東京マラソンの記録を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これでラップが計算できたので
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))できました。
もっとうまくできるのかも知れませんが
なんせ素人なのでこんなもんかと。■その他メモ
線を青色にする。 ax.plot(x, y, color="blue")以上
関連する投稿:
View Comments