BokehUserWarning 和 python 中 pandas_datareader 的问题
BokehUserWarning and problem with pandas_datareader in python
我正在尝试使用 pandas_datareader 模块根据从 data.DataReader 获得的股票数据绘制一张带有 bokeh.plotting 的图表。
问题一:检索到的数据在 pandas.Index 而不是 pandas.DatetimeIndex
问题二:我收到 BokehWarning
代码1:
import os
from pandas_datareader import data
from datetime import datetime as dt
from bokeh.plotting import figure, show, output_file
os.environ["ALPHAVANTAGE_API_KEY"] = "E____secret____4"
hours_12 = 12*60*60*1000
start = dt(2016,3,1)
end = dt(2016,3,10)
f = data.DataReader('GOOG','av-daily',start,end,api_key=os.getenv('ALPHAVANTAGE_API_KEY'))
#f
#f.loc['2016-03-09']
f.index
输出:
Index(['2016-03-01', '2016-03-02', '2016-03-03', '2016-03-04', '2016-03-07',
'2016-03-08', '2016-03-09', '2016-03-10'],
dtype='object')
请注意,索引是 DatetimeIndex([...) 而不是 Index
f 的值为:
open high low close volume
2016-03-01 703.62 718.8100 699.77 718.81 2151419
2016-03-02 719.00 720.0000 712.00 718.85 1629003
2016-03-03 718.68 719.4500 706.02 712.42 1957974
2016-03-04 714.99 716.4900 706.02 710.89 1972077
2016-03-07 706.90 708.0912 686.90 695.16 2988026
2016-03-08 688.59 703.7900 685.34 693.97 2058471
2016-03-09 698.47 705.6800 694.00 705.24 1421515
2016-03-10 708.12 716.4400 703.36 712.82 2833525
代码 2:
p = figure(x_axis_type='datetime',width=1000,height=400, title="CandleStick Chart")
p.rect(x=f.index[f.close > f.open],y=(f.open + f.close)/2, width=hours_12, height=abs(f.open-f.close))
output_file("cs.html")
show(p)
输出:
BokehUserWarning: ColumnDataSource's columns must be of the same length. Current lengths: ('x', 4), ('y', 8)
BokehUserWarning: ColumnDataSource's columns must be of the same length. Current lengths: ('height', 8), ('x', 4), ('y', 8)
散景输出是一张白纸,这不是应该的。我遵循了一个教程,它似乎在教程中有效(虽然教程有点过时了)
请帮忙并温和地回答或不回答。一直很头疼
我通过将数据源从 Alpha Vantage 更改为 Yahoo Finance 找到了解决方案。我没有直接使用 yahoo 作为 data.DataReader 模块的来源,因为它已被弃用。结果是 yahoo finance 创建了一个名为 yfinance 的单独模块。
from pandas_datareader import data
from datetime import datetime as dt
import yfinance as yf
yf.pdr_override() #this enables your code use yfinance instead of pdr
from bokeh.plotting import figure, show, output_file
hours_12 = 12*60*60*1000
start = dt(2016,3,1)
end = dt(2016,3,10)
df=data.get_data_yahoo(tickers="GOOG", start=start, end=end)
yfinance 通过 alpha 优势创建 pandas.DatetimeIndex 而不是 pandas.Index 数据。这会创建图表,但仍然存在 BokehWarning
为了解决 BokehWarning 问题并确保您的图表准确一致,我通过这样做在 df 中创建了新列
def status(open,close):
if open < close:
value="Profit"
elif open > close:
value="Loss"
else: value="Equal"
return value
df['Status'] = [status(open,close) for open,close in zip(df.Open,df.Close)]
df['Middle_y'] = (df.Open+df.Close)/2
df['Height'] = abs(df.Close-df.Open)
然后您可以通过添加变量继续创建图表。
p = figure(x_axis_type='datetime',width=1000,height=400, title="CandleStick Chart")
p.rect(x=df.index[df.Status =="Profit"],y=df.Middle_y[df.Status=='Profit'], width=hours_12,
height=df.Height[df.Status=="Profit"],fill_color="green", line_color="black")
p.rect(x=df.index[df.Status =="Loss"],y=df.Middle_y[df.Status=='Loss'], width=hours_12,
height=df.Height[df.Status=="Loss"],fill_color="red", line_color="black")
output_file("cs.html")
show(p)
希望这对以后遇到同样困难的人有所帮助
我正在尝试使用 pandas_datareader 模块根据从 data.DataReader 获得的股票数据绘制一张带有 bokeh.plotting 的图表。
问题一:检索到的数据在 pandas.Index 而不是 pandas.DatetimeIndex
问题二:我收到 BokehWarning
代码1:
import os
from pandas_datareader import data
from datetime import datetime as dt
from bokeh.plotting import figure, show, output_file
os.environ["ALPHAVANTAGE_API_KEY"] = "E____secret____4"
hours_12 = 12*60*60*1000
start = dt(2016,3,1)
end = dt(2016,3,10)
f = data.DataReader('GOOG','av-daily',start,end,api_key=os.getenv('ALPHAVANTAGE_API_KEY'))
#f
#f.loc['2016-03-09']
f.index
输出:
Index(['2016-03-01', '2016-03-02', '2016-03-03', '2016-03-04', '2016-03-07',
'2016-03-08', '2016-03-09', '2016-03-10'],
dtype='object')
请注意,索引是 DatetimeIndex([...) 而不是 Index
f 的值为:
open high low close volume
2016-03-01 703.62 718.8100 699.77 718.81 2151419
2016-03-02 719.00 720.0000 712.00 718.85 1629003
2016-03-03 718.68 719.4500 706.02 712.42 1957974
2016-03-04 714.99 716.4900 706.02 710.89 1972077
2016-03-07 706.90 708.0912 686.90 695.16 2988026
2016-03-08 688.59 703.7900 685.34 693.97 2058471
2016-03-09 698.47 705.6800 694.00 705.24 1421515
2016-03-10 708.12 716.4400 703.36 712.82 2833525
代码 2:
p = figure(x_axis_type='datetime',width=1000,height=400, title="CandleStick Chart")
p.rect(x=f.index[f.close > f.open],y=(f.open + f.close)/2, width=hours_12, height=abs(f.open-f.close))
output_file("cs.html")
show(p)
输出:
BokehUserWarning: ColumnDataSource's columns must be of the same length. Current lengths: ('x', 4), ('y', 8)
BokehUserWarning: ColumnDataSource's columns must be of the same length. Current lengths: ('height', 8), ('x', 4), ('y', 8)
散景输出是一张白纸,这不是应该的。我遵循了一个教程,它似乎在教程中有效(虽然教程有点过时了) 请帮忙并温和地回答或不回答。一直很头疼
我通过将数据源从 Alpha Vantage 更改为 Yahoo Finance 找到了解决方案。我没有直接使用 yahoo 作为 data.DataReader 模块的来源,因为它已被弃用。结果是 yahoo finance 创建了一个名为 yfinance 的单独模块。
from pandas_datareader import data
from datetime import datetime as dt
import yfinance as yf
yf.pdr_override() #this enables your code use yfinance instead of pdr
from bokeh.plotting import figure, show, output_file
hours_12 = 12*60*60*1000
start = dt(2016,3,1)
end = dt(2016,3,10)
df=data.get_data_yahoo(tickers="GOOG", start=start, end=end)
yfinance 通过 alpha 优势创建 pandas.DatetimeIndex 而不是 pandas.Index 数据。这会创建图表,但仍然存在 BokehWarning
为了解决 BokehWarning 问题并确保您的图表准确一致,我通过这样做在 df 中创建了新列
def status(open,close):
if open < close:
value="Profit"
elif open > close:
value="Loss"
else: value="Equal"
return value
df['Status'] = [status(open,close) for open,close in zip(df.Open,df.Close)]
df['Middle_y'] = (df.Open+df.Close)/2
df['Height'] = abs(df.Close-df.Open)
然后您可以通过添加变量继续创建图表。
p = figure(x_axis_type='datetime',width=1000,height=400, title="CandleStick Chart")
p.rect(x=df.index[df.Status =="Profit"],y=df.Middle_y[df.Status=='Profit'], width=hours_12,
height=df.Height[df.Status=="Profit"],fill_color="green", line_color="black")
p.rect(x=df.index[df.Status =="Loss"],y=df.Middle_y[df.Status=='Loss'], width=hours_12,
height=df.Height[df.Status=="Loss"],fill_color="red", line_color="black")
output_file("cs.html")
show(p)
希望这对以后遇到同样困难的人有所帮助