1.PythonでExcelの巨大ファイルを扱う際に1000倍高速化する方法(1/2)まとめ
・ビジネスではExcelでファイルが共有される事が多いがPythonはExcelファイルでは特に低速
・Excelファイルを保存する際にCSVで保存するだけでかなり読み込み速度が向上する
・個々のファイルを1つのデータフレームに読み込むより個別のデータフレームに読む方が早い
2.pythonでExcelを直接読み込もうとするととても遅い
以下、www.kdnuggets.comより「Do You Read Excel Files with Python? There is a 1000x Faster Way」の意訳です。元記事は2021年9月にゴールドランクを獲得していた人気記事で、Nicolas Vandeputさんによる投稿です。
ありがちなシュチエーションで、Excelを直接読み込むのは相当遅くなるだろうと検討はつきましたが、ここまで差が出るとは知りませんでした。
アイキャッチ画像のクレジットはPhoto by Hidde van Esch on Unsplash
Pythonユーザーとして、私はExcelファイルを使用してデータをロード/保存します。これは、ビジネスマンがExcelまたはcsv形式でデータを共有することを好むためです。 残念ながら、PythonはExcelファイルでは特に低速です。
この記事では、Pythonでデータを読み込む5つの方法を紹介します。 最終的には、3桁のスピードアップを達成します。 非常に高速になります。
追記:更に5倍速くする方法を見つけました(5000倍のスピードアップになります)。 記事の最後にボーナスとして追加しました。
実験環境のセットアップ
20000行25列(合計で約70MB)のExcelファイルを10ファイル、読み込むとします。 これは、トランザクションデータをERP(SAP)からPythonにロードして、分析を実行する際の代表的なケースです。
以下のダミーデータを入力して、必要なライブラリをインポートしましょう。(pickleとjoblibについてはこの記事の後半で説明します)。
import pandas as pd import numpy as np from joblib import Parallel, delayed import time for file_number in range(10): values = np.random.uniform(size=(20000,25)) pd.DataFrame(values).to_csv(f"Dummy {file_number}.csv") pd.DataFrame(values).to_excel(f"Dummy {file_number}.xlsx") pd.DataFrame(values).to_pickle(f"Dummy {file_number}.pickle")
Pythonでデータをロードする5つの方法
アイデア#1:PythonでExcelファイルをロードする
これらのファイルをロードする簡単な方法から始めましょう。最初にPandasデータフレームを作成してから、各Excelファイルを追加します。
start = time.time() df = pd.read_excel("Dummy 0.xlsx") for file_number in range(1,10): df.append(pd.read_excel(f"Dummy {file_number}.xlsx")) end = time.time() print("Excel:", end - start)
PythonでExcelファイルをインポートする簡単な方法。
実行には約50秒かかります。 かなり遅いですね。(訳注:無印 Colabで45秒でした)
アイデア#2:ExcelファイルではなくCSVを使用する
これらのファイルをERP/システム/SAPから(.xlsx形式ではなく).csv形式で保存したと想像してみましょう。
start = time.time() df = pd.read_csv("Dummy 0.csv") for file_number in range(1,10): df.append(pd.read_csv(f"Dummy {file_number}.csv")) end = time.time() print("CSV:", end - start)
Pythonのcsvファイルインポートは、Excelファイルよりも100倍高速です。
ファイルを0.63秒でロードできるようになりました。これは約10倍高速です。
(訳注:無印 Colabで1.2787秒でした)
短所:csvファイルはほとんどの場合.xlsxファイルよりも大きくなります。この例では、.csvファイルは9.5MBですが、.xlsxは6.4MBです。
アイデア#3:よりスマートにPandasのDataFrameを作成
PandasのDataFrameの作成方法を変更することで、プロセスをスピードアップできます。 各ファイルを既存のDataFrameに追加する代わりに、各DataFrameを個別にリストにロードします。
次に、リスト全体を単一のDataFrameに連結します。
start = time.time() df = [] for file_number in range(10): temp = pd.read_csv(f"Dummy {file_number}.csv") df.append(temp) df = pd.concat(df, ignore_index=True) end = time.time() print("CSV2:", end - start)
Pythonでcsvファイルをインポートするためのよりスマートな方法
時間を数パーセント短縮しました。 私の経験に基づくと、このトリックは、より大きなデータフレーム(df >> 100MB)を扱うときに役立ちます。
(訳注:無印 Colabで1.2703秒でした)
3.PythonでExcelの巨大ファイルを扱う際に1000倍高速化する方法(1/2)関連リンク
1)www.kdnuggets.com
Do You Read Excel Files with Python? There is a 1000x Faster Way