八、从网络加载数据

除了从文件加载数据,另一个流行的数据源是互联网。 我们可以用各种各样的方式从互联网加载数据,但对我们来说,我们只是简单地读取网站的源代码,然后通过简单的拆分来分离数据。

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import urllib
  4. import matplotlib.dates as mdates
  5. def graph_data(stock):
  6. stock_price_url = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=10y/csv'
  7. source_code = urllib.request.urlopen(stock_price_url).read().decode()
  8. stock_data = []
  9. split_source = source_code.split('\n')
  10. for line in split_source:
  11. split_line = line.split(',')
  12. if len(split_line) == 6:
  13. if 'values' not in line:
  14. stock_data.append(line)

这里有很多步骤。首先,我们看到importpyplot像往常一样导入,然后导入了numpy,然后是用于访问互联网的urllib,然后导入了matplotlib.dates作为mdates,它对于将日期戳转换为 matplotlib 可以理解的日期很有用。

接下来,我们开始构建我们的graph_data函数。在这里,我们首先定义包含股票数据的网址。之后,我们写一些urllib代码来访问该 URL,然后使用.read读取源代码,之后我们继续解码该数据。如果你使用 Python 2,则不必使用decode

然后,我们定义一个空列表,这是我们将要放置股票数据的地方,我们也开始使用split_source变量拆分数据,以换行符拆分。

现在,如果你去看源代码,用stock替换 URL 中的+stock+,像 AAPL 那样,你可以看到大多数页面数据确实是股票定价信息,但有一些头信息我们需要过滤掉。为此,我们使用一些基本的过滤,检查它们来确保每行有 6 个数据点,然后确保术语values不在行中。

现在,我们已经解析了数据,并做好了准备。我们将使用 NumPy:

  1. date, closep, highp, lowp, openp, volume = np.loadtxt(stock_data,
  2. delimiter=',',
  3. unpack=True,
  4. # %Y = full year. 2015
  5. # %y = partial year 15
  6. # %m = number month
  7. # %d = number day
  8. # %H = hours
  9. # %M = minutes
  10. # %S = seconds
  11. # 12-06-2014
  12. # %m-%d-%Y
  13. converters={0: bytespdate2num('%Y%m%d')})

我们在这里所做的是,使用numpyloadtxt函数,并将这六个元素解构到六个变量。 这里的第一个参数是stock_data,这是我们加载的数据。 然后,我们指定delimiter(这里是逗号),然后我们指定我们确实想要在这里解包变量,不是一个变量,而是我们定义的这组变量。 最后,我们使用可选的converters参数来指定我们要转换的元素(0),以及我们打算要怎么做。 我们传递一个名为bytespdate2num的函数,它还不存在,但我们下面会编写它。