どりらんです。この記事はfintalk Advent Calendar 2019の11日目です。
ここのボスになんか書けと言われたので書きました。
pandasのようなテーブルデータ(DataFrame)を扱うライブラリです。Out-of-Core(メモリにのらない大きなデータ)を遅延処理で計算できるのが特徴です。
pandasの1000倍速いと言われており、シャア少佐もびっくりです。気になったのでちょろっと試してみました。金融ネタということで、今回は移動平均を算出してみます。
公式ドキュメントに書いてあるので割愛します。
時系列データを用意するのが大変なので、今回は乱数で代用します。
import numpy as np
import pandas as pd
import vaex
t = np.arange("1900-01-01", "2019-12-25", dtype=np.datetime64)
y = np.random.rand(len(t))
比較用にpandasのDataFrameを作成します。
df_pd = pd.DataFrame({"t": t, "y": y})
df_pd.head()
Vaexでは引数自体がカラム名となり、データを渡す形式のようです。
df_vaex = vaex.from_arrays(t=t, y=y)
df_vaex.head()
まずは、pandasで5日間の移動平均を算出してみます。
%timeit df_pd.rolling(5).mean()
Vaexにはrolling
に相当する関数がなさそうなので、groupby
メソッドで代用します。
%timeit df_vaex.groupby(vaex.BinnerTime(df_vaex["t"], "5D")).agg({"y": "mean"})
1000倍速くなるどころか、10倍遅くなってますね...このケースでは関係ないかもしれませんが、ファイルに書き出したほうがメモリの負担が少ないらしいので、HDF5にから読み込んで実行してみます。
df_vaex.export_hdf5("price.hdf5")
df_vaex_hdf5 = vaex.open("price.hdf5")
%timeit df_vaex_hdf5.groupby(vaex.BinnerTime(df_vaex_hdf5["t"], "5D")).agg({"y": "mean"})
この程度のデータ量だと、あまり意味がないかもしれません。
文字列の処理などは高速化するようですが、datetime型のデータがどこまで高速化されるかはよくわかってません。
当たり前ですが、pandasのほうが機能が豊富であり。同じことをOut-of-Core処理したいのであればDaskを使うのがよさそうです。
Vaexは公式ドキュメントのAPIリファレンスが不十分で、今回の時系列データのリサンプル方法を見つけるのも大変でした(週や月などの決まった期間は載っていました)。今後に期待したいところです。
Copyright © 2020 driller
Powered by miyadaiku