Распаковка NumPy с помощью ndarray - PullRequest
0 голосов
/ 22 мая 2018

Я новичок в питоне.Буду признателен за любую помощь.

Я хочу показать этот график , используя первый блок кодов, который я пробовал, но когда я пытаюсь запустить этот код:

date, value = np.loadtxt(revenue_ar, delimiter=',', unpack=True, converters={ 0: bytespdate2num('%Y-%m-%d')})

с использованием yield_ar (numpy.ndarray) это сообщение об ошибке выскакивает:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Первый блок кодов:

import time
import requests
import intrinio
import pandas as pd
import numpy as np    

api_username = 'hidden'
api_password = 'hidden'

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

ticker = 'AAPL' 
revenue_data = requests.get('https://api.intrinio.com/historical_data?identifier=' + ticker + '&item=totalrevenue', auth=(api_username, api_password))
revenue1 = revenue_data.json()['data'] 
revenue = pd.DataFrame(revenue1) 
revenue_ar = revenue.values

date, value = np.loadtxt(revenue_ar, delimiter=',', unpack=True,
                                   converters={ 0: bytespdate2num('%Y-%m-%d')})('%Y-%m-%d')})('%Y-%m-%d')})

fig = plt.figure()
ax1 = plt.subplot2grid((6,4), (0,0), rowspan=6, colspan=4)
ax1.plot(date,value)
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.show()

Однако это кажетсяработать с использованием дохода.txt :

date, value = np.loadtxt('revenue.txt', delimiter='\t', unpack=True,
                                   converters={0: bytespdate2num('%Y-%m-%d')})

Пожалуйста, дайте мне знать, если мне нужно уточнить мой вопрос дальше.Заранее спасибо.


доход1:

[{'date': '2018-03-31', 'value': 247417000000.0},
{'date': '2017-12-30', 'value': 239176000000.0},
{'date': '2017-09-30', 'value': 229234000000.0},
{'date': '2017-07-01', 'value': 223507000000.0},
{'date': '2017-04-01', 'value': 220457000000.0},
{'date': '2016-12-31', 'value': 218118000000.0},
{'date': '2016-09-24', 'value': 215639000000.0},
{'date': '2016-06-25', 'value': 220288000000.0},
{'date': '2016-03-26', 'value': 227535000000.0},
{'date': '2015-12-26', 'value': 234988000000.0},
{'date': '2015-09-26', 'value': 233715000000.0},
{'date': '2015-06-27', 'value': 224337000000.0},
{'date': '2015-03-28', 'value': 212164000000.0},

доход_ар:

array([['2018-03-31', 247417000000.0],
       ['2017-12-30', 239176000000.0],
       ['2017-09-30', 229234000000.0],
       ['2017-07-01', 223507000000.0],
       ['2017-04-01', 220457000000.0],
       ['2016-12-31', 218118000000.0],
       ['2016-09-24', 215639000000.0],
       ['2016-06-25', 220288000000.0],
       ['2016-03-26', 227535000000.0],
       ['2015-12-26', 234988000000.0],
       ['2015-09-26', 233715000000.0],

доход.txt:

2007-09-29  2.457800e+10
2008-09-27  3.749100e+10
2009-09-26  4.290500e+10
2009-12-26  4.670800e+10
2010-03-27  5.112300e+10
2010-06-26  5.708900e+10
2010-09-25  6.522500e+10
2010-12-25  7.628300e+10
2011-03-26  8.745100e+10
2011-06-25  1.003220e+11
2011-09-24  1.082490e+11

Это было бы решением, как вы предложили.Это потрясающе, так как работает гладко.

import time
import urllib.request
from urllib.request import urlopen
import requests
import intrinio
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import matplotlib.dates as mdates
import datetime

api_username = 'hidden'
api_password = 'hidden'

def grab_intrinio(ticker):
    try:
        revenue_data = requests.get('https://api.intrinio.com/historical_data?    identifier=' + ticker + '&item=totalrevenue', auth=(api_username, api_password))
        revenue1 = revenue_data.json()['data'] 
        revenue = pd.DataFrame(revenue1)
        revenue['date'] = pd.to_datetime(revenue['date'])

        plt.plot(revenue['date'], revenue['value'])

    except Exception as e:
        print('failed in the main loop',str(e))
        pass

grab_intrinio('AAPL')

Это производит вывод как:

revenue graph

** У меня есть еще 2 вещиработать на.Во-первых, я хочу построить еще две переменные (net_income и roe)

Во-вторых, мои данные по икрам имеют значение nm, которое нельзя преобразовать в число с плавающей точкой или целое число.

Как я мог решить эту проблему? **

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

final graph

Я пробовал эту строку, но, похоже, не работает с ошибкой, показывающей 'list' object has no attribute 'plot'.

fig = plt.figure()

    ax1 = plt.plot(net_income['date'], net_income['value'])
    ax1.plot(net_income['date'], net_income['value'])

    ax2 = plt.plot(revenue['date'], revenue['value'])
    ax2.plot(revenue['date'], revenue['value'])

Этот производит net_income и доход на том же участке:

plt.plot(net_income['date'], net_income['value'])
plt.plot(revenue['date'], revenue['value'])

enter image description here

Blockquote

Воткоды для net_income и roe (тот же формат, что и для выручки)

net_income_data = requests.get('https://api.intrinio.com/historical_data?identifier=' + ticker + '&item=totalrevenue', auth=(api_username, api_password))
net_income1 = net_income_data.json()['data']
net_income = pd.DataFrame(net_income1)
net_income['date'] = pd.to_datetime(net_income['date'])        

roe_data = requests.get('https://api.intrinio.com/historical_data?identifier=' + ticker + '&item=roe', auth=(api_username, api_password))
roe1 = roe_data.json()['data']
roe = pd.DataFrame(roe1)
roe['date'] = pd.to_datetime(revenue['date'])

Это дата roe с nm value

    date    value
30  2010-09-25  0.352835
31  2010-06-26  0.354701
32  2010-03-27  0.274779
33  2009-12-26  0.261631
34  2009-09-26  0.305356
35  2008-09-27  0.274432
36  2007-09-29  nm

Вот результаты для roe.dtypes

In: roe.dtypes
Out: date     datetime64[ns]
     value            object
     dtype: object

Принимая во внимание, что net_income.dtypes и revenue.dtypes производят вывод следующим образом:

In: net_income.dtypes(revenue.dtypes)
Out: date     datetime64[ns]
     value           float64
     dtype: object

Ваша поправка на икру для преобразования из объекта в число с плавающей точкой сработала для построения графика.Когда я объединяю функцию в качестве последнего шага, я получаю ошибку invalid syntax, как показано ниже:

File "<ipython-input-141-537d7c6c91a3>", line 28
    fig axs = plt.subplots(3)

Для этой функции, написанной с вашей помощью.

def grab_intrinio(ticker):
    try:
        net_income_data = requests.get('https://api.intrinio.com/historical_data?identifier=' + ticker + '&item=netincome', auth=(api_username, api_password)) # 
        net_income1 = net_income_data.json()['data']
        net_income = pd.DataFrame(net_income1)
        net_income['date'] = pd.to_datetime(net_income['date'])

        revenue_data = requests.get('https://api.intrinio.com/historical_data?identifier=' + ticker + '&item=totalrevenue', auth=(api_username, api_password))
        revenue1 = revenue_data.json()['data']
        revenue = pd.DataFrame(revenue1)

        revenue['date'] = pd.to_datetime(revenue['date'])
        revenue

        roe_data = requests.get('https://api.intrinio.com/historical_data?identifier=' + ticker + '&item=roe', auth=(api_username, api_password))
        roe1 = roe_data.json()['data']
        roe = pd.DataFrame(roe1)
        roe['date'] = pd.to_datetime(roe['date'])
        roe.index = roe['date']
        roe = roe.drop(columns=['date'])
        nm_idx = roe['value'] =='nm'

        roe.value[nm_idx] = np.nan
        roe.value = roe.value.astype(float)

        fig axs = plt.subplots(3)
        for ax, dat in zip(axs, [net_income, Revenue, roc]):
            ax.plot(dat['date'], dat['value'])

    except exception as e:
        print('failed in the main loop',str(e))
        pass

grab_intrinio('AAPL')    

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 22 мая 2018

np.loadtxt ожидает имя файла или строковую переменную, из которой он может анализировать данные.Вот почему он работает, указывая путь, а не массив значений.

Таким образом, вы, очевидно, получаете действительные данные json через requests.get и декодируете через

revenue1 = revenue_data.json()['data']

ипоместите его в фрейм данных с

df = pd.DataFrame(revenue1)

Вот как это выглядит:

In: df.head()
Out: 
         date         value
0  2018-01-31  247417000000
1  2017-12-30  239176000000
2  2017-09-30  229234000000
3  2017-07-01  223507000000

, и вот как проверить типы данных столбцов в вашем фрейме данных:

In: df.dtypes
Out: 
date     object
value     int64
dtype: object

value - это целое число, что неплохо, но date не было проанализировано, это просто данные объекта, поэтому давайте исправим это:

df['date'] = pd.to_datetime(df['date'])

In: df
Out: 
        date         value
0 2018-01-31  247417000000
1 2017-12-30  239176000000
2 2017-09-30  229234000000
3 2017-07-01  223507000000

In: df.dtypes
Out: 
date     datetime64[ns]
value             int64
dtype: object    df = df.drop(columns=['date'])

Теперь date имеетПравильный тип данных, и вы можете построить его как

plt.plot(df['date'], df['value'])

enter image description here

Однако вы можете сделать его еще более удобным, если в качестве индекса укажите дату:

df.index = pd.to_datetime(df['date'])
df = df.drop(columns=['date'])

Поскольку вы можете просто позвонить

df.plot()

, поскольку у pandas есть интерфейс matplotlib на борту.

[! [Введите описание изображения здесь] [2]] [2]

Для вашего тройного графика вам понадобится что-то вроде:

fig axs = plt.subplots(3)
for ax, dat in zip(axs, [net_income, Revenue, roc]):
    ax.plot(dat['date'], dat['value'])

Некоторые ваши данные не могут быть преобразованы в плавающее из-за nm-записей.Замените их на np.nan, чтобы команды печати могли их обрабатывать, и вы можете использовать ваши данные:

In: roe
Out: 
          date     value
30  2010-09-25  0.352835
31  2010-06-26  0.354701
32  2010-03-27  0.274779
33  2009-12-26  0.261631
34  2009-09-26  0.305356
35  2008-09-27  0.274432
36  2007-09-29        nm

roe.index = roe['date']
roe = roe.drop(columns=['date'])
nm_idx = roe['value'] =='nm'

roe.value[nm_idx] = np.nan
roe.value = roe.value.astype(float)

In: roe
Out: 
               value
date                
2010-09-25  0.352835
2010-06-26  0.354701
2010-03-27  0.274779
2009-12-26  0.261631
2009-09-26  0.305356
2008-09-27  0.274432
2007-09-29       NaN

In: roe.dtypes
Out: 
value    float64
dtype: object

roe.plot ()

enter image description here

...