読んだメモ:「Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理 第2版」

はじめに

NumpyとかPandasのまだ知らない機能ってたくさんあるんだろうなと思い立ったので、ざっと眺めて知らなかった便利機能をメモ。
# 最近Pythonあんまり触ってないけど、こういう作業って特にPythonでやることがないこういうときにしかできないよなぁと

1章 はじめに

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のベクトル演算版
  • cumsumcumprod
  • anyall
  • ほか、便利な集合関数がいろいろ
    • 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以外の値も指定可
      • limittoleranceで穴埋めの度合いも指定可
  • 要素指定の際、スライシングでラベルを使うと終点も含む
    • locとilocの挙動も違うことになるので注意
  • 算術メソッド
    • Series、DataFrame同士の算術演算
    • インデックスについては外部結合するイメージ
    • df.add等のメソッドを使えばfill_valueの指定が可能
    • SeriesとDataFrame間の演算も可
  • applyapplymapは便利
  • ソート
    • sort_indexsort_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とかもできる
  • 重複
    • duprecateddrop_duprecatesで判定、削除
    • 一度目の登場以外を重複と判断
      • 最後だけ残すとかも可
  • 置き換え
    • mapの引数には関数だけでなくディクショナリを与えるのも可
    • replaceも使える
  • 軸名の変更
    • インデックスにもmapが使える
    • renameでもいい
  • ビニング
    • cutでbinに分けられる
      • 境界を明示的に指定するのも、等間隔で自動的に分けるのも可
    • qcutで分位点ベースにできるのも便利
  • 外れ値検出・除去は配列操作で普通にやろう
  • df.sampleで行の復元・非復元抽出
  • df.takeはilocと同等
  • get_dummiesは便利
  • 文字列操作
    • 基本的にPython標準の機能で十分
    • reモジュールで正規表現
    • シリーズの文字列属性(str)を使うと、NAを無視してくれたりと便利だったりする

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を計算(金融)
  • rollingで窓関数を用いた集約ができる
    • 移動平均を求めるのに便利
    • データ数または期間を指定できたりする
    • expandingというのもある(拡大する窓関数)
    • 重みをつけたりもできる?

12章 pandas:応用編

  • Categorical型
    • 基本的に操作は同じだが、パフォーマンスの改善が見込める
    • cutで返される区間はカテゴリ型だったりする
  • groupby().transform()
    • applyと比べて多少制約がかかるが、高速になる場合がある(組み込み関数を用いる場合)
  • TimeGrouperによって、特定のkey(インデックスである必要がある)と時系列によるresampleを同時に行える
  • assignで列を増やす
  • pipeでメソッドチェーンを書く
    • f(df)df.pipe(f)と同じ

# いったんここまで