[英]Pandas get average from second dataframe of the last N rows within time interval
我有 2 個 DF:
DF1
名稱 | 時間戳 | 價值 |
---|---|---|
object 1 | 2021-11-01 10:00:00 | 1. |
object 1 | 2021-11-01 11:00:00 | 1.5 |
object 2 | 2021-11-01 10:30:00 | 1.7 |
DF2
名稱 | 時間戳 | 特征 |
---|---|---|
object 1 | 2021-11-01 8:00:00 | 0.9 |
object 1 | 2021-11-01 9:00:00 | 1.1 |
object 1 | 2021-11-01 9:30:00 | 1.3 |
object 1 | 2021-11-01 12:00:00 | 1. |
object 2 | 2021-11-01 10:00:00 | 1.3 |
object 2 | 2021-11-01 11:30:00 | 1.9 |
DF1 的每一行,我想獲得 DF2 的最后 N 行的滾動平均值,這些行具有相同的Name
並且Timestamp
小於我正在考慮的行。 (在本例中假設 N=2)
示例 output 應如下所示:
名稱 | 時間戳 | 價值 | 特征的平均值 |
---|---|---|---|
object 1 | 2021-11-01 10:00:00 | 1. | (1.1 + 1.3)/2 |
object 1 | 2021-11-01 11:00:00 | 1.5 | (1.1 + 1.3)/2 |
object 2 | 2021-11-01 10:30:00 | 1.7 | 1.3 |
理想情況下,我可以根據時差進行加權平均。 例如
名稱 | 時間戳 | 價值 | 特征的平均值 |
---|---|---|---|
object 1 | 2021-11-01 10:00:00 | 1. | (60 分鍾 * 1.1 + 30 分鍾 * 1.3)/(2 * 90 分鍾) |
object 1 | 2021-11-01 11:00:00 | 1.5 | (120 分鍾 * 1.1 + 90 分鍾 * 1.3)/(2 * 210 分鍾) |
object 2 | 2021-11-01 10:30:00 | 1.7 | 1.3 |
重要提示:我的問題是執行DF1.apply
會花費很長時間,因為我有大數據幀(DF1 大約是 DF2 的兩倍)。 我認為最重要的瓶頸在於如何在 DF2 中找到小於 DF1 中當前行的最大時間戳
您需要使用pandas.merge_asof
來對齊時間戳:
df1.join(pd
.merge_asof(df2.sort_values(by='Timestamp'),
df1.sort_values(by='Timestamp')
.reset_index()
.drop(columns='Value')
.rename(columns={'Timestamp': 'TS'}),
by='Name', left_on='Timestamp', right_on='TS',
direction='forward')
.assign(weight=lambda d: d['TS'].sub(d['Timestamp']).dt.total_seconds(),
feature=lambda d: d['feature'].mul(d['weight'])
)
.groupby('index').apply(lambda g: g['feature'].sum()/g['weight'].sum()/len(g))
.rename('AVG of (feature)')
)
output:
Name Timestamp Value AVG of (feature)
0.0 object 1 2021-11-01 10:00:00 1.0 0.583333
1.0 object 1 2021-11-01 11:00:00 1.5 NaN
2.0 object 2 2021-11-01 10:30:00 1.7 1.300000
注意。 如果你想傳播 AVG 的先前值,你可以使用ffill
每組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.