備忘録＠Python OR セミナー:Pandas

# pandas

```pycon
>>> import pandas as pd
```


pandasは「[Pythonによるデータ分析入門](http://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-%E2%80%95NumPy%E3%80%81pandas%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-Wes-McKinney/dp/4873116554)」で取り上げられているライブラリ．詳しく勉強したければ，こっちを勉強してください．
![Pythonによるデータ分析入門](http://ecx.images-amazon.com/images/I/51Y8KNTSc1L._SL500_AA300_.jpg)

## データ型

pandasには**Series**と**DataFrame**という二種類のデータ型がある．

### Series
一列（行）のデータを扱う型．

```pycon
# 普通のリスト型
>>> 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
表のデータを扱う型．

```pycon
# 普通の辞書型
>>> 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

ファイル読み込みが提供されてる．

```pycon
>>> 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ファイル読み込み例
```pycon
>>> dataset = pd.read('sample.csv')
```

### csvファイル書き込み例
```pycon
>>> dataset.to_csv('write.csv')
```

## データの読み出し

### 数行のデータを見たいとき

```pycon
>>> dataset.head() # 引数にintegerを入れると
>>> dataset.tail() # integer行読み出してくれる

>>> dataset.ix[n] # n行目を見る
>>> dataset.ix[m:n] # m~(n-1)行目を見る
>>> dataset.ix[[0, 3, 5]] # 離れた行を見る
```

### 数列のデータを見たいとき

```pycon
>>> dataset.カラム名
# もしくは
>>> dataset['カラム名']
# 複数列見たいときは
>>> dataset[['カラム名1', 'カラム名2', ...,]]
```

### 検索

```pycon
>>> dataset[dataset.UID == 'カラム名']

```

## 欠損値NAの処理

### 欠損値の有無確認

`len()`と`count()`を組み合わせるらしい

- `len()`はデータのサイズを取得する．
- `count()`は列方向にNA以外の要素数を取得する．
（引数に`axis=1`ってすると行方向になる）

```pycon
>>> 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`とすれば，行方向になる)

```pycon
>>> dataset[dataset.isnull().any(axis=1)]
```

### 欠損値NAの処理

主に２つ．
`dropna()`: NAが含まれる行を削除する．(引数に`axis=1`で列方向)
`fillna('何か')`: NAを`何か`に置き換える．

```pycon
>>> 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` 

```pycon
>>> dataset.describe()
```

## グループ化

要素でグループ化する．

```pycon
>>> dataset.groupby('カラム名')
```

## グラフ

pandasだけでもある程度のグラフは書けるらしい．

### 時系列グラフ

`dtime`をindexにする

```pycon
>>> 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()
```

### リサンプリング

上のようにそのまま（２時間おき）だとグラフが細かすぎる．
一日おきにする．

```pycon
>>> c = b.resample('1d') # 1m: 1ヶ月おき
>>> c.plot()
>>> b.resample('1d', 'std').plot() # 標準偏差
>>> b.drop('UID', axis=1).resample('1d', 'max').plot() # 最大値
```

### 移動平均

```pycon
>>> pd.rolling_mean(c, 12).plot() # 12週間
```

### ヒストグラム

```pycon
>>> c.hist()
```

### 箱ひげ図

```pycon
>>> c.boxplot(return_type='axes')
```

### 相関係数

```pycon
>>> c.corr()
```


### コレログラム

```pycon
>>> import statsmodels.api as sm
>>> plot(sm.tsa.acf(b.カラム名))
```

### 散布図

```pycon
>>> pd.tools.plotting.scatter_matrix(c)
```

### 重回帰

```pycon
>>> c = c.fillna(0)
>>> m = sm.OLS(c.Soushoshouhi, \
...          c[['Hatsudenryou', 'Use_AirCon']])
>>> r = m.fit()
>>> r.summary2()
```

## オンラインドキュメント

残りは[ここ](http://pandas.pydata.org/pandas-docs/stable/)で．