熊猫结合了滚动和重采样

Posted

技术标签:

【中文标题】熊猫结合了滚动和重采样【英文标题】:pandas combine rolling and resample 【发布时间】:2019-07-25 00:32:44 【问题描述】:

我需要重新采样和滚动功能之间的某种组合。 基本上我需要翻转秒数(例如,每秒 - 在最后 X 秒内计算唯一值),而我的数据精度是毫秒。所以我需要每秒分组一些记录(没有聚合,所以我不会丢失任何信息),然后翻转它们。

示例: 假设我有以下数据帧,其中索引具有毫秒精度的时间戳,并且数据是分类的(生成数据帧的代码如下):

                         A
2019-01-01 13:00:00.060  1
2019-01-01 13:00:00.140  2
2019-01-01 13:00:00.731  1
2019-01-01 13:00:01.135  2
2019-01-01 13:00:01.344  3
2019-01-01 13:00:02.174  2
2019-01-01 13:00:02.213  3
2019-01-01 13:00:02.363  2
2019-01-01 13:00:02.951  1
2019-01-01 13:00:03.393  4
2019-01-01 13:00:03.454  4
2019-01-01 13:00:04.444  4
2019-01-01 13:00:05.123  1
2019-01-01 13:00:05.456  4

我希望,对于每一轮秒,计算最后 2 秒内的唯一值(窗口大小 = '2s')。

使用 for 循环将如下所示:

from pandas.tseries.frequencies import to_offset

idx_seconds = df.index.ceil('s').unique()
output = pd.Series(index=idx_seconds)
for s in idx_seconds:
    print(f"s-to_offset('2s') - s -> df.loc[s-to_offset('2s'):s, 'A'].to_list()")
    output [s] = df.loc[s-to_offset('2s'):s, 'A'].nunique()

代码将记录拆分和分组如下(代码输出):

2019-01-01 12:59:59 - 2019-01-01 13:00:01 -> [1, 2, 1]
2019-01-01 13:00:00 - 2019-01-01 13:00:02 -> [1, 2, 1, 2, 3]
2019-01-01 13:00:01 - 2019-01-01 13:00:03 -> [2, 3, 2, 3, 2, 1]
2019-01-01 13:00:02 - 2019-01-01 13:00:04 -> [2, 3, 2, 1, 4, 4]
2019-01-01 13:00:03 - 2019-01-01 13:00:05 -> [4, 4, 4]
2019-01-01 13:00:04 - 2019-01-01 13:00:06 -> [4, 1, 4]

输出将如下所示:

2019-01-01 13:00:01    2.0
2019-01-01 13:00:02    3.0
2019-01-01 13:00:03    3.0
2019-01-01 13:00:04    4.0
2019-01-01 13:00:05    1.0
2019-01-01 13:00:06    2.0

我正在寻找一种不需要 for 循环的更有效的解决方案。有什么建议吗?


生成数据框的代码:

timestamps = [
'2019-01-01 13:00:00.060000', #0
'2019-01-01 13:00:00.140000', #0
'2019-01-01 13:00:00.731000', #0
'2019-01-01 13:00:01.135000', #1
'2019-01-01 13:00:01.344000', #1
'2019-01-01 13:00:02.174000', #2
'2019-01-01 13:00:02.213000', #2
'2019-01-01 13:00:02.363000', #2
'2019-01-01 13:00:02.951000', #2    
'2019-01-01 13:00:03.393000', #3
'2019-01-01 13:00:03.454000', #3    
'2019-01-01 13:00:04.444000', #4
'2019-01-01 13:00:05.123000', #5
'2019-01-01 13:00:05.456000', #5
]
df = pd.DataFrame([1, 2, 1, 2, 3, 2, 3, 2, 1, 4, 4, 4, 1 ,4]
                  ,columns=['A'], index=pd.to_datetime(timestamps)

【问题讨论】:

【参考方案1】:

试试df.resample('2s').nunique()

【讨论】:

【参考方案2】:

来自numpy广播的一种方法

s1=idx_seconds.values
s2=(idx_seconds-to_offset('2s')).values
s=df.index.values

Outs=((s[:,None]-s2)/np.timedelta64(1, 'ns')>=0)&((s[:,None]-s1)/np.timedelta64(1, 'ns')<=0)

pd.Series([(df.A[x].nunique()) for x in Outs.T],index=idx_seconds )
2019-01-01 13:00:01    2
2019-01-01 13:00:02    3
2019-01-01 13:00:03    3
2019-01-01 13:00:04    4
2019-01-01 13:00:05    1
2019-01-01 13:00:06    2
dtype: int64

【讨论】:

它仍然需要一个 for 循环(列表理解),但是很好的方法。会检查出来。 10x

以上是关于熊猫结合了滚动和重采样的主要内容,如果未能解决你的问题,请参考以下文章

重采样后合并熊猫数据帧

粒子滤波PF—从贝叶斯滤波到粒子滤波PF—Part-IV(粒子退化和重采样)

粒子滤波 particle filter — 从贝叶斯滤波到粒子滤波—Part-IV(粒子退化和重采样)

粒子滤波 particle filter — 从贝叶斯滤波到粒子滤波—Part-IV(粒子退化和重采样)

带有熊猫重采样的额外箱

熊猫时间序列重采样和插值一起