【问题标题】:Calculate value using previously-calculated value (from the same column) and value from another column in a Pandas Dataframe使用先前计算的值(来自同一列)和 Pandas 数据框中另一列的值计算值
【发布时间】:2019-10-12 12:22:19
【问题描述】:

在尝试学习如何做到这一点数小时后,我正在与社区联系。

我从以下开始:

                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_change = previous_days_pct_change * ( 1 + perf )

我尝试了几种不同的方法,包括 for ... in 循环,但均未成功。

# 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

但这只给了我一个价值。

我怀疑已经有一种更简单的方法来做我想做的事情,但我只是没有找到它。任何帮助,将不胜感激。在电子表格中很容易做到,但我想学习如何在 Pandas 中做到这一点。

谢谢

【问题讨论】:

  • 先将列中的所有值加一,然后使用cumprod再乘以100。

标签: python pandas dataframe


【解决方案1】:

使用cumprod

df['pct_change'] = (df['perf']+1).cumprod() * 100

实现你真正想要的:

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 值)的累积乘积。

【讨论】:

  • 非常感谢!我知道必须有更好的方法。正是我需要的。
  • 另外...我刚刚意识到我什至不需要执行额外的步骤,即使用初始“​​100”值附加一行!干净多了。再次感谢。
【解决方案2】:

像这样:

dates = ['2018-06-01', '2018-06-02', '2018-06-03', '2018-06-04', '2018-06-05']
import datetime as dt
dates = [pd.datetime.date(dt.datetime.strptime(x, "%Y-%m-%d")) for x in dates]
perfs = [0.012923, 0.039364, 0.042805, -0.033214, -0.021745]
df = pd.DataFrame({'perf': perfs}, index=dates)

# The important bit:
df['pct_change'] = ((df['perf'] + 1).cumprod() * 100)

df
#                 perf  pct_change
# 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

【讨论】:

  • 它们没有正确对齐,即 0.012923 映射到 100。
  • @today Oof。被假人行骗了。现在基本上就是你的答案了,但是对于这个问题会有帮助的一代东西。
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2022-12-18
相关资源
最近更新 更多