【发布时间】:2019-04-18 02:04:19
【问题描述】:
我有一个存储为 pandas.Series 的时间序列,我需要找出时间序列跟踪的值何时变化至少 x。
在伪代码中:
print s(0)
s*=s(0)
for all t in ]t, t_max]:
if |s(t)-s*| > x:
s* = s(t)
print s*
天真地,这可以用 Python 编码如下:
import pandas as pd
def find_changes(s, x):
changes = []
s_last = None
for index, value in s.iteritems():
if s_last is None:
s_last = value
if value-s_last > x or s_last-value > x:
changes += [index, value]
s_last = value
return changes
我的数据集很大,不能只用上面的方法。此外,由于我将运行它的框架的限制,我不能使用 Cython 或 Numba。我可以(并且计划)使用 pandas 和 NumPy。
我正在寻找有关使用哪些 NumPy 向量化/优化方法以及如何使用的指导。
谢谢!
编辑:更改代码以匹配伪代码。
【问题讨论】:
-
这个问题在内部具有很强的线性关系,因为在你看到它之前没有迹象表明下一个阈值在哪里。所以看到一个并行/矢量化的解决方案会很有趣。
-
另外,有几件事我不太确定: 1. 您的伪代码似乎与您的 Python 代码不同。 2. 你的数据有多大,因为即使是 Python 代码也最多可以在几分钟内处理数十亿行。
-
@QuangHoang 我修复了代码以匹配伪代码,在我编写 OP 时一定是复制粘贴错误。数据集有 ~ 100 GB。
-
内存大小无关紧要,除非您需要对每一列都这样做。否则,重要的是行数。
-
@dd_rlwll 单个文件 100GB?你如何存储原始数据?
标签: python pandas numpy bigdata