広告 Python データの前処理

【python】大量のcsvファイルをpickleに保存して高速化

大量のcsvファイルを一度に読み込んでデータ解析したいな。
だけど、時間かかるし、面倒だからやめようかな。。

こんなお悩みを解決します。

どうも。こんにちは。
ケミカルエンジニアのこーしです。

本日は、「大量のcsvファイルをpickleに保存して高速化」についてわかりやすく解説します。

製造プロセスの時系列データや株価、気象データなど、同じ形式で大量にデータがある場合、それらを一度に処理したいことがよくあります。

しかし、それらを個別に扱うのは時間がかかりますし、再利用が難しい場合もあります。

そこで本記事では、Pythonを使って大量のCSVファイルを一度に読み込み、再読み込みを高速化する「pickleファイル」に保存する方法を解説します。

これにより、次回からのデータの取り扱いが迅速になり、データの前処理時間を大幅に削減することができます。

本記事の内容

・pickleファイルとは
・pythonコード

この記事を書いた人

プロフィール

こーし(@mimikousi)

大量のcsvファイル(例)

製造プロセスのデータを題材に考えましょう。

製造プロセスでは、温度計や流量計、圧力計などの数多くの計器を用いて、品質や収率を管理しています。

多くの測定値(1分や5分データ)がデータベースに保存されており、とても大きな容量になります。

例えば、100個の計器データを1分間隔で保存すると、1日で144,000点にもなります。

よって、数年分のデータをデータベースから抽出する際は、データが重くなりすぎないように1ヶ月や半年単位でデータを分離して行います。

大量のcsv

上図は1ヶ月単位でデータを分割した例です。

このように1つのフォルダに複数のcsvファイルが保存されている場合に、pythonを使って一括で処理する方法を解説します。

 

pythonコード

下記のコードにより、ディレクトリ(フォルダ)内にある全csvファイルをpandasで読み込んで結合できます。

そして、以後読み込みが速くなるようにpickleファイルにも保存しておきます。

import pandas as pd 
import glob # ファイル操作のためのglobライブラリをインポート

path = r"C:\path\to\your\data" # CSVファイルがあるディレクトリのパスを指定
all_files = glob.glob(path + "/*.csv") # 指定したディレクトリ内の全CSVファイルのパスを取得

df_ = pd.DataFrame() # 結合するための空のDataFrameを作成
for filename in all_files: # ディレクトリ内の各CSVファイルに対してループ
    df = pd.read_csv(filename, index_col=0, header=0, encoding='shift-jis') # CSVファイルを読み込み、DataFrameに変換
    df_ = pd.concat([df_, df], axis=0) # 読み込んだデータを結合

df_.to_pickle('total_dataframe.pkl') # 結合したデータをpickleファイルとして保存

pathの前に記載しているrは、'\n'や'\t'のような特別なエスケープシーケンスとして解釈されないように記載します。

つまり、pathに使われているバックスラッシュが別の意味で解釈されないためにrをpathの前に書いています。

index_colheaderencodingは取り扱うデータに合わせて微調整しましょう。

 

時系列データの場合(注意)

プロセスデータイメージ

上図のような時系列データの場合、日付(インデックス)のデータ型が'datetime'になっている必要があります。

よって、インデックスをdatetime型に変換し、さらに時系列順に並べ替えるコードを紹介します。

# インデックスをdatetime型に変換
df_.index = pd.to_datetime(df_.index)

# インデックスを時系列順に並べ替え
df_ = df_.sort_index()

# 必要であれば、結果を別のファイルに保存
df_.to_pickle('sorted_dataframe.pkl')

 

なぜpickle形式に変換するのか

結論、csvファイルを読み込むよりも圧倒的に速いからです。

読み込みに2分以上かかる重たいcsvファイルの場合、pickleファイルなら数秒で終わります。

【参考】Pandasでのデータ保存・読込速度を高速化したい(Pickle、Numpy、Dask比較)

 

csvファイルとpickleファイルの違い

csvファイルはテキスト形式で保存されるため、人間が読むことができます。

しかし、コンピュータが読むには数字や日付などを型変換する作業が必要になります。

一方、pickleファイルではコンピュータ専用の形式で保存されるため、読み込みが速くなります。

言い換えれば、CSVファイルは人間が読みやすい形式で、Pickleファイルはコンピュータが読みやすい形式ということになります。

よって、大量のデータを読み込む場合、Pickleファイルの方が速く読み込むことができます。

注意ポイント

pickleファイルはpython専用の形式であるため、pythonを使わない人に渡したりする際は注意が必要です。

また、信頼されていないソースからのpickleファイルの読み込みはセキュリティリスクをもたらすことがあります。

 

参考文献

Pythonによるデータ分析入門【第2版】

本書では、データ分析にまつわるpythonの基礎を学ぶことができます。

本記事では、「6章 データの読み込み、書き出しとファイル形式」を参考に執筆しました。

 

  • この記事を書いた人
  • 最新記事

こーし

■ケミカルエンジニア
■化学メーカー勤務
■現場配属の生産技術
■化学工学 × データサイエンス
pythonと数理統計学を勉強中!

-Python, データの前処理