对于下面数据框中的每一行,想要填充 minlow 和 lowdate。 minlow 应该找到未来最低的“low”列,然后设置 minlow 和 lowdate。我有很多使用 .loc/.iloc 的代码示例,但这些示例很慢,因为数据帧超过 400 万条记录。试图找到最有效的方法。
预期产量 |
---|
索引 0 没什么意义,因为未来的记录不会更低 |
索引 1 的 minlow=277.97 和 lowdate=2020-01-20 21:39:00 |
索引 2 就什么也不是了,因为它已经是最低的了 |
索引 3 没什么意义,因为未来的记录不会更低 |
索引 4 不会有任何东西,因为它是最后一条记录,而且还不存在未来的记录 |
date low minlow lowdate
0 2020-01-20 21:37:00 277.97 None None
1 2020-01-20 21:38:00 277.98 None None
2 2020-01-20 21:39:00 277.97 None None
3 2020-01-20 21:40:00 277.98 None None
4 2020-01-20 21:41:00 277.99 None None
你尝试过pandas的向量化操作和索引方法吗? 尝试此方法并将性能与您当前的方法进行比较。
import pandas as pd
# Sample DataFrame
data = {
'timestamp': ['2020-01-20 21:30:00', '2020-01-20 21:35:00', '2020-01-20 21:40:00', '2020-01-20 21:45:00', '2020-01-20 21:50:00'],
'low': [278.12, 277.97, 277.97, 278.01, 278.05]
}
df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['timestamp'])
# Sort DataFrame by timestamp
df = df.sort_values(by='timestamp')
# Initialize minlow and lowdate columns
df['minlow'] = None
df['lowdate'] = None
# Get future low values
future_low_values = df['low'].shift(-1)
# Find minimum future low for each row
min_future_low = future_low_values.expanding(min_periods=1).min()
# Update minlow and lowdate columns where applicable
update_mask = (df['low'] > min_future_low) & (min_future_low.notna())
df.loc[update_mask, 'minlow'] = min_future_low
df.loc[update_mask, 'lowdate'] = df.loc[min_future_low.idxmin(), 'timestamp']
print(df)