【python】Jupyter-notebook + pandas + multiprocessing(Pool)を動かす方法【pandas】 メモ


目的

  • 大量のcsvデータを分析するために、データをたくさん読み込む必要があった
  • ループを回すと遅すぎてイライラしました。

問題

  • Jupyter-notebookでmultiprocessing(Pool)を利用したpandasのread_csvの並列化ができない。
  • このへんとかこのへんにも、同様のことが書いてあった。
  • Windows機のみで起こる問題らしい?

結論

  • 回避策は、関数をfunc.pyとして保存し、Jupyter-notebookでimportする。

NG例

  • 最終セルが終わらない。(そもそも始まってない?)

OK例

  1. .ipynbと同じフォルダにfunc.pyとして丸ごとコピーする
  2. __init__.pyファイルを置く
  3. 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で作ります。