我有一个数据集,我想用它来计算平均季度增长率,并按数据集中的每年细分。

现在,我有一个具有多级分组的数据框,我想将gmean函数从scipy.stats应用于数据集中的每一年。

我用来获取季度增长率的代码如下:

df.groupby(df.index.year).resample('Q')['Sales'].sum() / df.groupby(df.index.year).resample('Q')['Sales'].sum().shift(1)


结果就是这样:

python - 计算 Pandas 特定水平的多级指数增长率-LMLPHP

因此,基本上我想要2014年的几何平均值(1.162409、1.665956、1.250600),以及其他每隔一年的季度增长率。

本能地,我想做这样的事情:

(df.groupby(df.index.year).resample('Q')['Sales'].sum() / df.groupby(df.index.year).resample('Q')['Sales'].sum().shift(1)).apply(gmean, level=0)


但这是行不通的。

最佳答案

我不知道您的数据是什么样子,所以我将随机抽取一些样本数据:

dates = pd.date_range('2014-01-01', '2017-12-31')
n = 5000

np.random.seed(1)
df = pd.DataFrame({
    'Order Date': np.random.choice(dates, n),
    'Sales': np.random.uniform(1, 100, n)
})

  Order Date      Sales
0 2016-11-27  82.458720
1 2014-08-24  66.790309
2 2017-01-01  75.387001
3 2016-06-24   9.272712
4 2015-12-17  48.278467


和代码:

# Total sales per quarter
q = df.groupby(pd.Grouper(key='Order Date', freq='Q'))['Sales'].sum()

# Q-over-Q growth rate
q = (q / q.shift()).fillna(1)

# Y-over-Y growth rate
from scipy.stats import gmean
y = q.groupby(pd.Grouper(freq='Y')).agg(gmean) - 1
y.index = y.index.year
y.index.name = 'Year'

y.to_frame('Avg. Quarterly Growth').style.format('{:.1%}')


结果:

        Avg. Quarterly Growth
Year
2014                    -4.1%
2015                    -0.7%
2016                     3.5%
2017                    -1.1%

08-19 21:43