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") 

以上

Linuxで再起動時にデバイスのマウントが入れ替わってしまう

Linux(RHEL5.7)を再起動したところ、デバイスのマウントが入れ替わる事象が発生しました。
どうもRHEL5.7は、カーネルが認識した順序でデバイスを割り振るため、こんなことが起きるようです。
おかげでサービスに支障がでてしまいました。
一応解決できたのでメモしておきます。

■解決方法
/etc/fstabにUUIDでマウントする設定に変更した。

1.対象のファイルシステムをアンマウントする。

[root@onedari01 ~]# mount
/dev/sdf on /test1 type ext3 (rw,_netdev) 
/dev/sdg on /test2 type ext3 (rw,_netdev) 

[root@onedari01 ~]# umount /test1 
[root@onedari01 ~]# umount /test2 

2.現在のUUID、ラベル名を確認する。

[root@onedari01 ~]# blkid /dev/sdf 
/dev/sdf: UUID="abcde-f80c-4b5f-8f36-71234556" TYPE="ext3" 

[root@onedari01 ~]# blkid /dev/sdg 
/dev/sdg: UUID="cdefj-0c8d-46bc-9378-56491123" TYPE="ext3" 
[root@onedari01 ~]# 

3.確認したUUIDを使用しマウントする。
 (実行例/UUID を使用する場合)
   # mount -t ext3 -U xxxxxxxx /work

[root@onedari01 ~]# mount -t ext3 -U cdefj-0c8d-46bc-9378-56491123 /NetVault_Gen1 
[root@onedari01 ~]# mount -t ext3 -U abcde-f80c-4b5f-8f36-71234556 /NetVault_Gen2 

4./etc/fstabを変更する。

[root@onedari01 ~]# vi /etc/fstab
/dev/sdf                /test1          ext3    _netdev        1 0 
/dev/sdg                /test2          ext3    _netdev        1 0 
↓↓↓ 
UUID=280cce91-0c8d-46bc-9378-24abb721e04e /test1    ext3    _netdev        1 0 
UUID=ce993c8d-f80c-4b5f-8f36-78baa48a8f0a /test2    ext3    _netdev        1 0 

※記述されている数字の意味
第1列 マウントするブロックデバイスやラベル
第2列 マウントポイント
第3列 ファイルシステムの種類
第4列 マウント時のオプション
第5列 ファイルシステムをdumpする必要があるか否かの指定
「0」または無記述の場合はdump不要のファイルシステムであると見なされる。
第6列 システム起動時にfsckチェックを行うか否かの指定。
「0」チェックを行わない。
「1」ルートファイルシステムでチェックを行う
「2」ルートファイルシステム以外でチェックを行う

※第6列を2にしておくとOS起動時にfsckが走ってなかなか起動しないことがある。
例えば、以下の例だと起動してから6か月以上たっているため、
再起動するとfsckが走り、なかなか起動しない。

[root@onedari01 ~]# tune2fs -l /dev/sdf 
Last checked:             Fri Mar 30 20:49:49 2012 
Check interval:           15552000 (6 months)                    ★ここが6か月になっているためfsckが走った。 

サイズがでかいデバイスの場合、第6列は「0」にしたほうがよいかもしれません。

以上

BIG-IP iRuleのメモ ドメイン名によってpoolを変える

BIG-IPのiRuleで設定しなければならないものがありましたので
メモに残しておきます。

■やりたいこと

http://kiss.co.jp/とhttp://chuu.co.jp/で使用するpoolを分ける。

http://kiss.co.jp/のアクセスはpool_kissというpoolに、

http://chuu.co.jp/のアクセスはpool_chuuというpoolにする。

■iRule設定

when HTTP_REQUEST { 
if { [string tolower [HTTP::host]] eq "kiss.co.jp" } { 
    pool pool_kiss 
    } elseif { [string tolower [HTTP::host]] eq "chuu.co.jp" } { 
    pool pool_chuu 
   } 
} 

こんなもんでできます。簡単ですね。
(私は結構苦労しましたが。。)

このブログがよく纏められてて参考になると思います。
http://millerch.wordpress.com/tag/irules/

以上

return top