我正在使用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
索引是一个日期时间索引。
我怀疑,如果我在跨年时每周都这样做,同样的情况也会发生。
我做错了什么?我对熊猫还很陌生,所以这可能是一个很容易犯的错误。
IIUC,您可能需要使用resample
,这类似于按月份和年份分组:
aggregate_avgs = member_frame.resample('m').mean().replace(np.inf, 1).fillna(0)
我认为您可以像这里描述的那样编写aggregate_avgs = member_frame.groupby(pd.Grouper(freq="M")).mean()
。