先日出てきたみたけ山トレイルラン(15km)の大会の記録をPythonを使ってヒストグラムにしてみました。
http://www.kfctriathlon.jp/pdf/result_mitake2015.pdf
記録は公開されていますがPDF形式なのでCSVに変換する必要があります。
この作業が一番大変だったかも。
from pandas import Series, DataFrame import pandas as pd import numpy as np
CSVファイルを取り込みます。データに漢字が入っているとエラーになったりします。
sakuraエディタとかで文字コードを SJIS→UTF-8にしてからやるとうまく取り込めました。
tm = pd.read_csv('C:/work/mitake.csv',skiprows=1, names=['Rank', 'No','FamilyName','FirstName','Age','Sex','Pref','Time'], encoding='utf-8')
時間データの変換
pd.__version__で0.16.2のバージョンの場合 tmd = pd.to_timedelta(tm['Time']) '0.17.0'のバージョンの場合 tmd = Series([pd.to_timedelta(str(i)) for i in tm['Time']])
インデックスの作成
rng= pd.timedelta_range('1:05:00',periods=22,freq='5T')
groupbyを使用するためDataFrameの形にしています。
df = pd.DataFrame({"time":tmd,"value":tm['Rank']})
五分毎の人数のカウント
s = df.groupby(tmd / pd.to_timedelta('00:05:00') // 1).value.count()
インデックスを時間にします。
s.index = rng
これで5分ごとの人数がでました。
s Out[24]: 01:05:00 3 01:10:00 8 01:15:00 3 01:20:00 18 01:25:00 27 01:30:00 34 01:35:00 56 01:40:00 60 01:45:00 67 01:50:00 78 01:55:00 66 02:00:00 67 02:05:00 60 02:10:00 53 02:15:00 77 02:20:00 51 02:25:00 41 02:30:00 22 02:35:00 15 02:40:00 9 02:45:00 2 02:50:00 2 Freq: 5T, Name: value, dtype: int64
次にグラフにしてみます。
一旦インデックスを元に戻します。
s = df.groupby(tmd / pd.to_timedelta('00:05:00') // 1).value.count()
棒グラフにします。
%pylab import matplotlib.pyplot as plt x = s.index y = s.values plt.bar(x,y,width = 1,align="center") plt.xticks([12.5, 15.5, 18.5, 21.5, 24.5,27.5,30.5,33.5], ['1:00:00','1:15:00','1:30:00','1:45:00','2:00:00','2:15:00','2:30:00','2:45:00']) plt.xticks([12, 15, 18, 21, 24,27,30,33], ['1:00:00','1:15:00','1:30:00','1:45:00','2:00:00','2:15:00','2:30:00','2:45:00']) plt.xlabel('TIME') plt.ylabel('COUNT')
できました。
へーこういう分布だったんだー
って感じですかね。
※参考
■Pythonで日本語を扱うには? – 文字コードについて理解しよう
http://news.mynavi.jp/series/python/014/
■Python pandas プロット機能を使いこなす
http://sinhrks.hatenablog.com/entry/2015/11/15/222543
■Pandas ドキュメント
http://pandas.pydata.org/pandas-docs/stable/timeseries.html
http://pandas.pydata.org/pandas-docs/version/0.17.1/whatsnew.html
■How to resample timedeltas?
http://stackoverflow.com/questions/20270012/how-to-resample-timedeltas
■標準python、numpy、pandasを行ったり来たりするために①
http://qiita.com/richi40/items/6b3af6f4b00d62dbe8e1
■棒グラフの描写
http://yubais.net/doc/matplotlib/bar.html
■参考2014ハセツネデータ解析!!
http://usakame7.web.fc2.com/diary/2014/1012/2.html
View Comments