熊猫 - 彼此靠近的分桶事件

Posted

技术标签:

【中文标题】熊猫 - 彼此靠近的分桶事件【英文标题】:Pandas - bucketing events close to each other 【发布时间】:2014-10-20 09:47:21 【问题描述】:

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

如何在 pandas 中做到这一点?

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢,我今天会尝试一下,如果它确实有效,请接受答案。

以上是关于熊猫 - 彼此靠近的分桶事件的主要内容,如果未能解决你的问题,请参考以下文章

Hive的分桶

Hive 内部表和 SparkSql 中的分桶

Hive中的分桶

熊猫日期和事件

如何计算熊猫事件之间的时间

python3 - 熊猫确定事件发生是不是具有统计意义