当前位置: 首页 > 知识库问答 >
问题:

带Django的Alpha Vantage API-解析数据

公孙琛
2023-03-14

我正在使用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个答案

高宏峻
2023-03-14

您的错误是因为您没有访问“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)

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

姜戈

# 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 %}
 类似资料:
  • 本文向大家介绍django反向解析和正向解析的方式,包括了django反向解析和正向解析的方式的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Django的正向解析和反向解析,分享给大家,具体如下: 先创建一个视图界面 urls.py   index.html   index页面加载的效果 正向解析 所谓正向解析就是直接在这里写地址 向urls.py里面一样 例如: test/p1/p2 反向

  • 本文向大家介绍剖析Django中模版标签的解析与参数传递,包括了剖析Django中模版标签的解析与参数传递的使用技巧和注意事项,需要的朋友参考一下 分析直至另一个模板标签 模板标签可以像包含其它标签的块一样工作(想想 {% if %} 、 {% for %} 等)。 要创建一个这样的模板标签,在你的编译函数中使用 parser.parse() 。 标准的 {% comment %} 标签是这样实现

  • 本文向大家介绍django-rest-framework解析请求参数过程详解,包括了django-rest-framework解析请求参数过程详解的使用技巧和注意事项,需要的朋友参考一下 前言 我们在django-rest-framework 自定义swagger 文章中编写了接口, 调通了接口文档. 接口文档可以直接填写参数进行请求, 接下来的问题是如何接受参数, 由于请求方式与参数序列化形式的

  • 问题内容: 由于某种原因,我无法弄清楚为什么Django无法正确处理我的内容。 它以格式发送,查看开发工具中的选项卡将其显示为请求有效负载: 这正是我希望将其发送到我的API的方式。 在Django中,我有一个接受此请求作为参数的视图,仅出于测试目的,应将其打印到控制台。 当然,什么都没有打印出来,但是当我打印时我得到了: 所以我知道我 确实 有尸体被寄出。 我尝试也无济于事。设置该变量后打印也不

  • 本文向大家介绍Django的性能优化实现解析,包括了Django的性能优化实现解析的使用技巧和注意事项,需要的朋友参考一下 一 利用标准数据库优化技术 传统数据库优化技术博大精深,不同的数据库有不同的优化技巧,但重心还是有规则的。在这里算是题外话,挑两点通用的说说: 索引,给关键的字段添加索引,性能能更上一层楼,如给表的关联字段,搜索频率高的字段加上索引等。Django建立实体的时候,支持给字段添

  • 问题内容: 由于某种原因,我无法弄清楚为什么Django无法正确处理我的内容。 它以JSON格式发送,查看Network开发工具中的选项卡将其显示为请求有效负载: 这正是我希望将其发送到我的API的方式。 在Django中,我有一个接受此请求作为参数的视图,仅出于测试目的,应将其打印到控制台。 当然,什么都没有打印出来,但是当我打印时request.body我得到了: 所以我知道我确实有尸体被寄出