pandas
>>> import pandas as pd
pandasは「Pythonによるデータ分析入門」で取り上げられているライブラリ.詳しく勉強したければ,こっちを勉強してください.
データ型
pandasにはSeriesとDataFrameという二種類のデータ型がある.
Series
一列(行)のデータを扱う型.
# 普通のリスト型
>>> lst = [1, 2, 3, 4, 5]
# Series
>>> s = pd.Series(lst)
>>> s
0 1
1 2
2 3
3 4
4 5
dtype: float64
DataFrame
表のデータを扱う型.
# 普通の辞書型
>>> dic = {"a": [1, 2, 3], "b": [9, 8, 7]}
# DataFrame
>>> df = pd.DataFrame(dic)
a b
0 1 9
1 2 8
2 3 7
I/O
ファイル読み込みが提供されてる.
>>> pd.read*? # *つけると部分一致
pd.read_clipboard
pd.read_csv
pd.read_excel
pd.read_fwf
pd.read_gbq
pd.read_hdf
pd.read_html
pd.read_json
pd.read_msgpack
pd.read_pickle
pd.read_sql
pd.read_sql_query
pd.read_sql_table
pd.read_stata
pd.read_table
csvファイル読み込み例
>>> dataset = pd.read('sample.csv')
csvファイル書き込み例
>>> dataset.to_csv('write.csv')
データの読み出し
数行のデータを見たいとき
>>> dataset.head() # 引数にintegerを入れると
>>> dataset.tail() # integer行読み出してくれる
>>> dataset.ix[n] # n行目を見る
>>> dataset.ix[m:n] # m~(n-1)行目を見る
>>> dataset.ix[[0, 3, 5]] # 離れた行を見る
数列のデータを見たいとき
>>> dataset.カラム名
# もしくは
>>> dataset['カラム名']
# 複数列見たいときは
>>> dataset[['カラム名1', 'カラム名2', ...,]]
検索
>>> dataset[dataset.UID == 'カラム名']
欠損値NAの処理
欠損値の有無確認
len()
とcount()
を組み合わせるらしい
-
len()
はデータのサイズを取得する. -
count()
は列方向にNA以外の要素数を取得する.
(引数にaxis=1
ってすると行方向になる)
>>> len(dataset) - dataset.count()
UID 0
dtime 0
Sousyouhi 0
Hatsudenryou 0
Jikasyouhi 0
Uriden 0
Kaiden 0
Use_AirCon 0
Use_Kyutou 3
Use_Kaden 0
dtype: int64
さらに詳しくみるときはisnull()
とany()
を組み合わせるといいんだとか.
isnull()
: 要素がNAのところをTrue
に,それ以外をFalse
にする.
any()
: 列方向で一つでもTrue
があればTrue
を,無ければFalse
を返す.
(引数をaxis=1
とすれば,行方向になる)
>>> dataset[dataset.isnull().any(axis=1)]
欠損値NAの処理
主に2つ.
dropna()
: NAが含まれる行を削除する.(引数にaxis=1
で列方向)
fillna('何か')
: NAを何か
に置き換える.
>>> dataset.dropna()
>>> dataset.fillna(0) # NAを0に置換する
# NAを前の値で埋める front?
>>> dataset.fillna(method='ffill')
# NAを後ろの値で埋める back?
>>> dataset.fillna(method='bfill')
要約統計量
describe()
を使えば,大体のものを算出してくれる.
count
, mean
, std
, min
, 25%
, 50%
, 75%
, max
>>> dataset.describe()
グループ化
要素でグループ化する.
>>> dataset.groupby('カラム名')
グラフ
pandasだけでもある程度のグラフは書けるらしい.
時系列グラフ
dtime
をindexにする
>>> tdataset = dataset.copy()
>>> tdataset.index = tdatasset.dtime.apply(pd.to_datetime)
>>> tdataset.drop('dtime', axis=1, inplace=True)
>>> b = tdataset[tdataset.UID == 'id1'] \
... [['UID', 'Soushohi']]
>>> b.plot()
リサンプリング
上のようにそのまま(2時間おき)だとグラフが細かすぎる.
一日おきにする.
>>> c = b.resample('1d') # 1m: 1ヶ月おき
>>> c.plot()
>>> b.resample('1d', 'std').plot() # 標準偏差
>>> b.drop('UID', axis=1).resample('1d', 'max').plot() # 最大値
移動平均
>>> pd.rolling_mean(c, 12).plot() # 12週間
ヒストグラム
>>> c.hist()
箱ひげ図
>>> c.boxplot(return_type='axes')
相関係数
>>> c.corr()
コレログラム
>>> import statsmodels.api as sm
>>> plot(sm.tsa.acf(b.カラム名))
散布図
>>> pd.tools.plotting.scatter_matrix(c)
重回帰
>>> c = c.fillna(0)
>>> m = sm.OLS(c.Soushoshouhi, \
... c[['Hatsudenryou', 'Use_AirCon']])
>>> r = m.fit()
>>> r.summary2()
オンラインドキュメント
残りはここで.