Path: blob/main/docs/source/src/rust/user-guide/transformations/time-series/rolling.rs
7890 views
// --8<-- [start:setup]1use chrono::prelude::*;2use polars::io::prelude::*;3use polars::prelude::*;4// --8<-- [end:setup]56fn main() -> Result<(), Box<dyn std::error::Error>> {7// --8<-- [start:df]8let df = CsvReadOptions::default()9.map_parse_options(|parse_options| parse_options.with_try_parse_dates(true))10.try_into_reader_with_file_path(Some("docs/assets/data/apple_stock.csv".into()))11.unwrap()12.finish()13.unwrap()14.sort(15["Date"],16SortMultipleOptions::default().with_maintain_order(true),17)?;18println!("{}", &df);19// --8<-- [end:df]2021// --8<-- [start:group_by]22let annual_average_df = df23.lazy()24.group_by_dynamic(25col("Date"),26[],27DynamicGroupOptions {28every: Duration::parse("1y"),29period: Duration::parse("1y"),30offset: Duration::parse("0"),31..Default::default()32},33)34.agg([col("Close").mean()])35.collect()?;3637let df_with_year = annual_average_df38.lazy()39.with_columns([col("Date").dt().year().alias("year")])40.collect()?;41println!("{}", &df_with_year);42// --8<-- [end:group_by]4344// --8<-- [start:group_by_dyn]45let time = polars::time::date_range(46"time".into(),47NaiveDate::from_ymd_opt(2021, 1, 1)48.unwrap()49.and_hms_opt(0, 0, 0)50.unwrap(),51NaiveDate::from_ymd_opt(2021, 12, 31)52.unwrap()53.and_hms_opt(0, 0, 0)54.unwrap(),55Duration::parse("1d"),56ClosedWindow::Both,57TimeUnit::Milliseconds,58None,59)?60.cast(&DataType::Date)?;6162let df = df!(63"time" => time,64)?;6566let out = df67.lazy()68.group_by_dynamic(69col("time"),70[],71DynamicGroupOptions {72every: Duration::parse("1mo"),73period: Duration::parse("1mo"),74offset: Duration::parse("0"),75closed_window: ClosedWindow::Left,76..Default::default()77},78)79.agg([80col("time")81.cum_count(true) // python example has false82.reverse()83.head(Some(3))84.alias("day/eom"),85((col("time").last() - col("time").first()).map(86// had to use map as .duration().days() is not available87|s| {88Ok(s.duration()?89.physical()90.into_iter()91.map(|d| d.map(|v| v / 1000 / 24 / 60 / 60))92.collect::<Int64Chunked>()93.into_column())94},95|_, f| Ok(Field::new(f.name().clone(), DataType::Int64)),96) + lit(1))97.alias("days_in_month"),98])99.collect()?;100println!("{}", &out);101// --8<-- [end:group_by_dyn]102103// --8<-- [start:group_by_roll]104let time = polars::time::date_range(105"time".into(),106NaiveDate::from_ymd_opt(2021, 12, 16)107.unwrap()108.and_hms_opt(0, 0, 0)109.unwrap(),110NaiveDate::from_ymd_opt(2021, 12, 16)111.unwrap()112.and_hms_opt(3, 0, 0)113.unwrap(),114Duration::parse("30m"),115ClosedWindow::Both,116TimeUnit::Milliseconds,117None,118)?;119let df = df!(120"time" => time,121"groups"=> ["a", "a", "a", "b", "b", "a", "a"],122)?;123println!("{}", &df);124// --8<-- [end:group_by_roll]125126// --8<-- [start:group_by_dyn2]127let out = df128.lazy()129.group_by_dynamic(130col("time"),131[col("groups")],132DynamicGroupOptions {133every: Duration::parse("1h"),134period: Duration::parse("1h"),135offset: Duration::parse("0"),136include_boundaries: true,137closed_window: ClosedWindow::Both,138..Default::default()139},140)141.agg([len()])142.collect()?;143println!("{}", &out);144// --8<-- [end:group_by_dyn2]145146Ok(())147}148149150