Python §41 : 実践編Pandasのデータをpickleモジュールで読み書きする | hitochan007のブログ(Pythonの勉強ブログ)

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

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

【過去の記事 Python:目次】

■実践編Pandasのデータをpickleモジュールで読み書きする■
●1.データフレームをpickleファイルに書き込む関数を作る
●2.pickleファイルからデータフレームを復元する関数を作る



●1.データフレームをpickleファイルに書き込む関数を作る


以前に実践のための練習としてデータを作成したものを作って、pickleファイルへの読み書きを試してみたいと思います。(→ データはこのページで作成したものを使います

また、前処理などを含めて過去に実施した練習プログラムはこちらです↓

①データ確認
②データ入力
③データ加工

それでは、pandasでいろいろ操作した結果ファイルをpickleファイルに書き込むための関数をつくってみましょう。引き数は、pickle化したデータとファイル名とします。

def pickle_write(data,filename):
#pickleファイル書き込み
Path=WriteFilePath(Pathname='RW_Data') #パスの設定
os.chdir(Path)
with open(filename,'wb') as fw: #pickleデータを書き込むファイルをopen
pickle.dump(data,fw) #書き込み処理(データ、ファイルハンドル)


書き込むファイルは、Pythonのスクリプトファイルがあるフォルダの下にRW_Dataというフォルダを作成してそこを指定することにします。(os.chdirでカレントディレクトリーを指定しています)この書き込み用フォルダを生成する関数は以下のとおりです。↓

def WriteFilePath(Pathname='RW_Data'):     #ファイルの書き込み場所の指定 、基本はプログラムの下
writepath=os.path.join(ScriptPath()[2],Pathname)
if not os.path.isdir(writepath):
os.mkdir(writepath)
return writepath



【計測結果】
書き込み速度を計測しました。(timeモジュールを使いました)

時間計測:pickleファイル書き込み: 0.0035856017228738184 [sec]

たったの3.5msecで書き込みは完了しました。



●2.pickleファイルからデータフレームを復元する関数を作る


次には、その書き込んだファイルを復元する関数を作りましょう。ファイル指定は、書き込みと同様にRW_Dataフォルダを指定します。

def pickle_read(filename):
#pickleファイル読み込み
Path=WriteFilePath(Pathname='RW_Data') #パスの設定
os.chdir(Path)
with open(filename,'rb') as fw: #pickleデータを読み込みモードでOPEN
data=pickle.load(fw) #読み込み処理
return data


戻り値としてpickle化したデータを返します。



【計測結果】

時間計測:pickleファイル読み込み: 0.0007617451326628012[sec]

時間は0.7msec と激速です。

もちろん今回のデータは小さなデータですが、150万行のデータを処理しても書き込み94msec、読み込み24msecでしたので、一般的なデータでは瞬時に読み込めるということです。

(詳しいテストの様子はこちらです→リンク



以上のテストを行ったコードがこちらです↓

def prg_G1e(self):
import pickle
print('G1e')
print('■pandasのデータをpickle化する')

#文字列データの取得のためのFrameDataの取得
rfilename='pd_data.tsv'
dialect='tab'
df0=data_check(rfilename,dialect)
StartDateTime=pd.Timestamp(df0.ix[2,1]+' '+df0.ix[2,2])

#本格的なデータ処理をするためのFrameDataの取得
rfilename='pd_data.tsv'
skiprow=5 #ヘッダを除く、スキップ行数
head=0 #スキップしたあとの行番号を指定すること 無視する場合はNone
delimiter='\t' #区切り文字 : delimiter=',' or delimiter='\t'
df=data_input(rfilename,skiprow,head,delimiter) #データインプット関数

#スタート時刻を基準に時間データを加算して時刻データを生成する
data=[]
for i in range(len(df['sec'])):
data.append(StartDateTime+pd.offsets.Second(df['sec'][i]))
s1=Series(data)

#生成した時刻データをインデックスに使う
df.index=s1

#新規のデータ列を追加
df['hr']=df['sec']/3600 #直接データを追加する
df['min']=df['sec']/60 #直接データを追加する

data=[]
data.append(df) #データフレーム
data.append(StartDateTime) #開始時刻 TimeStamp
data.append('Memo:Sin Cos data')#Memo (文字データ)

start=time.clock()
filename='data.pkl'
pickle_write(data,filename) #pickleデータを書き込む
print ("時間計測:pickleファイル書き込み: ", time.clock() - start, "\n" )

def prg_G1f(self):
import pickle
Path=WriteFilePath(Pathname='RW_Data') #パスの設定
os.chdir(Path)

print('G1f')
print('■pickleデータを復元する')

start=time.clock()
filename='data.pkl'
data=pickle_read(filename) #pickleデータの読み込み
print ("時間計測:pickleファイル読み込み: ", time.clock() - start, "\n" )

print('pickle data no=\n',len(data))
print('data frame :\n',data[0])
print('start datetime:\n',data[1])
print('memo:\n',data[2])


データの出力結果はこちらです↓


【出力結果】

pickle data no=
3
data frame :
No sec x sin(x) cos(x) \
2015-03-24 08:47:12 0 0 -3.141593 -1.224647e-16 -1.000000e+00
2015-03-24 08:48:12 1 60 -2.879793 -2.588190e-01 -9.659258e-01
2015-03-24 08:49:12 2 120 -2.617994 -5.000000e-01 -8.660254e-01
2015-03-24 08:50:12 3 180 -2.356194 -7.071068e-01 -7.071068e-01
2015-03-24 08:51:12 4 240 -2.094395 -8.660254e-01 -5.000000e-01
2015-03-24 08:52:12 5 300 -1.832596 -9.659258e-01 -2.588190e-01
2015-03-24 08:53:12 6 360 -1.570796 -1.000000e+00 6.123234e-17
2015-03-24 08:54:12 7 420 -1.308997 -9.659258e-01 2.588190e-01
2015-03-24 08:55:12 8 480 -1.047198 -8.660254e-01 5.000000e-01
2015-03-24 08:56:12 9 540 -0.785398 -7.071068e-01 7.071068e-01
2015-03-24 08:57:12 10 600 -0.523599 -5.000000e-01 8.660254e-01
2015-03-24 08:58:12 11 660 -0.261799 -2.588190e-01 9.659258e-01
2015-03-24 08:59:12 12 720 0.000000 0.000000e+00 1.000000e+00
2015-03-24 09:00:12 13 780 0.261799 2.588190e-01 9.659258e-01
2015-03-24 09:01:12 14 840 0.523599 5.000000e-01 8.660254e-01
2015-03-24 09:02:12 15 900 0.785398 7.071068e-01 7.071068e-01
2015-03-24 09:03:12 16 960 1.047198 8.660254e-01 5.000000e-01
2015-03-24 09:04:12 17 1020 1.308997 9.659258e-01 2.588190e-01
2015-03-24 09:05:12 18 1080 1.570796 1.000000e+00 6.123234e-17
2015-03-24 09:06:12 19 1140 1.832596 9.659258e-01 -2.588190e-01
2015-03-24 09:07:12 20 1200 2.094395 8.660254e-01 -5.000000e-01
2015-03-24 09:08:12 21 1260 2.356194 7.071068e-01 -7.071068e-01
2015-03-24 09:09:12 22 1320 2.617994 5.000000e-01 -8.660254e-01
2015-03-24 09:10:12 23 1380 2.879793 2.588190e-01 -9.659258e-01
2015-03-24 09:11:12 24 1440 3.141593 1.224647e-16 -1.000000e+00

tan(x) x^2 hr min
2015-03-24 08:47:12 1.224647e-16 9.869604 0.000000 0
2015-03-24 08:48:12 2.679492e-01 8.293209 0.016667 1
2015-03-24 08:49:12 5.773503e-01 6.853892 0.033333 2
2015-03-24 08:50:12 1.000000e+00 5.551652 0.050000 3
2015-03-24 08:51:12 1.732051e+00 4.386491 0.066667 4
2015-03-24 08:52:12 3.732051e+00 3.358407 0.083333 5
2015-03-24 08:53:12 -1.633124e+16 2.467401 0.100000 6
2015-03-24 08:54:12 -3.732051e+00 1.713473 0.116667 7
2015-03-24 08:55:12 -1.732051e+00 1.096623 0.133333 8
2015-03-24 08:56:12 -1.000000e+00 0.616850 0.150000 9
2015-03-24 08:57:12 -5.773503e-01 0.274156 0.166667 10
2015-03-24 08:58:12 -2.679492e-01 0.068539 0.183333 11
2015-03-24 08:59:12 0.000000e+00 0.000000 0.200000 12
2015-03-24 09:00:12 2.679492e-01 0.068539 0.216667 13
2015-03-24 09:01:12 5.773503e-01 0.274156 0.233333 14
2015-03-24 09:02:12 1.000000e+00 0.616850 0.250000 15
2015-03-24 09:03:12 1.732051e+00 1.096623 0.266667 16
2015-03-24 09:04:12 3.732051e+00 1.713473 0.283333 17
2015-03-24 09:05:12 1.633124e+16 2.467401 0.300000 18
2015-03-24 09:06:12 -3.732051e+00 3.358407 0.316667 19
2015-03-24 09:07:12 -1.732051e+00 4.386491 0.333333 20
2015-03-24 09:08:12 -1.000000e+00 5.551652 0.350000 21
2015-03-24 09:09:12 -5.773503e-01 6.853892 0.366667 22
2015-03-24 09:10:12 -2.679492e-01 8.293209 0.383333 23
2015-03-24 09:11:12 -1.224647e-16 9.869604 0.400000 24
start datetime:
2015-03-24 08:47:12
memo:
Memo:Sin Cos data


見事にpickleデータが再現しています。





●pickleデータの今後●

今回は、pandasのデータフレームと付随したmemo情報をpickle化した例を実践してみました。
この付随するデータに関しては、今後グラフを描くための情報、例えば軸名やプロットのマーカー種類、色などさまざまな情報を付与して、グラフ自体も簡単に再現できるようにしたいと考えています。


ソースコードはこちらです。(プログラム:Group1のG1eとG1fです)







【追記】枠で囲んだ記事を書くテクニックの情報


ブログページの枠を作る方法は、PCインストラクターの川上先生のブログを参考にしました。以下が川上先生のブログです。




実はこのブログページを紹介する場合のタグ生成もレクチャーしてくれています。
リンクはこちらです 

また、川上先生のブログの「テクニック」を目次化して、いつでも使えるようにしてくれている方もおられます。→こちらがリンクです

どうぞ活用ください。






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



新しいブログをはじめました。pythonの初級者から中級者まで、役に立つ記事を掲載していますので、ご覧ください。

特にカスタム関数(ユーザー定義関数)は、便利に使えると思います。

ぜひぜひこのリンクをクリックしてください 

 Pythonを勉強して株で儲けるブログ