2020年12月14日月曜日

Jupyter notebooks + Kotlin で移動平均を描画する(その2): krangl で csv データを操作する

このエントリは Fintalk Advent Calendar 2020 の14日目です。
今年は3つも割当たっているので、Covid-19 のデータで件数とその移動平均をグラフに描画する、というのを3回シリーズでやりたいと思います。


krangl は R の dplyr と Python の pandas を参考にした Kotlin のライブラリで、関数スタイルのデータ操作APIがあります。pandas と同じように表形式のデータのフィルタリングや変換、集約などができます。

krangl も Kotlin Jupyter Kernel にバンドルされていて一緒にインストール&セットアップがされているので %use krangl だけで使えます。

ざっくりした使い方は krangl の examples を実際にやってみるのがいいと思います。下に notebook で実行した結果を貼っておきます。



CSVから読み込む時は readCSV() を使います。 val df = DataFrame.readCSV("path/to/file") Covid-19 のデータを読み込むと、数字が入っているカラムに空のところがあるのでDoubleのパースに失敗します。
なので、デフォルトの ColType として String を指定して読み込みます。 val df = DataFrame.readCSV("owid-covid-data.csv", colTypes = mapOf(".default" to ColType.String))
schema() とか head() とか使えます。

日本データだけ出してみましょう。
日付と新規感染者数のデータだけにします。
新規感染者数が空のデータを省きます。
新規感染者数のデータを Double に変換します。
あとは移動平均を計算してグラフにするだけです。それはまた次回〜


2020年12月7日月曜日

Jupyter notebooks + Kotlin で移動平均を描画する(その1): lets-plot-kotlin で線を描画する

このエントリは Fintalk Advent Calendar 2020 の7日目です。
今年は3つも割当たっているので、Covid-19 のデータで件数とその移動平均をグラフに描画する、というのを3回シリーズでやりたいと思います。
Jupyter notebooks + python でやる方法はいっぱい情報があると思うので、ここでは Kotlin でやっていきます。


Kotlin + Jupyter notebooks については去年の Fintalk Advent Calendar のエントリとして書きました。
Kotlin + Jupyter notebooks で給与の額面から手取りを求めてみる

時間が経ってるので、今回の Kotlin + Jupyter notebooks のセットアップ手順を載せておきます。 $ python3 -m venv venv $ source venv/bin/activate (venv) $ pip install --upgrade pip setuptools (venv) $ pip install numpy scipy matplotlib Pillow ipython[all] (venv) $ pip install jupyter 以前の kotlin kernel が残っていたので venv の方をみるように一度削除 (venv) $ jupyter kernelspec list (venv) $ jupyter kernelspec uninstall kotlin (venv) $ pip install kotlin-jupyter-kernel (venv) $ jupyter notebook

グラフの描画には lets-plot-kotlin を使います。
Kotlin Jupyter Kernel にバンドルされていて一緒にインストール&セットアップがされているので %use lets-plot だけで使えます。 lets_plot(data) でプロットを作成し、これにレイヤーを追加していきます。

lets_plot() に渡すデータの型は Map<*, *> です。

例えばこんな感じ。 val data = mapOf( "x" to listOf(0, 1, 2, 3), "y" to listOf(1, 5, 2, 4) ) これは表にするとこういうデータに対応しています。

xy
01
15
22
34


点を描画するレイヤーを追加するには geom_point() を使います。

lambda(この中の this は PointMapping) で x軸、y軸のデータを Map の key 名で指定します。 %use lets-plot val data = mapOf( "x" to listOf(0, 1, 2, 3), "y" to listOf(1, 5, 2, 4) ) lets_plot(data) + geom_point(data, size=5) { x = "x"; y ="y" }


線を描画するレイヤーを追加するには geom_line() を使います。


点と線両方描画したいなら、両方のレイヤーを追加すればOKです。


2020年12月1日火曜日

mutableStateOf() の 3 つの使い方

val mutableState: MutableState<String> = mutableStateOf("") val v = mutableState.value mutableState.value = "1"

destructuring declaration val (value: String, setValue: (String) -> Unit) = mutableStateOf("") val v = value setValue("1")

delegate var value: String by mutableStateOf("") val v = value value = "1"