八、从网络加载数据
除了从文件加载数据,另一个流行的数据源是互联网。 我们可以用各种各样的方式从互联网加载数据,但对我们来说,我们只是简单地读取网站的源代码,然后通过简单的拆分来分离数据。
import matplotlib.pyplot as plt
import numpy as np
import urllib
import matplotlib.dates as mdates
def graph_data(stock):
stock_price_url = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=10y/csv'
source_code = urllib.request.urlopen(stock_price_url).read().decode()
stock_data = []
split_source = source_code.split('\n')
for line in split_source:
split_line = line.split(',')
if len(split_line) == 6:
if 'values' not in line:
stock_data.append(line)
这里有很多步骤。首先,我们看到import
。 pyplot
像往常一样导入,然后导入了numpy
,然后是用于访问互联网的urllib
,然后导入了matplotlib.dates
作为mdates
,它对于将日期戳转换为 matplotlib 可以理解的日期很有用。
接下来,我们开始构建我们的graph_data
函数。在这里,我们首先定义包含股票数据的网址。之后,我们写一些urllib
代码来访问该 URL,然后使用.read
读取源代码,之后我们继续解码该数据。如果你使用 Python 2,则不必使用decode
。
然后,我们定义一个空列表,这是我们将要放置股票数据的地方,我们也开始使用split_source
变量拆分数据,以换行符拆分。
现在,如果你去看源代码,用stock
替换 URL 中的+stock+
,像 AAPL 那样,你可以看到大多数页面数据确实是股票定价信息,但有一些头信息我们需要过滤掉。为此,我们使用一些基本的过滤,检查它们来确保每行有 6 个数据点,然后确保术语values
不在行中。
现在,我们已经解析了数据,并做好了准备。我们将使用 NumPy:
date, closep, highp, lowp, openp, volume = np.loadtxt(stock_data,
delimiter=',',
unpack=True,
# %Y = full year. 2015
# %y = partial year 15
# %m = number month
# %d = number day
# %H = hours
# %M = minutes
# %S = seconds
# 12-06-2014
# %m-%d-%Y
converters={0: bytespdate2num('%Y%m%d')})
我们在这里所做的是,使用numpy
的loadtxt
函数,并将这六个元素解构到六个变量。 这里的第一个参数是stock_data
,这是我们加载的数据。 然后,我们指定delimiter
(这里是逗号),然后我们指定我们确实想要在这里解包变量,不是一个变量,而是我们定义的这组变量。 最后,我们使用可选的converters
参数来指定我们要转换的元素(0
),以及我们打算要怎么做。 我们传递一个名为bytespdate2num
的函数,它还不存在,但我们下面会编写它。