Python 使用先前计算的值(来自同一列)和数据帧中另一列的值计算值
在花了几个小时努力学习如何做到这一点后,我开始接触社区 我从以下几点开始:Python 使用先前计算的值(来自同一列)和数据帧中另一列的值计算值,python,pandas,dataframe,Python,Pandas,Dataframe,在花了几个小时努力学习如何做到这一点后,我开始接触社区 我从以下几点开始: perf date 2018-06-01 0.012923 2018-06-02 0.039364 2018-06-03 0.042805 2018-06-04 -0.033214 2018-06-05 -0.021745 需要计算新列的累积百分比变化,但需要确保计算使用100作为起始值。所以我在一行前面加了100:
perf
date
2018-06-01 0.012923
2018-06-02 0.039364
2018-06-03 0.042805
2018-06-04 -0.033214
2018-06-05 -0.021745
需要计算新列的累积百分比变化,但需要确保计算使用100作为起始值。所以我在一行前面加了100:
perf pct_change
date
2018-05-31 NaN 100.0
2018-06-01 0.012923 NaN
2018-06-02 0.039364 NaN
2018-06-03 0.042805 NaN
2018-06-04 -0.033214 NaN
我需要得到的是:
perf pct_change
date
2018-05-31 NaN 100.0
2018-06-01 0.012923 101.2923
2018-06-02 0.039364 105.2795701
2018-06-03 0.042805 109.7860621
2018-06-04 -0.033214 106.1396278
公式类似于pct\u change=previous\u days\u pct\u change*(1+perf)
我尝试了几种不同的方法,包括针对。。。在循环中没有成功
# INCOMPLETE/DOES NOT WORK (adding for illustration purposes only)
for index, row in performance.iterrows():
curr = performance.loc[index, 'perf']
pidx = index + pd.DateOffset(-1)
prev = performance.iloc[[pidx], 'pct_change']
performance.loc[index, 'pct_change'] = prev * ( 1 + curr )
我还尝试:
performance['pct_change'] = performance['pct_change'].shift() * ( 1 + performance['perf'] )
这将产生:
perf pct_change
date
2018-05-31 NaN NaN
2018-06-01 0.012923 101.292251
2018-06-02 0.039364 NaN
2018-06-03 0.042805 NaN
2018-06-04 -0.033214 NaN
但这只给了我一个值
我怀疑已经有一个更简单的方法来做我想做的事情,但我只是没有找到它。任何帮助都将不胜感激。在电子表格中很容易做到,但我想学习如何在熊猫中做到这一点
感谢您使用:
实现您真正想要的:
pct_change_0 = (perf_0 + 1) * 100
pct_change_1 = pct_change_0 * (perf_1 + 1) = (perf_0 + 1) * (perf_1 + 1) * 100
pct_change_2 = pct_change_1 * (perf_2 + 1) = (perf_0 + 1) * (perf_1 + 1) * (perf_2 + 1) * 100
...
因此,您实际上是在计算perf
值的累积乘积(或者更准确地说perf+1
值)。使用:
实现您真正想要的:
pct_change_0 = (perf_0 + 1) * 100
pct_change_1 = pct_change_0 * (perf_1 + 1) = (perf_0 + 1) * (perf_1 + 1) * 100
pct_change_2 = pct_change_1 * (perf_2 + 1) = (perf_0 + 1) * (perf_1 + 1) * (perf_2 + 1) * 100
...
因此,您实际上是在计算perf
值(或者更准确地说perf+1
值)的累积乘积
日期=['2018-06-01'、'2018-06-02'、'2018-06-03'、'2018-06-04'、'2018-06-05']
将日期时间导入为dt
日期=[pd.datetime.date(dt.datetime.strtime(x,“%Y-%m-%d”))表示x个日期]
性能=[0.012923,0.039364,0.042805,-0.033214,-0.021745]
df=pd.DataFrame({'perf':perfs},index=dates)
#重要的一点是:
df['pct_change']=((df['perf']+1.cumprod()*100)
df
#性能更改
# 2018-06-01 0.012923 101.292300
# 2018-06-02 0.039364 105.279570
# 2018-06-03 0.042805 109.786062
# 2018-06-04 -0.033214 106.139628
# 2018-06-05 -0.021745 103.831622
像这样:
日期=['2018-06-01'、'2018-06-02'、'2018-06-03'、'2018-06-04'、'2018-06-05']
将日期时间导入为dt
日期=[pd.datetime.date(dt.datetime.strtime(x,“%Y-%m-%d”))表示x个日期]
性能=[0.012923,0.039364,0.042805,-0.033214,-0.021745]
df=pd.DataFrame({'perf':perfs},index=dates)
#重要的一点是:
df['pct_change']=((df['perf']+1.cumprod()*100)
df
#性能更改
# 2018-06-01 0.012923 101.292300
# 2018-06-02 0.039364 105.279570
# 2018-06-03 0.042805 109.786062
# 2018-06-04 -0.033214 106.139628
# 2018-06-05 -0.021745 103.831622
首先将一个值添加到列中的所有值中,然后使用,然后乘以100。首先将一个值添加到列中的所有值中,然后使用,然后乘以100。它们没有正确对齐,即0.012923映射到100。@today Oof。被那条假行骗了。现在,这基本上是你的答案,但这一代的东西在这个问题上会很有帮助。它们没有正确对齐,即0.012923被映射到100。@today Oof。被那条假行骗了。现在,这基本上是你的答案,但对于这一代人来说,这在这个问题上会很有帮助。非常感谢!我知道一定有更好的办法。正是我需要的。而且。。。我刚刚意识到,我甚至不必额外添加一行初始值为“100”的行!这么干净。再次感谢,非常感谢!我知道一定有更好的办法。正是我需要的。而且。。。我刚刚意识到,我甚至不必额外添加一行初始值为“100”的行!这么干净。再次感谢。