Pandas的“逆”cumprod

flseospp  于 2023-06-20  发布在  其他
关注(0)|答案(3)|浏览(88)

我有一个数据框架,其中包含作为索引的日期和存储连续日期之间的增长百分比的值列(即索引中的日期)。假设我想通过在指数的第一个日期设置100个基数,然后迭代地应用增长%来计算“真实的”值。使用cumprod方法很容易。
现在,我想设置为100基础上的最后日期的指数。因此,我需要为索引中的每个日期计算“逆”增长。有没有一个简单的方法(和pythonic)来做这与Pandas?
致上,
阿利亚

3df52oht

3df52oht1#

考虑 Dataframe df,随机返回10天。

np.random.seed([3,1415])
tidx = pd.date_range('2012-04-01', periods=10)
df = pd.DataFrame(dict(A=np.random.rand(10) / 10), tidx)

df

                   A
2012-04-01  0.044494
2012-04-02  0.040755
2012-04-03  0.046015
2012-04-04  0.046524
2012-04-05  0.046269
2012-04-06  0.001655
2012-04-07  0.085045
2012-04-08  0.081774
2012-04-09  0.077796
2012-04-10  0.075798

您希望使用cumprod,然后除以最后一个值

dcum = df.add(1).cumprod()
dcum.div(dcum.iloc[-1]).mul(100)

                     A
2012-04-01   61.539104
2012-04-02   64.047157
2012-04-03   66.994277
2012-04-04   70.111111
2012-04-05   73.355090
2012-04-06   73.476459
2012-04-07   79.725230
2012-04-08   86.244715
2012-04-09   92.954225
2012-04-10  100.000000
9bfwbjaz

9bfwbjaz2#

上下颠倒,做cumprod,翻转回来:

dfci = df.iloc[::-1].cumprod().iloc[::-1]

适用于框架和系列。
添加关键字:反向电流

iecba09b

iecba09b3#

为了防止其他人在这里结束,让我提供一个更通用的答案。
假设DataFrame列、Series、vector等X具有n值。在任意的位置i你想得到
(X[i])*(X[i+1])*...*(X[n])
相当于
(X[1])*(X[2])*...*(X[n]) / (X[1])*(X[2])*...*(X[i-1])
因此,你可以
inverse_cumprod = (np.prod(X) / np.cumprod(X)) * X

相关问题