ここまででできたことをまとめてみる。
少ないがまとめてしまうとこんなものだろう。「詳解」の本では、この後読み込んだ点列を題材に平均や分散などの基本的な量を解説している。ちょうどDataFrameの使い方に慣れるいい機会なので再現してみる。
Seriesにある演算を用いるならば次のようになる。
let mean: f64 = df.column("lidar").unwrap().mean().unwrap();
いちいちunwrapが挟まるのが面倒臭い。一方点列の和を求めて全体の長さで割るという求め方は以下のようになる。
let lidar = df.column("lidar").unwrap()
let sum: i64 = lidar.sum().unwrap();
let mean = (sum as f64) / (lidar.len() as f64);
f64にキャストする必要がある。
分散を求めるメソッドはSeriesにはないようだった。定義に従って実装してみる。まず、平均を引いて2乗する。
// meanは既に求めてあるとする。
let diff_square: Series = lidar // 型をつける必要あり
.i64()
.unwrap()
.into_iter()
.map(|opt_x| match opt_x {
Some(x) => Some(((x as f64) - mean).powi(2)),
None => None,
})
.collect();
単純な操作なのに結構長い・・・何かいいやり方があるのかもしれないがわからない。into_iter.map
の結果はOption
なのでこういう風にmatch
を使ってやるといいらしい。Rustらしい書き方なんだろうか?
f64
にはpow
がなく代わりにint
を引数に取るpowi
とfloatを引数に取るpowf
があるらしい。この辺りはドキュメントを読んだら書いてあった。
into_iter().map().collect()
のパターンでSeries
になるらしい。この手のはお作法として覚えることなんだろう。
diff_squareがもとまっていれば、不偏分散も標本分散も求められる。
let sum_diff_square: f64 = diff_square.sum().unwrap();
let sample_var: f64 = sum_diff_square / (lidar.len() as f64);
let unbiased_var: f64 = sum_diff_square / ((lidar.len() as f64) - 1.0);