我有一个振荡的时间序列数据,我需要找到最大的积分,也就是符号变化前的最长持续时间。为了简单起见,这里有一个例子:
In [166]: df
Out[166]:
c timestamp
0 1 1
1 2 2
2 3 3
3 4 4
4 5 5
5 4 6
6 3 7
7 2 8
8 1 9
9 -1 10
10 -2 11
11 -3 12
12 -1 13
13 1 14
14 2 15
15 3 16
下面是我如何找到积分的:
import pandas as pd
import numpy as np
from itertools import tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
asign = np.sign(df['c'])
signchange = ((np.roll(asign, 1) - asign) != 0).astype(int)
changes = list(signchange[signchange>0].index)
changes.insert(0, 0)
changes.append(list(df[' timestamp'].index)[-1])
integral_borders = list(pairwise(changes))
integrals = []
for (begin, end) in integral_borders:
area = np.trapz(df['c'][begin:end])
integrals.append((area, (begin, end)))
# this gives
# In [67]: integrals
# Out[67]: [(24.0, (0, 9)), (-6.0, (9, 13)), (1.5, (13, 15))]
我对这种方法的问题是它在计算上很昂贵。
我想改进它,这样我就不必一次读取整个数据文件。
我还认为,如果简单append
,则可以有一个简单的插入排序,同时只保留一个小的N积分。你知道吗
你能指出一个方法来做这两件事吗?你知道吗
你在找
groupby
。在熊猫中进行预处理:退货:
然后分别对每个组应用
np.trapz
函数:结果:
编辑:为了恢复每个时段的开始和结束,可以使用
first
和last
groupby方法。你知道吗如果您想一次应用所有三个函数,可以使用
agg
:相关问题 更多 >
编程相关推荐