pandas - 熊猫结合了滚动和重采样
问题描述
我需要重新采样和滚动功能之间的某种组合。基本上我需要翻转秒数(例如,每秒 - 在最后 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)
解决方案
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
推荐阅读
- c - 使用一维编码数据重新创建 TIFF 文件时出现问题
- android - 为什么我在房间刷新 RecyclerView 中的更新
- react-native - 无法导航到新屏幕反应原生收到错误未定义对象导航.导航
- java - 强制执行 Graphql 相关参数
- string - C ++程序读取字符串并返回其中的整数(负数和正数)
- typescript - 打字稿:导入=需要与导入自
- python - 我的 Jupyter notebook 的 VS 代码界面与新版本有很大不同
- outlook-redemption - 尝试更新要发送的消息的签名
- perl - 有什么办法可以改变 Perl 中常量的值吗?
- etw - ETW - 为什么有时 ETL 没有有效的清单架构