Alpha Vantage API с Django - Анализ данных - PullRequest
0 голосов
/ 11 июля 2020

Я создаю какое-то веб-приложение Stock Market, используя структуру django. Я получаю данные из Alpha Vantage API, и я застрял при анализе нужных мне данных.

1 - я могу успешно вызвать API, но всегда получаю сообщение об ошибке при попытке получить данные, которые мне нужны. код, который я использую на views.py:

def home(request):

import requests
import json
import pandas as pd
from alpha_vantage.timeseries import TimeSeries


url = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=B3SA3.SA&outputsize=compact&apikey=XXX"

api_request = requests.post("GET", url)

try:
    api = api_request.content.json()

except Exception as e:
    api="Erro, tente novamente"

return render(request,'home.html', {'api': api})

На home.html Я использую этот код, чтобы показывать информацию или ошибку:

{% if api %}

    {% if api == "Erro, tente novamente."%}
        Houve um problema com a busca da ação, tente novamente.

    {% else %}
        {% for key,value in api.items %}
            {{key}}: {{value}}<br/>

        {%endfor%}

    {% endif %}

{% endif %}

С этим код, я получаю следующее, и, как вы можете видеть, есть два отдельных словаря Метаданные и Временные ряды (ежедневно) :

{ 'Метаданные ': {' 1. Информация »:« Ежедневные временные ряды с разделениями и событиями дивидендов »,« 2. Символ ':' B3SA3.SA ',' 3. Последнее обновление ':' 2020-07-10 ',' 4. Размер вывода »:« Компактный »,« 5. Часовой пояс ':' США / Восток '}, ' Временной ряд (ежедневно) ': {' 2020-07-10 ': {' 1. открыть ': '58 .8000', '2. высокий ': '59 .9800', '3. низкий ': '57 .6000', '4. закрыть ': '59 .9500', '5. скорректировано закрытие ': '59 .9500', '6. объем ':' 7989500 ',' 7. размер дивидендов »:« 0,0000 »,« 8. коэффициент разделения ':' 1.0000 '},' 2020-07-09 ': {' 1. открыть ': '60 .9700', '2. высокий ': '60 .9700', '3. низкий ': '58 .4400', '4. закрыть ': '58 .8900', '5. скорректированное закрытие ': '58 .8900', '6. том ':' 13494000 ',' 7. размер дивидендов »:« 0,0000 »,« 8. коэффициент разделения ':' 1.0000 '},' 2020-07-08 ': {' 1. открыть ': '57 .6100', '2. высокий ': '60 .8900', '3. низкий ': '57 .2300', '4. закрыть ': '60 .6500', '5. скорректированное закрытие ':' 60 .6500 ',' 6. объем ':' 13847100 ',' 7. размер дивиденда »:« 0,0000 »,« 8. коэффициент разделения ':' 1.0000 '},' 2020-07-07 ': {' 1. открыть ': '56 .5500', '2. высокий ':' 57,6000 ',' 3. низкий ': '56 .2500', '4. закрыть ': '57 .1700', '5. скорректированное закрытие ': '57 .1700', '6. объем ':' 9038800 ',' 7. размер дивидендов »:« 0,0000 »,« 8. коэффициент разделения ':' 1.0000 '}

Я только пытаюсь получить ' Временной ряд (ежедневно) ' и проанализировать его в кадре данных, но я всегда получаю ошибки при попытке позвонить 'Временные ряды (ежедневно)' словарь.

Вы, ребята, знаете, что я делаю не так? Заранее спасибо, ребята!

1 Ответ

1 голос
/ 14 июля 2020

Ошибка возникает из-за того, что вы не получаете доступ к клавише «Временной ряд Daily ()».

### This is data you would receive from your API call
api = {'Meta Data': {'1. Information': 'Daily Time Series with Splits and Dividend Events', '2. Symbol': 'B3SA3.SA', '3. Last Refreshed': '2020-07-10', '4. Output Size': 'Compact', '5. Time Zone': 'US/Eastern'}, 'Time Series (Daily)': {'2020-07-10': {'1. open': '58.8000', '2. high': '59.9800', '3. low': '57.6000', '4. close': '59.9500', '5. adjusted close': '59.9500', '6. volume': '7989500', '7. dividend amount': '0.0000', '8. split coefficient': '1.0000'}, '2020-07-09': {'1. open': '60.9700', '2. high': '60.9700', '3. low': '58.4400', '4. close': '58.8900', '5. adjusted close': '58.8900', '6. volume': '13494000', '7. dividend amount': '0.0000', '8. split coefficient': '1.0000'}, '2020-07-08': {'1. open': '57.6100', '2. high': '60.8900', '3. low': '57.2300', '4. close': '60.6500', '5. adjusted close': '60.6500', '6. volume': '13847100', '7. dividend amount': '0.0000', '8. split coefficient': '1.0000'}, '2020-07-07': {'1. open': '56.5500', '2. high': '57.6000', '3. low': '56.2500', '4. close': '57.1700', '5. adjusted close': '57.1700', '6. volume': '9038800', '7. dividend amount': '0.0000', '8. split coefficient': '1.0000'}}}

# We access the Time Series dictionary from the api call.
time_series = api["Time Series (Daily)"]

# If you want to print all columns
for time, prices in time_series.items():
    print(f"{time}: {prices}")


# If you want to print a specific column i.e. close prices.
for time, prices in time_series.items():
    print(f"{time}: {prices['4. close']}")

Теперь, если вы хотите проанализировать эти данные в pandas, вы можете использовать метод from_dict в классе DataFrame. см. пример ниже.

import pandas as pd

api = {'Meta Data': {'1. Information': 'Daily Time Series with Splits and Dividend Events', '2. Symbol': 'B3SA3.SA', '3. Last Refreshed': '2020-07-10', '4. Output Size': 'Compact', '5. Time Zone': 'US/Eastern'}, 'Time Series (Daily)': {'2020-07-10': {'1. open': '58.8000', '2. high': '59.9800', '3. low': '57.6000', '4. close': '59.9500', '5. adjusted close': '59.9500', '6. volume': '7989500', '7. dividend amount': '0.0000', '8. split coefficient': '1.0000'}, '2020-07-09': {'1. open': '60.9700', '2. high': '60.9700', '3. low': '58.4400', '4. close': '58.8900', '5. adjusted close': '58.8900', '6. volume': '13494000', '7. dividend amount': '0.0000', '8. split coefficient': '1.0000'}, '2020-07-08': {'1. open': '57.6100', '2. high': '60.8900', '3. low': '57.2300', '4. close': '60.6500', '5. adjusted close': '60.6500', '6. volume': '13847100', '7. dividend amount': '0.0000', '8. split coefficient': '1.0000'}, '2020-07-07': {'1. open': '56.5500', '2. high': '57.6000', '3. low': '56.2500', '4. close': '57.1700', '5. adjusted close': '57.1700', '6. volume': '9038800', '7. dividend amount': '0.0000', '8. split coefficient': '1.0000'}}}

time_series = api["Time Series (Daily)"]

# this will create a dataframe with the Dates and close prices.
# it first sets the date as the index then resets the index so that the date becomes its own column
df = pd.DataFrame.from_dict(time_series, orient="index", columns=["4. close"]).reset_index()
renamed_headers = {"index": "Date", "4. close": "Close Price"}
df = df.rename(columns=renamed_headers)

# this makes sure that your close prices are numeric.
df["Close Price"] = pd.to_numeric(df["Close Price"])
print(df)

EDIT Решение вашей проблемы будет следующим:

DJANGO

# Its good practice to have imports at the top of script.
import requests
import json
import pandas as pd
from alpha_vantage.timeseries import TimeSeries

# We will create an object and store data from alpha vantage inside this object
from collections import namedtuple 



def home(request):    
    url = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=B3SA3.SA&outputsize=compact&apikey=XXX"

    api_request = requests.post("GET", url)

    # this is our object that will contain the date and close price data
    Security_Data = namedtuple("SecurityData", ["Date", "ClosePrice"])

    # this is a list of Security_Data objects.
    all_data = []

    try:
        api = api_request.content.json()
    except Exception as e:  # It's bad practice to capture a bare exception
        api = None

    if api is not None:
        time_series = api["Time Series (Daily)"]
        for time, prices in time_series.items():
            data = Security_Data(time, prices["4. close"])
            all_data.append(data)

return render(request, 'home.html', {'all_data': all_data})

Дома. html

{% if len(all_data) == 0 %}
    Houve um problema com a busca da ação, tente novamente.

{% else %}
    {% for data in all_data %}
        {{data.Date}}: {{data.ClosePrice}}<br/>

    {%endfor%}

{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...