h3ron_polars/algorithm/frame/
valid.rs1use crate::frame::H3DataFrame;
2use crate::{AsH3IndexChunked, Error, IndexValue};
3use polars::export::arrow::array::BooleanArray;
4use polars::prelude::{BooleanChunked, DataFrame, FromData};
5
6pub trait FilterH3IsValid {
7 fn filter_h3_is_valid<IX, S>(&self, index_column_name: S) -> Result<Self, Error>
8 where
9 Self: Sized,
10 IX: IndexValue,
11 S: AsRef<str>;
12}
13
14fn filter_h3_is_valid<IX>(df: &DataFrame, index_column_name: &str) -> Result<DataFrame, Error>
15where
16 IX: IndexValue,
17{
18 let indexchunked = df.column(index_column_name)?.u64()?.h3indexchunked::<IX>();
19 let ba = BooleanArray::from_data_default(indexchunked.validity_bitmap(), None);
20
21 Ok(df.filter(&BooleanChunked::from(ba))?)
22}
23
24impl FilterH3IsValid for DataFrame {
25 fn filter_h3_is_valid<IX, S>(&self, index_column_name: S) -> Result<Self, Error>
45 where
46 Self: Sized,
47 IX: IndexValue,
48 S: AsRef<str>,
49 {
50 filter_h3_is_valid::<IX>(self, index_column_name.as_ref())
51 }
52}
53
54impl<IX: IndexValue> H3DataFrame<IX> {
55 pub fn filter_h3_is_valid(&self) -> Result<Self, Error> {
56 filter_h3_is_valid::<IX>(self.dataframe(), self.h3index_column_name())
57 .map(|df| H3DataFrame::from_dataframe_nonvalidated(df, self.h3index_column_name()))
58 }
59}