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/index.rs
6939 views
1
use polars_core::error::{PolarsResult, polars_ensure};
2
use polars_core::prelude::arity::unary_elementwise_values;
3
use polars_core::prelude::{ChunkedArray, DataType, IDX_DTYPE, IdxCa, PolarsIntegerType, Series};
4
use polars_utils::index::ToIdx;
5
6
fn convert<T>(ca: &ChunkedArray<T>, target_len: usize) -> PolarsResult<IdxCa>
7
where
8
T: PolarsIntegerType,
9
T::Native: ToIdx,
10
{
11
let target_len = target_len as u64;
12
Ok(unary_elementwise_values(ca, |v| v.to_idx(target_len)))
13
}
14
15
pub fn convert_to_unsigned_index(s: &Series, target_len: usize) -> PolarsResult<IdxCa> {
16
let dtype = s.dtype();
17
polars_ensure!(dtype.is_integer(), InvalidOperation: "expected integers as index");
18
if dtype.is_unsigned_integer() {
19
let nulls_before_cast = s.null_count();
20
let out = s.cast(&IDX_DTYPE).unwrap();
21
polars_ensure!(out.null_count() == nulls_before_cast, OutOfBounds: "some integers did not fit polars' index size");
22
return Ok(out.idx().unwrap().clone());
23
}
24
match dtype {
25
DataType::Int64 => {
26
let ca = s.i64().unwrap();
27
convert(ca, target_len)
28
},
29
DataType::Int32 => {
30
let ca = s.i32().unwrap();
31
convert(ca, target_len)
32
},
33
#[cfg(feature = "dtype-i16")]
34
DataType::Int16 => {
35
let ca = s.i16().unwrap();
36
convert(ca, target_len)
37
},
38
#[cfg(feature = "dtype-i8")]
39
DataType::Int8 => {
40
let ca = s.i8().unwrap();
41
convert(ca, target_len)
42
},
43
_ => unreachable!(),
44
}
45
}
46
47