ほんじゃらねっと

ダイエット中プログラマのブログ

PythonとPandasで作業履歴から案件別作業別のピボットテーブルを作成する

作業履歴が入ったデータベーステーブルから、 案件情報を行に、作業内容(「設計」とか「PG」とか)を列に、 案件別作業内容別合計時間を値として持つピボットテーブルを作成して Excelで確認する必要があったので、以前から興味のあったPandasを 使ってスクリプトを書いてみた。

作業履歴テーブル(work_histories)は下記のような構成とする:

案件名 customer_name
作業名 type_name
作業時間数 total_work_time

genka_checker.py

import psycopg2
import pandas as pd
import pandas.io.sql as psql

OUTPUT_CSV_PATH = '<CSVファイル出力パス>'

conn = psycopg2.connect(
    host='<DBホスト名>',
    port='<DBポート番号>',
    database='<DB名>',
    user='<DBユーザー名>',
    password='<DBパスワード>'
)

sql = 'select customer_name, type_name, sum(total_work_time) as sum_time from work_histories group by customer_name, type_name order by customer_name'

df = psql.read_sql(sql, conn)
df.groupby('type_name').agg(np.sum)
pd.pivot_table(df, values='sum_time', index=['customer_name'], columns=['type_name']).fillna(0).to_csv(OUTPUT_CSV_PATH, encoding='cp932')

conn.close()

初めてPandasを使ったけど、色々便利な機能があって勉強する価値がありそう。

次は合計作業時間ではなく、案件ごとの作業の割合を出したい。 正しく見積もるためのヒントが見えてきそう。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理