Path: blob/main/crates/polars-core/src/series/ops/null.rs
6940 views
use arrow::bitmap::Bitmap;1use arrow::buffer::Buffer;2use arrow::offset::OffsetsBuffer;34#[cfg(feature = "object")]5use crate::chunked_array::object::registry::get_object_builder;6use crate::prelude::*;78impl Series {9pub fn full_null(name: PlSmallStr, size: usize, dtype: &DataType) -> Self {10// match the logical types and create them11match dtype {12DataType::List(inner_dtype) => {13ListChunked::full_null_with_dtype(name, size, inner_dtype).into_series()14},15#[cfg(feature = "dtype-array")]16DataType::Array(inner_dtype, width) => {17ArrayChunked::full_null_with_dtype(name, size, inner_dtype, *width).into_series()18},19#[cfg(feature = "dtype-categorical")]20dt @ (DataType::Categorical(_, _) | DataType::Enum(_, _)) => {21with_match_categorical_physical_type!(dt.cat_physical().unwrap(), |$C| {22CategoricalChunked::<$C>::full_null_with_dtype(23name,24size,25dtype.clone()26)27.into_series()28})29},30#[cfg(feature = "dtype-date")]31DataType::Date => Int32Chunked::full_null(name, size)32.into_date()33.into_series(),34#[cfg(feature = "dtype-datetime")]35DataType::Datetime(tu, tz) => Int64Chunked::full_null(name, size)36.into_datetime(*tu, tz.clone())37.into_series(),38#[cfg(feature = "dtype-duration")]39DataType::Duration(tu) => Int64Chunked::full_null(name, size)40.into_duration(*tu)41.into_series(),42#[cfg(feature = "dtype-time")]43DataType::Time => Int64Chunked::full_null(name, size)44.into_time()45.into_series(),46#[cfg(feature = "dtype-decimal")]47DataType::Decimal(precision, scale) => Int128Chunked::full_null(name, size)48.into_decimal_unchecked(*precision, scale.unwrap_or(0))49.into_series(),50#[cfg(feature = "dtype-struct")]51DataType::Struct(fields) => {52let fields = fields53.iter()54.map(|fld| Series::full_null(fld.name().clone(), size, fld.dtype()))55.collect::<Vec<_>>();56let ca = StructChunked::from_series(name, size, fields.iter()).unwrap();5758if !fields.is_empty() {59ca.with_outer_validity(Some(Bitmap::new_zeroed(size)))60.into_series()61} else {62ca.into_series()63}64},65DataType::BinaryOffset => {66let length = size;6768let offsets = vec![0; size + 1];69let array = BinaryArray::<i64>::new(70dtype.to_arrow(CompatLevel::oldest()),71unsafe { OffsetsBuffer::new_unchecked(Buffer::from(offsets)) },72Buffer::default(),73Some(Bitmap::new_zeroed(size)),74);7576unsafe {77BinaryOffsetChunked::new_with_dims(78Arc::new(Field::new(name, dtype.clone())),79vec![Box::new(array)],80length,81length,82)83}84.into_series()85},86DataType::Null => Series::new_null(name, size),87DataType::Unknown(kind) => {88let dtype = kind.materialize().unwrap_or(DataType::Null);89Series::full_null(name, size, &dtype)90},91#[cfg(feature = "object")]92DataType::Object(_) => {93let mut builder = get_object_builder(name, size);94for _ in 0..size {95builder.append_null();96}97builder.to_series()98},99_ => {100macro_rules! primitive {101($type:ty) => {{ ChunkedArray::<$type>::full_null(name, size).into_series() }};102}103macro_rules! bool {104() => {{ ChunkedArray::<BooleanType>::full_null(name, size).into_series() }};105}106macro_rules! string {107() => {{ ChunkedArray::<StringType>::full_null(name, size).into_series() }};108}109macro_rules! binary {110() => {{ ChunkedArray::<BinaryType>::full_null(name, size).into_series() }};111}112match_dtype_to_logical_apply_macro!(dtype, primitive, string, binary, bool)113},114}115}116}117118119