Pertimbangkan stok gudang pada hari yang berbeda

day action  quantity symbol
0   1         40      a
1   1         53      b
2   -1        21      a
3   1         21      b
4   -1         2      a
5   1         42      b

Di sini, day mewakili deret waktu, action mewakili buy/sell untuk produk tertentu (symbol) dan quantity.
Untuk kerangka data ini, Bagaimana cara menghitung jumlah kumulatif setiap hari, untuk setiap produk.
Pada dasarnya, kerangka data yang dihasilkan seperti di bawah ini:

days    a   b
0       40  0
1       40  53
2       19  53
3       19  64
4       17  64
5       17  106

Saya telah mencoba cumsum() dengan groupby dan tidak berhasil dengan itu

1
kumar_m_kiran 13 Agustus 2017, 10:45

2 jawaban

Jawaban Terbaik

Menggunakan pivot_table

In [920]: dff = df.pivot_table(
                   index=['day', 'action'], columns='symbol',
                   values='quantity').reset_index()
In [921]: dff
Out[921]:
symbol  day  action     a     b
0         0       1  40.0   NaN
1         1       1   NaN  53.0
2         2      -1  21.0   NaN
3         3       1   NaN  21.0
4         4      -1   2.0   NaN
5         5       1   NaN  42.0

Kemudian, mul tindakan, ambil cumsum, teruskan isi nilai yang hilang, dan terakhir ganti NaN dengan 0

In [922]: dff[['a', 'b']].mul(df.action, 0).cumsum().ffill().fillna(0)
Out[922]:
symbol     a      b
0       40.0    0.0
1       40.0   53.0
2       19.0   53.0
3       19.0   74.0
4       17.0   74.0
5       17.0  116.0

Hasil akhir

In [926]: dff[['a', 'b']].mul(df.action, 0).cumsum().ffill().fillna(0).join(df.day)
Out[926]:
      a      b  day
0  40.0    0.0    0
1  40.0   53.0    1
2  19.0   53.0    2
3  19.0   74.0    3
4  17.0   74.0    4
5  17.0  116.0    5
3
Zero 13 Agustus 2017, 08:02

Sudahlah, tidak melihat tag . Ini hanyalah Python biasa.

Coba ini:

sums = []

currentsums = {'a': 0, 'b': 0}

for i in data:
    currentsums[i['symbol']] += i['action'] * i['quantity']
    sums.append({'a': currentsums['a'], 'b': currentsums['b']})

Cobalah secara online!

Perhatikan bahwa itu memberikan hasil yang berbeda dari yang Anda posting karena Anda salah menghitung.

0
Oliver Ni 13 Agustus 2017, 07:55