300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 绘制股票价格图 《Python数据可视化》的p131 python爬取雅虎财经股票交易数据

绘制股票价格图 《Python数据可视化》的p131 python爬取雅虎财经股票交易数据

时间:2021-08-15 06:46:52

相关推荐

绘制股票价格图   《Python数据可视化》的p131 python爬取雅虎财经股票交易数据

股票价格图

采用pandas_datareader包和获取Yahoo数据源

该书中说

采用matplotlib.mlab和matplotlib.finance的子包可以获取股票数据,但是matplotlib.finance已经用不了了。所以课本上的代码运行不通了。

所以我们换成pandas_datareader包获取Yahoo数据

旧版Pandas是通过pandas.io.data获取网络数据源,新版Pandas已将该子模块独立成了pandas_datareader包,须独立安装.(摘自老师给的某本书的截图,不知道叫什么)

目前可访问的网络数据服务商主要包括:Yahoo Finance(雅虎金融),Google Finance(谷歌金融)、Enigma(Enigma公共数据搜索的提供商)、World Bank(世界银行)、OECD(经合组织)、Eurostat(欧盟统计局)、Nasdaq Trader Symbol Definitions(纳斯达克)等。

打开命令行(cmd)窗口,输入

pip install pandas_datareader

获取数据股票数据的方法

r= webdata.get_data_yahoo(ticker,startdate,enddate)print(r.head())

光写这个实现的代码还是会报错,网上看到很多人用get_data_yahoo()方法都读取不出数据,因为雅虎在中国受到限制,程序会运行很久没有结果出来,还会报超时的错误,如下

runfile('H:/python/股票.py', wdir='H:/python')Traceback (most recent call last):timeout: The read operation timed outFile "C:\Users\a\anaconda3\lib\contextlib.py", line 131, in __exit__self.gen.throw(type, value, traceback)File "C:\Users\a\AppData\Roaming\Python\Python38\site-packages\urllib3\response.py", line 443, in _error_catcherraise ReadTimeoutError(self._pool, None, "Read timed out.")ReadTimeoutError: HTTPSConnectionPool(host='', port=443): Read timed out.During handling of the above exception, another exception occurred:Traceback (most recent call last):File "C:\Users\a\AppData\Roaming\Python\Python38\site-packages\requests\models.py", line 760, in generateraise ConnectionError(e)ConnectionError: HTTPSConnectionPool(host='', port=443): Read timed out.Figures now render in the Plots pane by default. To make them also appear inline in the Console, uncheck "Mute Inline Plotting" under the Plots pane options menu.

别慌,解决办法在这里,看到网上很多人说再导入 fix_yahoo_finance 包,这个包里提供的pdr_overrider()可以修复不能读取的问题

import fix_yahoo_finance as yf

但我试过了,还是不行,搜了好多文章,终于在CSDN上找到了解决办法

原文:在CSDN上找到的解决办法

方法就是 fix_yahoo_finance包改名了,改成了yfinance包,所以只要导入yfinance包,用这个包里的pdr_override() 方法即可

import pandas_datareader.data as webdataimport yfinance as yfyf.pdr_override()r= webdata.get_data_yahoo(ticker,startdate,enddate)#ticker表示股票代码,格式如下图,statedate是开始日期,必须为datatime格式,endate是结束日期

这样就可以解决get_data_yahoo获取股票数据超时的问题啦

接下来观察r.head()函数输出的前五条记录,可以知道get_data_yahoo()方法返回的已经是数据框的格式了,所以我没有做把他存入csv,再读取csv的步骤,而且课本上的

m=mlab.csv2rec(fh)这个方法也用不了了,matplotlib.mlab包中已经没有这个函数了。

分析数据集r

观察可知,首先这是个dataframe,所以课本上

prices=r.adj_closeax.plot(r.date, prices, ,color=fillcolor,lw=2,label=ticker)

要改成

prices = r['Adj Close']###plot the price and volume dataax.plot(r.index,prices,color=fillcolor,lw=2,label=ticker)

最后一个要改的地方是

#set the labels rotation and alignmentfor label in ax.get_xtickabels(): #get_xtickabels()也是用不了了,所以我直接注释了#To display date label slanting at 30 degreeeslabel.set_rotation(30)label.set_horizontalalignment('right')

因为get_xtickabels()也是用不了了,但我还没找到解决的方式,我直接注释掉了,如果有会的朋友可以评论区教我一下,谢谢~~

这是我的第一篇博客,写的不太好,请见谅,希望对你们有帮助(如有侵权,请联系删除)

完整代码实现

import datetimeimport numpy as npimport matplotlib.dates as mdatesimport pandas_datareader.data as webdataimport pandas as pdimport mplfinance as mpfimport matplotlib.pyplot as pltimport matplotlibimport yfinance as yfyf.pdr_override()#因为雅虎在中国受限制的原因,需要引入另一个模块,“yfinance”startdate = datetime.datetime(,4,12)enddate = datetime.datetime(,5,12)#today = enddate = datetime.date.today()plt.rcParams['font.sans-serif'] = ['SimHei'] #允许中文plt.rcParams['axes.unicode_minus'] = False #允许有坐标轴中的正负号plt.rc('axes',grid=True)plt.rc('grid',color='0.75',linestyle='-',linewidth=0.5)rect = [0.4,0.5,0.8,0.5]fig =plt.figure(facecolor='white',figsize=(12,11))#axescolor = '#f6f6f6' #the axes background colorax = fig.add_axes(rect,facecolor='#f6f6f6') #left, bottom, width, height =[0.4,0.5,0.8,0.5]ax.set_ylim(10,800)def plotTicker(ticker,startdate,enddate,fillcolor):r= webdata.get_data_yahoo(ticker,startdate,enddate)print(r.head())mpf.plot(r, type='candle', mav=(2, 5, 10), volume=True)###plot the relative strength indicator###adjusted close removes the impacts of splits and dividendsprices = r['Adj Close']###plot the price and volume dataax.plot(r.index,prices,color=fillcolor,lw=2,label=ticker)ax.legend(loc='upper right',shadow=True,fancybox=True) #shadow: 是否为图例边框添加阴影,fancybox: 是否将图例框的边角设为圆形'''#set the labels rotation and alignmentfor label in ax.get_xtickabels(): #get_xtickabels()也是用不了了,所以我直接注释了#To display date label slanting at 30 degreeeslabel.set_rotation(30)label.set_horizontalalignment('right')''' ax.fmt_xdata = mdates.DateFormatter('%Y-%m-%d')#plot the tickers nowplotTicker('BIDU',startdate,enddate,'red')plotTicker('GOOG',startdate,enddate,'#1066ee')plotTicker('AMZN',startdate,enddate,'#506612')plt.show()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。