解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python で Excel ファイルと csv ファイルを読み込む



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析をするにあたって、データの読み込みは避けて通れません。
データの読み込みはやはり速いに越したことはありません。

そこで、 pandas と dask の使い方と読み込み速度を比べてみました。



動作環境


Windows 7
・winpython 64bit 3.4.4



入力データ

読み込むデータは Excel で作成しました。

Excel の 10,48,576 行を全て使いました。

Data1 〜 Data4 は乱数で Data5 は Data1 〜 Data4 の合計です。

また、 Excel から csv 出力したファイルも作成しました。

図1 作成した入力データ



プログラム

ソースコード


###############################################################################
# Excel ファイルと csv ファイルを読み込み時間を計測するプログラム
###############################################################################
# インポート
from time import time
import pandas as pd
import dask.dataframe as dd
 
# 時間計測関数
def calc_time(func):
    start = time()
    r = func()
    return{'value':r, 'time':time()-start}
 
# 表題行 + 1,048,575 行のデータ
file_dir  = 'C:\\Users\\UserName\\Desktop\\'
file_name = 'driven_test'
 
csv = calc_time(lambda:pd.read_csv(file_dir + file_name + '.csv'))
print( 'pd.read_csv で読込にかかった時間 : ' + str(csv['time']) + ' sec')
 
xls = calc_time(lambda:pd.ExcelFile(file_dir + file_name + '.xlsx', encoding='utf-8'))
print( 'pd.ExcelFile で読込にかかった時間 : ' + str(xls['time']) + ' sec')
 
csv = calc_time(lambda:dd.read_csv(file_dir + file_name + '.csv', header=0))
print( 'dd.read_csv で読込にかかった時間 : ' + str(csv['time']) + ' sec')



結果

3 回分の実行結果を表示します。

100万行程度であれば、 csv ファイルは pandas でも実用に耐えると思います。

Excel をそのまま読み込むのはやめたほうがいいですね。

dask が噂通りものすごく速いという結果になりました。

1,000 万行、 1 億行といったデータを扱いたいなら dask ですね!


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/split_file0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
pd.read_csv で読込にかかった時間 : 1.8201038837432861 sec
pd.ExcelFile で読込にかかった時間 : 101.72981905937195 sec
dd.read_csv で読込にかかった時間 : 0.010999917984008789 sec
 
In [2]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/split_file0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
pd.read_csv で読込にかかった時間 : 1.755100965499878 sec
pd.ExcelFile で読込にかかった時間 : 102.36885499954224 sec
dd.read_csv で読込にかかった時間 : 0.009999990463256836 sec
 
In [3]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/split_file0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
pd.read_csv で読込にかかった時間 : 1.801103115081787 sec
pd.ExcelFile で読込にかかった時間 : 100.0787239074707 sec
dd.read_csv で読込にかかった時間 : 0.009999990463256836 sec



コメント

dask の速さは異常ですね。

読み込みがこれだけ速いと、処理は値の計算とグラフ出力の時間で決まる様なものですね。

グラフの出力の高速化について調べてみたくなりました。



以上