You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:16:42