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

Python 需要返回两个带时间戳事件通道之间的符合矩阵,python,pandas,dataframe,Python,Pandas,Dataframe,我试图在两个通道中探测器测量的能量事件之间创建一个符合矩阵。“巧合”是指事件发生在用户指定的时间窗口内。数据当前存储在具有假样本数据的以下格式的数据框中: Energy Timestamp Channel ___________________________ 6 103 1 7 70 2 4 110 2 8 205 2 2 219 1 3

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

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 

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

让我们尝试使用
pd.merge\u asof
pd.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
那么

输出:

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
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