目的
- 大量のcsvデータを分析するために、データをたくさん読み込む必要があった
- ループを回すと遅すぎてイライラしました。
問題
- Jupyter-notebookでmultiprocessing(Pool)を利用したpandasのread_csvの並列化ができない。
- このへんとかこのへんにも、同様のことが書いてあった。
- Windows機のみで起こる問題らしい?
結論
- 回避策は、関数を
func.py
として保存し、Jupyter-notebookでimportする。
NG例
OK例
-
.ipynb
と同じフォルダにfunc.py
として丸ごとコピーする -
__init__.py
ファイルを置く - Jupyter-notebook上で、funcをimportして実行する
func.py
import pandas as pd
import os,glob
from datetime import datetime as dt
from multiprocessing import Pool
FOLDER_PATH = r'folder_path\\'
FILE_TYPE = r'*.csv'
FILE_FORMAT = 'Report_%Y%m%d.csv'
def read_report_to_dataframe():
# ファイルパスをリスト化
csv_pathlist = glob.glob(FOLDER_PATH + FILE_TYPE)
with Pool(os.cpu_count()) as p:
df = pd.concat(p.map(read_report, csv_pathlist))
return df
# report読み込み
def read_report(csv_path):
separator_list = [';',',']
for sep in separator_list:
df = pd.read_csv(filepath_or_buffer=csv_path,
engine='python',
parse_dates=[0],
index_col=[0],
skiprows=[1],
nrows=96,
sep=sep)
# データフレームが空か確認
if not df.empty:
break
return df
- jupyter-notebookの方で読みだして実行する。
jupyter-notebook
import func
func.read_report_to_dataframe()
まとめ
- jupyter-notebookやめて、pycharmで作ります。