能解释一下大熊猫的asfreq和重采样方法的区别吗?什么时候应该用什么?
发布于 2019-01-05 19:30:29
让我用一个例子来说明:
# generate a series of 365 days
# index = 20190101, 20190102, ... 20191231
# values = [0,1,...364]
ts = pd.Series(range(365), index = pd.date_range(start='20190101',
end='20191231',
freq = 'D'))
ts.head()
output:
2019-01-01 0
2019-01-02 1
2019-01-03 2
2019-01-04 3
2019-01-05 4
Freq: D, dtype: int64现在,按季度对数据进行重新采样:
ts.asfreq(freq='Q')
output:
2019-03-31 89
2019-06-30 180
2019-09-30 272
2019-12-31 364
Freq: Q-DEC, dtype: int64asfreq()返回一个Series对象,其中包含每个季度的最后一天。
ts.resample('Q')
output:
DatetimeIndexResampler [freq=<QuarterEnd: startingMonth=12>, axis=0, closed=right, label=right, convention=start, base=0]Resample返回一个DatetimeIndexResampler,你看不到里面的实际内容。可以将其视为groupby方法。它创建了一个bins (组)列表:
bins = ts.resample('Q')
bin.groups
output:
{Timestamp('2019-03-31 00:00:00', freq='Q-DEC'): 90,
Timestamp('2019-06-30 00:00:00', freq='Q-DEC'): 181,
Timestamp('2019-09-30 00:00:00', freq='Q-DEC'): 273,
Timestamp('2019-12-31 00:00:00', freq='Q-DEC'): 365}到目前为止,除了返回类型之外,似乎没有什么不同。让我们计算一下每个季度的平均值:
# (89+180+272+364)/4 = 226.25
ts.asfreq(freq='Q').mean()
output:
226.25当应用mean()时,它输出所有值的平均值。请注意,这不是每个季度的平均值,而是每个季度最后一天的平均值。
要计算每个季度的平均值:
ts.resample('Q').mean()
output:
2019-03-31 44.5
2019-06-30 135.0
2019-09-30 226.5
2019-12-31 318.5You can perform more powerful operations with resample()而不是asfreq()。
把resample想象成groupby +你可以在groupby之后调用的所有方法(例如,mean,sum,apply,你可以给它命名)。
可以将asfreq看作是一种具有有限填充功能的过滤机制(在fillna() ()中,您可以指定limit,但asfreq()不支持它)。
发布于 2013-08-05 22:54:41
resample比asfreq更通用。例如,使用resample,我可以传递一个任意函数,在任意大小的bin中对Series或DataFrame对象执行装箱。asfreq是一种更改DatetimeIndex对象频率的简明方法。它还提供填充功能。
正如pandas文档所说,asfreq是对date_range的调用+对reindex的调用的一个薄包装器。有关示例,请参阅here。
我在日常工作中使用的resample的一个例子是通过对一个大型布尔数组进行重采样来计算一个神经元在1秒内的尖峰数组,其中True表示“尖峰”,False表示“没有尖峰”。我可以像large_bool.resample('S', how='sum')一样简单地做到这一点。挺整洁的!
当您想要将DatetimeIndex更改为具有不同频率,同时在当前索引处保留相同的值时,可以使用asfreq。
下面是一个示例,说明它们是等效的:
In [6]: dr = date_range('1/1/2010', periods=3, freq=3 * datetools.bday)
In [7]: raw = randn(3)
In [8]: ts = Series(raw, index=dr)
In [9]: ts
Out[9]:
2010-01-01 -1.948
2010-01-06 0.112
2010-01-11 -0.117
Freq: 3B, dtype: float64
In [10]: ts.asfreq(datetools.BDay())
Out[10]:
2010-01-01 -1.948
2010-01-04 NaN
2010-01-05 NaN
2010-01-06 0.112
2010-01-07 NaN
2010-01-08 NaN
2010-01-11 -0.117
Freq: B, dtype: float64
In [11]: ts.resample(datetools.BDay())
Out[11]:
2010-01-01 -1.948
2010-01-04 NaN
2010-01-05 NaN
2010-01-06 0.112
2010-01-07 NaN
2010-01-08 NaN
2010-01-11 -0.117
Freq: B, dtype: float64至于什么时候使用:这取决于你在mind...care中有什么问题要分享?
https://stackoverflow.com/questions/18060619
复制相似问题