Pandas:根据另一列的百分比增长率创建一个新列

Posted

技术标签:

【中文标题】Pandas:根据另一列的百分比增长率创建一个新列【英文标题】:Pandas: create a new column based on percentage growth rates from another column 【发布时间】:2022-01-24 00:41:17 【问题描述】:

我很确定我正在为一些非常简单的事情而苦苦挣扎,但我需要一些帮助......

我正在尝试在Portfolio 列中添加基于每日价格发展的股票总价值:

Date Close Change Portfolio
2018-12-27 10381.509766 NaN 1000.000000
2018-12-28 10558.959961 0.017093 1017.092908
2019-01-02 10580.190430 0.002011 1002.010659
2019-01-03 10416.660156 -0.015456 984.543731
2019-01-04 10767.690430 0.033699 1033.698927

因此我正在使用以下功能:

def XP_strategy(data):
    #Starting capital
    START = 1000
    data['Change'] = data['Close'].pct_change()
    data['Portfolio'] = START
    data.loc[1:, 'Portfolio'] = data['Portfolio'].shift(1) * (1 + data['Change'])

    columns = ['Close', 'Change', 'Portfolio']

    return data[columns]
    

如您所见,我无法根据前一天应用某天的投资组合公式。请问有人可以帮我吗?

【问题讨论】:

【参考方案1】:

此线程中的其他答案在技术上是正确的并返回您的预期输出 - 但如果您尝试计算股票价值 - 这是错误的。在更简单的数字上——如果你买了 10 股每股 100 美元的股票,一段时间后每股价值 1000 美元,你的投资组合应该大 10 倍。您提出的方法不会出现这种情况。

我会以一种更简单的方式来解决这个问题 - 您只需建立一个比例 portfolio / close 一次(AKA 拥有的股份数量),然后使用从给定的 close 值中找出 portfolio 值的比例。像这样:

start = 1000
proportion = start/df['Close'].iloc[0]
df['Portfolio'] = proportion * df['Close']

结果:

         Date         Close           Portfolio
0  2018-12-27   10381.509766        1000.000000
1  2018-12-28   10558.959961        1017.092908
2  2019-01-02   10580.190430        1019.137935
3  2019-01-03   10416.660156        1003.385865
4  2019-01-04   10767.690430        1037.198892

【讨论】:

【参考方案2】:

使用pct_change

START = 1000
df['Portfolio'] = START + START * df['Close'].pct_change().fillna(0)
print(df)

# Output:
         Date         Close    Change    Portfolio
0  2018-12-27  10381.509766       NaN  1000.000000
1  2018-12-28  10558.959961  0.017093  1017.092908
2  2019-01-02  10580.190430  0.002011  1002.010659
3  2019-01-03  10416.660156 -0.015456   984.543731
4  2019-01-04  10767.690430  0.033699  1033.698927

【讨论】:

以上是关于Pandas:根据另一列的百分比增长率创建一个新列的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - 基于 str 包含从另一列创建新列/值

Pandas:根据字符串的一部分是不是在另一列中的任何位置创建新列

Pandas - 基于另一列(城市名称)创建一个新列(分支名称)

要检查 Pandas Dataframe 列的 TRUE/FALSE,如果 TRUE 检查另一列是不是满足条件并生成具有值 PASS/FAIL 的新列

Pandas Dataframe to pivot table - 根据前两列的添加创建新列

根据另一列计算 groupby 中的百分比