From 1b0e6fd53b43a5ebe7c463a72f1f6d84a23a8579 Mon Sep 17 00:00:00 2001 From: Zack Owens Date: Sat, 2 Aug 2025 17:44:57 -0700 Subject: [PATCH 1/2] Upgrade polars to 0.50 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 49ea749..7953f89 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ exclude = [ ] [dependencies] -polars = { version = "0.47.1", features = ["lazy", "strings", "temporal", "rolling_window", "parquet", "dtype-categorical", "dtype-struct"] } +polars = { version = "0.50", features = ["lazy", "strings", "temporal", "rolling_window", "parquet", "dtype-categorical", "dtype-struct", "timezones", "regex"] } chrono = "0.4.34" thiserror = "2.0.11" # Consider updating if needed, check compatibility ndarray = "0.16.1" # Consider updating if needed, check compatibility From d42c5ca0efdce7d767527688fe791a60a12eef13 Mon Sep 17 00:00:00 2001 From: Zack Owens Date: Fri, 20 Feb 2026 17:49:51 -0800 Subject: [PATCH 2/2] Upgrade to polars 0.53 --- Cargo.toml | 4 +- examples/bollinger_bands_basic.rs | 2 +- examples/debug_array_lengths.rs | 10 ++--- examples/general/basic_indicators.rs | 2 +- examples/macd_basic.rs | 2 +- examples/mean_reversion_test.rs | 7 +++- examples/moving_averages_basic.rs | 2 +- examples/options/vertical_spreads.rs | 12 +++--- examples/rsi_basic.rs | 2 +- examples/simple_dataframe.rs | 2 +- examples/stock/mean_reversion.rs | 37 ++++++++++-------- examples/stock/trend_following.rs | 39 ++++++++++--------- examples/stock_mr.rs | 23 ++++++----- examples/test_case_sensitive.rs | 2 +- examples/test_df.rs | 2 +- examples/test_headerless.rs | 19 +++++---- examples/test_parquet.rs | 2 +- examples/trend_adx_basic.rs | 2 +- examples/vwap_basic.rs | 19 +++++---- examples/working_with_multi_stock_data.rs | 2 +- src/indicators/add_indicators.rs | 2 +- src/indicators/moving_averages/hull.rs | 2 +- src/indicators/oscillators/macd.rs | 2 +- src/indicators/oscillators/mod.rs | 12 +++--- .../pattern_recognition/candlestick.rs | 2 +- src/indicators/test_util.rs | 17 ++++---- src/indicators/trend/mod.rs | 2 +- src/indicators/volatility/keltner_channels.rs | 2 +- src/indicators/volume/mod.rs | 6 +-- src/util/dataframe_utils.rs | 2 +- 30 files changed, 131 insertions(+), 110 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7953f89..bd0d4be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ exclude = [ ] [dependencies] -polars = { version = "0.50", features = ["lazy", "strings", "temporal", "rolling_window", "parquet", "dtype-categorical", "dtype-struct", "timezones", "regex"] } +polars = { version = "0.53", features = ["lazy", "strings", "temporal", "rolling_window", "parquet", "dtype-categorical", "dtype-struct", "timezones", "regex"] } chrono = "0.4.34" thiserror = "2.0.11" # Consider updating if needed, check compatibility ndarray = "0.16.1" # Consider updating if needed, check compatibility @@ -102,4 +102,4 @@ path = "examples/trend_adx_basic.rs" [lib] name = "rustalib" path = "src/lib.rs" -doctest = false \ No newline at end of file +doctest = false diff --git a/examples/bollinger_bands_basic.rs b/examples/bollinger_bands_basic.rs index 2c7209a..8868e79 100644 --- a/examples/bollinger_bands_basic.rs +++ b/examples/bollinger_bands_basic.rs @@ -13,7 +13,7 @@ fn main() -> Result<(), PolarsError> { ); // Create DataFrame with price data - let df = DataFrame::new(vec![close_prices.clone().into()])?; + let df = DataFrame::new(close_prices.len(), vec![close_prices.clone().into()])?; // Calculate Bollinger Bands with standard parameters (20-period, 2 standard deviations) let (middle, upper, lower) = calculate_bollinger_bands(&df, 20, 2.0, "close")?; diff --git a/examples/debug_array_lengths.rs b/examples/debug_array_lengths.rs index 6fdc7d8..65ee2b7 100644 --- a/examples/debug_array_lengths.rs +++ b/examples/debug_array_lengths.rs @@ -127,10 +127,10 @@ fn main() -> Result<(), PolarsError> { println!(" closes_series: {}", closes_series.len()); // Create DataFrame - let mut df = DataFrame::new(vec![ - dates_series.clone().into(), - closes_series.clone().into(), - ])?; + let mut df = DataFrame::new( + dates_series.len(), + vec![dates_series.clone().into(), closes_series.clone().into()], + )?; println!("\nDataFrame height: {}", df.height()); @@ -144,7 +144,7 @@ fn main() -> Result<(), PolarsError> { println!("DataFrame height: {}", df.height()); // Try to add the test vector to the DataFrame - let test_series = Series::new("test".into(), test_vec); + let test_series = Column::new("test".into(), test_vec); match df.with_column(test_series) { Ok(new_df) => { println!("Success! New DataFrame height: {}", new_df.height()); diff --git a/examples/general/basic_indicators.rs b/examples/general/basic_indicators.rs index d6d7784..d114d8d 100644 --- a/examples/general/basic_indicators.rs +++ b/examples/general/basic_indicators.rs @@ -17,7 +17,7 @@ fn main() -> Result<(), PolarsError> { ); // Create DataFrame with price data - let df = DataFrame::new(vec![close_prices.clone().into()])?; + let df = DataFrame::new(close_prices.len(), vec![close_prices.clone().into()])?; println!("Basic Technical Indicators Example\n"); diff --git a/examples/macd_basic.rs b/examples/macd_basic.rs index 7ea514f..e301e7f 100644 --- a/examples/macd_basic.rs +++ b/examples/macd_basic.rs @@ -13,7 +13,7 @@ fn main() -> Result<(), PolarsError> { ); // Create DataFrame with price data - let df = DataFrame::new(vec![close_prices.clone().into()])?; + let df = DataFrame::new(close_prices.len(), vec![close_prices.clone().into()])?; // Calculate MACD with standard parameters // fast_period = 12, slow_period = 26, signal_period = 9 diff --git a/examples/mean_reversion_test.rs b/examples/mean_reversion_test.rs index 30430c8..d9e30a7 100644 --- a/examples/mean_reversion_test.rs +++ b/examples/mean_reversion_test.rs @@ -21,7 +21,10 @@ fn main() -> Result<(), PolarsError> { let values = Series::new("value".into(), &[10.0, 11.0, 12.0, 13.0, 14.0]); // Create DataFrame - let mut df = DataFrame::new(vec![dates.clone().into(), values.clone().into()])?; + let mut df = DataFrame::new( + values.len(), + vec![dates.clone().into(), values.clone().into()], + )?; // Print information println!("Original DataFrame:"); @@ -45,7 +48,7 @@ fn main() -> Result<(), PolarsError> { let doubles_series = Series::new("doubles".into(), doubles); // Add the new column - df.with_column(doubles_series)?; + df.with_column(doubles_series.into_column())?; println!("\nDataFrame with new column:"); println!("{}", df); diff --git a/examples/moving_averages_basic.rs b/examples/moving_averages_basic.rs index 38905c9..f54464d 100644 --- a/examples/moving_averages_basic.rs +++ b/examples/moving_averages_basic.rs @@ -13,7 +13,7 @@ fn main() -> Result<(), PolarsError> { ); // Create DataFrame with price data - let df = DataFrame::new(vec![close_prices.clone().into()])?; + let df = DataFrame::new(close_prices.len(), vec![close_prices.clone().into()])?; // Calculate different moving averages let sma_10 = calculate_sma(&df, "close", 10)?; diff --git a/examples/options/vertical_spreads.rs b/examples/options/vertical_spreads.rs index 27eed01..3445147 100644 --- a/examples/options/vertical_spreads.rs +++ b/examples/options/vertical_spreads.rs @@ -54,7 +54,7 @@ fn main() -> Result<(), PolarsError> { let description = Series::new("description".into(), description_vec); // Create a DataFrame with our spread data - let mut df = DataFrame::new(vec![ + let mut df = DataFrame::new(short_strike.len(), vec![ short_strike.into(), long_strike.into(), short_price.into(), @@ -123,11 +123,11 @@ fn main() -> Result<(), PolarsError> { } // Add calculated metrics to the dataframe - df.with_column(Series::new("max_profit".into(), max_profit))?; - df.with_column(Series::new("max_loss".into(), max_loss))?; - df.with_column(Series::new("breakeven".into(), breakeven))?; - df.with_column(Series::new("risk_reward".into(), risk_reward))?; - df.with_column(Series::new("strike_width".into(), strike_width))?; + df.with_column(Column::new("max_profit".into(), max_profit))?; + df.with_column(Column::new("max_loss".into(), max_loss))?; + df.with_column(Column::new("breakeven".into(), breakeven))?; + df.with_column(Column::new("risk_reward".into(), risk_reward))?; + df.with_column(Column::new("strike_width".into(), strike_width))?; // Display the results println!("Vertical Spread Metrics:"); diff --git a/examples/rsi_basic.rs b/examples/rsi_basic.rs index 2fcc869..b457a98 100644 --- a/examples/rsi_basic.rs +++ b/examples/rsi_basic.rs @@ -12,7 +12,7 @@ fn main() -> Result<(), PolarsError> { ); // Create DataFrame with date and price data - let df = DataFrame::new(vec![close_prices.clone().into()])?; + let df = DataFrame::new(close_prices.len(), vec![close_prices.clone().into()])?; // Calculate RSI with 5-period setting for this short example let rsi = calculate_rsi(&df, 5, "close")?; diff --git a/examples/simple_dataframe.rs b/examples/simple_dataframe.rs index 3fe2d9b..1462bf1 100644 --- a/examples/simple_dataframe.rs +++ b/examples/simple_dataframe.rs @@ -7,7 +7,7 @@ fn main() -> Result<(), PolarsError> { let values = Series::new("value".into(), &[10.0, 11.0, 12.0]); // Create DataFrame - let df = DataFrame::new(vec![dates.clone().into(), values.clone().into()])?; + let df = DataFrame::new(3, vec![dates.clone().into(), values.clone().into()])?; // Print information println!( diff --git a/examples/stock/mean_reversion.rs b/examples/stock/mean_reversion.rs index 9b5a1de..dfa521e 100644 --- a/examples/stock/mean_reversion.rs +++ b/examples/stock/mean_reversion.rs @@ -163,14 +163,17 @@ fn main() -> Result<(), PolarsError> { println!(" Volume count: {}", volumes.len()); // Create DataFrame - let mut df = DataFrame::new(vec![ - dates.into(), - opens.into(), - highs.into(), - lows.into(), - closes.clone().into(), - volumes.into(), - ])?; + let mut df = DataFrame::new( + opens.len(), + vec![ + dates.into(), + opens.into(), + highs.into(), + lows.into(), + closes.clone().into(), + volumes.into(), + ], + )?; // Calculate indicators // 1. Calculate SMA @@ -180,15 +183,15 @@ fn main() -> Result<(), PolarsError> { sma_20.len(), df.height() ); - df.with_column(sma_20)?; + df.with_column(sma_20.into_column())?; // 2. Calculate Bollinger Bands let (middle, upper, lower) = calculate_bollinger_bands(&df, 20, 2.0, "close")?; - println!("Middle Band length: {}, Upper Band length: {}, Lower Band length: {}, DataFrame height: {}", + println!("Middle Band length: {}, Upper Band length: {}, Lower Band length: {}, DataFrame height: {}", middle.len(), upper.len(), lower.len(), df.height()); - df.with_column(middle)?; - df.with_column(upper)?; - df.with_column(lower)?; + df.with_column(middle.into_column())?; + df.with_column(upper.into_column())?; + df.with_column(lower.into_column())?; // 3. Calculate RSI let rsi = calculate_rsi(&df, 14, "close")?; @@ -223,12 +226,12 @@ fn main() -> Result<(), PolarsError> { padded_rsi.len(), df.height() ); - df.with_column(padded_rsi)?; + df.with_column(padded_rsi.into_column())?; } else { // Rename RSI column to ensure consistency let rsi_values = rsi.f64()?.to_vec(); let renamed_rsi = Series::new("rsi".into(), rsi_values); - df.with_column(renamed_rsi)?; + df.with_column(renamed_rsi.into_column())?; } // 4. Calculate Z-Score (a simpler measure of mean reversion) @@ -343,7 +346,7 @@ fn calculate_z_score(df: &mut DataFrame, window: usize) -> Result<(), PolarsErro z_scores.len(), height ); - df.with_column(Series::new("z_score".into(), z_scores))?; + df.with_column(Column::new("z_score".into(), z_scores))?; Ok(()) } @@ -384,7 +387,7 @@ fn calculate_mean_reversion_signals(df: &mut DataFrame) -> Result<(), PolarsErro ); // Add signals to dataframe - df.with_column(Series::new("signal".into(), signals))?; + df.with_column(Column::new("signal".into(), signals))?; Ok(()) } diff --git a/examples/stock/trend_following.rs b/examples/stock/trend_following.rs index d4d7323..24c48e3 100644 --- a/examples/stock/trend_following.rs +++ b/examples/stock/trend_following.rs @@ -163,14 +163,17 @@ fn main() -> Result<(), PolarsError> { println!(" Volume count: {}", volumes.len()); // Create DataFrame - let mut df = DataFrame::new(vec![ - dates.into(), - opens.into(), - highs.into(), - lows.into(), - closes.clone().into(), - volumes.into(), - ])?; + let mut df = DataFrame::new( + dates.len(), + vec![ + dates.into(), + opens.into(), + highs.into(), + lows.into(), + closes.clone().into(), + volumes.into(), + ], + )?; // Calculate indicators for trend following // 1. Calculate short and long SMAs @@ -182,15 +185,15 @@ fn main() -> Result<(), PolarsError> { let sma_50_values = sma_50.f64()?.to_vec(); // Add to dataframe - df.with_column(Series::new("sma_20".into(), sma_20_values))?; - df.with_column(Series::new("sma_50".into(), sma_50_values))?; + df.with_column(Column::new("sma_20".into(), sma_20_values))?; + df.with_column(Column::new("sma_50".into(), sma_50_values))?; // 2. Calculate MACD let (macd_line, signal_line) = calculate_macd(&df, 12, 26, 9, "close")?; // Add MACD and signal line to the dataframe - df.with_column(macd_line.with_name("macd".into()))?; - df.with_column(signal_line.with_name("macd_signal".into()))?; + df.with_column(macd_line.with_name("macd".into()).into_column())?; + df.with_column(signal_line.with_name("macd_signal".into()).into_column())?; // Calculate MACD histogram // First get the values as f64 arrays @@ -206,7 +209,7 @@ fn main() -> Result<(), PolarsError> { } // Add the histogram to the dataframe - df.with_column(Series::new("macd_histogram".into(), histogram))?; + df.with_column(Column::new("macd_histogram".into(), histogram))?; // 3. Calculate ADX (Average Directional Index) for trend strength let adx = calculate_adx(&df, 14)?; @@ -226,10 +229,10 @@ fn main() -> Result<(), PolarsError> { padded_adx.push(val); } - df.with_column(Series::new("adx".into(), padded_adx))?; + df.with_column(Column::new("adx".into(), padded_adx))?; } else { let adx_values = adx.f64()?.to_vec(); - df.with_column(Series::new("adx".into(), adx_values))?; + df.with_column(Column::new("adx".into(), adx_values))?; } // 4. Calculate RSI @@ -250,10 +253,10 @@ fn main() -> Result<(), PolarsError> { padded_rsi.push(val); } - df.with_column(Series::new("rsi".into(), padded_rsi))?; + df.with_column(Column::new("rsi".into(), padded_rsi))?; } else { let rsi_values = rsi.f64()?.to_vec(); - df.with_column(Series::new("rsi".into(), rsi_values))?; + df.with_column(Column::new("rsi".into(), rsi_values))?; } // 5. Generate trend signals @@ -359,7 +362,7 @@ fn calculate_trend_signals(df: &mut DataFrame) -> Result<(), PolarsError> { } // Add signals to dataframe - df.with_column(Series::new("signal".into(), signals))?; + df.with_column(Column::new("signal".into(), signals))?; Ok(()) } diff --git a/examples/stock_mr.rs b/examples/stock_mr.rs index 28842af..6996e9c 100644 --- a/examples/stock_mr.rs +++ b/examples/stock_mr.rs @@ -30,10 +30,13 @@ fn main() -> Result<(), PolarsError> { } // Create DataFrame - let mut df = DataFrame::new(vec![ - Series::new("date".into(), dates).into(), - Series::new("close".into(), closes.clone()).into(), - ])?; + let mut df = DataFrame::new( + dates.len(), + vec![ + Series::new("date".into(), dates).into(), + Series::new("close".into(), closes.clone()).into(), + ], + )?; println!("Price data created with {} days", df.height()); @@ -118,15 +121,15 @@ fn main() -> Result<(), PolarsError> { } // Add calculated columns to DataFrame - df.with_column(Series::new("sma".into(), sma_vals))?; - df.with_column(Series::new("upper_band".into(), upper_band))?; - df.with_column(Series::new("lower_band".into(), lower_band))?; - df.with_column(Series::new("rsi".into(), rsi_vals))?; - df.with_column(Series::new("z_score".into(), z_scores))?; + df.with_column(Column::new("sma".into(), sma_vals))?; + df.with_column(Column::new("upper_band".into(), upper_band))?; + df.with_column(Column::new("lower_band".into(), lower_band))?; + df.with_column(Column::new("rsi".into(), rsi_vals))?; + df.with_column(Column::new("z_score".into(), z_scores))?; // Clone signals before adding to DataFrame let signals_copy = signals.clone(); - df.with_column(Series::new("signal".into(), signals))?; + df.with_column(Column::new("signal".into(), signals))?; // Print results println!("\nMean Reversion Analysis:"); diff --git a/examples/test_case_sensitive.rs b/examples/test_case_sensitive.rs index 64d6884..9f598ea 100644 --- a/examples/test_case_sensitive.rs +++ b/examples/test_case_sensitive.rs @@ -7,7 +7,7 @@ fn main() -> Result<(), Box> { println!("=====================================\n"); // Create a sample DataFrame with financial data with differently cased headers - let df = DataFrame::new(vec![ + let df = DataFrame::new(3, vec![ Series::new("DATE".into(), &["2024-01-01", "2024-01-02", "2024-01-03"]).into(), Series::new("Open".into(), &[150.0, 152.0, 151.0]).into(), Series::new("HIGH".into(), &[155.0, 156.0, 154.0]).into(), diff --git a/examples/test_df.rs b/examples/test_df.rs index bcf30a9..2e46b94 100644 --- a/examples/test_df.rs +++ b/examples/test_df.rs @@ -8,7 +8,7 @@ fn main() -> Result<(), PolarsError> { let s2 = Series::new("b".into(), &[4, 5, 6]); // Create DataFrame - let df = DataFrame::new(vec![s1.into(), s2.into()])?; + let df = DataFrame::new(3, vec![s1.into(), s2.into()])?; // Print the DataFrame println!("Test DataFrame"); diff --git a/examples/test_headerless.rs b/examples/test_headerless.rs index d1cd99e..5f6f6c6 100644 --- a/examples/test_headerless.rs +++ b/examples/test_headerless.rs @@ -28,14 +28,17 @@ fn main() -> Result<(), Box> { ); // Create DataFrame - let mut df = DataFrame::new(vec![ - dates.into(), - opens.into(), - highs.into(), - lows.into(), - closes.into(), - volumes.into(), - ])?; + let mut df = DataFrame::new( + 5, + vec![ + dates.into(), + opens.into(), + highs.into(), + lows.into(), + closes.into(), + volumes.into(), + ], + )?; println!("Original DataFrame with generic column names:"); println!("{}\n", df); diff --git a/examples/test_parquet.rs b/examples/test_parquet.rs index 0284e74..68a935b 100644 --- a/examples/test_parquet.rs +++ b/examples/test_parquet.rs @@ -7,7 +7,7 @@ fn main() -> Result<(), Box> { println!("====================================================\n"); // Create a sample DataFrame with financial data with abbreviated and varied-case headers - let df = DataFrame::new(vec![ + let df = DataFrame::new(3, vec![ Series::new("dt".into(), &["2024-01-01", "2024-01-02", "2024-01-03"]).into(), Series::new("o".into(), &[150.0, 152.0, 151.0]).into(), // abbreviated "open" Series::new("h".into(), &[155.0, 156.0, 154.0]).into(), // abbreviated "high" diff --git a/examples/trend_adx_basic.rs b/examples/trend_adx_basic.rs index 06fb40a..5e801a9 100644 --- a/examples/trend_adx_basic.rs +++ b/examples/trend_adx_basic.rs @@ -28,7 +28,7 @@ fn main() -> PolarsResult<()> { ], ); - let df = DataFrame::new(vec![high.into(), low.into(), close.into()])?; + let df = DataFrame::new(high.len(), vec![high.into(), low.into(), close.into()])?; // Calculate 14-period ADX let adx = calculate_adx(&df, 14)?; diff --git a/examples/vwap_basic.rs b/examples/vwap_basic.rs index 6f7b256..4f9b45d 100644 --- a/examples/vwap_basic.rs +++ b/examples/vwap_basic.rs @@ -72,14 +72,17 @@ fn main() -> Result<(), PolarsError> { ); // Create DataFrame - let df = DataFrame::new(vec![ - dates.clone().into(), - opens.clone().into(), - highs.clone().into(), - lows.clone().into(), - closes.clone().into(), - volumes.clone().into(), - ])?; + let df = DataFrame::new( + dates.len(), + vec![ + dates.clone().into(), + opens.clone().into(), + highs.clone().into(), + lows.clone().into(), + closes.clone().into(), + volumes.clone().into(), + ], + )?; // Display the original data println!("Original OHLCV Data:"); diff --git a/examples/working_with_multi_stock_data.rs b/examples/working_with_multi_stock_data.rs index 7ec79cd..1e063d8 100644 --- a/examples/working_with_multi_stock_data.rs +++ b/examples/working_with_multi_stock_data.rs @@ -212,7 +212,7 @@ fn main() -> Result<(), PolarsError> { let add_column_safely = |df: &mut DataFrame, series: Series| -> Result<(), PolarsError> { // Only add the column if it has the same length as the DataFrame if series.len() == df.height() { - df.with_column(series)?; + df.with_column(series.into_column())?; } Ok(()) }; diff --git a/src/indicators/add_indicators.rs b/src/indicators/add_indicators.rs index b73a917..de77409 100644 --- a/src/indicators/add_indicators.rs +++ b/src/indicators/add_indicators.rs @@ -146,7 +146,7 @@ pub fn add_technical_indicators(df: &mut DataFrame) -> PolarsResult { features_to_add.extend(time_features); for feature in features_to_add { - df.with_column(feature)?; + df.with_column(feature.into_column())?; } Ok(df.clone()) diff --git a/src/indicators/moving_averages/hull.rs b/src/indicators/moving_averages/hull.rs index 96e7685..054a10f 100644 --- a/src/indicators/moving_averages/hull.rs +++ b/src/indicators/moving_averages/hull.rs @@ -17,7 +17,7 @@ pub fn calculate_hma(df: &DataFrame, column: &str, period: usize) -> PolarsResul .subtract(&wma_full)?; // Create a temporary dataframe with the raw_hma - let temp_df = DataFrame::new(vec![raw_hma.clone().into()])?; + let temp_df = DataFrame::new(1, vec![raw_hma.clone().into()])?; // Calculate WMA of the result with period = sqrt(n) let sqrt_period = (period as f64).sqrt().round() as usize; diff --git a/src/indicators/oscillators/macd.rs b/src/indicators/oscillators/macd.rs index 8fc510a..86f9a6a 100644 --- a/src/indicators/oscillators/macd.rs +++ b/src/indicators/oscillators/macd.rs @@ -32,7 +32,7 @@ pub fn calculate_macd( // Create a temporary DataFrame with MACD series for calculating the signal let macd_series = macd.clone(); - let temp_df = DataFrame::new(vec![macd_series.with_name(column.into()).into()])?; + let temp_df = DataFrame::new(macd_series.len(), vec![macd_series.with_name(column.into()).into()])?; // Calculate the signal line as an EMA of the MACD let signal = calculate_ema(&temp_df, column, signal_period)?; diff --git a/src/indicators/oscillators/mod.rs b/src/indicators/oscillators/mod.rs index a656abd..501820d 100644 --- a/src/indicators/oscillators/mod.rs +++ b/src/indicators/oscillators/mod.rs @@ -51,21 +51,21 @@ pub fn add_oscillator_indicators(df: &DataFrame) -> PolarsResult { // RSI let rsi_14 = calculate_rsi(df, 14, "close")?; - result_df.with_column(rsi_14)?; + result_df.with_column(rsi_14.into_column())?; // MACD let (macd, macd_signal) = calculate_macd(df, 12, 26, 9, "close")?; - result_df.with_column(macd)?; - result_df.with_column(macd_signal)?; + result_df.with_column(macd.into_column())?; + result_df.with_column(macd_signal.into_column())?; // Williams %R let williams_r_14 = calculate_williams_r(df, 14)?; - result_df.with_column(williams_r_14)?; + result_df.with_column(williams_r_14.into_column())?; // Stochastic Oscillator let (stoch_k, stoch_d) = calculate_stochastic(df, 14, 3, 3)?; - result_df.with_column(stoch_k)?; - result_df.with_column(stoch_d)?; + result_df.with_column(stoch_k.into_column())?; + result_df.with_column(stoch_d.into_column())?; Ok(result_df) } diff --git a/src/indicators/pattern_recognition/candlestick.rs b/src/indicators/pattern_recognition/candlestick.rs index 97ee726..67c50bf 100644 --- a/src/indicators/pattern_recognition/candlestick.rs +++ b/src/indicators/pattern_recognition/candlestick.rs @@ -10,5 +10,5 @@ pub fn recognize_patterns(_df: &DataFrame) -> PolarsResult { // TODO: Implement candlestick pattern recognition // Return an empty DataFrame for now - DataFrame::new(Vec::new()) + DataFrame::new(0, Vec::new()) } diff --git a/src/indicators/test_util.rs b/src/indicators/test_util.rs index 296d13e..9f6ec32 100644 --- a/src/indicators/test_util.rs +++ b/src/indicators/test_util.rs @@ -45,12 +45,15 @@ pub fn create_test_ohlcv_df() -> DataFrame { // Create the DataFrame - DataFrame::new(vec![ - Series::new("open".into(), open).into(), - Series::new("high".into(), high).into(), - Series::new("low".into(), low).into(), - Series::new("close".into(), close).into(), - Series::new("volume".into(), volume).into(), - ]) + DataFrame::new( + open.len(), + vec![ + Series::new("open".into(), open).into(), + Series::new("high".into(), high).into(), + Series::new("low".into(), low).into(), + Series::new("close".into(), close).into(), + Series::new("volume".into(), volume).into(), + ], + ) .unwrap() } diff --git a/src/indicators/trend/mod.rs b/src/indicators/trend/mod.rs index 8d3074c..7c41a8a 100644 --- a/src/indicators/trend/mod.rs +++ b/src/indicators/trend/mod.rs @@ -54,7 +54,7 @@ pub fn add_trend_indicators(df: &DataFrame) -> PolarsResult { // Parabolic SAR let psar = calculate_psar(df, 0.02, 0.2)?; - result_df.with_column(psar)?; + result_df.with_column(psar.into_column())?; Ok(result_df) } diff --git a/src/indicators/volatility/keltner_channels.rs b/src/indicators/volatility/keltner_channels.rs index 773a96b..d17a9d3 100644 --- a/src/indicators/volatility/keltner_channels.rs +++ b/src/indicators/volatility/keltner_channels.rs @@ -128,7 +128,7 @@ pub fn calculate_keltner_channels( let upper_series = Series::new("keltner_upper".into(), upper_band); let lower_series = Series::new("keltner_lower".into(), lower_band); - DataFrame::new(vec![ + DataFrame::new(upper_series.len(), vec![ upper_series.into(), middle_series.into(), lower_series.into(), diff --git a/src/indicators/volume/mod.rs b/src/indicators/volume/mod.rs index 610519d..f807165 100644 --- a/src/indicators/volume/mod.rs +++ b/src/indicators/volume/mod.rs @@ -48,15 +48,15 @@ pub fn add_volume_indicators(df: &DataFrame) -> PolarsResult { // Calculate On Balance Volume (OBV) let obv = calculate_obv(df)?; - result_df.with_column(obv)?; + result_df.with_column(obv.into_column())?; // Calculate Chaikin Money Flow (CMF) with default period of 20 let cmf = calculate_cmf(df, 20)?; - result_df.with_column(cmf)?; + result_df.with_column(cmf.into_column())?; // Calculate Money Flow Index (MFI) with default period of 14 let mfi = calculate_mfi(df, 14)?; - result_df.with_column(mfi)?; + result_df.with_column(mfi.into_column())?; Ok(result_df) } diff --git a/src/util/dataframe_utils.rs b/src/util/dataframe_utils.rs index 66b70f9..8216922 100644 --- a/src/util/dataframe_utils.rs +++ b/src/util/dataframe_utils.rs @@ -35,7 +35,7 @@ pub fn ensure_f64_column(df: &mut DataFrame, column_name: &str) -> PolarsResult< // 3) Convert the Column back into a Series and replace it in the DataFrame let series: Series = col.take_materialized_series(); - df.replace(column_name, series)?; + df.replace(column_name, series.into_column())?; Ok(()) }