从当前行列值查找数据框中最低值的最快方法

问题描述 投票:0回答:1

对于下面数据框中的每一行,想要填充 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 dataframe vectorization
1个回答
0
投票

你尝试过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)
© www.soinside.com 2019 - 2024. All rights reserved.