【コピペで動く!】Pythonで1.5GBのcsvファイル読み込み高速化:1分5秒⇒4秒程度 DASK , pickle (Pythonコードあり)

スポンサーリンク
投資

PythonでのCSV読み込みの高速化についてのご紹介します。読み込むデータは株価データなど、時系列データを今回は利用します。

2019/04/23 に note で書いた記事になります。

Pythonのcsvファイル読み込みが1分30秒かかっていたものが1秒未満でできます。 DASK pickle (Pythonコードあり)|TF|note
ーーーーーーーーーーー2021/07/28 追記ーーーーーーーーーーー Pythonの一部仕様変更などでうまく動いていなかった部分を新しいサイトでは修正しました。 今後適宜修正や改修を行おうとは思いますが、すべてを改修できるわけではないことはご承知おきください。 2021/07/28時点では動いていることは確認して...

ハードウェアの進化や機能の深化でかかる時間などが、変わっていました。
現在の環境での状況を改めて報告したいと思います。

2021/07/25時点で以下のコードはエラーなく動いていることを確認しています。

追記2022/05/13:Python高速化! for文は遅いので、”これ”を使うと30倍早いですよ!【コピペで動く!】という記事を書きました。

この記事を読むことで、csvファイル読み込みで1分5秒かかっていたものが4秒程度でデータを読み込めるようになります。大幅な速度・パフォーマンスの向上が期待できます。以下がその結果です。

読み込み時間 Wall time: 1 min 5 sec
読み込み時間 Wall time: 4 sec

今まで、Python 遅い と思っていたものが、こんなに早くなる と驚くことになるのではないでしょうか。使い方によってはすごく速くなります。

内容

Pythonでの作業の効率化の小技で、並列DataFrame処理で有名なDASKとオブジェクト保存のpickleを紹介します。以下の記事で、初心者、ビギナーの方が、Pythonを使ってcsvファイルの読み込みの速度・パフォーマンスを改善・向上することができます。
いわゆる時間のかかる前処理を”爆速化・高速化”し、分析の方により注力し、開発効率をあげるための小技の紹介になります。

今回の処理速度の計測には %%time というJupyter Notebook マジックコマンドを利用しています。

まず、DASKですが、基本的には並列処理・分散処理を行う分析ライブラリですが、私はcsvファイルの読み込みに使っています。調べるとメモリの使用量を抑えながら並列処理できるようなのですが、頻繁に使って、かつ時間がかかっているデータロードを高速化するために使っています。

解析には自分のPC(Windows10)の環境を利用しました。

では、実際の使用例を以下に示します。まずファイルの状況をまず、確認します。

import os

print(os.path.getsize('./out.csv'))

1564369691
約1.5GBのファイルを読み込んでみたいと思います。

%%time 
import pandas as pd

input_file_csv = "./out.csv"
df_csv=pd.read_csv(input_file_csv, encoding='utf-8',index_col=0,parse_dates=True) 
display(df_csv.tail())
print(df_csv.info())

読み込み時間 Wall time: 1 min 5 sec

約900万行のデータで、読み込むのに1分5秒程度かかっています。
このようなファイルがたくさんあったり、毎回この作業をするのはちょっと、、というような場合があります。その時こそ、DASKです。

DASKのコードは以下の通りです。

%%time
import dask.dataframe as ddf
import dask.multiprocessing

df_dask = ddf.read_csv(input_file_csv,parse_dates=True,
    dtype={'C': 'float64',
           'H': 'float64',
           'L': 'float64',
           'O': 'float64',
           'PBR': 'float64',
           'PER': 'float64',
           '後場寄り': 'float64',
           '大引け': 'float64'})
df_dask = df_dask.compute()
display(df_dask.tail())
print(df_dask.info())

読み込み時間 Wall time: 18 sec

同じファイルの読み込みに19秒です。高速化成功です。
これならもう少し大きなファイルでデータをもらうようなことがあっても、データの下準備や前処理ではなく、データ解析のほうに自分の時間が使えそうです。

さらに大きなファイルやデータの場合はpickleを使うと便利です。
たとえば、大きなデータを解析していて、翌日に同じところから始めたいと思うようなことがあります。折角時間をかけてデータロードしたDataFrameも明日の朝に再度データロードからやり直しかと思うとちょっと気が重いですよね、、でも、pickleがあれば大丈夫です。

使い方は簡単で、DataFrameをpicleファイルに保存して、それを使いたいときに読み込めばいいのです。使い方は以下の通りです。

import pickle
df_csv.to_pickle('./dataout_out.pickle')
print(os.path.getsize('./dataout_out.pickle'))

1696888267
約1.7GBのファイルにDataFrameの内容が書き出されます。明日の朝と思いながらそのファイルを読み込んでみましょう。

%%time
import pickle
with open('./dataout_out.pickle', mode='rb') as fp :
    df_pickle = pickle.load(fp)
display(df_pickle.info())

読み込み時間 Wall time:4 sec

なんと、4秒です。通常のcvsファイルの読み込みから比べるとあっという間ですね。データの種類や構造・サイズによって変わるとは思いますが、効率の明らかな改善が見込まれる場合など、これを使わない手はないです。

二つのモジュールとももっといろいろな機能があるようですが、とりあえず、簡単に作業効率を上げられる小技でした。


この記事が今後の投資活動において、お役に立つことを願っています。

この部分はどうなのか、ここを知りたいのだが、、というような希望があればご連絡いただければ幸いです。すべてにこたえられるかは分かりませんが、是非前向きに検討してみようと思います。

また、短い文でも構いませんので、感想などいただけるとモチベーションの向上、今後の改善への励みになりますので、是非ともよろしくお願いいたします。

最後まで読んでいただき、大変ありがとうございました。

関連記事:

Python高速化! for文は遅いので、”これ”を使うと30倍早いですよ!【コピペで動く!】

---

Python・投資関係

Python高速化! for文は遅いので、”これ”を使うと30倍早いですよ!【Google ColabのPython:コピペで動く!】
【コピペで動く!】Pythonで1.5GBのcsvファイル読み込み高速化:1分5秒⇒4秒程度 DASK , pickle (Pythonコードあり)
デコピコミンが全国(47都道府県)で、どの施設に出てくるか地図(Google Maps)で確認!!【ピクミン ブルーム(Pikmin Bloom)】
Windows10で機械学習環境チェック CPU/GPUでTensorflowの作業時間はどのくらい違うのか、Google Colabとも比較してみた。(CUDA Toolkit,cuDNN)
【解決】Google ColabのPythonでエクセル(Excel)ファイルやCSVファイルに出力・入力する方法【コピペで動く!】
【コピペで動く!】Google ColabでPython を用いての 効率的フロンティア と ポートフォリオの最適化 Efficient Frontier & Portfolio Optimization with Python [Part 2/2]
【解決】スクレイピングでHTTP Error 403: Forbiddenでアクセスできないときに試すべき方法【コピペで動く!】【Google Colab:Python:pd.read_html,selenium】
【コピペで動く!】20行で資産運用モデル作成 Google ColabのPythonで 米国株の株価を取得し、グラフ・チャートを表示
株価時系列データを分析する上で正規化を行う事の重要性について紹介する【違いをみつけろ!】
ConoHa WINGレンタルサーバーでPython! Webアプリcgiを動かす手順を紹介!3つの例あり【コピペで動く!】
Google Analytics にPython APIで接続してみた話【コピペで動く!】
【コピペで動く!】IB証券(インタラクティブ・ブローカーズ証券 )へのPythonでのAPI接続 ib_insync [自分が使っているPythonコード]
Google Data Portalを使ってWeb上のオープンデータを使って簡単に情報を可視化しようという話
Google ColabでYouTube動画を開始・終了の時間を指定してPythonでダウンロード(音声・動画両方対応)【コピペで動く!】
過去50年間のS&P500の季節性の値動きから負けにくいポジション構築はできるのか考える・大統領選挙のアノマリー対応!【コピペで動く!】Google ColabのPythonで自分で調べてみよう!

IB証券

【コピペで動く!】Pythonで1.5GBのcsvファイル読み込み高速化:1分5秒⇒4秒程度 DASK , pickle (Pythonコードあり)
【コピペで動く!】レイ・ダリオ推奨「オール・ウェザー戦略」をETFで構築するには? ETFの手軽さとそのパフォーマンスの高さとは!【違いをみつけろ!】
【コピペで動く!】Google ColabでPython を用いての 効率的フロンティア と ポートフォリオの最適化 Efficient Frontier & Portfolio Optimization with Python [Part 2/2]
【解決】スクレイピングでHTTP Error 403: Forbiddenでアクセスできないときに試すべき方法【コピペで動く!】【Google Colab:Python:pd.read_html,selenium】
【コピペで動く!】20行で資産運用モデル作成 Google ColabのPythonで 米国株の株価を取得し、グラフ・チャートを表示
米国債のゼロクーポン債STRIPSについてのメモ
株価時系列データを分析する上で正規化を行う事の重要性について紹介する【違いをみつけろ!】
【コピペで動く!】IB証券(インタラクティブ・ブローカーズ証券 )へのPythonでのAPI接続 ib_insync [自分が使っているPythonコード]
自動化・効率化でなにができるのか!Google FinanceやYahoo Financeからデータ取得して年初来パフォーマンスや週次騰落率のファクターチェック
過去50年間のS&P500の季節性の値動きから負けにくいポジション構築はできるのか考える・大統領選挙のアノマリー対応!【コピペで動く!】Google ColabのPythonで自分で調べてみよう!

コメント

タイトルとURLをコピーしました