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