Skip to content

Instantly share code, notes, and snippets.

@domitry
Last active August 29, 2015 14:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save domitry/b4b9822fcf5f69780e6a to your computer and use it in GitHub Desktop.
Save domitry/b4b9822fcf5f69780e6a to your computer and use it in GitHub Desktop.

DataFrameの開発による科学用途のgem開発の促進 中間報告

助成金の期間の内、中間報告までに以下の3つのgemにそれぞれコミットした。

Mikon

データ可視化ライブラリNyaplotのモジュールだったNyaplot::DataFrameを分離し独立したgem、Mikonとして公開した。

データストレージの切り替え

Nyaplot::DataFrameではデータストレージとしてRuby標準のArrayを使っていたが、MikonではSciRubyで開発されている多次元配列ライブラリNMatrixに切り替え高速化を図った。 これによりMikonはNMatrix v0.1.0以上に依存することとなったが、NMatrixは未だ不安定でNyaplotなど他のライブラリに依存させるには不安がある。 そこで最終報告までにNMatrixへの依存をなくした軽量版のリリースを予定している。

Statsampleとの互換性の確保

Mikonに統計ライブラリStatsampleのデータ構造と互換性のあるAPIを実装することで、StatSampleの持つ多くの統計関数をMikon::DataFrameに適応できるようにした。 1カラムとインデックスからなるデータ構造Mikon::SeriesStatSample::Vectorの互換性はほぼ完全であるが、それらをまとめたMikon::DataFrameStatSample::Datasetの互換性は不十分であり、重回帰分析などいくつかの統計関数は未だ適応できない。 こちらを最終報告までに実装し、互換性をより確かなものにする予定である。

column/row操作APIの実装

Mikonのデータ構造を簡単に操作するDSLを実装した。 例えばこのデータフレームから2012年度のデータを取り出すにはカラムの名前を用い、以下のようなコードを書く。

df1.select{year==2012}

その他にも試験的ではあるがpivot機能など様々なAPIを実装した。 詳細はIRuby notebookにまとめた。

可視化機能の実装

データ可視化用gem, NyaplotのAPIを内部で呼び出すことで、データフレームを可視化するメソッドを実装した。 例えば以下のコードで折れ線グラフを表示できる。

require 'mikon'
arr1 = ([0]*100).map{rand-0.5}.reduce([0.0]){|memo, val| memo.push(memo.last + val); memo}
arr2 = ([0]*100).map{rand-0.5}.reduce([0.0]){|memo, val| memo.push(memo.last + val); memo}
df = Mikon::DataFrame.new({a: arr1, b: arr2})
df.plot

現状では折れ線グラフ、ヒストグラム、箱ひげ図、散布図をサポートしている。 詳細はIRuby notebookにまとめた。

IRuby

IRubyはブラウザ上のフロントエンド・Pryを利用したバックエンドより構成されるRuby実行環境である。

中間報告までに、当初の計画より前倒しでWidgets機能をポーティングした。 これによってIRubyのフロントエンド・バックエンド間での双方向通信が可能になり、RubyでR言語のepivizrのようなGUIを実装する道を開いた。 参考として二重振り子の運動方程式をODE solverで解いた結果をリアルタイムにIRuby上で表示する例を挙げる。

Nyaplot

Nyaplot::DataFrameMikon::DataFrameに完全に切り替え、ヒストグラムなど計算部分をRubyで行うようにする予定であったが、IRuby::Widgetsの実装を優先しこちらは後回しとした。 こちらはMikonの軽量版を実装した後、最終報告までに完成させることとする。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment