熊猫 - 相互接近的交易活动

时间:2014-08-26 23:00:39

标签: python numpy pandas time-series

我的问题最好用一个例子来描述,比如t是时间索引,而x是数据,我们有输入

t = [1,2,3, 7,9,11, 17,18,20]
x = [1,2,3, 4,5,6,   7,8,9]
s = ['P', 'P', 'N',  'N', 'N', 'N', 'P', 'P', 'P']
window = 2

期望的输出:

t1 = [1, 3, 7, 17]
x1 = [3, -3, -15, 24]

即。我想对x进行聚类,使得如果2个连续样本的时间戳差别为< = window,并且它们具有相同的s值,则将它们放在一起,并将它们中的所有内容相加。相同的集群。而且,那些s值为N的聚类使它们成为负数。 然后,将每个群集中第一个样本的时间戳记作为该群集的时间。

我如何在熊猫中这样做?

实施例的说明:簇是(1,2),(3),(4,5,6),(7,8,9)。 (3)必须在它自己的集群中,因为即使它与它的前身很接近,它也有不同的标志。 (4,5,6)都是负数(s值是N),因此该簇的指定值是 - (4 + 5 + 6)= -15

1 个答案:

答案 0 :(得分:2)

这是一个开始。给定值的数据帧,添加三个新列,数据向后移动一次。还要添加x的签名版本。

df = pd.DataFrame({'t':t, 'x':x, 's':s})
df[['s_1', 't_1', 'x_1']] = df.shift(-1)
df['x_signed'] = np.where(df['s'] == 'N', -1 * df['x'], df['x'])

根据您的两个可能条件,添加一个表示新群集开始的布尔列。

df['cluster'] = (df['s'] != df['s_1']) | (df['t_1'] - df['t'] > window)

通过向后移动一次,填充第一个值(组0),转换为整数,然后获取累积总和,将其转换为组号。

df['cluster'] = df['cluster'].shift(1).fillna(False).astype(int).cumsum()

然后从那里,它很容易分组并得到你的输出。

In [72]: df.groupby('cluster').agg({'t':'first', 'x_signed':'sum'})
Out[72]: 
          t  x_signed
cluster              
0         1         3
1         3        -3
2         7       -15
3        17        24