Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-expr/src/dispatch/trigonometry.rs
7884 views
1
use num_traits::Float;
2
use polars_core::chunked_array::ops::arity::broadcast_binary_elementwise;
3
use polars_core::error::{PolarsResult, polars_bail};
4
use polars_core::prelude::*;
5
use polars_plan::plans::IRTrigonometricFunction;
6
7
pub(super) fn apply_trigonometric_function(
8
s: &Column,
9
trig_function: IRTrigonometricFunction,
10
) -> PolarsResult<Column> {
11
use DataType::*;
12
match s.dtype() {
13
#[cfg(feature = "dtype-f16")]
14
Float16 => {
15
let ca = s.f16().unwrap();
16
apply_trigonometric_function_to_float(ca, trig_function)
17
},
18
Float32 => {
19
let ca = s.f32().unwrap();
20
apply_trigonometric_function_to_float(ca, trig_function)
21
},
22
Float64 => {
23
let ca = s.f64().unwrap();
24
apply_trigonometric_function_to_float(ca, trig_function)
25
},
26
dt if dt.is_primitive_numeric() => {
27
let s = s.cast(&Float64)?;
28
apply_trigonometric_function(&s, trig_function)
29
},
30
dt => polars_bail!(op = "trigonometry", dt),
31
}
32
}
33
34
pub(super) fn apply_arctan2(s: &mut [Column]) -> PolarsResult<Column> {
35
let y = &s[0];
36
let x = &s[1];
37
38
let y_len = y.len();
39
let x_len = x.len();
40
41
match (y_len, x_len) {
42
(1, _) | (_, 1) => arctan2_on_columns(y, x),
43
(len_a, len_b) if len_a == len_b => arctan2_on_columns(y, x),
44
_ => polars_bail!(
45
ComputeError:
46
"y shape: {} in `arctan2` expression does not match that of x: {}",
47
y_len, x_len,
48
),
49
}
50
}
51
52
fn arctan2_on_columns(y: &Column, x: &Column) -> PolarsResult<Column> {
53
use DataType::*;
54
match y.dtype() {
55
#[cfg(feature = "dtype-f16")]
56
Float16 => {
57
let y_ca: &ChunkedArray<Float16Type> = y.f16().unwrap();
58
arctan2_on_floats(y_ca, x)
59
},
60
Float32 => {
61
let y_ca: &ChunkedArray<Float32Type> = y.f32().unwrap();
62
arctan2_on_floats(y_ca, x)
63
},
64
Float64 => {
65
let y_ca: &ChunkedArray<Float64Type> = y.f64().unwrap();
66
arctan2_on_floats(y_ca, x)
67
},
68
_ => {
69
let y = y.cast(&DataType::Float64)?;
70
arctan2_on_columns(&y, x)
71
},
72
}
73
}
74
75
fn arctan2_on_floats<T>(y: &ChunkedArray<T>, x: &Column) -> PolarsResult<Column>
76
where
77
T: PolarsFloatType,
78
T::Native: Float,
79
ChunkedArray<T>: IntoColumn,
80
{
81
let dtype = T::get_static_dtype();
82
let x = x.cast(&dtype)?;
83
let x = y
84
.unpack_series_matching_type(x.as_materialized_series())
85
.unwrap();
86
87
Ok(broadcast_binary_elementwise(y, x, |yv, xv| Some(yv?.atan2(xv?))).into_column())
88
}
89
90
fn apply_trigonometric_function_to_float<T>(
91
ca: &ChunkedArray<T>,
92
trig_function: IRTrigonometricFunction,
93
) -> PolarsResult<Column>
94
where
95
T: PolarsFloatType,
96
T::Native: Float,
97
ChunkedArray<T>: IntoColumn,
98
{
99
match trig_function {
100
IRTrigonometricFunction::Cos => cos(ca),
101
IRTrigonometricFunction::Cot => cot(ca),
102
IRTrigonometricFunction::Sin => sin(ca),
103
IRTrigonometricFunction::Tan => tan(ca),
104
IRTrigonometricFunction::ArcCos => arccos(ca),
105
IRTrigonometricFunction::ArcSin => arcsin(ca),
106
IRTrigonometricFunction::ArcTan => arctan(ca),
107
IRTrigonometricFunction::Cosh => cosh(ca),
108
IRTrigonometricFunction::Sinh => sinh(ca),
109
IRTrigonometricFunction::Tanh => tanh(ca),
110
IRTrigonometricFunction::ArcCosh => arccosh(ca),
111
IRTrigonometricFunction::ArcSinh => arcsinh(ca),
112
IRTrigonometricFunction::ArcTanh => arctanh(ca),
113
IRTrigonometricFunction::Degrees => degrees(ca),
114
IRTrigonometricFunction::Radians => radians(ca),
115
}
116
}
117
118
fn cos<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
119
where
120
T: PolarsFloatType,
121
T::Native: Float,
122
ChunkedArray<T>: IntoColumn,
123
{
124
Ok(ca.apply_values(|v| v.cos()).into_column())
125
}
126
127
fn cot<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
128
where
129
T: PolarsFloatType,
130
T::Native: Float,
131
ChunkedArray<T>: IntoColumn,
132
{
133
Ok(ca.apply_values(|v| v.tan().powi(-1)).into_column())
134
}
135
136
fn sin<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
137
where
138
T: PolarsFloatType,
139
T::Native: Float,
140
ChunkedArray<T>: IntoColumn,
141
{
142
Ok(ca.apply_values(|v| v.sin()).into_column())
143
}
144
145
fn tan<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
146
where
147
T: PolarsFloatType,
148
T::Native: Float,
149
ChunkedArray<T>: IntoColumn,
150
{
151
Ok(ca.apply_values(|v| v.tan()).into_column())
152
}
153
154
fn arccos<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
155
where
156
T: PolarsFloatType,
157
T::Native: Float,
158
ChunkedArray<T>: IntoColumn,
159
{
160
Ok(ca.apply_values(|v| v.acos()).into_column())
161
}
162
163
fn arcsin<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
164
where
165
T: PolarsFloatType,
166
T::Native: Float,
167
ChunkedArray<T>: IntoColumn,
168
{
169
Ok(ca.apply_values(|v| v.asin()).into_column())
170
}
171
172
fn arctan<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
173
where
174
T: PolarsFloatType,
175
T::Native: Float,
176
ChunkedArray<T>: IntoColumn,
177
{
178
Ok(ca.apply_values(|v| v.atan()).into_column())
179
}
180
181
fn cosh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
182
where
183
T: PolarsFloatType,
184
T::Native: Float,
185
ChunkedArray<T>: IntoColumn,
186
{
187
Ok(ca.apply_values(|v| v.cosh()).into_column())
188
}
189
190
fn sinh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
191
where
192
T: PolarsFloatType,
193
T::Native: Float,
194
ChunkedArray<T>: IntoColumn,
195
{
196
Ok(ca.apply_values(|v| v.sinh()).into_column())
197
}
198
199
fn tanh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
200
where
201
T: PolarsFloatType,
202
T::Native: Float,
203
ChunkedArray<T>: IntoColumn,
204
{
205
Ok(ca.apply_values(|v| v.tanh()).into_column())
206
}
207
208
fn arccosh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
209
where
210
T: PolarsFloatType,
211
T::Native: Float,
212
ChunkedArray<T>: IntoColumn,
213
{
214
Ok(ca.apply_values(|v| v.acosh()).into_column())
215
}
216
217
fn arcsinh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
218
where
219
T: PolarsFloatType,
220
T::Native: Float,
221
ChunkedArray<T>: IntoColumn,
222
{
223
Ok(ca.apply_values(|v| v.asinh()).into_column())
224
}
225
226
fn arctanh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
227
where
228
T: PolarsFloatType,
229
T::Native: Float,
230
ChunkedArray<T>: IntoColumn,
231
{
232
Ok(ca.apply_values(|v| v.atanh()).into_column())
233
}
234
235
fn degrees<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
236
where
237
T: PolarsFloatType,
238
T::Native: Float,
239
ChunkedArray<T>: IntoColumn,
240
{
241
Ok(ca.apply_values(|v| v.to_degrees()).into_column())
242
}
243
244
fn radians<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>
245
where
246
T: PolarsFloatType,
247
T::Native: Float,
248
ChunkedArray<T>: IntoColumn,
249
{
250
Ok(ca.apply_values(|v| v.to_radians()).into_column())
251
}
252
253