【问题标题】:How to use the Alpha Vantage API directly from Python如何直接从 Python 使用 Alpha Vantage API
【发布时间】:2018-06-12 19:22:28
【问题描述】:

我一直在使用 Romel Torres 的 alpha_vantage 包,但也想直接从 python 中使用 Alpha Vantage API(提供更强大的功能)和包请求,如下所述CALL with CURL an API through Python

import requests
import alpha_vantage

API_URL = "https://www.alphavantage.co/query"

data = {
    "function": "TIME_SERIES_DAILY",
    "symbol": "NIFTY",
    "outputsize": "compact",
    "datatype": "csv"
    "apikey": "XXX",
    }
response = requests.get(API_URL, data)
print(response.json())[/code]

但我在返回的字典中收到以下错误消息:

{'错误消息': '无效的 API 调用。请重试或访问 TIME_SERIES_DAILY 的文档 (https://www.alphavantage.co/documentation/)。'}

使用 requests.post() 的结果是:

response = requests.post(API_URL, data)
{'detail': 'Method "POST" not allowed.'}

我重新检查了文档并遵循了所有必需的 API 参数。感谢我在这里可能缺少的一些帮助以及正确的调用和/或任何其他替代方法。谢谢

【问题讨论】:

  • 您必须获得唯一的API key 才能使用 API - 因此您必须在此门户上注册。
  • 在文档中查看您必须使用哪些参数 - functionsymbolintervalapikey。你忘了interval
  • @furas:TIME_SERIES_DAILY 没有“间隔”字段(函数名称中的间隔很清楚),我有一个 API 密钥,它在我的 OP 中用“XXX”隐藏。如上所述,我已经在使用 alpha_vantage 包,所以我在门户网站上注册了

标签: python api python-requests alpha-vantage


【解决方案1】:

提示在错误中。将您的请求方法从post 更改为get

response = requests.get(API_URL, params=data)

并使用作为 Alpha Vantage 数据存在的股票代码。 NIFTY 不是股票 - 它是指数。如果您使用MSFT 尝试您的代码,它将起作用。

【讨论】:

    【解决方案2】:

    这就是我在不使用任何包装器的情况下从 Alpha Vantage 获取每日股票时间序列的方式。收到后,我将数据转换成pandas数据框进行进一步处理。

        import requests
        import pandas as pd
    
        API_URL = "https://www.alphavantage.co/query" 
        symbol = 'SMBL'
    
        data = { "function": "TIME_SERIES_DAILY", 
        "symbol": symbol,
        "outputsize" : "full",
        "datatype": "json", 
        "apikey": "your_api_key" } 
    
        response = requests.get(API_URL, data) 
        response_json = response.json() # maybe redundant
    
        data = pd.DataFrame.from_dict(response_json['Time Series (Daily)'], orient= 'index').sort_index(axis=1)
        data = data.rename(columns={ '1. open': 'Open', '2. high': 'High', '3. low': 'Low', '4. close': 'Close', '5. adjusted close': 'AdjClose', '6. volume': 'Volume'})
        data = data[[ 'Open', 'High', 'Low', 'Close', 'AdjClose', 'Volume']]
        data.tail() # check OK or not
    

    【讨论】:

    • 当我尝试运行它时,我得到:Traceback (most recent call last): File "after.py", line 16, in <module> data = pd.DataFrame.from_dict(response_json['Time Series (Daily)'], orient= 'index').sort_index(axis=1) KeyError: 'Time Series (Daily)'
    • 查看官方文档-alphavantage.co/documentation-非常有用
    【解决方案3】:
    import requests
    import alpha_vantage
    import json
    
    
    API_URL = "https://www.alphavantage.co/query" 
    symbols = ['QCOM',"INTC","PDD"]
    
    for symbol in symbols:
            data = { "function": "TIME_SERIES_INTRADAY", 
            "symbol": symbol,
            "interval" : "60min",       
            "datatype": "json", 
            "apikey": "XXX" } 
            response = requests.get(API_URL, data) 
            data = response.json()
            print(symbol)
            a = (data['Time Series (60min)'])
            keys = (a.keys())
            for key in keys:
                    print(a[key]['2. high'] + " " + a[key]['5. volume'])
    

    【讨论】:

      【解决方案4】:

      首先

      您使用的是“csv”数据类型。

      “数据类型”:“csv”

      但您正在尝试以 JSON 格式打印

      print(response.json())
      

      第二

      按照建议尝试使用 get 方法

      【讨论】:

        【解决方案5】:

        您在 data 中的最后一个元素之后似乎多了一个逗号 (,)。

        【讨论】:

        • 这在 Python 中是允许的,但没有问题。
        【解决方案6】:
        import requests
        import alpha_vantage
        
        API_URL = "https://www.alphavantage.co/query"
        data = {
            "function": "TIME_SERIES_DAILY",
            "symbol": "AAPL",
         "outputsize": "compact",
            "apikey": "your key"
            }
        
        response = requests.get(API_URL, params=data)
        print(response.json())
        

        【讨论】:

        • 提供一些上下文将有助于理解您的答案是如何工作的。请考虑How to Answer
        • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。
        【解决方案7】:

        这就是我在没有任何包装器的情况下这样做的方式。您可以使用此代码轻松地从 Alpha Vantage 中提取历史股票价格。您所要做的就是插入您的符号和令牌。有关提取 Alpha Vantage 数据的更多功能,请随时查看此链接:https://github.com/hklchung/StockPricePredictor/blob/master/2020/alphavantage_funcs.py

        def request_stock_price_hist(symbol, token, sample = False):
            if sample == False:
                q_string = 'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol={}&outputsize=full&apikey={}'
            else:
                q_string = 'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol={}&apikey={}'
        
            print("Retrieving stock price data from Alpha Vantage (This may take a while)...")
            r = requests.get(q_string.format(symbol, token))
            print("Data has been successfully downloaded...")
            date = []
            colnames = list(range(0, 7))
            df = pd.DataFrame(columns = colnames)
            print("Sorting the retrieved data into a dataframe...")
            for i in tqdm(r.json()['Time Series (Daily)'].keys()):
                date.append(i)
                row = pd.DataFrame.from_dict(r.json()['Time Series (Daily)'][i], orient='index').reset_index().T[1:]
                df = pd.concat([df, row], ignore_index=True)
            df.columns = ["open", "high", "low", "close", "adjusted close", "volume", "dividend amount", "split cf"]
            df['date'] = date
            return df
        

        上述函数的使用方式如下:

        df = request_stock_price_hist('IBM', 'REPLACE_YOUR_TOKEN')
        df.to_csv('output.csv')
        

        【讨论】:

          猜你喜欢
          • 2019-02-16
          • 1970-01-01
          • 1970-01-01
          • 2020-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-21
          • 2020-02-16
          相关资源
          最近更新 更多