Преобразование строки в дату в numpy распаковать - PullRequest
0 голосов
/ 17 марта 2020

Я учусь извлекать данные из ссылок, а затем приступаю к их графику.

Для этого урока я использовал набор данных Yahoo из набора.

Код такой следует


import matplotlib.pyplot as plt
import numpy as np
import urllib
import matplotlib.dates as mdates
import datetime

def bytespdate2num(fmt, encoding='utf-8'):
    strconverter = mdates.strpdate2num(fmt)
    def bytesconverter(b):
        s = b.decode(encoding)
        return strconverter(s)
    return bytesconverter


def graph_data(stock):
    stock_price_url = 'https://pythonprogramming.net/yahoo_finance_replacement'
    source_code = urllib.request.urlopen(stock_price_url).read().decode()

    stock_data = []
    split_source=source_code.split('\n')

    print(len(split_source))

    for line in split_source:
        split_line=line.split(',')
        if (len(split_line)==7):
            stock_data.append(line)


    date,openn,closep,highp,lowp,openp,volume=np.loadtxt(stock_data,delimiter=',',unpack=True,converters={0:bytespdate2num('%Y-%m-%d')})

    plt.plot_date(date,closep)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title('Graph')
    plt.show()

graph_data('TSLA')

Весь код довольно прост для понимания, за исключением части преобразования строкового типа данных в формат даты с использованием функции bytesupdate2num.

Существует ли более простой способ преобразования строк, извлеченных из чтения URL в формате даты во время извлечения numpy или есть другой способ, который я могу использовать.

Спасибо

1 Ответ

0 голосов
/ 17 марта 2020

С предположением о формате csv я могу использовать numpy 'native' datetime dtype:

In [183]: txt = ['2020-10-23 1 2.3']*3                                                                               
In [184]: txt                                                                                                        
Out[184]: ['2020-10-23 1 2.3', '2020-10-23 1 2.3', '2020-10-23 1 2.3']

Если я позволю genfromtxt сделать свои собственные dtype преобразования:

In [187]: np.genfromtxt(txt, dtype=None, encoding=None)                                                              
Out[187]: 
array([('2020-10-23', 1, 2.3), ('2020-10-23', 1, 2.3),
       ('2020-10-23', 1, 2.3)],
      dtype=[('f0', '<U10'), ('f1', '<i8'), ('f2', '<f8')])

столбец даты отображается в виде строки.

Если я укажу формат datetime64:

In [188]: np.array('2020-10-23', dtype='datetime64[D]')                                                              
Out[188]: array('2020-10-23', dtype='datetime64[D]')

In [189]: np.genfromtxt(txt, dtype=['datetime64[D]',int,float], encoding=None)                                       
Out[189]: 
array([('2020-10-23', 1, 2.3), ('2020-10-23', 1, 2.3),
       ('2020-10-23', 1, 2.3)],
      dtype=[('f0', '<M8[D]'), ('f1', '<i8'), ('f2', '<f8')])

Эта дата работает в plt

In [190]: plt.plot_date(_['f0'], _['f1'])       

Я использовал genfromtxt, потому что я ' Я более знаком с его способностью обрабатывать dtypes.

...