Dash + Dask

Dash + Dask

Daskは、メモリにのらないような大きなデータを扱う際によく使われるライブラリです。

主な特徴は、以下の通りです。

  • 並列処理・分散処理などを簡単に扱える。
  • Pythonでよく使われるライブラリ(NumPy、Pandas、Scikit-Learnなど)とかなり近いインターフェイスを提供している。
  • データを全てメモリに乗せず、ある単位でメモリに乗せたりして計算するので、通常Pandasなどでメモリに乗り切らない大きなデータセットでも扱える。

サンプル

DashでDaskを使った簡単なサンプルを作成します。

下記のファイルをダウンロードして、ソースコードと同じ位置に配置しておきます。

CSVデータ - https://gist.githubusercontent.com/chriddyp/5d1ea79569ed194d432e56108a04d188/raw/a9f9e8076b837d541398e999dcbac2b2826a81f8/gdp-life-exp-2007.csv

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import dash
from dash import dcc, html
import plotly.express as px
import dask.dataframe as dd

app = dash.Dash(__name__)

df = dd.read_csv('./gdp-life-exp-2007.csv')

def filter_df(pop_thresh):
filt_df = df[df["population"] > pop_thresh].compute()
return filt_df

def build_graphs():
pop_thresh = 5 * 10 ** 6
filt_df = filter_df(pop_thresh)

fig_out = px.scatter(filt_df, x="gdp per capita", y="life expectancy",
size="population", color="continent", hover_name="country",
log_x=True, size_max=60)
return fig_out

fig = build_graphs()

app.layout = html.Div([
dcc.Graph(
id='life-exp-vs-gdp',
figure=fig
)
])

if __name__ == '__main__':
app.run_server(debug=True)

読み込んだ元のデータフレーム(df) をフィルタリングして、filt_df を作成しています。(filter_df関数

元のデータ(df) は Dask DataFrammeでしたが、compute()メソッドPandas DataFrame に変換されています。(11行目)

この処理により、よりコンパクトなメモリ内オブジェクト(filt_df)を利用して図を作成することができます。

Dashを使うことにより計算コストの高い繰り返しを最小限に抑えることができます。

[ブラウザで表示]

平均寿命とGDPを表したバブルチャートを表示することができました。

指定した範囲を拡大表示したり、移動したり、凡例をクリックしデータの表示と非表示を切り替えたりすることが可能です。