Распаковка NumPy с помощью ndarray
Я новичок в питоне. Любая помощь будет оценена.
Я хочу показать этот график, используя первый блок кодов, который я пробовал, но когда я пытаюсь запустить этот код:
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()
Тем не менее, похоже, что это работает с использованием come.txt:
date, value = np.loadtxt('revenue.txt', delimiter='\t', unpack=True,
converters={0: bytespdate2num('%Y-%m-%d')})
Пожалуйста, дайте мне знать, если мне нужно уточнить мой вопрос дальше. Заранее спасибо.
revenue1:
[{'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},
revenue_ar:
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],
revenue.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')
Это производит вывод как:
** У меня есть еще 2 вещи для работы. Во-первых, я хочу построить еще две переменные (net_income и roe)
Во-вторых, мои данные икры имеют значение nm, которое нельзя преобразовать в число с плавающей точкой или целое число.
Как я мог решить эту проблему?**
В качестве окончательного результата я хочу показать график, подобный этому (я могу сделать свою собственную работу над графиками и деталями конфигурации):
Я пробовал эту строку, но это не похоже на работу с отображением ошибки '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'])
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_date с 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 ответ
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'])
Однако вы могли бы сделать это еще более удобным, если бы указали дату в качестве индекса:
df.index = pd.to_datetime(df['date'])
df = df.drop(columns=['date'])
Потому что вы могли бы просто позвонить
df.plot()
как панды имеет интерфейс 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
-entries. Заменить их на 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 ()