彼此之间的铲斗事件

彼此之间的铲斗事件

我的问题最好用一个例子来描述,例如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个连续样本的时间戳的差异为s值,则将它们放在一起,然后将所有聚类在一起。此外,那些具有S值为N的簇使它们为负。
然后,将每个群集中第一个样本的时间戳记作为该群集的时间。

如何在熊猫中做到这一点?

示例说明:群集为(1,2),(3),(4,5,6),(7、8、9)。 (3)必须位于自己的群集中,因为即使它接近其前身,它也具有不同的符号。 (4,5,6)均为负(s值为N),因此该群集的分配值为-(4 + 5 + 6)= -15

最佳答案

这是一个开始。给定您的值的数据框,添加三个新列,数据向后移动一次。同时添加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

关于python - Pandas -彼此之间的铲斗事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25516477/

10-10 10:45