首页 > 解决方案 > 熊猫数据框的年度加权平均值

问题描述

中级/初学者 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)?

标签: pythonpandasdatedataframestatistics

解决方案


获取包含年度平均值的列的正确语法是

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().

在您的示例数据中,每个股票代码都有一个唯一的年份,该年份对于该股票代码的所有值都相同,并且与所有其他股票代码值不同,因此按年份分组和按年份和股票代码分组是等效的操作。


推荐阅读