从Bittrex解析JSON数据:现有Python代码相关技术问询
处理Bittrex行情数据的Python代码优化与解析指南
我看了你这段从Bittrex拉取ETH/BTC行情数据的代码,先给你梳理下几个关键的优化点,以及把未完成的数据解析和可视化部分补全——毕竟你提到data['result'][:]['V']的内容没写完,我默认是要处理成交量、OHLC(开盘/最高/最低/收盘)这些核心行情数据:
一、先解决过时库的兼容性问题
你的代码里用了几个Python2时代的库,现在Python3环境下已经不推荐甚至无法直接运行,先替换成现代替代方案:
urllib2→ 改用requests(更简洁的HTTP请求库)matplotlib.finance→ 改用mplfinance(专门用于金融数据可视化的现代库,原matplotlib.finance已被官方废弃)
二、完整的数据解析与处理
Bittrex的v2 API返回的data['result']是一个字典列表,每个字典包含以下核心字段:
T:ISO 8601格式的时间字符串(比如"2024-05-20T12:30:00")O:开盘价H:最高价L:最低价C:收盘价V:成交量(你提到的字段)BV:基准货币成交量(这里是BTC的成交量)
下面是补全后的代码,包含数据拉取、解析、可视化的完整流程:
import requests import json import mplfinance as mpf import pandas as pd # 拉取Bittrex的30分钟ETH/BTC行情数据 url = 'https://bittrex.com/Api/v2.0/pub/market/GetTicks?marketName=BTC-ETH&tickInterval=thirtyMin' response = requests.get(url) data = json.loads(response.text) # 将行情数据转换为DataFrame,方便后续处理 df = pd.DataFrame(data['result']) # 把时间字符串转换为datetime类型,并设置为索引 df['T'] = pd.to_datetime(df['T']) df.set_index('T', inplace=True) # 重命名列名,适配mplfinance的要求 df.rename(columns={'O': 'Open', 'H': 'High', 'L': 'Low', 'C': 'Close', 'V': 'Volume'}, inplace=True) # 绘制蜡烛图,同时显示成交量 mpf.plot(df, type='candle', volume=True, title='BTC-ETH 30min Candlestick Chart', ylabel='Price (BTC)', ylabel_lower='Volume')
三、如果你坚持用原生matplotlib绘制(不推荐)
如果不想改用mplfinance,也可以修复原代码的问题来绘制蜡烛图,这里需要手动处理时间轴刻度:
import requests import json import matplotlib.pyplot as plt from matplotlib.finance import candlestick2_ohlc import matplotlib.ticker as ticker import datetime as dt import numpy as np url = 'https://bittrex.com/Api/v2.0/pub/market/GetTicks?marketName=BTC-ETH&tickInterval=thirtyMin' response = requests.get(url) data = json.loads(response.text) # 提取OHLC、成交量和时间数据 opens = [item['O'] for item in data['result']] highs = [item['H'] for item in data['result']] lows = [item['L'] for item in data['result']] closes = [item['C'] for item in data['result']] volumes = [item['V'] for item in data['result']] times = [dt.datetime.fromisoformat(item['T']) for item in data['result']] # 创建画布和子图 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True) # 绘制蜡烛图 candlestick2_ohlc(ax1, opens, highs, lows, closes, width=0.6, colorup='green', colordown='red') ax1.set_title('BTC-ETH 30min Candlestick Chart') ax1.set_ylabel('Price (BTC)') # 绘制成交量柱状图 ax2.bar(range(len(times)), volumes, width=0.6, color=['green' if opens[i] < closes[i] else 'red' for i in range(len(times))]) ax2.set_ylabel('Volume') # 格式化时间轴刻度 ax2.xaxis.set_major_locator(ticker.MaxNLocator(10)) def format_date(x, pos=None): if x < 0 or x >= len(times): return '' return times[int(x)].strftime('%Y-%m-%d %H:%M') ax2.xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) plt.xticks(rotation=45) plt.tight_layout() plt.show()
四、额外的小提示
- 如果你需要把数据保存到CSV文件,可以直接用DataFrame的
to_csv方法:df.to_csv('btc_eth_thirtymin.csv') - Bittrex的API有请求频率限制,不要频繁调用,避免被封禁IP
- 时间间隔参数
tickInterval支持的值有:oneMin,fiveMin,thirtyMin,hour,day
内容的提问来源于stack exchange,提问作者user9280506
相关产品推荐
相关产品推荐

