Path: blob/main/crates/polars-expr/src/dispatch/trigonometry.rs
7884 views
use num_traits::Float;1use polars_core::chunked_array::ops::arity::broadcast_binary_elementwise;2use polars_core::error::{PolarsResult, polars_bail};3use polars_core::prelude::*;4use polars_plan::plans::IRTrigonometricFunction;56pub(super) fn apply_trigonometric_function(7s: &Column,8trig_function: IRTrigonometricFunction,9) -> PolarsResult<Column> {10use DataType::*;11match s.dtype() {12#[cfg(feature = "dtype-f16")]13Float16 => {14let ca = s.f16().unwrap();15apply_trigonometric_function_to_float(ca, trig_function)16},17Float32 => {18let ca = s.f32().unwrap();19apply_trigonometric_function_to_float(ca, trig_function)20},21Float64 => {22let ca = s.f64().unwrap();23apply_trigonometric_function_to_float(ca, trig_function)24},25dt if dt.is_primitive_numeric() => {26let s = s.cast(&Float64)?;27apply_trigonometric_function(&s, trig_function)28},29dt => polars_bail!(op = "trigonometry", dt),30}31}3233pub(super) fn apply_arctan2(s: &mut [Column]) -> PolarsResult<Column> {34let y = &s[0];35let x = &s[1];3637let y_len = y.len();38let x_len = x.len();3940match (y_len, x_len) {41(1, _) | (_, 1) => arctan2_on_columns(y, x),42(len_a, len_b) if len_a == len_b => arctan2_on_columns(y, x),43_ => polars_bail!(44ComputeError:45"y shape: {} in `arctan2` expression does not match that of x: {}",46y_len, x_len,47),48}49}5051fn arctan2_on_columns(y: &Column, x: &Column) -> PolarsResult<Column> {52use DataType::*;53match y.dtype() {54#[cfg(feature = "dtype-f16")]55Float16 => {56let y_ca: &ChunkedArray<Float16Type> = y.f16().unwrap();57arctan2_on_floats(y_ca, x)58},59Float32 => {60let y_ca: &ChunkedArray<Float32Type> = y.f32().unwrap();61arctan2_on_floats(y_ca, x)62},63Float64 => {64let y_ca: &ChunkedArray<Float64Type> = y.f64().unwrap();65arctan2_on_floats(y_ca, x)66},67_ => {68let y = y.cast(&DataType::Float64)?;69arctan2_on_columns(&y, x)70},71}72}7374fn arctan2_on_floats<T>(y: &ChunkedArray<T>, x: &Column) -> PolarsResult<Column>75where76T: PolarsFloatType,77T::Native: Float,78ChunkedArray<T>: IntoColumn,79{80let dtype = T::get_static_dtype();81let x = x.cast(&dtype)?;82let x = y83.unpack_series_matching_type(x.as_materialized_series())84.unwrap();8586Ok(broadcast_binary_elementwise(y, x, |yv, xv| Some(yv?.atan2(xv?))).into_column())87}8889fn apply_trigonometric_function_to_float<T>(90ca: &ChunkedArray<T>,91trig_function: IRTrigonometricFunction,92) -> PolarsResult<Column>93where94T: PolarsFloatType,95T::Native: Float,96ChunkedArray<T>: IntoColumn,97{98match trig_function {99IRTrigonometricFunction::Cos => cos(ca),100IRTrigonometricFunction::Cot => cot(ca),101IRTrigonometricFunction::Sin => sin(ca),102IRTrigonometricFunction::Tan => tan(ca),103IRTrigonometricFunction::ArcCos => arccos(ca),104IRTrigonometricFunction::ArcSin => arcsin(ca),105IRTrigonometricFunction::ArcTan => arctan(ca),106IRTrigonometricFunction::Cosh => cosh(ca),107IRTrigonometricFunction::Sinh => sinh(ca),108IRTrigonometricFunction::Tanh => tanh(ca),109IRTrigonometricFunction::ArcCosh => arccosh(ca),110IRTrigonometricFunction::ArcSinh => arcsinh(ca),111IRTrigonometricFunction::ArcTanh => arctanh(ca),112IRTrigonometricFunction::Degrees => degrees(ca),113IRTrigonometricFunction::Radians => radians(ca),114}115}116117fn cos<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>118where119T: PolarsFloatType,120T::Native: Float,121ChunkedArray<T>: IntoColumn,122{123Ok(ca.apply_values(|v| v.cos()).into_column())124}125126fn cot<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>127where128T: PolarsFloatType,129T::Native: Float,130ChunkedArray<T>: IntoColumn,131{132Ok(ca.apply_values(|v| v.tan().powi(-1)).into_column())133}134135fn sin<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>136where137T: PolarsFloatType,138T::Native: Float,139ChunkedArray<T>: IntoColumn,140{141Ok(ca.apply_values(|v| v.sin()).into_column())142}143144fn tan<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>145where146T: PolarsFloatType,147T::Native: Float,148ChunkedArray<T>: IntoColumn,149{150Ok(ca.apply_values(|v| v.tan()).into_column())151}152153fn arccos<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>154where155T: PolarsFloatType,156T::Native: Float,157ChunkedArray<T>: IntoColumn,158{159Ok(ca.apply_values(|v| v.acos()).into_column())160}161162fn arcsin<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>163where164T: PolarsFloatType,165T::Native: Float,166ChunkedArray<T>: IntoColumn,167{168Ok(ca.apply_values(|v| v.asin()).into_column())169}170171fn arctan<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>172where173T: PolarsFloatType,174T::Native: Float,175ChunkedArray<T>: IntoColumn,176{177Ok(ca.apply_values(|v| v.atan()).into_column())178}179180fn cosh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>181where182T: PolarsFloatType,183T::Native: Float,184ChunkedArray<T>: IntoColumn,185{186Ok(ca.apply_values(|v| v.cosh()).into_column())187}188189fn sinh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>190where191T: PolarsFloatType,192T::Native: Float,193ChunkedArray<T>: IntoColumn,194{195Ok(ca.apply_values(|v| v.sinh()).into_column())196}197198fn tanh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>199where200T: PolarsFloatType,201T::Native: Float,202ChunkedArray<T>: IntoColumn,203{204Ok(ca.apply_values(|v| v.tanh()).into_column())205}206207fn arccosh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>208where209T: PolarsFloatType,210T::Native: Float,211ChunkedArray<T>: IntoColumn,212{213Ok(ca.apply_values(|v| v.acosh()).into_column())214}215216fn arcsinh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>217where218T: PolarsFloatType,219T::Native: Float,220ChunkedArray<T>: IntoColumn,221{222Ok(ca.apply_values(|v| v.asinh()).into_column())223}224225fn arctanh<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>226where227T: PolarsFloatType,228T::Native: Float,229ChunkedArray<T>: IntoColumn,230{231Ok(ca.apply_values(|v| v.atanh()).into_column())232}233234fn degrees<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>235where236T: PolarsFloatType,237T::Native: Float,238ChunkedArray<T>: IntoColumn,239{240Ok(ca.apply_values(|v| v.to_degrees()).into_column())241}242243fn radians<T>(ca: &ChunkedArray<T>) -> PolarsResult<Column>244where245T: PolarsFloatType,246T::Native: Float,247ChunkedArray<T>: IntoColumn,248{249Ok(ca.apply_values(|v| v.to_radians()).into_column())250}251252253