From 0d0a89825891aa88948d30ec1be29bdde9277451 Mon Sep 17 00:00:00 2001 From: Philippe Laflamme Date: Tue, 31 Jan 2023 09:26:28 -0500 Subject: [PATCH] feat: add DataType::Decimal128 --- polars/polars-core/src/datatypes/dtype.rs | 8 ++++++++ polars/polars-core/src/datatypes/mod.rs | 13 +++++++++++-- py-polars/src/conversion.rs | 1 + py-polars/src/datatypes.rs | 1 + py-polars/src/series.rs | 1 + 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/polars/polars-core/src/datatypes/dtype.rs b/polars/polars-core/src/datatypes/dtype.rs index f229301d752f..977a1c7697ff 100644 --- a/polars/polars-core/src/datatypes/dtype.rs +++ b/polars/polars-core/src/datatypes/dtype.rs @@ -15,6 +15,10 @@ pub enum DataType { Int64, Float32, Float64, + #[cfg(feature = "dtype-i128")] + /// Fixed point decimal type with precision and scale. + /// This is backed by 128 bits which allows for 38 significant digits. + Decimal128(Option<(usize, usize)>), /// String data Utf8, #[cfg(feature = "dtype-binary")] @@ -208,6 +212,8 @@ impl DataType { Int64 => ArrowDataType::Int64, Float32 => ArrowDataType::Float32, Float64 => ArrowDataType::Float64, + #[cfg(feature = "dtype-i128")] + Decimal128(_) => todo!(), Utf8 => ArrowDataType::LargeUtf8, #[cfg(feature = "dtype-binary")] Binary => ArrowDataType::LargeBinary, @@ -261,6 +267,8 @@ impl Display for DataType { DataType::Int64 => "i64", DataType::Float32 => "f32", DataType::Float64 => "f64", + #[cfg(feature = "dtype-i128")] + DataType::Decimal128(_) => "i128", DataType::Utf8 => "str", #[cfg(feature = "dtype-binary")] DataType::Binary => "binary", diff --git a/polars/polars-core/src/datatypes/mod.rs b/polars/polars-core/src/datatypes/mod.rs index 96dded32e0f4..e7ac00a0faf5 100644 --- a/polars/polars-core/src/datatypes/mod.rs +++ b/polars/polars-core/src/datatypes/mod.rs @@ -82,8 +82,6 @@ impl_polars_datatype!(Int8Type, Int8, i8); impl_polars_datatype!(Int16Type, Int16, i16); impl_polars_datatype!(Int32Type, Int32, i32); impl_polars_datatype!(Int64Type, Int64, i64); -#[cfg(feature = "dtype-i128")] -impl_polars_datatype!(Int128Type, Unknown, i128); impl_polars_datatype!(Float32Type, Float32, f32); impl_polars_datatype!(Float64Type, Float64, f64); impl_polars_datatype!(DateType, Date, i32); @@ -120,6 +118,17 @@ impl PolarsDataType for ListType { } } +#[cfg(feature = "dtype-i128")] +pub struct Int128Type {} + +#[cfg(feature = "dtype-i128")] +impl PolarsDataType for Int128Type { + fn get_dtype() -> DataType { + // we cannot know precision/scale statically + DataType::Decimal128(None) + } +} + #[cfg(feature = "object")] pub struct ObjectType(T); #[cfg(feature = "object")] diff --git a/py-polars/src/conversion.rs b/py-polars/src/conversion.rs index 575d69fbd14e..56eebe940bb9 100644 --- a/py-polars/src/conversion.rs +++ b/py-polars/src/conversion.rs @@ -281,6 +281,7 @@ impl ToPyObject for Wrap { DataType::UInt64 => pl.getattr("UInt64").unwrap().into(), DataType::Float32 => pl.getattr("Float32").unwrap().into(), DataType::Float64 => pl.getattr("Float64").unwrap().into(), + DataType::Decimal128(_) => todo!(), DataType::Boolean => pl.getattr("Boolean").unwrap().into(), DataType::Utf8 => pl.getattr("Utf8").unwrap().into(), DataType::Binary => pl.getattr("Binary").unwrap().into(), diff --git a/py-polars/src/datatypes.rs b/py-polars/src/datatypes.rs index 3e40787ce3e9..26a1c1b2f871 100644 --- a/py-polars/src/datatypes.rs +++ b/py-polars/src/datatypes.rs @@ -46,6 +46,7 @@ impl From<&DataType> for PyDataType { DataType::UInt64 => UInt64, DataType::Float32 => Float32, DataType::Float64 => Float64, + DataType::Decimal128(_) => todo!(), DataType::Boolean => Bool, DataType::Utf8 => Utf8, DataType::Binary => Binary, diff --git a/py-polars/src/series.rs b/py-polars/src/series.rs index 51758e0d0539..1c75a3eed603 100644 --- a/py-polars/src/series.rs +++ b/py-polars/src/series.rs @@ -666,6 +666,7 @@ impl PySeries { DataType::Int64 => PyList::new(py, series.i64().unwrap()), DataType::Float32 => PyList::new(py, series.f32().unwrap()), DataType::Float64 => PyList::new(py, series.f64().unwrap()), + DataType::Decimal128(_) => todo!(), DataType::Categorical(_) => { PyList::new(py, series.categorical().unwrap().iter_str()) }