python for data anaysis第2回勉強会4,5章

52
Python for Data Analysis Chap.4, 5 かわの まこと

Upload: makoto-kawano

Post on 20-Jul-2015

814 views

Category:

Engineering


13 download

TRANSCRIPT

Page 1: Python for Data Anaysis第2回勉強会4,5章

Python for Data Analysis Chap.4, 5かわの まこと

Page 2: Python for Data Anaysis第2回勉強会4,5章

今日のお話4章 Numpyの基礎

5章 Pandasとはじめよう

2

Page 3: Python for Data Anaysis第2回勉強会4,5章

4章 NumPyの基礎

Page 4: Python for Data Anaysis第2回勉強会4,5章

Numerical Python:特徴ndarray: ものすごく便利な配列

基本的な計算をループなしにやってくれる(すべての要素に)

ディスクに読み書き,メモリ上で計算してくれる

線形代数,乱数生成,フーリエ変換が出来る

C,C++,Fortranのソースコードとごちゃまぜに出来る

4

Page 5: Python for Data Anaysis第2回勉強会4,5章

データ分析における着目点高速なベクトル演算• データマンジング,整理,部分集合か,フィルタリング,変換など

有名な配列アルゴリズム• ソート,ユニーク発見,セットなど

効率的な記述統計学,データの集計統計

データの結合・追加をよしなにやってくれる

if-elif-elseの代わりに配列表記で表現してくれる

集計加工もよしなにやってくれる

5

Page 6: Python for Data Anaysis第2回勉強会4,5章

N-dimensional array object (ndarray)高速で,柔軟な入れ物らしい• とにかくスカラー計算と同じようにまとめてやってくれる

shape- 行,列の大きさを教えてくれる

dtype- 配列のデータタイプ

6

Page 7: Python for Data Anaysis第2回勉強会4,5章

Creating ndarrays最も簡単な配列生成:array関数• 入れ子にすれば,多次元配列を生成

• 基本的によしなにデータタイプを選んでくれる

その他の配列生成:引数一つ→ベクトル,引数タプル→行列• zeros関数:要素全部0

• ones関数:要素全部1

• empty関数:とりあえず空っぽだけど枠は作る感じ

• arange関数:python組み込み関数と一緒

7

Page 8: Python for Data Anaysis第2回勉強会4,5章

配列生成関数一覧表

8

関数

array リスト・タプルなどを配列にする.型などは自動推論してくれる.入力はコピー.

asarray 配列に変換してくれる.でも入力が既に配列ならコピーしない.

arange 組み込み関数のrangeと一緒.但しリストではなく配列で返す.

ones, ones_like 与えられたshapeとdtypeで要素全部1の配列生成./ _likeは別の行列生成.

zeros, zeros_like 与えられたshapeとdtypeで要素全部0の配列生成./ _likeは別の行列生成.

empty, empty_like 与えられたshapeとdtypeの配列のメモリを割り当てる.でも値はない.

eye, identity n次正方単位行列を作成

Page 9: Python for Data Anaysis第2回勉強会4,5章

Data Typesメモリチャンクを解釈する必要があるため• データのバイナリを読み書きしたり,CやFORTRANのコードとコネクトするため

• intやfloatがいっぱいあるけど覚えなくていいよ

9

Page 10: Python for Data Anaysis第2回勉強会4,5章

配列とスカラー配列を使えば,ループ使わないでバッチ処理できる!• ”vectorization”っていうらしい

• 同じサイズの行列なら演算できる

• スカラー +/-/×/÷ 行列も各要素にできる

• 異なるサイズの行列の場合はbroadcastingっていうらしい

10

Page 11: Python for Data Anaysis第2回勉強会4,5章

インデックスとスライスの基礎1次元配列の場合:Pythonと同じようにできる• 配列のスライスはあくまでも実値=コピーではない

• 巨大なデータになった時にコピーしてたらメモリやばいから

多次元配列の場合:• 2次元ならarr[0][2] = arr[0, 2]

• 更に高次元でもOK

11

Page 12: Python for Data Anaysis第2回勉強会4,5章

Boolean Indexing名前配列から,’Bob’見つけたりしたい

- 多分ユーザごとの調査に適用できるとかだと思われる

• boolean indexingで選ばれたデータはコピーされる

• 便利な使い方 data[data < 0] = 0

12

Page 13: Python for Data Anaysis第2回勉強会4,5章

Fancy Indexinginteger配列を使ったインデックス• 配列で指定した順番に出てくる

• 結構ややこしい

13

Page 14: Python for Data Anaysis第2回勉強会4,5章

転置array.Tで転置する

numpy.ndarray.transpose(tuple)• tuple =(2, 1, 0) -> 0軸が2軸に,1軸が1軸に,2軸が0軸に

14

Page 15: Python for Data Anaysis第2回勉強会4,5章

便利な関数たちufunc: sqrt, exp

unary: add, maximum

一般的ではないけど,便利なの:modf

• pythonxのdivmod -> 商と余りを出してくれるx

15

Page 16: Python for Data Anaysis第2回勉強会4,5章

便利な関数一覧

16

Function Descriptionabs, fabs 絶対値計算.複素数じゃないなら高速なfabs使うべき.

sqrt 2乗根計算=arr ** 0.5square 2乗計算=arr**2

exp 自然対数e^xの計算log, log10, log2, log1p 対数計算.底がそれぞれe, 10, 2, 1+x

sign 符号関数 1 / 0 / -1を返すceil 小数点繰り上げfloor 小数点繰り下げrint 整数値に丸める(<-謎)

modf 商と余り両方を返してくれるisnan NaN(Not a Number)かどうかを判断してくれる

isfinite, isinf 有限か無限か判断してくれるcos, cosh, sin, sinh,tan, tanh 三角関数

arccos, arccosh, arcsin, arcsinh, 逆三角関数

logical_not 数値であるかないか確認

Page 17: Python for Data Anaysis第2回勉強会4,5章

バイナリーで便利な関数一覧

17

Function Descriptionadd 各要素を足す

subtract 各要素を引くmultiply 各要素をかける

divide, floor_divide 各要素を割るpower 累乗

maximum, fmax 要素ごとの最大値.fmaxはNaNを無視.minimum, fmin 要素ごとの最小値.fminはNaNを無視.

mod 余りcopysign 符号関数の結果を2つ目の配列にコピー

greater, greater_equal, less, less_equal, equal, not_equal 各要素で比較.>, >=, <, <=, ==, !=

logical_and, logical_or, logical_Xor 各要素で比較.&, |, ^

Page 18: Python for Data Anaysis第2回勉強会4,5章

配列を使ったデータ処理何度も言うようだけど,ループ使わないで出来る• 詳しくは12章でやる

18

Page 19: Python for Data Anaysis第2回勉強会4,5章

配列演算としての条件論理numpy.where(condition, x, y)• x if condition else y(x, yは配列である必要はない)

• python的な書き方は,[(x if c else y) for x, y, c in zip(xarr, yarr, condition)]

• 計算が遅くなるし,1次元配列でしか通用しない

• 複雑なのも結構いけちゃう

19

result = [] for i in range(n): if cond1[i] and cond2[i]: result.append(0) elif cond1[i]: result.append(1) elif cond2[i]: result.append(2) else: result.append(3)

np.where(cond1 & cond2, 0, np.where(cond1, 1, np.where(cond2, 2, 3)))

result = 1 * cond1 + 2 * cond2 + 3 * (cond1 | cond2)

Page 20: Python for Data Anaysis第2回勉強会4,5章

数学的で統計学的な手法合計,平均,標準偏差とか:軸に沿っても出来る

20

Function Description

sum 配列全て/軸に沿っての合計.長さが0の配列の合計は0

mean 配列全て/軸に沿っての平均.長さが0の配列の平均はNaN.

std, var 標準偏差と分散

min, max 最小値と最大値

argmin, argmax 最小,最大要素のインデックス

cumsum 累計的な足し算

cumprod 類型的な掛け算

Page 21: Python for Data Anaysis第2回勉強会4,5章

Boolean配列1(True)と0(False)だからsum使えばTrueを数えられる

• (arr > 0).sum()

anyとall関数

• any: 一つでもTrueがあるかどうか

• all: 全部がTrueかどうか

21

Page 22: Python for Data Anaysis第2回勉強会4,5章

ソート組み込み関数と同じくソート関数ある• np.ndarray.sort()は書き換え

• np.sort()はコピー

• 詳しいことは12章

22

Page 23: Python for Data Anaysis第2回勉強会4,5章

固有とか論理演算1次配列には基本的な集合演算がある• np.unique (Pythonでやるならsorted(set(names)))

23

Method Description

unique(x) xから固有の要素をみつけてソート

intersect1d(x, y) xとyで共通の要素をみつけてソート

union1d(x, y) xとyの和集合

in1d(x, y) xの要素がyにあるか見て,boolean配列を返す

setdiff1d(x, y) yにないxの要素を返す

setxor1d(x, y) xとyどちらかにしかない要素を返す

Page 24: Python for Data Anaysis第2回勉強会4,5章

ファイル入出力テキストかバイナリでディスクに保存できる• np.saveとnp.load -> 拡張子は.npy

• np.savezにすればzipで保存できる->拡張子は.npz

• np.loadtxtを使えばcsvとかも読み込める(pandasの方が良)

24

Page 25: Python for Data Anaysis第2回勉強会4,5章

線形代数行列積,行列分解,行列式などの行列計算は重要• x.dot(y) = np.dot(x, y) = XY ≠ YX

numpy.linalg: 逆行列と行列式が扱える

25

Page 26: Python for Data Anaysis第2回勉強会4,5章

numpy.linalg関数一覧

26

Function Descriptiondiag 行列の対角要素を1次配列で返すか,一次配列を対角要素にした行列を返すdot 行列積

trace 行列の対角要素の合計det 行列式eig 固有値,固有ベクトルinv 逆行列

pinv ムーアペンロース擬似逆行列qr QR分解

svd 特異値分解solve 線形方程式を解くlstsq 最小二乗法

Page 27: Python for Data Anaysis第2回勉強会4,5章

乱数生成Pythonの組み込みrandomをよしなに配列で使えるようにする

• %timeit samples = [normalvariate(0, 1) for _ in xrange(N)] • 1 loops, best of 3: 1.33s/1 loop

• %timeit np.random.normal(size=N) • 10 loops, best of 3: 57.7ms/1 loop

27

Page 28: Python for Data Anaysis第2回勉強会4,5章

numpy.random関数一覧

28

Function Descriptionseed 乱数のシードを生成

permutation 連続した数値のランダム順列を返すshuffle まぜるrand 一様分布からサンプリングする

randint low-highの範囲から整数をランダムで返すrandn 正規分布からサンプリング(平均は0,標準偏差は1)

binomial 二項分布からサンプリングnormal 正規(ガウシアン)分布からサンプリング

beta ベータ分布からサンプリングchisquare カイ二乗分布からサンプリング

gamma ガンマ分布からサンプリングuniform 一様分布[0, 1)からサンプリング

Page 29: Python for Data Anaysis第2回勉強会4,5章

具体例:ランダムウォークpythonのコードとnumpyを使ったコードの比較

複数のランダムウォークを動かす

29

Page 30: Python for Data Anaysis第2回勉強会4,5章

5章 pandasとはじめよう

Page 31: Python for Data Anaysis第2回勉強会4,5章

pandasのありがたい話pythonで高速かつ簡単にデータ構造・操作を扱えるツール

• NumPyで実装されてる

どうやら筆者が作ったらしい.そのコンセプトは:• データ構造をよしなに扱いたい

• 時系列も扱えるようになりたい

• 算術演算とか

• 欠損値とか

• SQLとかと同じように扱いたい

31

Page 32: Python for Data Anaysis第2回勉強会4,5章

pandasで大事なデータ構造:Series1次元配列ライクな構造+データラベルの連想配列(index)左側にindex,右側にValueがある• indexは指定がなければ0からN-1番が振られる

numpyと同じように色々できる辞書からもSeriesは簡単欠損値について(軽く)

• pd.isnull(), pd.notnull(), obj.isnull() 簡単に算術演算も出来るSeries自体とindexにはname属性がある

32

Page 33: Python for Data Anaysis第2回勉強会4,5章

pandasで大事なデータ構造:DataFrame表やスプレッドシートライクなデータ構造• 各列は別のValue Typeでよい(数字,文字など)

• 行・列それぞれにindexがある

33

Page 34: Python for Data Anaysis第2回勉強会4,5章

DataFrameコンストラクタの入力値

34

Type Notes2D ndarray 行列データ,(オプション)行・列のラベル

dict of arrays, lists, or tuples 各Sequenceが列になる.Sequenceは全部同じ長さマストNumPy structured/record array dict of arraysと同様の扱い

dict of Series 各値が列になる.indexは合体して行のindexになる.dict of dicts 各辞書が列になる.キーはdict of Seriesと同様の扱い.

list of dicts or Series 各アイテムが行になる.キーor indexは列のラベルになるlist of lists or tuples 2D ndarrayと同様の扱いAnother DataFrame 基本的にそのまま

NumPy MaskedArray masked valueがNA/missingになってそれ以外は2D ndarray

Page 35: Python for Data Anaysis第2回勉強会4,5章

Index Object軸のラベルやメタデータ(軸の名前とか)を保持する• indexは不変→データを共有するときに安全

35

Class Description

Index 最も一般的.NumPyオブジェクトとして表現

Int64Index 整数値のための特別なindex

MultiIndex 階層的なindex.タプルの配列のような感じ

DatetimeIndex ナノ秒のタイムスタンプ

PeriodIndex 期間を示すindex

Page 36: Python for Data Anaysis第2回勉強会4,5章

Indexオブジェクトのメソッドとプロパティ一覧

36

Method Descriptionappend indexオブジェクトを連結して新しいindexを生成

diff 集合の差分をindexとして計算するintersection 集合の積集合を計算する

union 和集合を計算するisin 各Valueがpassed collectionに含まれているかの二値配列を生成

delete i番目のindexを削除して新しいindexを生成drop passed valueを消して新しいindexを生成insert i番目にindexを挿入して新しいindexを生成

is_monotonic 前のvalue<=次のvalueってなってるかis_unique かぶっているindexがないか(なければTrue)

unique indexのなかの固有の値だけのindexを生成

Page 37: Python for Data Anaysis第2回勉強会4,5章

大事な機能性: Reindex新しいindexにデータを適合させること

• reindex option

• reindex function

37

Argument Description

ffill or pad Fill(or carry) values forward

bfill or backfill Fill(or carry) values backward

Argument Description

index indexとして扱うデータ.コピーせずに使われる

method 補完手法

fill_value 欠損していた時に埋める値

limit forward- or backfillingのときの最大ギャップ

level multiindexのレベルを合わせる(謎)

copy 旧indexと一緒の場合はコピーしない(デフォルトTrue)

Page 38: Python for Data Anaysis第2回勉強会4,5章

軸をそのまま削除drop関数

• SeriesでもDataFrameでもどちらでもいける

38

Page 39: Python for Data Anaysis第2回勉強会4,5章

インデックス,選択,フィルタリングSeriesのインデックスは普通のNumPy配列と一緒

Special Indexing Field:ix

• DataFrameからNumPy+軸ラベルで行・列の部分集合を取得

39

Page 40: Python for Data Anaysis第2回勉強会4,5章

インデックスオプション

40

Type Notes

obj[val] DataFrameから1つ以上の列を取り出す

obj.ix[val] DataFrameから1つの行を取り出す

obj.ix[:, val] DataFrameから1つの列を取り出す

obj.ix[val1, val2] 行と列両方を選ぶ

reindex method 1つ以上の軸で新しいindexをつくる

xs method ラベルから1つの行か列をSeriesとして取り出す

icol, irow method 数字から1つの行か列をSeriesとして取り出す

get_value, set_value method 行と列のラベルから値を一つ取り出す

Page 41: Python for Data Anaysis第2回勉強会4,5章

データの算術と整理よしなに計算してくれる(欠損値もNaNで扱う)

• もし片方に同じindexがなかったらNaNになってしまう

補完しつつ計算したい• fill_valueを入れれば良い

DataFrameとSeriesで計算

• Broadcastingに似てる41

Method Descirption

add 足し算

sub 引き算

div 掛け算

mul 割り算

Page 42: Python for Data Anaysis第2回勉強会4,5章

Function Application and MappingNumPyのufuncsが使える

• DataFrame.applyが秀逸(sumとかmeanはpandasにある)

• Element-wiseなpythonの関数も使える

42

Page 43: Python for Data Anaysis第2回勉強会4,5章

ソートと順位付け辞書的にソートしたい→sort_index()

値でソートしたい→order()

43

Method Description

‘average' デフォルト.同値の場合は平均順位

‘max' できるだけ悪い順位

‘min’ できるだけ良い順位

‘first’ 同値の場合は先に出てきたほうが先

Page 44: Python for Data Anaysis第2回勉強会4,5章

重複した数値の扱いラベルはユニークである必要はない!• 普通にそのまんま扱える

44

Page 45: Python for Data Anaysis第2回勉強会4,5章

記述統計学の集計と計算今までのは削減,集約する統計学だった(平均とか1つの値)

直接的な統計学的ではないメソッドもある(idxmaxとか)

上2つに当てはまらないメソッドもある(describeとか)

45

Method Description

axis 処理する方向.0は行,1は列に減らす

skipna 欠損値を除外するかどうか.デフォルトはTrue

level multiindexのときに削減する

Page 46: Python for Data Anaysis第2回勉強会4,5章

要約したり描写したりするメソッドたち

46

Method Description

count NA以外カウント

describe 統計情報

min, max 最小値,最大値

argmin, argmax 最小値,最大値のindex location

idxmin, idxmax 最小値,最大値のindex value

quantile 分位点(0~1の範囲)

sum 値の合計

mean 値の平均

median 値の中央値

mad 平均絶対偏差

var 分散

std 標準偏差

skew 歪み,歪度

kurt 尖度

cumsum 累積和

cummin, cummax 累積最小値,累積最大値

cumprod 累乗

diff 差(時間差とかで便利)

pct_change 変化率

Page 47: Python for Data Anaysis第2回勉強会4,5章

相関・共分散Yahoo!経済から株価と株式を使ってみる→API切れ

• corr: 相関

• cov: 共分散

47

Page 48: Python for Data Anaysis第2回勉強会4,5章

固有な値,値カウント,メンバーシップ一つのSeriesに含まれている情報を抜き出す

48

Method Description

isin Seriesに任意の値があるかどうかの二値Seriesを返す

unique ユニークな値のSeriesを返す

value_counts ユニークな値をindex,その頻度を値にしたSeriesを返す

Page 49: Python for Data Anaysis第2回勉強会4,5章

欠損値の処理欠損値は合って当たり前.pandasは可能な限りよしなに扱う

• 欠損値はNaNとして扱う

• pythonのNoneもNaNとして扱う

49

Argument Description

dropna 欠損値をどれだけ無視するか閾値と共に扱う

fillna ffillやbfillのように欠損値を別の値で補完する

isnull 欠損値の場合True,それ以外はFalseで同じ型で返す

notnull isnullの否定

Page 50: Python for Data Anaysis第2回勉強会4,5章

fillnaの引数一覧

50

Argument Description

value 欠損値の補完に数値もしくは辞書を入れる

method デフォルトはffillで,改ざんする

axis デフォルトはaxis=0で,補完

inplace コピーを作らずに直接いじる

limit forward-, backward fillで補完する最大の回数

Page 51: Python for Data Anaysis第2回勉強会4,5章

階層的なインデックス結構便利.• from pandas import MultiIndexでもいけるらしい

足し算とかも結構イケてる

51

Page 52: Python for Data Anaysis第2回勉強会4,5章

その他のpandas

52