Я искал еще несколько инструментов для автоматизации анализа акций, и вот как я нашел эту ссылку на приведенный ниже код. Автор говорит, что опубликовал весь код, но я его не видел, поэтому я реконструирую его и не могу заставить его работать. Ссылка ниже.

Запросы, веб-скрейпинг и pandas - области, в которых я не так хорошо разбираюсь, поэтому я решил, что джедаи на SO могут помочь распутать или обновить этот код. https://medium.com/swlh/automating-your-stock-portfolio-research-with-python-for-beginners-912dc02bf1c2

В долгосрочной перспективе я пытаюсь изучать python, обновляя или добавляя новые функции в инструменты, созданные другими, так что это тоже опыт обучения. Поэтому мне бы хотелось, чтобы вы исправили проблему, но я бы предпочел, чтобы вы дали подсказки и направили меня к возможным решениям.

# FILENAME financial_analysis.py
# SOURCE https://medium.com/swlh/automating-your-stock-portfolio-research-with-python-for-beginners-912dc02bf1c2

import requests
import pandas as pd


def getdata(stock):
    """Company Quote Group of Items"""
    company_quote = requests.get(f"https://financialmodelingprep.com/api/v3/quote/{stock}")
    company_quote = company_quote.json()
    share_price = float("{0:.2f}".format(company_quote[0]['price']))

    # Balance Sheet Group of Items
    BS = requests.get(f"https://financialmodelingprep.com/api/v3/financials/balance-sheet-statement/{stock}?period=quarter")
    BS = BS.json()

    # print_data = getdata(aapl)
    #Total Debt
    debt = float("{0:.2f}".format(float(BS['financials'][0]['Total debt'])/10**9))#Total Cash
    cash = float("{0:.2f}".format(float(BS['financials'][0]['Cash and short-term investments'])/10**9))

    # Income Statement Group of Items
    IS = requests.get(f"https://financialmodelingprep.com/api/v3/financials/income-statement/{stock}?period=quarter")
    IS = IS.json()

    # Most Recent Quarterly Revenue
    qRev = float("{0:.2f}".format(float(IS['financials'][0]['Revenue'])/10**9))

    # Company Profile Group of Items
    company_info = requests.get(f"https://financialmodelingprep.com/api/v3/company/profile/{stock}")
    company_info = company_info.json()# Chief Executive Officer
    ceo = company_info['profile']['ceo']

    return(share_price, cash, debt, qRev, ceo)


tickers = {'AAPL', 'MSFT', 'GOOG', 'T', 'CSCO', 'INTC', 'ORCL', 'AMZN', 'FB', 'TSLA', 'NVDA'}

data = map(getdata, tickers)

df = pd.DataFrame(data,
                  columns=['Total Cash', 'Total Debt', 'Q3 2019 Revenue', 'CEO'],
                  index=tickers), print(df)

генерирует эту ошибку

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3296, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "", line 1, in 
    runfile('/Users/owner/sbox/Jamesmk6_3/toolbox/financial_analysis.py', wdir='/Users/owner/sbox/Jamesmk6_3/toolbox')
  File "/Users/owner/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-1/193.7288.30/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydev_bundle/pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "/Users/owner/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-1/193.7288.30/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "/Users/owner/sbox/Jamesmk6_3/toolbox/financial_analysis.py", line 44, in 
    index=tickers), print(df)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/frame.py", line 469, in __init__
    data = list(data)
  File "/Users/owner/sbox/Jamesmk6_3/toolbox/financial_analysis.py", line 12, in getdata
    share_price = float("{0:.2f}".format(company_quote[0]['price']))
KeyError: 0

Я копнул глубже и нашел dev pages, но, похоже, есть сложности между тем, что сделал автор, и тем, что показывают их документы.

Ответы (1)

Иногда API возвращает dict, а иногда list. Более простой подход - всегда извлекать с помощью json_normalize()

.

Очевидно, что для того, чтобы это работало, необходимо вставить свой ключ API. Я проверил все допустимые вызовы за 24-часовой период для дальнейшего тестирования. Некоторые тикеры возвращали несколько строк для некоторых вызовов API. Например, конечный набор данных был > 11 строк

import requests
import pandas as pd

tickers = {'AAPL', 'MSFT', 'GOOG', 'T', 'CSCO', 'INTC', 'ORCL', 'AMZN', 'FB', 'TSLA', 'NVDA'}

df = pd.DataFrame()

url = "https://financialmodelingprep.com/api/v3"
apikey="xxx"
payload = {"apikey":apikey}

for stock in tickers:
    print(stock)
    # use params rather than manually build request parameters
    quote = requests.get(f"{url}/quote/{stock}",params=payload)
    bs = requests.get(f"{url}/balance-sheet-statement/{stock}", params={"period":"quarter", "limit":1, **payload})
    IS = requests.get(f"{url}/income-statement/{stock}", params={"period":"quarter", "limit":1, **payload})
    company_info = requests.get(f"{url}/company/profile/{stock}", params=payload)

    if "Error Message" in quote.json():
        print(f"Error: {quote.text}")
        break

    else:
        # join all the results together using json_normalise() rather than hand coded extration from JSON
        df = pd.concat([df, (pd.json_normalize(quote.json())
         .merge(pd.json_normalize(bs.json()), on="symbol", suffixes=("","_BS"))
         .merge(pd.json_normalize(IS.json()), on="symbol", suffixes=("","_IS"))
         .merge(pd.json_normalize(company_info.json()), on="symbol", suffixes=("","_info"))
                    )])

# df.columns.tolist()
if len(df)>0:
    # the columns the question is interested in
    df.loc[:,["symbol","price","totalDebt","cashAndShortTermInvestments","revenue","profile.ceo"]]



2022 WebDevInsider