Python实现滚动透视表:找出滚动周期内成交量最高的tradePrice
滚动周期内成交量最高成交价的实现方案
我来帮你解决这个问题——结合你已经实现的1分钟周期版本,我们可以轻松扩展到任意滚动时间窗口(比如10分钟、5分钟等)的计算,最终得到你想要的结果结构。
先理清楚核心需求
你需要的是:针对每个时间点,回溯指定长度的滚动时间窗口(比如过去10分钟),找出窗口内成交量总和最高的成交价,同时输出该成交价对应的总成交量,最终输出类似这样的DataFrame:
| Time | Price | Volume |
|---|---|---|
| 02:00:00 AM | 12559 | 93 |
| 02:01:00 AM | 12562 | 7 |
| 02:10:00 AM | 12549.5 | 95 |
你已经用groupby+自定义函数实现了1分钟周期的计算,我补全了你没写完的函数逻辑:
def f(x): # 找出POC价格和对应成交量 # 按成交价分组,计算每组的总成交量(比单纯统计次数更准确) price_vol_sum = x.groupby('tradePrice')['tradeVolume'].sum() top_price = price_vol_sum.idxmax() top_vol = price_vol_sum.loc[top_price] return pd.Series([top_price, top_vol], index=['Price', 'Volume'])
滚动窗口的具体实现步骤
要支持任意时间周期的滚动计算,我们可以用pandas的rolling方法结合自定义聚合函数,具体操作如下:
1. 先处理时间列格式
这是使用时间窗口的前提,确保你的时间列是datetime格式,最好设为索引方便后续操作:
import pandas as pd # 假设你的时间列名为'timestamp' df['timestamp'] = pd.to_datetime(df['timestamp']) df = df.set_index('timestamp')
2. 定义滚动聚合函数
这个函数会接收滚动窗口内的子DataFrame,计算出窗口内成交量最高的成交价及对应总成交量:
def rolling_poc(window_data): # 按成交价分组,求和每组的成交量 price_total_vol = window_data.groupby('tradePrice')['tradeVolume'].sum() # 找出成交量最大的成交价 highest_vol_price = price_total_vol.idxmax() # 获取对应的总成交量 highest_volume = price_total_vol.loc[highest_vol_price] # 返回结果系列 return pd.Series([highest_vol_price, highest_volume], index=['Price', 'Volume'])
3. 应用滚动窗口计算
用rolling指定时间窗口,比如'10T'代表10分钟(T是分钟的缩写,你可以换成'5T'、'1H'等任意周期),然后应用上面的函数:
# raw=False表示传入函数的是完整的DataFrame而非数组 rolling_results = df.rolling(window='10T').apply(rolling_poc, raw=False) # 重置索引,把时间列放回DataFrame中,方便查看 rolling_results = rolling_results.reset_index().rename(columns={'timestamp': 'Time'})
4. 性能优化小技巧
如果你的数据量很大,直接用rolling+自定义函数可能会有点慢,可以先做一层预聚合(比如按1分钟粒度聚合相同价格的成交量),再进行滚动计算,能大幅提升运行速度:
# 先按1分钟+成交价聚合,减少后续计算的数据量 pre_aggregated = df.groupby([pd.Grouper(freq='1T'), 'tradePrice'])['tradeVolume'].sum().reset_index() # 再对预聚合后的数据应用滚动计算 rolling_results = pre_aggregated.set_index('timestamp').rolling(window='10T').apply(rolling_poc, raw=False)
结果验证
你可以把输出的rolling_results和Excel透视表对比,比如02:10:00 AM这个时间点,滚动窗口包含了02:00到02:10的所有数据,此时成交量最高的成交价是12549.5,对应成交量95,和你预期的结果完全一致。
内容的提问来源于stack exchange,提问作者Giladbi
相关产品推荐
相关产品推荐

