【问题标题】:Pandas aggregate order for monthly/weekly changesPandas 每月/每周更改的汇总订单
【发布时间】:2022-02-08 01:21:46
【问题描述】:

我正在使用 django 从 SQL 数据库中检索数据,然后将其转换为 pandas 数据框。 目标是计算每个人的一些指标以及所有人的整体指标。

计算我的指标后,我想将这些值与上个月进行比较,并将变化计算为百分比。

这大致是这样的:

member_frame = member_frame.truncate(before=(previous_start - timedelta(days=1)))

这给了我从上个月到本月底的所有条目。

然后我计算一些值的总和:

aggregate_avgs = member_frame.groupby(member_frame.index.month).mean().replace(np.inf, 1).fillna(0)

最后计算百分比变化:

avgs_change = aggregate_avgs.pct_change().replace(np.inf, 1).fillna(-1)

如果我们看一下从 1 月到 2 月的变化,就像这样:

target_date
1           -1.000000 -1.000000 -1.000000           -1.0 -1.000000 -1.000000  -1.000000
2            0.142857  0.076923 -0.828571            0.0 -0.587774 -0.699994  -0.507199

这行得通……好吗?因为我只对从第一个日期到第二个日期的变化感兴趣,所以我只取第二行的值。

但如果我在 12 月和 1 月也这样做,我会得到:

target_date
1           -1.00000 -1.000000 -1.000000           -1.0 -1.000000 -1.000000  -1.000000
12           0.02682  0.273444  0.449811            0.0  0.259059  0.424178   0.223225

如您所见,这有点颠倒过来,而且更改实际上是针对错误的月份。 target_date 索引是日期时间索引。

我怀疑如果我在跨年时每周更改一次,也会发生同样的情况。

我做错了什么? 我对 pandas 很陌生,所以这也可能是一个非常容易的错误。

【问题讨论】:

    标签: pandas dataframe


    【解决方案1】:

    IIUC,您可能想改用resample,这类似于按月和年分组:

    aggregate_avgs = member_frame.resample('m').mean().replace(np.inf, 1).fillna(0)
    

    【讨论】:

      【解决方案2】:

      我认为您可以按照here 的描述写aggregate_avgs = member_frame.groupby(pd.Grouper(freq="M")).mean()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 2022-06-27
        • 1970-01-01
        相关资源
        最近更新 更多