Dive into hoge

データ分析関連の備忘録

pandas操作⑥:横持ち変換

縦持ち(レコード形式)から横持ち(表形式)への変換をするとき、スマートではないのはわかっていたけどSQLで横持ち変換したい値に応じたcase文をシコシコ書いていた。値が増えたりしたときにまた書き換える必要あるのでこれはクソなコードである。

pythonに横持ち変換用にpivot_table関数というのがあることを知ったのでどうやるのか試してみる。

import pandas as pd
from preprocess.load_data.data_loader import load_hotel_reserve
customer_tb, hotel_tb, reserve_tb = load_hotel_reserve()

# pivot_table関数で、横持ち変換と集約処理を同時実行
# aggfuncに予約数をカウントする関数を指定
pd.pivot_table(reserve_tb, index='customer_id', columns='people_num',
               values='reserve_id',
               aggfunc=lambda x: len(x), fill_value=0)

https://github.com/ghmagazine/awesomebook/blob/master/preprocess/007_spread/01/python_awesome.py
『前処理大全』の上記githubから引用。

SQLだとpeople_numの人数毎にcase文書いていたけどこれなら一発でできるよ、ということらしい。でもredshiftのテーブルからデータを引っ張って来ている場合はこの関数では直接テーブルみれないのでredshiftのテーブルをDataFrameにする必要があるので、結局SQLは書くことになる。

仮に直接redshiftのテーブル見れたとしても、そのまま使うことってないから(他のテーブルと結合したり、何らかの抽出条件加えたりする)、やはりpivot_table関数の前にread_sql_query関数が必要になる。

まずは下記の記事で書いたredshiftに接続する方法でデータ持ってくるわけです。
exotic-manifold.hatenablog.com

いつも上記の方法でredshiftにあるテーブルにアクセスしていたけど、『前処理大全』にもっと簡単な接続方法書いてるかもしれないから次はこれを調べる。