From bbdbc3d8e6151a333cd1760a80ee3933386ce7a1 Mon Sep 17 00:00:00 2001 From: Palash Tyagi <23239946+Magnus167@users.noreply.github.com> Date: Sat, 5 Apr 2025 15:06:41 +0100 Subject: [PATCH] Add pivot_wide_dataframe_to_qdf function for transforming ticker dataframes --- src/utils/qdf/pivots.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/utils/qdf/pivots.rs b/src/utils/qdf/pivots.rs index ed110d0..8e6bd9b 100644 --- a/src/utils/qdf/pivots.rs +++ b/src/utils/qdf/pivots.rs @@ -66,6 +66,41 @@ pub fn pivot_dataframe_by_ticker( Ok(new_df) } +/// Pivot ticker dataframe to qdf. +#[allow(dead_code)] +pub fn pivot_wide_dataframe_to_qdf( + df: DataFrame, + metric: Option, +) -> Result> { + // df list of dataframes + let mut df_vec: Vec = Vec::new(); + // if no metric is provided, set it to 'value' + let metric = metric.unwrap_or("value".into()); + for tkr in df.get_column_names() { + if tkr == "real_date" { + continue; + } + let mut new_df = DataFrame::new(vec![df.column("real_date")?.clone()])?; + // copy the column to the new dataframe + new_df.with_column(df.column(tkr)?.clone())?; + new_df.rename(tkr, metric.clone().into())?; + // add the cid and xcat columns + let (cid, xcat) = split_ticker(tkr.to_string())?; + new_df.with_column(Series::new("cid".into(), vec![cid]))?; + new_df.with_column(Series::new("xcat".into(), vec![xcat]))?; + df_vec.push(new_df); + } + // create a new dataframe, concatting row-wise + let mut new_df = DataFrame::new(vec![])?; + for df in df_vec.iter() { + new_df.vstack_mut(df)?; + } + + // return the new dataframe + check_quantamental_dataframe(&new_df)?; + Ok(new_df) +} + /// Splits a dataframe by ticker. #[allow(dead_code)] fn split_df_by_tickers(