みたけ山トレイルランのヒストグラム

先日出てきたみたけ山トレイルラン(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') 

できました。

mitake_hist

へーこういう分布だったんだー
って感じですかね。

※参考
■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

pd.to_timedeltaの使い方メモ

pd.to_timedelta()が以前のバージョンと新しいバージョンで仕様が変わったようです。

以前、’0:36:54’を経過時間に変更する際に「pd.to_timedelta」を使いましたが、
久しぶりに試してみるとできなくなっていました。

以前のブログ
http://jbclub.xii.jp/?p=464

import pandas as pd
tmd = pd.to_timedelta('0' + tm['Time'])

↓↓↓こんなエラーメッセージが出るようになりました。
TypeError: Expected str, got unicode

バージョンを調べてみる。

pd.__version__
Out[6]: u'0.17.0'

以前は0.16.2でした。
↓↓↓こんな感じでできました。

from pandas import Series, DataFrame
Series([pd.to_timedelta(str(i)) for i in tm['Time']])
Out[7]: 
0   00:36:54 
1   01:04:20 
2   01:32:02 

以前の0.16.2では「0:36:54」こういう形ではエラーになったので
わざわざ

'0' + tm['Time']

をしていましたが、今回は必要なくなっています。

ただ、Series型で出力できなくなったので、for文をつかっています。
他にいい方法があれば知りたいものです。

以上

XtraBackupバックアップ・リストアメモ

Mysqlのオンラインバックアップを実現するXtraBackupを検証してみました。
以下はメモです。

■Percona-XtraBackup 2.2.10
http://www.percona.com/doc/percona-xtrabackup/2.2/installation.html

■XtraBackupインストール

# uname -m
x86_64
# wget http://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.10/binary/redhat/6/x86_64/Percona-XtraBackup-2.2.10-re623acb-el6-x86_64-bundle.tar
# yum -y install perl-Time-HiRes
# rpm -ivh percona-xtrabackup-2.2.10-1.el6.x86_64.rpm
# rpm -ivh percona-xtrabackup-test-2.2.10-1.el6.x86_64.rpm
# rpm -ivh percona-xtrabackup-debuginfo-2.2.10-1.el6.x86_64.rpm
# mkdir /var/lib/mysql_backup/

■フルバックアップ

# innobackupex --user=root --password=jagaimo --defaults-file=/etc/my.cnf /var/lib/mysql_backup

■リストア

# /etc/rc.d/init.d/mysqld stop
# innobackupex --user root --password jagaimo --copy-back /var/lib/mysql_backup/2015-04-30_11-07-39
# mv mysql bk_mysql
# chown -R mysql:mysql /var/lib/mysql/
# /etc/rc.d/init.d/mysqld start
# mysql -u root -p
mysql> use data1
mysql> select * from table1;

これでフルバックアップとリストアは検証できました。
差分バックアップは別途検証しようと思います。

■■■参考■■■
■Mysql 起動停止

# /etc/rc.d/init.d/mysqld start
# /etc/rc.d/init.d/mysqld stop

■Mysql設定変更

# /etc/my.cnf 

■Mysql操作

# mysql -u root -p

■パスワードをjagaimoへ変更

mysql> SET PASSWORD FOR root@localhost=PASSWORD('jagaimo');

■起動時の失敗時の調査

# tail -f /var/log/mysqld.log

■フルバックアップ

# innobackupex $BACKUP_OPTION $FULLBACKUP_DIR

$BACKUP_OPTION="--user=$MYSQL_USER --password=$MYSQL_PASSWORD --defaults-file=$DEFAULTS_FILE"
$MYSQL_USER=root
$MYSQL_PASSWORD=jagaimo
$DEFAULTS_FILE=/etc/my.cnf
$FULLBACKUP_DIR=

■Percona 正式ドキュメント
http://www.percona.com/doc/percona-xtrabackup/2.2/

■バックアップを取得して失敗した時のメモ

# mkdir /var/lib/mysql_backup/
# xtrabackup --backup --datadir=/var/lib/mysql/ --target-dir=/var/lib/mysql_backup/

=============================
# xtrabackup --backup --datadir=/var/lib/mysql/ --target-dir=/var/lib/mysql_backup/
xtrabackup version 2.2.10 based on MySQL server 5.6.22 Linux (x86_64) (revision id: )
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql/
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup:   innodb_data_home_dir = ./
xtrabackup:   innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 2
xtrabackup:   innodb_log_file_size = 50331648
InnoDB: Error: log file ./ib_logfile0 is of different size 5242880 bytes
InnoDB: than specified in the .cnf file 50331648 bytes!

InnoDBのサイズ変更のやり方
http://blog.enjoitech.com/article/196
=============================

■参考サイト
http://variable.jp/2013/01/24/mysql%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97-xtrabackup/
http://www.submit.ne.jp/428

以上

return top