パンダの月次バケットのテーブルから在庫の在庫を計算しようとしています。これはテーブルです:
Goods | Incoming | Date
-------+------------+-----------
'a' | 10 | 2014-01-10
'a' | 20 | 2014-02-01
'b' | 30 | 2014-01-02
'b' | 40 | 2014-05-13
'a' | 20 | 2014-06-30
'c' | 10 | 2014-02-10
'c' | 50 | 2014-05-10
'b' | 70 | 2014-03-10
'a' | 10 | 2014-02-10
これまでの私のコードは次のとおりです。
import pandas as pd
df = pd.DataFrame({
'goods': ['a', 'a', 'b', 'b', 'a', 'c', 'c', 'b', 'a'],
'incoming': [0, 20, 30, 40, 20, 10, 50, 70, 10],
'date': ['2014-01-10', '2014-02-01', '2014-01-02', '2014-05-13', '2014-06-30', '2014-02-10', '2014-05-10', '2014-03-10', '2014-02-10']})
df['date'] = pd.to_datetime(df['date'])
# we don't care about year in this example
df['month'] = df['date'].map(lambda x: x.month)
dfg = df.groupby(['goods', 'month'])['incoming'].sum()
# flatten multi-index
dfg = dfg.reset_index ()
dfg['level'] = dfg.groupby(['goods'])['incoming'].cumsum()
dfg
返す
goods month incoming level
0 a 1 0 0
1 a 2 30 30
2 a 6 20 50
3 b 1 30 30
4 b 3 70 100
5 b 5 40 140
6 c 2 10 10
7 c 5 50 60
これは良いことですが、私が使用する視覚化方法では、(1) グループ (「商品」) ごとに同じ数のデータ ポイント、(2) 時系列の同じ範囲 (つまり、最初の月と最後の月は同じ) が必要です。すべての時系列) および (3) どの時系列にも「ギャップ」がないこと (データポイントのある最小 (月) と最大 (月) の間の月)。
パンダでこれを行うにはどうすればよいですか? この構造は少し非効率的かもしれませんが、一般的な流れに固執したいと思います。おそらく、ギャップを埋めるために「後処理」を挿入することは可能です。
アップデート
以下の回答を要約すると、私はこれを行うことにしました。
piv = dfg.pivot_table(["level"], "month", "goods")
piv = piv.reindex(np.arange(piv.index[0], piv.index[-1] + 1))
piv = piv.ffill(axis=0)
piv = piv.fillna(0)
piv.index.name = 'month'
私も追加しました
piv = piv.stack()
print r.reset_index()
入力テーブルに似たテーブルを取得するには:
month goods level
0 1 a 0
1 1 b 30
2 1 c 0
3 2 a 30
4 2 b 30
5 2 c 10
6 3 a 30
7 3 b 100
8 3 c 10
9 4 a 30
10 4 b 100
11 4 c 10
12 5 a 30
13 5 b 140
14 5 c 60
15 6 a 50
16 6 b 140
17 6 c 60