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