Pythonでグラフを描く

東京マラソンの記録をPythonを使ってグラフにしてみました。
その内容をメモに残しておきます。

■やりたいこと
東京マラソンの5kmごとのラップタイムをグラフにしたい。

■環境
Windows7にAnacondaをインストールして使っています。

Anaconda:
Python本体と科学技術計算、可視化のライブラリを含んだディストリビューションパケージ
https://store.continuum.io/cshop/anaconda/

■表示する記録
東京マラソンの記録をTime.csvというCSVファイルにします。
こんな感じ。

KM,TIME 
5,0:36:54 
10,1:04:20 
15,1:32:02 
20,1:59:29 
25,2:26:48 
30,2:54:24 
35,3:24:01 
40,3:51:53 
42.195,4:03:56 

これを適当なディレクトリに置きます。
C:\Anaconda\work

■やり方
CSVファイルを取り込みます。

import pandas as pd 
tm = pd.read_csv("C:\Anaconda\work\Time.csv", skiprows=1, names=['km', 'time'], encoding='Shift_JIS') 

In [60]: tm 
Out[60]: 
     km       time 
0   5.000  0:36:54 
1  10.000  1:04:20 
2  15.000  1:32:02 
3  20.000  1:59:29 
4  25.000  2:26:48 
5  30.000  2:54:24 
6  35.000  3:24:01 
7  40.000  3:51:53 
8  42.195  4:03:56 

[9 rows x 2 columns] 

csvで取り込んだだけではtimeは数値ではないので経過時間の形に変換します。

tmd = pd.to_timedelta('0' + tm['time']) 

In [7]: tmd 
Out[7]: 
0   00:36:54 
1   01:04:20 
2   01:32:02 
3   01:59:29 
4   02:26:48 
5   02:54:24 
6   03:24:01 
7   03:51:53 
8   04:03:56 
Name: time, dtype: timedelta64[ns] 

これで経過時間(nanoseconds)になりました。
続いてデータフレームを作ります。

from pandas import DataFrame 

data =  {'KM':tm['km'], 'TIME':tmd } 
frame = DataFrame(data) 

In [12]:frame 
Out[12]: 
       KM     TIME 
0   5.000 00:36:54 
1  10.000 01:04:20 
2  15.000 01:32:02 
3  20.000 01:59:29 
4  25.000 02:26:48 
5  30.000 02:54:24 
6  35.000 03:24:01 
7  40.000 03:51:53 
8  42.195 04:03:56 

[9 rows x 2 columns] 

ここでpandasというライブラリを使っています。
pandasというのはPythonにRのデータフレームのような型を持たせるライブラリで
行列計算ができ、Rでやっていたような集計作業がPythonでも楽にできるようになります。
http://pandas.pydata.org/

つづいてラップタイムを算出します。

list = [frame.TIME[0]] 
n = 0 
while (n < 8): 
  list.append( frame.TIME[n + 1] - frame.TIME[n]) 
  n += 1 

In [16]: list 
Out[16]: 
[numpy.timedelta64(2214000000000,'ns'), 
 numpy.timedelta64(1646000000000,'ns'), 
 numpy.timedelta64(1662000000000,'ns'), 
 numpy.timedelta64(1647000000000,'ns'), 
 numpy.timedelta64(1639000000000,'ns'), 
 numpy.timedelta64(1656000000000,'ns'), 
 numpy.timedelta64(1777000000000,'ns'), 
 numpy.timedelta64(1672000000000,'ns'), 
 numpy.timedelta64(723000000000,'ns')] 

これでラップが計算できたので
frameにデータを挿入します。

 frame['RAP'] = list 

In [18]: frame 
Out[18]: 
       KM     TIME      RAP 
0   5.000 00:36:54 00:36:54 
1  10.000 01:04:20 00:27:26 
2  15.000 01:32:02 00:27:42 
3  20.000 01:59:29 00:27:27 
4  25.000 02:26:48 00:27:19 
5  30.000 02:54:24 00:27:36 
6  35.000 03:24:01 00:29:37 
7  40.000 03:51:53 00:27:52 
8  42.195 04:03:56 00:12:03 

これをグラフにします。

%pylab 
import matplotlib.pyplot as plt 
fig = plt.figure() 
ax = fig.add_subplot(111)
y =  frame.RAP 
x =  frame.KM 
ax.plot(x, y, 'wo') 
plt.xlabel('KM') 
plt.ylabel('TIME') 
plt.grid() 
plt.xlim(xmin = 0) 
plt.xticks(np.arange(0, 45, 5)) 
plt.ylim(ymin = 60 * 10 * 10**9) 
plt.ylim(ymax = 60 * 10 * 4 * 10**9) 
plt.yticks(np.arange(60 * 10 * 10**9, 60 * 10 * 4 * 10**9, 60 * 10 * 10**9 / 4)) 

グラフが一旦できましたが、これだとY軸がnanosecondになっているので
見やすいようにhh:mm:ssで表示するようにします。

from matplotlib.ticker import FuncFormatter as ff 
def m2hm(y, i): 
    h = int(y/1000000000/3600) 
    m = int(y/1000000000/60) 
    s = int(y/1000000000%60) 
    return '%(h)02d:%(m)02d:%(s)02d' % {'h':h,'m':m,'s':s} 
  
ax.yaxis.set_major_formatter(ff(m2hm)) 

できました。

PY_tkmara

もっとうまくできるのかも知れませんが
なんせ素人なのでこんなもんかと。

■その他メモ

線を青色にする。
ax.plot(x, y, color="blue") 

以上

関連する投稿:

“Pythonでグラフを描く” への1件の返信

  1. ピンバック: pd.to_timedelta | JBClub

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください