【问题标题】:Alpha Vantage API with Django - Parsing data带有 Django 的 Alpha Vantage API - 解析数据
【发布时间】:2020-11-01 03:39:54
【问题描述】:

我正在使用 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'}

我只是想获取 'Time Series (Daily)' 并将其解析为数据框,但尝试调用 'Time Series (Daily) 时总是出错' 字典。

你们知道我做错了什么吗? 提前谢谢各位!

【问题讨论】:

    标签: python django web-applications alpha-vantage


    【解决方案1】:

    您的错误是因为您没有访问“Time Series 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,您可以使用 DataFrame 类中的 from_dict 方法。请看下面的例子。

    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)
    

    编辑 您的问题的解决方案如下:

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

    在 home.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 %}
    

    【讨论】:

    • 感谢您的支持@RamWill!效果很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2019-11-02
    • 2019-02-16
    相关资源
    最近更新 更多