Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-ops/src/series/ops/eager.rs
6939 views
1
use polars_core::prelude::DataType;
2
use polars_core::series::Series;
3
use polars_error::PolarsResult;
4
5
pub trait ShrinkType {
6
fn shrink_type(&self) -> PolarsResult<Series>;
7
}
8
9
impl ShrinkType for Series {
10
fn shrink_type(&self) -> PolarsResult<Series> {
11
if !self.dtype().is_primitive_numeric() {
12
return Ok(self.clone());
13
}
14
15
if self.dtype().is_float() {
16
return self.cast(&DataType::Float32);
17
}
18
19
if self.dtype().is_unsigned_integer() {
20
let max = self.max_reduce()?.value().extract::<u64>().unwrap_or(0_u64);
21
22
if cfg!(feature = "dtype-u8") && max <= u8::MAX as u64 {
23
self.cast(&DataType::UInt8)
24
} else if cfg!(feature = "dtype-u16") && max <= u16::MAX as u64 {
25
self.cast(&DataType::UInt16)
26
} else if max <= u32::MAX as u64 {
27
self.cast(&DataType::UInt32)
28
} else {
29
Ok(self.clone())
30
}
31
} else {
32
let min = self.min_reduce()?.value().extract::<i64>().unwrap_or(0_i64);
33
let max = self.max_reduce()?.value().extract::<i64>().unwrap_or(0_i64);
34
35
if cfg!(feature = "dtype-i8") && min >= i8::MIN as i64 && max <= i8::MAX as i64 {
36
self.cast(&DataType::Int8)
37
} else if cfg!(feature = "dtype-i16")
38
&& min >= i16::MIN as i64
39
&& max <= i16::MAX as i64
40
{
41
self.cast(&DataType::Int16)
42
} else if min >= i32::MIN as i64 && max <= i32::MAX as i64 {
43
self.cast(&DataType::Int32)
44
} else {
45
Ok(self.clone())
46
}
47
}
48
}
49
}
50
51