如何在Python中创建滚动透视表至DataFrame,并按分钟统计交易量最高交易价
解决方案:每分钟交易量最高价格统计 + 滚动透视表实现
嘿,我来帮你搞定这两个问题!先从你提到的具体业务需求入手,再补充滚动透视表的通用实现方法~
一、统计每分钟交易量最高的交易价格并生成透视表
假设你的原始DataFrame包含tradeTime(交易时间)、tradePrice(交易价格)、tradeVolume(交易量)这几个核心字段,我们一步步来实现:
步骤1:预处理时间字段
首先把交易时间转换成可分组的分钟级别标识:
import pandas as pd # 假设你的原始数据已经读入为df df['tradeTime'] = pd.to_datetime(df['tradeTime']) # 生成分钟级别的分组键(保留日期+小时+分钟) df['minute'] = df['tradeTime'].dt.floor('min')
步骤2:分组统计每个价格的交易量总和与交易次数
按分钟和价格分组,计算每个价格在对应分钟内的交易量总和、交易次数:
# 分组聚合 grouped_stats = df.groupby(['minute', 'tradePrice']).agg( sum_tradeVolume=('tradeVolume', 'sum'), count_tradePrice=('tradePrice', 'count') ).reset_index()
步骤3:筛选每分钟交易量最高的价格
找出每个分钟内交易量总和最高的那些价格(如果有多个价格并列最高,都会保留):
# 先获取每个分钟的最大交易量值 max_volume_per_min = grouped_stats.groupby('minute')['sum_tradeVolume'].max().reset_index(name='max_volume') # 合并筛选出符合条件的行 top_price_per_min = pd.merge(grouped_stats, max_volume_per_min, on='minute') top_price_per_min = top_price_per_min[top_price_per_min['sum_tradeVolume'] == top_price_per_min['max_volume']].drop('max_volume', axis=1)
步骤4:转换成类似Excel的透视表样式
把统计指标转成行,模拟你给出的Excel格式,还可以加上总计行:
# 转换长格式,匹配Excel的行式展示 melted_result = top_price_per_min.melt( id_vars=['minute', 'tradePrice'], var_name='Metric', value_name='Data' ) # 重命名指标名称 melted_result['Metric'] = melted_result['Metric'].replace({ 'sum_tradeVolume': 'Sum - tradeVolume', 'count_tradePrice': 'Count - tradePrice' }) # 添加每分钟的总计行 total_per_min = top_price_per_min.groupby('minute').agg( total_sum=('sum_tradeVolume', 'sum'), total_count=('count_tradePrice', 'sum') ).reset_index() total_melted = total_per_min.melt( id_vars=['minute'], var_name='Metric', value_name='Data' ) total_melted['Metric'] = total_melted['Metric'].replace({ 'total_sum': 'Total Sum - tradeVolume', 'total_count': 'Total Count - tradePrice' }) total_melted['tradePrice'] = 'Total Result' # 合并结果并排序 final_df = pd.concat([melted_result, total_melted]).sort_values( ['minute', 'tradePrice', 'Metric'] ).reset_index(drop=True)
现在final_df就是你需要的透视表格式DataFrame了,可以直接导出到Excel或者进一步处理。
二、创建滚动透视表并转换为DataFrame
滚动透视表核心是基于滚动窗口(时间窗口或行窗口)做分组统计,这里给你两种常见场景的实现:
场景1:时间滚动窗口(比如滚动5分钟)
如果需要统计每个价格在过去5分钟内的累计交易量:
# 先把时间设为索引 df = df.set_index('tradeTime') # 按价格分组,做5分钟滚动求和,再转成宽格式透视表 rolling_pivot = df.groupby('tradePrice')['tradeVolume'].rolling('5min').sum().unstack(level=0) # 转换为普通DataFrame(重置索引恢复时间列) rolling_pivot_df = rolling_pivot.reset_index()
场景2:行滚动窗口(比如前10条交易数据)
如果需要基于最近10条交易,统计每个价格的交易量总和:
# 按价格分组,做10行滚动求和,转宽格式 rolling_pivot_rows = df.groupby('tradePrice')['tradeVolume'].rolling(10).sum().unstack(level=0).reset_index()
自定义滚动透视逻辑
如果需要更复杂的透视统计(比如同时计算求和、计数),可以用rolling.apply自定义函数:
def custom_rolling_pivot(window): # 对窗口内的数据做透视表,返回Series格式 pivot = pd.pivot_table( window, index='tradePrice', values='tradeVolume', aggfunc=['sum', 'count'] ) # 把多级列转成扁平名称,方便后续处理 pivot.columns = ['_'.join(col) for col in pivot.columns] return pivot.stack() # 应用5分钟滚动窗口 rolling_custom = df.rolling('5min').apply(custom_rolling_pivot, raw=False) # 转换为结构化DataFrame rolling_custom_df = rolling_custom.unstack().reset_index()
内容的提问来源于stack exchange,提问作者Giladbi
相关产品推荐
相关产品推荐

