需要返回两个时间戳事件通道之间的符合矩阵

2024-09-25 12:23:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在两个通道中探测器测量的能量事件之间创建一个符合矩阵。”“巧合”是指事件发生在用户指定的时间窗口内。数据当前存储在具有假样本数据的以下格式的数据框中:

Energy   Timestamp  Channel
___________________________
6        103        1
7         70        2
4        110        2
8        205        2 
2        219        1
3        333        1
5        300        1
9        350        2

我需要以下格式的数据,这样,如果用户选择20的计时窗口,则生成的符合矩阵将为:

Channel 1 Energy:   1   2   3   4   5   6   7   8   9   10
Channel 2 Energy:_________________________________________
                 1| 0   0   0   0   0   0   0   0   0   0
                 2| 0   0   0   0   0   0   0   0   0   0
                 3| 0   0   0   0   0   0   0   0   0   0
                 4| 0   0   0   0   0   1   0   0   0   0
                 5| 0   0   0   0   0   0   0   0   0   0
                 6| 0   0   0   0   0   0   0   0   0   0
                 7| 0   0   0   0   0   0   0   0   0   0
                 8| 0   1   0   0   0   0   0   0   0   0
                 9| 0   0   1   0   0   0   0   0   0   0   
                10| 0   0   0   0   0   0   0   0   0   0

其中,现在只有满足条件的事件:

 Event1_Timestamp < Event2_Timestamp + Timing window & Event1_Timestamp > Event2_Timestamp - Timing window 

将保留在符合矩阵中,并丢弃所有非符合事件

我试过:

df2 = df.merge(df, on="Timestamp")
df3 = pd.crosstab(df2.Energy_x, df2.Energy_y)

但这种输出存在一些问题。它在时间戳而不是计时窗口范围内查找精确匹配,并且只列出出现的能量,而不是所有可能能量的线性间隔范围(0-8192个能量箱)。非常感谢您的帮助


Tags: 数据用户格式时间channel事件矩阵timestamp
1条回答
网友
1楼 · 发布于 2024-09-25 12:23:44

让我们尝试使用pd.merge_asofpd.crosstab

其中df

   Energy  Timestamp  Channel
0       6        103        1
1       7         70        2
2       4        110        2
3       8        205        2
4       2        219        1
5       3        333        1
6       5        300        1
7       9        350        2

那么

df_out = pd.merge_asof(df.sort_values('Timestamp'), 
                       df.sort_values('Timestamp'), 
                       on='Timestamp', 
                       allow_exact_matches=False,
                      tolerance=20)

pd.crosstab(df_out['Energy_x'], 
            df_out['Energy_y']).reindex(index=np.arange(1,11),
                                        columns=np.arange(1,11), 
                                        fill_value=0)

输出:

Energy_y  1   2   3   4   5   6   7   8   9   10
Energy_x                                        
1          0   0   0   0   0   0   0   0   0   0
2          0   0   0   0   0   0   0   1   0   0
3          0   0   0   0   0   0   0   0   0   0
4          0   0   0   0   0   1   0   0   0   0
5          0   0   0   0   0   0   0   0   0   0
6          0   0   0   0   0   0   0   0   0   0
7          0   0   0   0   0   0   0   0   0   0
8          0   0   0   0   0   0   0   0   0   0
9          0   0   1   0   0   0   0   0   0   0
10         0   0   0   0   0   0   0   0   0   0

相关问题 更多 >