use polars::prelude::*;
use rustalib::util::file_utils::read_financial_data as rustalib_read_financial_data;
use std::path::Path;
pub fn read_financial_data<P: AsRef<Path>>(
file_path: P,
) -> PolarsResult<(DataFrame, rustalib::util::file_utils::FinancialColumns)> {
let (df, metadata) = rustalib_read_financial_data(file_path.as_ref().to_str().unwrap())?;
enhanced_process_dataframe(df, metadata)
}
fn enhanced_process_dataframe(
mut df: DataFrame,
metadata: rustalib::util::file_utils::FinancialColumns,
) -> PolarsResult<(DataFrame, rustalib::util::file_utils::FinancialColumns)> {
let mut rename_columns = Vec::new();
for column_name in df.get_column_names() {
let col_lower = column_name.to_lowercase();
let standard_name = match col_lower.as_str() {
"open" | "o" | "op" | "openprice" | "open_price" => "open",
"high" | "h" | "highprice" | "high_price" | "max" => "high",
"low" | "l" | "lowprice" | "low_price" | "min" => "low",
"close" | "c" | "cl" | "closeprice" | "close_price" => "close",
"volume" | "vol" | "v" | "volumes" => "volume",
"timestamp" | "time" | "date" | "t" | "datetime" | "dt" | "day" => "time",
"vwap" | "vwavg" | "vw" | "vwprice" | "volumeweightedavgprice" => "vwap",
"adj close" | "adj_close" | "adjusted close" | "adjusted_close" | "adjclose" | "adj" => "adjusted_close",
_ => continue,
};
if column_name != standard_name {
rename_columns.push((column_name.to_string(), standard_name.to_string()));
}
}
if !rename_columns.is_empty() {
println!("Original columns: {:?}", df.get_column_names());
println!("Columns to rename: {:?}", rename_columns);
let mut lazy_df = df.clone().lazy();
for (old_name, new_name) in rename_columns {
lazy_df = lazy_df.with_column(col(&old_name).alias(&new_name));
}
df = lazy_df.collect()?;
if df.schema().contains("volume") {
let volume = df.column("volume")?;
let volume_f64 = volume.cast(&DataType::Float64)?;
df.with_column(volume_f64)?;
}
if !df.schema().contains("adjusted_close") && df.schema().contains("close") {
let close = df.column("close")?.clone();
df.with_column(close.with_name("adjusted_close".into()))?;
}
println!("DataFrame columns after renaming: {:?}", df.get_column_names());
}
Ok((df, metadata))
}
pub fn enhanced_read_financial_data<P: AsRef<Path>>(
file_path: P,
) -> PolarsResult<(DataFrame, rustalib::util::file_utils::FinancialColumns)> {
let (df, metadata) = rustalib_read_financial_data(file_path.as_ref().to_str().unwrap())?;
enhanced_process_dataframe(df, metadata)
}
pub fn read_csv_to_dataframe<P: AsRef<Path>>(
file_path: P,
_has_header: bool,
) -> PolarsResult<DataFrame> {
let (df, _) = read_financial_data(file_path)?;
Ok(df)
}
pub fn load_and_preprocess<P: AsRef<Path>>(
file_path: P,
has_header: bool,
) -> PolarsResult<DataFrame> {
read_csv_to_dataframe(file_path, has_header)
}
pub fn read_csv_file<P: AsRef<Path>>(file_path: P) -> PolarsResult<DataFrame> {
let (df, _) = read_financial_data(file_path)?;
Ok(df)
}