簡體   English   中英

使用ndarray解壓numpy

[英]Unpacking numpy using ndarray

我是python的新手。 任何幫助,將不勝感激。

我想使用我嘗試過的第一段代碼來顯示此圖 ,但是當我嘗試運行此代碼時:

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

使用Revenue_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()

但是,這似乎可以使用Revenue.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'.的錯誤不兼容'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'])

在此處輸入圖片說明

大段引用

這是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'])

這是一個具有nm value的roe_date

    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.dtypesrevenue.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')    

提前謝謝你的幫助。

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()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM