Pandas & requests code for financial analysis giving KeyError:0

Pandas & requests code for financial analysis giving KeyError:0

我一直在寻找更多工具来自动进行股票分析,这就是我在下面的代码中找到 link 的方式。作者说他把整个代码贴出来了,但是我没有看到,所以我正在重构它,但不太明白运行。 Link 下面。

请求、网络抓取和 pandas 是我不太精通的领域,因此我认为 Jedi 在 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 "<ipython-input-2-d9759a746769>", line 1, in <module>
    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 <module>
    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 但作者所做的和他们的文档显示之间似乎存在复杂性。

API 有时 returns 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"]]