PythonでExcelの巨大ファイルを扱う際に1000倍高速化する方法(1/2)

入門/解説

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

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