Python中对API返回的订单簿浮点列表数据分组求和
Python精简订单簿数据:按整数价格合并数量求和
嘿,我来帮你搞定这个订单簿数据精简的问题!先理清楚你的需求:把每个价格取整数部分,然后把相同整数价格对应的数量加起来,最后输出成指定的列表格式对吧?给你几个简洁易上手的实现方法,从基础到进阶都有:
首先先回顾下你的原始数据(片段):
myData = [[9656.37, 0.063], [9656.32, 0.688], [9656.21, 0.729], [9656.07, 0.618], [9656.01, 0.598], [9656.0, 0.917], [9655.92, 0.417], ...] # 完整列表约999个元素
方法1:普通字典实现(新手友好,无需额外模块)
这个方法逻辑直白,容易理解,不用装任何额外库:
# 初始化空字典,键存整数价格,值存对应数量的总和 price_total = {} for price, qty in myData: # 取价格的整数部分(因为订单价格都是正数,用int()直接截断小数就行) int_price = int(price) # 检查这个整数价格是否已经在字典里 if int_price in price_total: price_total[int_price] += qty else: price_total[int_price] = qty # 把字典转换成你要的[[价格, 总数量]]格式 result = [[price, total_qty] for price, total_qty in price_total.items()] # 如果想保持和原数据一样的价格从高到低排序,加上这行 result.sort(reverse=True)
方法2:用collections.defaultdict简化代码
Python标准库的collections模块里的defaultdict可以帮你省去判断键是否存在的步骤,代码更简洁:
from collections import defaultdict # 初始化一个默认值为0.0的字典 price_total = defaultdict(float) for price, qty in myData: # 直接累加就行,不存在的键会自动初始化为0.0 price_total[int(price)] += qty # 转成列表并可选排序 result = sorted([[k, v] for k, v in price_total.items()], reverse=True)
方法3:Pandas(大数据量首选,高效便捷)
如果你的数据量特别大(比如几千上万条),用Pandas的分组功能会比循环快很多,代码也很清爽:
import pandas as pd # 把原始数据转成DataFrame表格格式 df = pd.DataFrame(myData, columns=["price", "quantity"]) # 新增一列存整数价格 df["int_price"] = df["price"].astype(int) # 按整数价格分组,对数量求和 summed_df = df.groupby("int_price")["quantity"].sum().reset_index() # 转成你需要的列表格式 result = summed_df.values.tolist() # 可选:按价格降序排序 result.sort(reverse=True)
小提示:
- 关于取整数:如果你的价格可能出现负数(虽然订单簿一般不会),
int()是向0截断,比如int(-9656.37)会得到-9656;如果需要向下取整可以用math.floor(),但订单场景下int()完全够用。 - 排序:原数据是按价格从高到低排列的,所以最后加上排序可以保持一致,不需要的话可以去掉
sorted或sort步骤。
内容的提问来源于stack exchange,提问作者Jack022
相关产品推荐
相关产品推荐

