【问题标题】:Annual weighted average of pandas dataframe熊猫数据框的年度加权平均值
【发布时间】:2018-11-16 18:22:18
【问题描述】:

这里是中级/初级 Python 用户。我需要弄清楚如何根据我解析成数据框的一些股市数据来计算年度权重和加权平均值。

我有 2003-2018 年某个区间的股票市场价值和日期,是这样给出的(比这个 sn-p 显示的价值要多得多):

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

我只是想为每个股票代码的市值计算一个权重。

即:

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)?

【问题讨论】:

    标签: python pandas date dataframe statistics


    【解决方案1】:

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

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

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

    【讨论】:

    • 没关系,我发现了这个问题。它工作正常。
    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 2014-11-30
    • 1970-01-01
    • 2018-05-15
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多