ここまででできたことをまとめてみる。

少ないがまとめてしまうとこんなものだろう。「詳解」の本では、この後読み込んだ点列を題材に平均や分散などの基本的な量を解説している。ちょうど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);