使用yfinance与Plotly在Python 2.7中绘制Yahoo Finance EUR/USD蜡烛图时出现空白窗口的问题排查
使用yfinance和Plotly在Python 2.7绘制EUR/USD蜡烛图的问题排查与解决
问题背景
我正在用yfinance和Plotly库(Python 2.7)获取欧元/美元(EUR/USD)数据并绘制蜡烛图,但绘制出的图表是空白的,想搞清楚问题出在哪以及怎么修复。
数据下载代码
我从Yahoo Finance下载数据的代码如下:
import yfinance as yf data = yf.download(tickers='EURUSD=X', period='1d', interval='30m')
数据示例
执行data.tail(10)得到的结果:
Open High Low Close Adj Close Volume Datetime 2022-02-25 17:30:00+00:00 1.125239 1.125239 1.124101 1.124354 1.124354 0 2022-02-25 18:00:00+00:00 1.124480 1.125873 1.124480 1.125492 1.125492 0 2022-02-25 18:30:00+00:00 1.125619 1.126507 1.125619 1.126126 1.126126 0 2022-02-25 19:00:00+00:00 1.125999 1.126507 1.125492 1.126253 1.126253 0 2022-02-25 19:30:00+00:00 1.126634 1.126888 1.125366 1.126634 1.126634 0 2022-02-25 20:00:00+00:00 1.126888 1.127015 1.126126 1.126634 1.126634 0 2022-02-25 20:30:00+00:00 1.126507 1.127650 1.126507 1.127015 1.127015 0 2022-02-25 21:00:00+00:00 1.127142 1.127523 1.126761 1.127523 1.127523 0 2022-02-25 21:30:00+00:00 1.127650 1.127777 1.127396 1.127777 1.127777 0 2022-02-25 22:00:00+00:00 1.127142 1.127142 1.127142 1.127142 1.127142 0
尝试的蜡烛图代码
我试了下面的代码绘制蜡烛图,但弹出窗口全是空白:
date_time = data.select_dtypes(['datetime64']) fig = go.Figure(data=[go.Candlestick(x=date_time, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'])]) fig.show()
问题分析与解决方案
核心问题
你获取x轴数据的方式错了:data.select_dtypes(['datetime64'])返回的是一个DataFrame(因为时间数据是你的DataFrame索引,不是普通列),但Plotly的Candlestick组件的x参数需要一维的时间序列数据,不是DataFrame。另外要注意,Python 2.7只支持Plotly 4.x及以下版本,如果你装了Plotly 5+的话也会出问题。
修复后的代码
方法1:直接用DataFrame的索引
既然时间数据是索引,直接调用data.index就可以:
import yfinance as yf import plotly.graph_objects as go # 下载数据 data = yf.download(tickers='EURUSD=X', period='1d', interval='30m') # 绘制蜡烛图 fig = go.Figure(data=[go.Candlestick( x=data.index, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'] )]) # 可选:给图表加些美化设置 fig.update_layout( title='EUR/USD 30分钟蜡烛图', xaxis_title='时间', yaxis_title='汇率', xaxis_rangeslider_visible=False # 隐藏底部的范围滑块 ) fig.show()
方法2:把索引转为列再使用
如果你想把时间索引转成单独的列来用,可以这么做:
import yfinance as yf import plotly.graph_objects as go data = yf.download(tickers='EURUSD=X', period='1d', interval='30m') # 将索引转为普通列 data['Datetime'] = data.index fig = go.Figure(data=[go.Candlestick( x=data['Datetime'], open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'] )]) fig.update_layout(title='EUR/USD 30分钟蜡烛图') fig.show()
额外注意事项
- 确保安装的库版本兼容Python 2.7:
pip install yfinance==0.1.67 # 这个版本支持Python 2.7 pip install plotly==4.14.3 # Plotly 4.x最后一个支持Python 2.7的版本 - 如果运行后还是没显示图表,试试生成HTML文件查看:
import plotly.offline as pyo pyo.plot(fig, filename='eurusd_candlestick.html')
内容的提问来源于stack exchange,提问作者behrad
相关产品推荐
相关产品推荐

