I have a dataframe where one column contains dates, one column contains the price of a stock and one column contains the dividend. I want to add another column that calculates compounded return with this data. Here is the formula I want to follow. enter image description here

下面是一个数据帧示例,以及我想对其执行的操作:

            price  dividend   
2020-07-31  83.08    0.7125  
2020-08-31  73.35    0.7225 
2020-09-30  74.55    0.7325  
2020-10-31  81.57    0.8400  
2020-11-30  81.85    0.8500  
2020-12-31  79.95    0.8600

假设n=2,那么我想使用当前行和前两行来计算每行的回报.例如,2020-12-31年世界其他地区的计算结果为:

复合旋转=(79.95/81.57)*((1+0.84/81.57)*(1+0.85/81.85)*(1+0.86/79.95))=1.0113

当n=2时,新列将如下所示:

            price  dividend    return
2020-07-31  83.08    0.7125        NA     
2020-08-31  73.35    0.7225        NA     
2020-09-30  74.55    0.7325    0.9229     
2020-10-31  81.57    0.8400    1.1457     
2020-11-30  81.85    0.8500    1.1318     
2020-12-31  79.95    0.8600    1.0113

有什么内置函数可以在python/numpy上帮助我做到这一点吗?

推荐答案

有几种方法可以实现这一点.我给你们两个,一个长的和一个短的.对于这两种情况,实际上不需要循环每个值,也不需要numpy.

给定您的数据帧:

import pandas as pd

date = ['2020-07-31', '2020-08-31', '2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31']
price = [83.08, 73.35, 74.55, 81.57, 81.85, 79.95]
dividends = [0.7125, 0.7225, 0.7325, 0.8400, 0.8500, 0.8600]

df = pd.DataFrame({"price":price, "dividend":dividends}, index=date)

Approach 1:

您只需使用pd.shift来重新构造数据,以便可以直接按列应用公式.我的代码包含一些注释,以使其更清楚.

你可以做这样简单的事情:

N = 2

# Define temporary return column
df["tmp_returns"] = 1 + df["dividend"].div(df["price"])
# Define compounded return column
df["compunded_return"] = df["tmp_returns"]

# Update compunded return column where number of updates is given by N
for i in range(1, N+1):
    df["compunded_return"] *= df["tmp_returns"].shift(i)
# Apply formula
df["compunded_return"] = (df["price"].div(df["price"].shift(N))).mul(df["compunded_return"])
# Drop temporary column
df.drop(columns=["tmp_returns"])

Approach 2:

如果你想要一条直线(这有点复杂),你也可以将pd.shiftrolling结合起来得到你想要的结果:

N = 2
df["compunded_return"] = (df["price"].div(df["price"].shift(N))).mul((1 + df["dividend"].div(df["price"])).rolling(N+1).apply(lambda x: x.prod()))

pd.df.rolling提供了一个滚动窗口计算,您可以应用该产品.

输出两种方法:

            price   dividend   compunded_return
2020-07-31  83.08   0.7125     NaN
2020-08-31  73.35   0.7225     NaN
2020-09-30  74.55   0.7325     0.922918
2020-10-31  81.57   0.8400     1.145732
2020-11-30  81.85   0.8500     1.131758
2020-12-31  79.95   0.8600     1.011279

Python相关问答推荐

运行Python脚本时,用作命令行参数的SON文本

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

为什么默认情况下所有Python类都是可调用的?

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

NumPy中条件嵌套for循环的向量化

python中的解释会在后台调用函数吗?

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

在Python中计算连续天数

手动设置seborn/matplotlib散点图连续变量图例中显示的值

GPT python SDK引入了大量开销/错误超时

从嵌套极轴列的列表中删除元素

如何在一组行中找到循环?

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

为什么dict. items()可以快速查找?

当我定义一个继承的类时,我可以避免使用`metaclass=`吗?

Pandas:将值从一列移动到适当的列

EST格式的Azure数据库笔记本中的当前时间戳

ValueError:必须在Pandas 中生成聚合值

如何定义一个将类型与接收该类型的参数的可调用进行映射的字典?

nameError_C未定义