如何按条件计算以毫秒为单位的总差异?
How to calculate total difference in milliseconds by condition?
我有以下 pandas 数据框 df
:
timestamp
version
actual
pred
2022-01-19 11:00:00.600
1
0
0
2022-01-19 11:00:00.800
1
0
1
2022-01-19 11:00:01.200
1
1
0
2022-01-19 11:00:01.800
1
0
0
2022-01-19 11:00:02.200
2
1
1
2022-01-19 11:00:02.600
2
0
0
2022-01-19 11:00:03.200
3
0
1
2022-01-19 11:00:03.600
3
0
0
2022-01-19 11:00:03.800
3
1
0
2022-01-19 11:00:03.600
4
0
0
2022-01-19 11:00:03.800
4
0
1
我需要计算 actual
和 pred
中 1
的值之间的总距离(以毫秒为单位),按 version
.
分组
预期答案是:1000 毫秒
- 版本 1:(2022-01-19 11:00:01.200 - 2022-01-19 11:00:00.600) = 400 毫秒
- 版本 2:(2022-01-19 11:00:02.200 - 2022-01-19 11:00:02.200) = 0 毫秒
- 版本 3:(2022-01-19 11:00:03.800 - 2022-01-19 11:00:03.200) = 600 毫秒
假设每个“版本”都存在一个“实际”值和一个“预测”值,我们可以简单地减去值。换句话说,如果每个“版本”恰好有 1 个“实际”值和恰好 1 个“预测”值,那么 df['actual'].eq(1)
对于每个“版本”只有一个值将为真; df['pred'].eq(1)
也一样。由于数据按“版本”排序,因此版本匹配。
df['timestamp'] = pd.to_datetime(df['timestamp'])
out = ((df.loc[df['actual'].eq(1), 'timestamp'].to_numpy() -
df.loc[df['pred'].eq(1), 'timestamp'].to_numpy())
.astype('timedelta64[ms]').sum())
如果不是所有版本的“actual”或“pred”都为1,我们仍然可以过滤“actual”和“pred”值;然后合并“version”(这样每个“version”都会有一个“actual”和一个“pred”值);然后找出差异 sum
:
df['timestamp'] = pd.to_datetime(df['timestamp'])
merged = (df.loc[df['actual'].eq(1), ['version', 'timestamp']]
.merge(df.loc[df['pred'].eq(1), ['version', 'timestamp']],
on='version', suffixes=('_actual', '_pred')))
out = (merged['timestamp_actual'] - merged['timestamp_pred']).astype('timedelta64[ms]').sum()
输出:
1000
我有以下 pandas 数据框 df
:
timestamp | version | actual | pred |
---|---|---|---|
2022-01-19 11:00:00.600 | 1 | 0 | 0 |
2022-01-19 11:00:00.800 | 1 | 0 | 1 |
2022-01-19 11:00:01.200 | 1 | 1 | 0 |
2022-01-19 11:00:01.800 | 1 | 0 | 0 |
2022-01-19 11:00:02.200 | 2 | 1 | 1 |
2022-01-19 11:00:02.600 | 2 | 0 | 0 |
2022-01-19 11:00:03.200 | 3 | 0 | 1 |
2022-01-19 11:00:03.600 | 3 | 0 | 0 |
2022-01-19 11:00:03.800 | 3 | 1 | 0 |
2022-01-19 11:00:03.600 | 4 | 0 | 0 |
2022-01-19 11:00:03.800 | 4 | 0 | 1 |
我需要计算 actual
和 pred
中 1
的值之间的总距离(以毫秒为单位),按 version
.
预期答案是:1000 毫秒
- 版本 1:(2022-01-19 11:00:01.200 - 2022-01-19 11:00:00.600) = 400 毫秒
- 版本 2:(2022-01-19 11:00:02.200 - 2022-01-19 11:00:02.200) = 0 毫秒
- 版本 3:(2022-01-19 11:00:03.800 - 2022-01-19 11:00:03.200) = 600 毫秒
假设每个“版本”都存在一个“实际”值和一个“预测”值,我们可以简单地减去值。换句话说,如果每个“版本”恰好有 1 个“实际”值和恰好 1 个“预测”值,那么 df['actual'].eq(1)
对于每个“版本”只有一个值将为真; df['pred'].eq(1)
也一样。由于数据按“版本”排序,因此版本匹配。
df['timestamp'] = pd.to_datetime(df['timestamp'])
out = ((df.loc[df['actual'].eq(1), 'timestamp'].to_numpy() -
df.loc[df['pred'].eq(1), 'timestamp'].to_numpy())
.astype('timedelta64[ms]').sum())
如果不是所有版本的“actual”或“pred”都为1,我们仍然可以过滤“actual”和“pred”值;然后合并“version”(这样每个“version”都会有一个“actual”和一个“pred”值);然后找出差异 sum
:
df['timestamp'] = pd.to_datetime(df['timestamp'])
merged = (df.loc[df['actual'].eq(1), ['version', 'timestamp']]
.merge(df.loc[df['pred'].eq(1), ['version', 'timestamp']],
on='version', suffixes=('_actual', '_pred')))
out = (merged['timestamp_actual'] - merged['timestamp_pred']).astype('timedelta64[ms]').sum()
输出:
1000