koji/メガネ男の日誌

日々の学び、活動状況を記録します。仕事のことは少なめ。

pandasよりも処理が速い(らしい)daskを使ってみた

f:id:kj_man666:20200407224216j:plain

仕事で重いcsvデータを扱う機会がありましたので、pandasよりも速い(らしい)daskを使ってみました。

ライブラリのインストールは以下のコマンドを入力。

dask のインストール後、ライブラリを回すとエラーが出て python -m pip install dask[dataframe] --upgrade を実行せよと出ましたので、これも実行。

python pip install dask
python -m pip install dask[dataframe] --upgrade

dask のライブラリのインポート。

pandas に比べ、心持ち長いですね。

import dask.dataframe as dd
import dask.multiprocessing

csv の読込は pandas と全く一緒ですね。 データに合わせてパラメーター sep(区切り文字の指定)や encoding(文字コード)を指定しましょう。

データの表示は、ddf.compute() という pandas では見慣れないものがあります。

こちらは処理を行うためのメソッドのようです。

なお、ddf = ddf.conpute() を入れてやらないと、DataFrame型として出力されませんでした。

この点は、read_csv()だけでDataFrame型が作成可能な pandas と違いますね。

参考 qiita.com

# csv の読込
ddf = dd.read_csv( "任意のデータのpath")

# 読み込んだデータの表示(すべての行を表示)
ddf = ddf.compute()

f:id:kj_man666:20200407225235p:plain

すべて実装されているわけではないようですが、一通りの pandas の機能は使えるようです。

参考 qiita.com

データの数字は適当なので、グラフもぐちゃぐちゃです、ご容赦ください。

# 折れ線グラフ
ddf.plot("def", "stq")

f:id:kj_man666:20200407225633p:plain

# グラフの細かい設定
ddf.plot(
        "def", "stq",
        title='Iris Data Set', # タイトル
        grid=True, # グリッド線の有無
        colormap='Accent', # 色
        legend=True, # 凡例の有無
        alpha=0.8) # 透過率

f:id:kj_man666:20200407225927p:plain

折れ線グラフ以外も出力可能です。

# 散布図
ddf.plot("def", "stq",kind="scatter")

f:id:kj_man666:20200407230617p:plain

要素の数値計算もできます。

# 合計、平均、最大値、最小値
print(ddf.sum(),ddf.mean(),ddf.max(),ddf.min())

f:id:kj_man666:20200407230732p:plain

カラムの要素同士を計算して、新しいカラムを作成することも可能です。

# 要素同士の計算
ddf["abcdef"] = ddf["abc"] * ddf["def"]
ddf

欠損値(NaN)の処理もできます。

# 欠損値のカウント
ddf.isnull().sum()

f:id:kj_man666:20200407230943p:plain

# データ型が数字の列のNaNを平均値で埋める
ddf = ddf.fillna(ddf.mean())

# 残ったデータ型が文字の列のNaNの行を削除する
ddf = ddf.dropna()

# 再び欠損値をカウント
ddf.isnull().sum()

f:id:kj_man666:20200407232456p:plain

軽く機械学習も回してみました。

データが適当に作ったものなので、スコアは全く振るいませんが…。

# サポートベクターマシン(回帰)
from sklearn.svm import SVR

# データ分割ライブラリ
from sklearn.model_selection import train_test_split

# 目的変数と説明変数の設定(仮 適当に決めてます
X = ddf[["def", "jkl", "mno", "pqr", "stq", "yz"]]
y = ddf["abc"]

# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

# SVR モデルの作成
model = SVR()

# モデルの学習
model.fit(X_train, y_train)

# モデルのスコア
model.score(X_test, y_test)

結果はひどいものですが、機械学習のモデルを回せることはわかりましたw

f:id:kj_man666:20200407232909p:plain

以上になります、最後までお読みいただきありがとうございました。

参考サイト

note.com

note.nkmk.me