2

パンダの月次バケットのテーブルから在庫の在庫を計算しようとしています。これはテーブルです:

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
4

1 に答える 1