Add pivot_wide_dataframe_to_qdf function for transforming ticker dataframes

This commit is contained in:
Palash Tyagi 2025-04-05 15:06:41 +01:00
parent b20659e04d
commit bbdbc3d8e6

View File

@ -66,6 +66,41 @@ pub fn pivot_dataframe_by_ticker(
Ok(new_df) Ok(new_df)
} }
/// Pivot ticker dataframe to qdf.
#[allow(dead_code)]
pub fn pivot_wide_dataframe_to_qdf(
df: DataFrame,
metric: Option<String>,
) -> Result<DataFrame, Box<dyn Error>> {
// df list of dataframes
let mut df_vec: Vec<DataFrame> = 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. /// Splits a dataframe by ticker.
#[allow(dead_code)] #[allow(dead_code)]
fn split_df_by_tickers( fn split_df_by_tickers(