• 八、从网络加载数据

    八、从网络加载数据

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

    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的函数,它还不存在,但我们下面会编写它。