読んだメモ:「Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理 第2版」
はじめに
NumpyとかPandasのまだ知らない機能ってたくさんあるんだろうなと思い立ったので、ざっと眺めて知らなかった便利機能をメモ。
# 最近Pythonあんまり触ってないけど、こういう作業って特にPythonでやることがないこういうときにしかできないよなぁと
1章 はじめに
- statsmodels
- 古典的な統計アルゴリズムをサポートする
- ARIMAとか
2章 Pythonの基礎、IPythonとJupyter Notebook
- IPythonのイントロスペクション
- 変数の前後に「?」で情報が見れる
- IPythonで
%run
、%load
- 知ってるけど
%debug
とか%timeit
とかも非常に便利
- 知ってるけど
- 文字列はimmutable
3章 Python組み込みのデータ構造と関数、ファイルの扱い
a,b=b,a
で簡単にswap- タプルの一部を取り出す
*rest
collections.defaultdict
- セット内包表記、ディクショナリ内包表記
- ジェネレータ
itertools
にもgroupby
がある
4章 NumPyの基礎:配列とベクトル演算
- arrayとndarrayって何が違うのって思ってたけど……
- array関数がndarray型を返すということ
- numpyで扱うのは基本ndarrayで、arrayとかarangeとかみんなndarrayを返す
np.where
x if condition else y
のベクトル演算版
cumsum
、cumprod
any
、all
- ほか、便利な集合関数がいろいろ
unique
など
- 行列積は
dot
だけでなく@
でも書ける(3.5以降)
5章 pandas入門
- Seriesとは:「インデックスとデータ値がマッピングされた固定長の順序付きディクショナリ」と捉えられる
- ディクショナリからの変換も可能
- インデックスが異なるSeires同士の算術演算も可能
- Seriesはname属性を持つ
- DataFrameとは:「シリーズをバリューとして持つディクショナリ」と捉えられる
- 各列が一つのシリーズで、インデックスを全体で共有しているイメージ
- 1段階ネストしたディクショナリをもとにDataFrameを作ることも可能
- DataFrameの行・列のインデックスにname属性を与えるとそれぞれ表示される
df.values
で、中身だけ取り出したndarrayができる- インデックスオブジェクトについて
- immutable
- 配列に似ているが集合としての機能も持ち、様々なメソッドが使えるので便利
- 重複値も許す
reindex
- 与えたインデックスに既存の値がない場合はデフォルトでNA
method='ffill
で前方に穴埋めbfill
なら後方fill_value
でnan以外の値も指定可limit
、tolerance
で穴埋めの度合いも指定可
- 与えたインデックスに既存の値がない場合はデフォルトでNA
- 要素指定の際、スライシングでラベルを使うと終点も含む
- locとilocの挙動も違うことになるので注意
- 算術メソッド
- Series、DataFrame同士の算術演算
- インデックスについては外部結合するイメージ
df.add
等のメソッドを使えばfill_value
の指定が可能- SeriesとDataFrame間の演算も可
apply
、applymap
は便利- ソート
sort_index
かsort_values
rank
で順位を返すこともできる
- 集計
mean
とかsum
skipna
で、NAを無視するか指定idxmax
で最大値を持つインデックスを返すargmax
で最大値を持つインデックス位置を返すpct_change
でパーセント変化
isin
なんかも便利pandas_datareader
を利用してデータを取得できる
6章 データの読み込み、書き出しとファイル形式
- 「複雑になりすぎた」
- 区切り文字の指定(正規表現も可)
- NAとみなす文字の指定(列ごとに別でも可)
- スキップする行の指定
TextFileReader
を使う(chunksize
を指定)と少しずつ読み込める- 一度だけなら
nrows
でも指定可
- 一度だけなら
- Python組み込みのcsvモジュールがある
- json、html、xmlの扱い、バイナリデータ、エクセル、webAPI、DBについて
- 必要になったら読む
7章 データのクリーニングと前処理
- 欠損値
dropna
で削除- howとかaxisとか指定
- threshも指定可(その行に何個以上NAがあったら削除するか、など)
fillna
で穴埋め- 列ごとに別の値も可
- methodの指定で
ffill
とかもできる
- 重複
duprecated
、drop_duprecates
で判定、削除- 一度目の登場以外を重複と判断
- 最後だけ残すとかも可
- 置き換え
map
の引数には関数だけでなくディクショナリを与えるのも可replace
も使える
- 軸名の変更
- インデックスにもmapが使える
- renameでもいい
- ビニング
cut
でbinに分けられる- 境界を明示的に指定するのも、等間隔で自動的に分けるのも可
qcut
で分位点ベースにできるのも便利
- 外れ値検出・除去は配列操作で普通にやろう
df.sample
で行の復元・非復元抽出df.take
はilocと同等get_dummies
は便利- 文字列操作
8章 データラングリング:連結、結合、変形
- リストのリストの形で階層型インデックスを指定できる(名前も別々に指定可)
- set_indexとreset_indexで列をインデックスにしたり戻したり
- 複数指定して階層型インデックスも可 − dropパラメータでもとのインデックスを残すかどうか指定
- mergeでSQLライクに結合
- keyの両方に重複値がある場合は直積
- インデックスをkeyとしたいときはleft_indexまたはright_indexをTrueにする
- concatでも連結
df1.combine_first(df2)
- df1の中のNAを対応するdf2の要素で補う
- stack、unstackでピボット
- 階層型インデックスのSeriesとDataFrameを行き来
- DataFrame同士も
- ピボットする階層を指定できる
- stackの際にdropnaを指定できる
- pivot、meltでもデータの縦持ち・横持ちを行き来
9章 プロットと可視化
- # 必要に応じて調べよう
- # 以下は特に有益
10章 データの集約とグループ演算
- groupbyには属性名だけでなく同じ長さの配列も指定可
- for文でgroupbyの結果を回せる
- axis=1も指定可
- ディクショナリを与えて複数属性をグループ化することもできる
- 関数を与えるのも可(その関数をインデックスに与えた結果でグループ化される?)
- 集約関数として、自分で定義したものも与えられる(aggで指定)
- 複数列に複数の関数を適用したい場合も柔軟にできる
- as_index=Falseを指定可
- groupby().apply()を使うのが一番柔軟
- 様々な例を紹介(略)
- pivot_table、crosstabなんかもある
11章 時系列データ
- インデックスがdatetimeの場合、インデックスの型はDatetimeIndexクラスになる
- 年を指定するだけで範囲指定できたりとかいろいろといい感じに解釈
- pd.date_rangeで一定頻度のDatetimeIndexを生成
- 頻度はデフォルトで日ごとだが、いろいろ指定可能(営業日、とかも)
- shift
- デフォルトでは、インデックスはそのままで値をずらす
- 与えた幅だけ、DatetimeIndexごと動かすこともできる
- タイムゾーン関係のテクニックもいろいろある(めんどくさい)
- 「期間」を表すことのできるPeriodクラスがある
- resampleが便利
- ダウンサンプリングは、resampleをgroupbyのように使うイメージ
- ohlc:open、high、low、closeを計算(金融)
- ダウンサンプリングは、resampleをgroupbyのように使うイメージ
- rollingで窓関数を用いた集約ができる
- 移動平均を求めるのに便利
- データ数または期間を指定できたりする
- expandingというのもある(拡大する窓関数)
- 重みをつけたりもできる?
12章 pandas:応用編
- Categorical型
- 基本的に操作は同じだが、パフォーマンスの改善が見込める
- cutで返される区間はカテゴリ型だったりする
- groupby().transform()
- applyと比べて多少制約がかかるが、高速になる場合がある(組み込み関数を用いる場合)
- TimeGrouperによって、特定のkey(インデックスである必要がある)と時系列によるresampleを同時に行える
- assignで列を増やす
- pipeでメソッドチェーンを書く
f(df)
はdf.pipe(f)
と同じ
# いったんここまで