Open1

RustのPolarsでOption<f64>をSeriesやDataFrameに変換するときの罠

HaruiHarui

色々やった結果ぜんぜん「Polarsの罠」ではないことに気がついた。

まあ NaN != NaN であり、 Nan != x (for any double x) であり None == Noneであることに注意しましょうね。そしてNaNを不用意に埋め込まないようにしましょうねという感じ。
下のテストは全部パスする。

    #[test]
    fn test_polars() {
        let vec1: Vec<Option<f64>> = vec![Some(1.0), Some(2.0), Some(3.0), None, Some(5.0)];
        let vec2: Vec<Option<f64>> = vec1.clone();
        let vec3: Vec<Option<f64>> = vec![Some(1.0), Some(2.0), Some(3.0), Some(NAN), Some(5.0)];

        let ser1: Series = Series::new("ser", vec1);
        let ser2: Series = Series::new("ser", vec2);
        let ser3: Series = Series::new("ser", vec3.clone());
        let ser4: Series = Series::new("ser", vec3);

        assert!(ser1.series_equal_missing(&ser2));

        assert_eq!(ser1, ser2); // None == None

        assert_ne!(ser1, ser3); // None != Some(NAN)

        assert_ne!(ser3, ser4); // Some(NAN) != Some(NAN)
    }