考虑一下您有一些不均匀的时间序列数据:
import pandas as pd
import random as randy
ts = pd.Series(range(1000),index=randy.sample(pd.date_range('2013-02-01 09:00:00.000000',periods=1e6,freq='U'),1000)).sort_index()
print ts.head()
2013-02-01 09:00:00.002895 995
2013-02-01 09:00:00.003765 499
2013-02-01 09:00:00.003838 797
2013-02-01 09:00:00.004727 295
2013-02-01 09:00:00.006287 253
假设我想在1ms的时间内进行滚动求和:
2013-02-01 09:00:00.002895 995
2013-02-01 09:00:00.003765 499 + 995
2013-02-01 09:00:00.003838 797 + 499 + 995
2013-02-01 09:00:00.004727 295 + 797 + 499
2013-02-01 09:00:00.006287 253
目前,我将所有内容都放回多头,并在cython中进行,但是在纯熊猫中有可能吗?我知道您可以执行.asfreq(’U’)之类的操作,然后填充并使用传统函数,但是一旦行数超过玩具数量,就无法缩放。
作为参考,这是一个骇人的,不是快速的Cython版本:
%%cython
import numpy as np
cimport cython
cimport numpy as np
ctypedef np.double_t DTYPE_t
def rolling_sum_cython(np.ndarray[long,ndim=1] times, np.ndarray[double,ndim=1] to_add, long window_size):
cdef long t_len = times.shape[0], s_len = to_add.shape[0], i =0, win_size = window_size, t_diff, j, window_start
cdef np.ndarray[DTYPE_t, ndim=1] res = np.zeros(t_len, dtype=np.double)
assert(t_len==s_len)
for i in range(0,t_len):
window_start = times[i] - win_size
j = i
while times[j]>= window_start and j>=0:
res[i] += to_add[j]
j-=1
return res
在更大的系列上对此进行演示:
ts = pd.Series(range(100000),index=randy.sample(pd.date_range('2013-02-01 09:00:00.000000',periods=1e8,freq='U'),100000)).sort_index()
%%timeit
res2 = rolling_sum_cython(ts.index.astype(int64),ts.values.astype(double),long(1e6))
1000 loops, best of 3: 1.56 ms per loop
您可以使用求和和二进制搜索解决大多数此类问题。
from datetime import timedelta
def msum(s, lag_in_ms):
lag = s.index - timedelta(milliseconds=lag_in_ms)
inds = np.searchsorted(s.index.astype(np.int64), lag.astype(np.int64))
cs = s.cumsum()
return pd.Series(cs.values - cs[inds].values + s[inds].values, index=s.index)
res = msum(ts, 100)
print pd.DataFrame({'a': ts, 'a_msum_100': res})
a a_msum_100
2013-02-01 09:00:00.073479 5 5
2013-02-01 09:00:00.083717 8 13
2013-02-01 09:00:00.162707 1 14
2013-02-01 09:00:00.171809 6 20
2013-02-01 09:00:00.240111 7 14
2013-02-01 09:00:00.258455 0 14
2013-02-01 09:00:00.336564 2 9
2013-02-01 09:00:00.536416 3 3
2013-02-01 09:00:00.632439 4 7
2013-02-01 09:00:00.789746 9 9
[10 rows x 2 columns]
您需要一种处理NaN的方法,并且取决于您的应用程序,您可能需要延迟时间前后的主要值(即,使用kdb + bin与np.searchsorted之间的差异)。
希望这可以帮助。
问题内容: 样本数据可能会有助于解释我想做的事情,而不是解释它,因此,我将从此开始。 这是我目前正在使用的数据: 我正在尝试在15分钟的时间内滚动显示此数据中的出现次数。该数据的预期结果如下: 样本数据: 我可以通过以下方式 使它 起作用: 但是,我想避免使用子查询,而建议使用(或其他任何可能的解决方案)解决方案。 这可能吗?还是子查询是正确的解决方案? 问题答案: 一种方法-如果表很大,可能比嵌
0.1-0.2:********** 0.2-0.3:******** 0.3-0.4:********* 0.5-0.6:********* 0.6-0.7:********* 0.7-0.8:********* 0.4-0.5:********* 0.5-0.6:********* 0.6-0.7:********* 0.1-0.2:********* 0.2-0.3:********* 0.
问题内容: 我有两个numpy数组light_points和time_points,想对这些数据使用一些时间序列分析方法。 然后我尝试了这个: 这有效,但没有做正确的事。确实,测量值不是均匀地间隔开的,如果我只是将time_points pandas DataFrame声明为帧的索引,则会出现错误: 我不知道该如何纠正。另外,似乎不建议使用大熊猫。 我尝试了这个: 但这给了我长度上的不匹配: 但是
问题内容: 我需要一个滚动窗口(也称为滑动窗口)可在序列/迭代器/生成器上使用。默认的Python迭代可视为一种特殊情况,其中窗口长度为1。我目前正在使用以下代码。有没有人有一个更蟒蛇,更少冗长,或更有效的方法来做这件事? 问题答案: 117 Python文档的旧版本中有一个带有示例: 文档中的一个更为简洁,我想它可以起到更大的作用。
问题内容: 我正在寻找一种类似的各种功能的方法,但我希望滚动计算的窗口由一个值范围(例如,DataFrame列的值范围)定义,而不是由窗口中的行数。 例如,假设我有以下数据: 如果执行类似的操作,则会得到一个滚动总和,其中每个窗口包含5行。但是我想要的是一个滚动总和,其中每个窗口都包含的一定范围的值。也就是说,我希望能够执行类似的操作,并得到一个结果,其中第一个窗口包含所有介于1和5之间的行,然后
假设我有一个每1分钟开始的2小时窗口。下一步是应用GroupBy转换。 如果能解释这一点,我将不胜感激。无法真正找到相关信息