python - Pandas 时间分组 : Drop "non full groups"

标签 python pandas statistics

我正在按某个频率对数据进行分组,但 TimeGrouper 似乎在右侧为一些“剩余”数据创建了最后一个组。

df.groupby([pd.TimeGrouper("2AS", label='left')]).sum()['shopping'].plot()

我预计数据随着时间的推移会相当稳定,但 2013 的最后一个数据点下降了近一半。我预计会发生这种情况,因为在一年两次的分组中,下半年 (2014) 会丢失。

rolling_mean 允许 center=True,这将在左侧和右侧放置 NaN/删除余数。石斑鱼有类似的功能吗? I couldn't find any on the manual ,但也许有解决方法?

left over

最佳答案

我认为这里的问题并不真正涉及 TimeGrouper 可用的选项,而是涉及您希望如何处理不均匀的数据。我能想到的基本上有 4 个选择:

1) 丢弃足够的观测值(在开始或结束时),以便获得 2 年倍数的观测值。

2) 推断您的开始(或结束)时间段,使其与具有完整数据的时间段进行比较。

3) 根据少于 2 年的基本时间段将数据标准化为 2 年总和。这种方法可以与其他两种方法结合起来。

4) 不用 groupby 的方法,只需执行rolling_sum即可。


示例数据框:

rng = pd.date_range('1/1/2010', periods=60, freq='1m')
df = pd.DataFrame({ 'shopping' : np.random.choice(12,60) }, index=rng )

我刚刚使用从 1 月 1 日开始的 5 年数据制作了示例数据集,因此如果您每年都这样做,那么您就完成了。

df.groupby([pd.TimeGrouper("AS", label='left')]).sum()['shopping']
Out[206]: 
2010-01-01    78
2011-01-01    60
2012-01-01    76
2013-01-01    51
2014-01-01    60
Freq: AS-JAN, Name: shopping, dtype: int64

这是表格形式的问题,前两组基于 2 年的数据,但第三组仅基于 1 年的数据。

df.groupby([pd.TimeGrouper("2AS", label='left')]).sum()['shopping']
Out[205]: 
2010-01-01    138
2012-01-01    127
2014-01-01     60
Freq: 2AS-JAN, Name: shopping, dtype: int64

如果您采用上述方法 (1),您只需删除一些观察结果即可。很容易放弃后来的观察并重新输入相同的命令。删除早期的观察结果有点棘手,因为这样你的第一次观察就不会在偶数年的 1 月 1 日开始,并且你会丢失自动标签等。这是一种方法,它将删除第一年并保留最后 4 年,但您会失去漂亮的标签(您可以与上面的年度数据进行比较以验证这是否正确):

In [202]: df2 = df[12:]

In [203]: df2['group24'] = (np.arange( len(df2) ) / 24 ).astype(int)

In [204]: df2.groupby('group24').sum()['shopping']
Out[204]: 
group24
0          136
1          111

或者,让我们尝试方法 (2),进行推断。为此,只需将 sum() 替换为 mean() 并乘以 24。对于最后一个周期,这仅意味着我们假设 2014 年的 60 将相等2015 年又增加了 60 个。无论这是否合理,您都需要做出判断,您可能希望标上星号并将其称为估计值。

df.groupby([pd.TimeGrouper("2AS")]).mean()['shopping']*24
Out[208]: 
2010-01-01    138
2012-01-01    127
2014-01-01    120
Freq: 2AS-JAN, Name: shopping, dtype: float64

另请记住,这只是您可以在期末进行推断的一种简单(可能过于简单)的方法。这是否是最好的方法(或者推断是否有意义)是您根据情况做出的判断。

接下来,您可以采用方法 (3) 并进行某种标准化。我不确定你到底想要什么,所以我只是概述一下想法。如果您想显示两年的总和,您可以使用前面的示例,将“2AS”替换为“AS”,然后乘以 2。这基本上会使表格看起来错误,但这是制作图表的一种非常简单的方法看起来不错。

最后,只需使用滚动总和:

pd.rolling_sum(df.shopping,window=24)

表格不太好,但绘图很好。

关于python - Pandas 时间分组 : Drop "non full groups",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28991265/

相关文章:

python - 如何忽略 Pyglet 窗口中的 UI 缩放?

python - 如何在Python中通过__init__设置类变量?

python - Seaborn自动选色

python - Python 中统计模型中的 ADF 测试

sas - 随着时间的推移通过重复测量从数据集中获取频率

c# - 我在这里找平均水平吗

python - 如何将标准化应用于训练和测试数据集

python - 别名 self = super(...).__new__(...)?为什么?

Python/Pandas UPSERT 等效项?

python - 将 CSV 上传到 Plotly Dash 并基于 Pandas 数据框渲染条形图