ホームページをリニューアルしました。旧HPはこちら
Python

data 操作 (cat, time, to_csv)

観測データをアーカイブするために、LinuxとPyhtoでデータ処理時間を比較してみた。

timeコマンド

timeコマンドはコマンド・プログラムを引数としてとり、引数として指定したコマンド・プログラムが実行されるのにどれだけ時間がかかった出力する

例)sleep 10

$ time sleep 10

real    0m10.002s
user    0m0.001s
sys     0m0.002s

timeが出力するreal, user, sysはそれぞれ次のような意味になる

項目 意味
real プログラムの呼び出しから終了までにかかった実時間(秒)
user プログラム自体の処理時間(秒)(ユーザCPU時間)
sys プログラムを処理するために、OSが処理をした時間(秒)(システム時間)

sleep 10 はプログラム呼び出しから終了までに10.002秒がかかったが、sleep 10 自体の処理には全然CPUが使われていないことがわかる。


 ファイルデータの書き込み・追記時間の検証

以下のShellスクリプトとPythoで比較:
Shell Scriptのほうが、半分位の時間で処理可能
——————————————-
Shell Script:

cat log01.txt > log20.txt
cat log02.txt >> log20.txt

kazuki:~/work/test$ time sh cat.sh
real    0m0.007s
user    0m0.004s
sys    0m0.000s
——————————————-
Pyhton:

f = open(‘log01.txt’)
data = f.read()
f.close()
out = open(“log20.txt”, “a”)
out.write(data)
out.close()
f = open(‘log02.txt’)
data = f.read()
f.close()…..

kazuki:~/work/test$ time python bk.py
real    0m0.027s
user    0m0.004s
sys    0m0.016s
————————————-


 百葉箱観測データのやりとり例

データサイズ:3.7MB, CSV

Python 1

import sys
import urllib
import pandas as pd
import numpy as np

url = ‘http://miyasan.sakura.ne.jp/logdata/fujimi280/fujimi280.txt’
f = urllib.urlopen(url)
data = f.read()
out = open(“fujimi280.txt”, “w”)
out.write(data)
out.close()

df=pd.read_csv(“fujimi280.txt”,header=None)
data = df.tail(20000)
data.to_csv(‘fujimi.csv’)

————————————————-
kazuki:~/work/test$ time python bk1.py

real    0m3.373s
user    0m0.692s
sys    0m0.136s
————————————————

Pyhton 2

url = ‘http://miyasan.sakura.ne.jp/logdata/fujimi280/fujimi280.txt’
df=pd.read_csv(url, header=None)

data = df.tail(20000)
data.to_csv(‘fujimi.csv’)

————————————————-
kazuki:~/work/test$ time python bk1.py

real    0m3.414s
user    0m0.732s
sys    0m0.132s

—————————————————

Pythonのファイル操作でも、PandasのCSVReadでも、ほぼ同じ時間
Programのシンプルさからすれば、Pandasを使う方がよい。


CSV ファイル出力 DataFrame.to_csv() メソッドでの注意

テキストデータを読込み、加工して、テキストファイルとしてへ書き込む際、データフォーマットがfloat64の場合、csv出力は勝手に小数点以下の0を丸める(下記データ)
よって、float_format=’%.2f’を記述して、オリジナルの観測データと同じフォーマットにする

例)

data_dir = ‘/home/kazuki/work/test/log20.txt’
df=pd.read_csv(data_dir,header=None)

#df.dtypes
#Out[73]:
#0     object
#1    float64
#2      int64
#3      int64
#4    float64
#5    float64
#6    float64
#7      int64
#dtype: object

#original data:
2016/09/01 00:06:24,12.84,16,607,16.11,899.44,84.73,4
2016/09/01 00:07:26,12.84,16,595,16.10,899.39,84.94,14
2016/09/01 00:09:29,12.84,16,570,16.02,899.40,86.20,8
2016/09/01 00:10:30,12.84,16,600,16.00,899.40,86.51,1

#df.to_csv(‘log21.txt’,index=False, header=False)
to_csv output data :
2016/09/01 00:06:24,12.84,16,607,16.11,899.44,84.73,4
2016/09/01 00:07:26,12.84,16,595,16.1,899.39,84.94,14
2016/09/01 00:09:29,12.84,16,570,16.02,899.4,86.2,8
2016/09/01 00:10:30,12.84,16,600,16.0,899.4,86.51,1

#df.to_csv(‘log21.txt’,index=False, header=False,float_format=’%.2f’)
to_csv output data :
2016/09/01 00:06:24,12.84,16,607,16.11,899.44,84.73,4
2016/09/01 00:07:26,12.84,16,595,16.10,899.39,84.94,14
2016/09/01 00:09:29,12.84,16,570,16.02,899.40,86.20,8
2016/09/01 00:10:30,12.84,16,600,16.00,899.40,86.51,1

diff log20.txt log21.tx –> OK!! オリジナルデータと差分なし



 

 

コメント

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