python for data anaysis第2回勉強会4,5章
TRANSCRIPT
Python for Data Analysis Chap.4, 5かわの まこと
今日のお話4章 Numpyの基礎
5章 Pandasとはじめよう
2
4章 NumPyの基礎
Numerical Python:特徴ndarray: ものすごく便利な配列
基本的な計算をループなしにやってくれる(すべての要素に)
ディスクに読み書き,メモリ上で計算してくれる
線形代数,乱数生成,フーリエ変換が出来る
C,C++,Fortranのソースコードとごちゃまぜに出来る
4
データ分析における着目点高速なベクトル演算• データマンジング,整理,部分集合か,フィルタリング,変換など
有名な配列アルゴリズム• ソート,ユニーク発見,セットなど
効率的な記述統計学,データの集計統計
データの結合・追加をよしなにやってくれる
if-elif-elseの代わりに配列表記で表現してくれる
集計加工もよしなにやってくれる
5
N-dimensional array object (ndarray)高速で,柔軟な入れ物らしい• とにかくスカラー計算と同じようにまとめてやってくれる
shape- 行,列の大きさを教えてくれる
dtype- 配列のデータタイプ
6
Creating ndarrays最も簡単な配列生成:array関数• 入れ子にすれば,多次元配列を生成
• 基本的によしなにデータタイプを選んでくれる
その他の配列生成:引数一つ→ベクトル,引数タプル→行列• zeros関数:要素全部0
• ones関数:要素全部1
• empty関数:とりあえず空っぽだけど枠は作る感じ
• arange関数:python組み込み関数と一緒
7
配列生成関数一覧表
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次正方単位行列を作成
Data Typesメモリチャンクを解釈する必要があるため• データのバイナリを読み書きしたり,CやFORTRANのコードとコネクトするため
• intやfloatがいっぱいあるけど覚えなくていいよ
9
配列とスカラー配列を使えば,ループ使わないでバッチ処理できる!• ”vectorization”っていうらしい
• 同じサイズの行列なら演算できる
• スカラー +/-/×/÷ 行列も各要素にできる
• 異なるサイズの行列の場合はbroadcastingっていうらしい
10
インデックスとスライスの基礎1次元配列の場合:Pythonと同じようにできる• 配列のスライスはあくまでも実値=コピーではない
• 巨大なデータになった時にコピーしてたらメモリやばいから
多次元配列の場合:• 2次元ならarr[0][2] = arr[0, 2]
• 更に高次元でもOK
11
Boolean Indexing名前配列から,’Bob’見つけたりしたい
- 多分ユーザごとの調査に適用できるとかだと思われる
• boolean indexingで選ばれたデータはコピーされる
• 便利な使い方 data[data < 0] = 0
12
Fancy Indexinginteger配列を使ったインデックス• 配列で指定した順番に出てくる
• 結構ややこしい
13
転置array.Tで転置する
numpy.ndarray.transpose(tuple)• tuple =(2, 1, 0) -> 0軸が2軸に,1軸が1軸に,2軸が0軸に
14
便利な関数たちufunc: sqrt, exp
unary: add, maximum
一般的ではないけど,便利なの:modf
• pythonxのdivmod -> 商と余りを出してくれるx
15
便利な関数一覧
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 数値であるかないか確認
バイナリーで便利な関数一覧
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 各要素で比較.&, |, ^
配列を使ったデータ処理何度も言うようだけど,ループ使わないで出来る• 詳しくは12章でやる
18
配列演算としての条件論理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)
数学的で統計学的な手法合計,平均,標準偏差とか:軸に沿っても出来る
20
Function Description
sum 配列全て/軸に沿っての合計.長さが0の配列の合計は0
mean 配列全て/軸に沿っての平均.長さが0の配列の平均はNaN.
std, var 標準偏差と分散
min, max 最小値と最大値
argmin, argmax 最小,最大要素のインデックス
cumsum 累計的な足し算
cumprod 類型的な掛け算
Boolean配列1(True)と0(False)だからsum使えばTrueを数えられる
• (arr > 0).sum()
anyとall関数
• any: 一つでもTrueがあるかどうか
• all: 全部がTrueかどうか
21
ソート組み込み関数と同じくソート関数ある• np.ndarray.sort()は書き換え
• np.sort()はコピー
• 詳しいことは12章
22
固有とか論理演算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どちらかにしかない要素を返す
ファイル入出力テキストかバイナリでディスクに保存できる• np.saveとnp.load -> 拡張子は.npy
• np.savezにすればzipで保存できる->拡張子は.npz
• np.loadtxtを使えばcsvとかも読み込める(pandasの方が良)
24
線形代数行列積,行列分解,行列式などの行列計算は重要• x.dot(y) = np.dot(x, y) = XY ≠ YX
numpy.linalg: 逆行列と行列式が扱える
25
numpy.linalg関数一覧
26
Function Descriptiondiag 行列の対角要素を1次配列で返すか,一次配列を対角要素にした行列を返すdot 行列積
trace 行列の対角要素の合計det 行列式eig 固有値,固有ベクトルinv 逆行列
pinv ムーアペンロース擬似逆行列qr QR分解
svd 特異値分解solve 線形方程式を解くlstsq 最小二乗法
乱数生成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
numpy.random関数一覧
28
Function Descriptionseed 乱数のシードを生成
permutation 連続した数値のランダム順列を返すshuffle まぜるrand 一様分布からサンプリングする
randint low-highの範囲から整数をランダムで返すrandn 正規分布からサンプリング(平均は0,標準偏差は1)
binomial 二項分布からサンプリングnormal 正規(ガウシアン)分布からサンプリング
beta ベータ分布からサンプリングchisquare カイ二乗分布からサンプリング
gamma ガンマ分布からサンプリングuniform 一様分布[0, 1)からサンプリング
具体例:ランダムウォークpythonのコードとnumpyを使ったコードの比較
複数のランダムウォークを動かす
29
5章 pandasとはじめよう
pandasのありがたい話pythonで高速かつ簡単にデータ構造・操作を扱えるツール
• NumPyで実装されてる
どうやら筆者が作ったらしい.そのコンセプトは:• データ構造をよしなに扱いたい
• 時系列も扱えるようになりたい
• 算術演算とか
• 欠損値とか
• SQLとかと同じように扱いたい
31
pandasで大事なデータ構造:Series1次元配列ライクな構造+データラベルの連想配列(index)左側にindex,右側にValueがある• indexは指定がなければ0からN-1番が振られる
numpyと同じように色々できる辞書からもSeriesは簡単欠損値について(軽く)
• pd.isnull(), pd.notnull(), obj.isnull() 簡単に算術演算も出来るSeries自体とindexにはname属性がある
32
pandasで大事なデータ構造:DataFrame表やスプレッドシートライクなデータ構造• 各列は別のValue Typeでよい(数字,文字など)
• 行・列それぞれにindexがある
33
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
Index Object軸のラベルやメタデータ(軸の名前とか)を保持する• indexは不変→データを共有するときに安全
35
Class Description
Index 最も一般的.NumPyオブジェクトとして表現
Int64Index 整数値のための特別なindex
MultiIndex 階層的なindex.タプルの配列のような感じ
DatetimeIndex ナノ秒のタイムスタンプ
PeriodIndex 期間を示すindex
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を生成
大事な機能性: 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)
軸をそのまま削除drop関数
• SeriesでもDataFrameでもどちらでもいける
38
インデックス,選択,フィルタリングSeriesのインデックスは普通のNumPy配列と一緒
Special Indexing Field:ix
• DataFrameからNumPy+軸ラベルで行・列の部分集合を取得
39
インデックスオプション
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 行と列のラベルから値を一つ取り出す
データの算術と整理よしなに計算してくれる(欠損値もNaNで扱う)
• もし片方に同じindexがなかったらNaNになってしまう
補完しつつ計算したい• fill_valueを入れれば良い
DataFrameとSeriesで計算
• Broadcastingに似てる41
Method Descirption
add 足し算
sub 引き算
div 掛け算
mul 割り算
Function Application and MappingNumPyのufuncsが使える
• DataFrame.applyが秀逸(sumとかmeanはpandasにある)
• Element-wiseなpythonの関数も使える
42
ソートと順位付け辞書的にソートしたい→sort_index()
値でソートしたい→order()
43
Method Description
‘average' デフォルト.同値の場合は平均順位
‘max' できるだけ悪い順位
‘min’ できるだけ良い順位
‘first’ 同値の場合は先に出てきたほうが先
重複した数値の扱いラベルはユニークである必要はない!• 普通にそのまんま扱える
44
記述統計学の集計と計算今までのは削減,集約する統計学だった(平均とか1つの値)
直接的な統計学的ではないメソッドもある(idxmaxとか)
上2つに当てはまらないメソッドもある(describeとか)
45
Method Description
axis 処理する方向.0は行,1は列に減らす
skipna 欠損値を除外するかどうか.デフォルトはTrue
level multiindexのときに削減する
要約したり描写したりするメソッドたち
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 変化率
相関・共分散Yahoo!経済から株価と株式を使ってみる→API切れ
• corr: 相関
• cov: 共分散
47
固有な値,値カウント,メンバーシップ一つのSeriesに含まれている情報を抜き出す
48
Method Description
isin Seriesに任意の値があるかどうかの二値Seriesを返す
unique ユニークな値のSeriesを返す
value_counts ユニークな値をindex,その頻度を値にしたSeriesを返す
欠損値の処理欠損値は合って当たり前.pandasは可能な限りよしなに扱う
• 欠損値はNaNとして扱う
• pythonのNoneもNaNとして扱う
49
Argument Description
dropna 欠損値をどれだけ無視するか閾値と共に扱う
fillna ffillやbfillのように欠損値を別の値で補完する
isnull 欠損値の場合True,それ以外はFalseで同じ型で返す
notnull isnullの否定
fillnaの引数一覧
50
Argument Description
value 欠損値の補完に数値もしくは辞書を入れる
method デフォルトはffillで,改ざんする
axis デフォルトはaxis=0で,補完
inplace コピーを作らずに直接いじる
limit forward-, backward fillで補完する最大の回数
階層的なインデックス結構便利.• from pandas import MultiIndexでもいけるらしい
足し算とかも結構イケてる
51
その他のpandas
52