python - 熊猫数据框的年度加权平均值
问题描述
中级/初学者 Python 用户在这里。我需要弄清楚如何根据我解析成数据框的一些股票市场数据计算年度权重和加权平均值。
我有 2003-2018 年某个区间的股票市场价值和日期,如下所示(有比这个片段显示的更多的价值):
ticker date marketcap open high low close
A 2003-03-31 8466487038.0 13.38 13.47 13.0 13.15
A 2003-06-30 11273789220.5 19.5 19.76 19.46 19.55
AA 2017-03-31 6031414196.0 34.06 34.74 33.6 34.4
AA 2017-06-30 6426297428.0 33.16 33.45 32.535 32.65
ICE 2016-03-31 29363680289.5 46.396 47.184 46.242 47.028
ICE 2016-06-30 31796255816.0 50.602 51.349 50.321 51.192
我只是想为每个股票的市值计算一个年度权重。
IE:
Weight(YEAR) = AVGTickerMarketCap(YEAR) / AllTickersMarketCap(YEAR)
由于每年的市值有多个值,我需要为每个股票取 2003、2004、2005 年等的市值的平均第一个值——因此是 AVGTickerMarketCap(YEAR)。
我只能弄清楚如何计算 AllTickersMarketCap(YEAR):
df1['date'] = pd.to_datetime(df1.date)
avg_all = df1.groupby(df1.date.dt.year['marketcap'].transform('mean')
但这似乎只取第一个股票代码“A”,并将“A”的相同平均值应用于每年,无论他们的股票代码如何。
问题出在哪里,然后我将如何寻找 AVGTickerMarketCap(YEAR)?
解决方案
获取包含年度平均值的列的正确语法是
avg_all = df1['marketcap'].groupby(df1.date.dt.year).transform('mean')
同样,要获得每年的平均值和代码,您将运行:
avg_all = df1['marketcap'].groupby([df1.date.dt.year,df1.ticker]).transform('mean')
如果您不希望它成为一个列,您可以映射回您的数据框,而只是想要一个新的数据框,其中包含每年/股票代码的值,您可以.transform('mean')
使用.mean()
.
在您的示例数据中,每个股票代码都有一个唯一的年份,该年份对于该股票代码的所有值都相同,并且与所有其他股票代码值不同,因此按年份分组和按年份和股票代码分组是等效的操作。
推荐阅读
- angular - 等待多个请求完成的正确方法是什么?
- kubernetes - Istio - 使用 DNS 名称访问外部数据库(TCP)
- javascript - ReactJS - TypeError:无法读取未定义的属性“名称”,但它是
- php - 如何使用数据库作为变量进行查询
- java - logback - 有没有办法包含目录中的所有配置文件
- c# - OneFS API POST 请求上的 400 错误请求
- regex - 使用跨不同行匹配的花括号重新格式化和清理 CSV 文件
- python - 如何制作在keras中使用模型的自定义损失函数
- mysql - 想知道为什么我必须分配给 mysql 中的会话变量?
- google-apps-script - 删除今天日期之后的行且列值为空白 - Google 表格