hitochan007のブログ(Pythonの勉強ブログ)

★Pythonの勉強記録を中心に●インターネット、●パソコン、●グルメ、●愛犬(トイプードル) などについてのブログです


テーマ:
今日は雨。コロンの散歩もできないし、散髪に行くことにしました。

暇なので、pythonのデータ解析の情報収集をしていると、いろいろと知らないことが出てきました。それは、csvデータなどを読み込む方法として、csvモジョールよりも高速かつ簡単な方法があるとのこと。

それは、pandasモジョールを使う方法だそうです。ウェブの情報だと、numpyの読み込み方法より、10倍速そう。pandasの参考資料

本当かな?いっぺん試そう。

まずは、pandasモジュールのインストールから始めてみることにします。

インストールはこちらからどうぞ


私のpythonは3.4を使っているので「pandas-0.15.0.win32-py3.4.exe」をダウンロードしました。

これを実行してから、import pandas as pd でインポートすると、pytzモジュールがないとエラーがでてしまいました。

コマンドラインから pip install pytz で無事にpytzモジュールnインストールに成功。

(3月2日追記:piが使えるのであれば、最初から pip install pandas とやればpytzも自動的にインストールされるようです。pipは使えるようにした方がいいですね。pipのインスト-ル方法はこちらのリンクでどうぞ

いよいよテストプログラムですが、nekopuniさんのプログラムを使わせていただきました。
(nekopuniさんありがとうございます)→ こちらがnekopuniさんのブログページです

テストコードは以下のとおりです。

  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!Python3
# -*- coding: utf-8 -*-
import numpy as np #numpyライブラリー 数値計算
import pylab as plt
import csv
import pandas as pd
import time

#グラフタイトルのためのインポート文
from matplotlib.font_manager import FontProperties

csv.register_dialect('tab', delimiter='\t')
csv.register_dialect('comma', delimiter=',')

def csv_read(rfilename, dialect='comma'):
#――――――――――――――――――――――――――――――――――――――――
# csv module でcsvファイルを読み込む
#――――――――――――――――――――――――――――――――――――――――
data1=[]
data2=[]
f = open(rfilename, 'rt')
try:
reader = csv.reader(f, dialect)
for row in reader:
data2.append(row)
finally:
f.close()
#for w in data2:
# data1.append('\t'.join(w))
return data1,data2

def csv_write(wfilename,data,dialect='tab'):
#――――――――――――――――――――――――――――――――――――――――
# csv module でcsvファイルを読み込む
#――――――――――――――――――――――――――――――――――――――――
f = open(wfilename, 'wt')
try:
writer = csv.writer(f,quoting=csv.QUOTE_NONE,lineterminator='\n',dialect=dialect)
for x in range(len(data)):
writer.writerows([data[x]])
finally:
f.close()


def file_read_test():
data1,data2=csv_read('csv_write.dat',dialect='comma')
return data2

def file_write_test():
xy=[]
x=np.linspace(-np.pi,np.pi,2000000)
for r in x:
y=np.sin(r)
xy.append([r,y])
wfilename='csv_write.dat'
csv_write(wfilename,xy,dialect='comma')
return xy

def pandas_read_test():

filename='csv_write.dat'
#------------------------------------------------------------------------------
# Pandas - read_csv
#------------------------------------------------------------------------------
start = time.clock()
data_pd = pd.io.parsers.read_csv(filename, header = None, float_precision = "high").values
print ("Pandas - read_csv")
print (type(data_pd))
#print (data_pd)
print ("Elapsed: ", time.clock() - start, "\n")


#------------------------------------------------------------------------------
# Numpy - loadtxt with object dtype
#------------------------------------------------------------------------------
start = time.clock()
data_np1 = np.loadtxt(filename, delimiter = ",", dtype = object)
print ("Numpy - loadtxt with object dtype")
print (type(data_np1))
#print (data_np1)
print ("Elapsed: ", time.clock() - start, "\n")


#------------------------------------------------------------------------------
# Numpy - genfromtxt
#------------------------------------------------------------------------------
start = time.clock()
data_np2 = np.genfromtxt(filename, delimiter = ",", dtype = None)
data_np2 = np.array(data_np2.tolist(), dtype = object)
print ("Numpy - genfromtxt with object dtype")
print (type(data_np2))
#print (data_np2)
print ("Elapsed: ", time.clock() - start, "\n")


#------------------------------------------------------------------------------
# Numpy - genfromtxt with specified dtype
#------------------------------------------------------------------------------
start = time.clock()
#data_np3 = np.genfromtxt(filename, delimiter = ",", dtype = ("S6", int, "S8", float, float))
data_np3 = np.genfromtxt(filename, delimiter = ",", dtype = (float, float))
data_np3 = np.array(data_np3.tolist(), dtype = object)
print ("Numpy - genfromtxt with specified dtype")
print (type(data_np3))
#print (data_np3)
print ("Elapsed: ", time.clock() - start, "\n" )

if __name__ == "__main__":
data=[]
data=file_write_test()
data=np.array(data)

start = time.clock()
data2=[]
data2=file_read_test()
data2=np.array(data2)
print ("CSV - csv.reader")
print (type(data2))
print ("Elapsed: ", time.clock() - start, "\n" )

filename='csv_write.dat'
pandas_read_test()

#plt.plot(data2[:,0],data2[:,1],'-go')
#plt.show()

syntax2html


ちょっと長くなってしまいました。ごめんなさい。
このテストプログラムは、まずはcsvモジュールを使って、200万点のプロット用データを
生成します。サインカーブのデータを分割します。(51行目の分割数を変更すれば、もっと少ないデータ量のテストができます)

因みにこのデータは63MBもあります。

そして、出力データです。

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
CSV - csv.reader
<class 'numpy.ndarray'>
Elapsed: 6.027110414965349

Pandas - read_csv
<class 'numpy.ndarray'>
Elapsed: 3.4455248091177255

Numpy - loadtxt with object dtype
<class 'numpy.ndarray'>
Elapsed: 17.62943580955951

Numpy - genfromtxt with object dtype
<class 'numpy.ndarray'>
Elapsed: 16.889456515433466

Numpy - genfromtxt with specified dtype
<class 'numpy.ndarray'>
Elapsed: 13.652675029340763

>>>

syntax2html


ごらんのとおり、CSVモジュールはまずまずのスピードですが、やはりpandasは一番速いことがわかりました。今後は、このpandasをファイル入出力に使おうと思います。


Python ブログランキングへ 
クリックしてね



AD
コメント(0)  |  リブログ(0)

hitochan007さんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

最近の画像つき記事  もっと見る >>

AD

Ameba人気のブログ

Amebaトピックス

      ランキング

      • 総合
      • 新登場
      • 急上昇
      • トレンド

      ブログをはじめる

      たくさんの芸能人・有名人が
      書いているAmebaブログを
      無料で簡単にはじめることができます。

      公式トップブロガーへ応募

      多くの方にご紹介したいブログを
      執筆する方を「公式トップブロガー」
      として認定しております。

      芸能人・有名人ブログを開設

      Amebaブログでは、芸能人・有名人ブログを
      ご希望される著名人の方/事務所様を
      随時募集しております。