我已经从Yahoo Financials提取了9条报价的现金流量表。它产生了一个四层嵌套的字典-字典,列表,字典,字典。理想的结果将显示按年份在1个数据帧中的所有dict的dict的4个层中的值,按年份。
2018-12-31
AMZN BABA
capitalExpenditures -13427000000 -35482000000
changeinCash 10317000000 -4232000000
changetoAccountReceivables -4615000000 8639000000
2017-12-31
AMZN BABA
capitalExpenditures -11955000000 -19628000000
changeinCash 1922000000 56335000000
changetoAccountReceivables -4780000000 5690000000
现在,每一层是分开的,每个股票行情在其各自的层中,单击将使您在各自的层中分别有4个日期,然后是最终值,从而使得难以对股票行情进行比较。
我浏览了这里发布的过去的问题,但是大多数问题都没有达到4层。另外,由于我的第二层是一个列表,因此我无法继续进行操作。
请在下面找到完整的代码,非常感谢您的建议!
from yahoofinancials import YahooFinancials
import pandas as pd
ecommerce = ['CTRP', 'EBAY', 'GRUB', 'BABA', 'JD', 'EXPE', 'AMZN', 'BKNG', 'MPNGF']
yahoo_financials_ecommerce = YahooFinancials(ecommerce)
ecommerce_cash_flow_data = yahoo_financials_ecommerce.get_financial_stmts('annual', 'cash')
for k, v in ecommerce_cash_flow_data.items():
for k1, v1 in v.items():
for k2, v2 in v1.items():
for k3, v3 in v2.items():
print(v3) ###AttributeError: 'list' object has no attribute 'items'
def recursive_items(ecommerce_cash_flow_data):
for key, value in ecommerce_cash_flow_data.items():
if type(value) is dict:
yield (key, value)
yield from recursive_items(value)
else:
yield (key, value)
for key, value in recursive_items(ecommerce_cash_flow_data):
print(key, value)
cashflow = pd.DataFrame(list(ecommerce_cash_flow_data.items())) ###Only shows '0' == cashflowStatementHistory, '1' == every value dumped here thus does not help the situation
cashflow = pd.concat([pd.DataFrame(ecommerce_cash_flow_data, columns=[key, value]) for key, value in recursive_items(ecommerce_cash_flow_data)], ignore_index=False)
cashflow ###TypeError: unhashable type: 'dict'
your_df_from_dict=pd.DataFrame.from_dict(ecommerce_cash_flow_data,orient='index')
print(your_df_from_dict) ###helps arrange by tickers, but would like to pull upfront as well the values within each ticker, by cashflow statement objects (capitalExpenditures, changeinCash, etc) and dates.
{'cashflowStatementHistory': {'AMZN': [{'2018-12-31': {'capitalExpenditures': -13427000000,
'changeInCash': 10317000000,
'changeToAccountReceivables': -4615000000,
'changeToInventory': -1314000000,
'changeToLiabilities': 4414000000,
'changeToNetincome': 6352000000,
'changeToOperatingActivities': 472000000,
'depreciation': 15341000000,
'effectOfExchangeRate': -351000000,
'investments': 1140000000,
'netBorrowings': -7686000000,
'netIncome': 10073000000,
'otherCashflowsFromInvestingActivities': 2104000000,
'totalCashFromFinancingActivities': -7686000000,
'totalCashFromOperatingActivities': 30723000000,
'totalCashflowsFromInvestingActivities': -12369000000}},
{'2017-12-31': {'capitalExpenditures': -11955000000,
'changeInCash': 1922000000,
'changeToAccountReceivables': -4780000000,
'changeToInventory': -3583000000,
'changeToLiabilities': 7838000000,
'changeToNetincome': 4096000000,
'changeToOperatingActivities': 283000000,
'depreciation': 11478000000,
'effectOfExchangeRate': 713000000,
'investments': -3054000000,
'netBorrowings': 9928000000,
'netIncome': 3033000000,
'otherCashflowsFromInvestingActivities': 1897000000,
'totalCashFromFinancingActivities': 9928000000,
'totalCashFromOperatingActivities': 18365000000,
'totalCashflowsFromInvestingActivities': -27084000000}},
{'2016-12-31': {'capitalExpenditures': -7804000000,
'changeInCash': 3759000000,
'changeToAccountReceivables': -3436000000,
'changeToInventory': -1426000000,
'changeToLiabilities': 6985000000,
'changeToNetincome': 2869000000,
'changeToOperatingActivities': 1724000000,
'depreciation': 8116000000,
'effectOfExchangeRate': -212000000,
'investments': -2663000000,
'netBorrowings': -3716000000,
'netIncome': 2371000000,
'otherCashflowsFromInvestingActivities': 1067000000,
'totalCashFromFinancingActivities': -3716000000,
'totalCashFromOperatingActivities': 17203000000,
'totalCashflowsFromInvestingActivities': -9516000000}},
{'2015-12-31': {'capitalExpenditures': -5387000000,
'changeInCash': 1333000000,
'changeToAccountReceivables': -1755000000,
'changeToInventory': -2187000000,
'changeToLiabilities': 5586000000,
'changeToNetincome': 2605000000,
'changeToOperatingActivities': 913000000,
'depreciation': 5646000000,
'effectOfExchangeRate': -374000000,
'investments': -1066000000,
'netBorrowings': -3882000000,
'netIncome': 596000000,
'otherCashflowsFromInvestingActivities': 798000000,
'totalCashFromFinancingActivities': -3882000000,
'totalCashFromOperatingActivities': 12039000000,
'totalCashflowsFromInvestingActivities': -6450000000}}],
'BABA': [{'2019-03-31': {'capitalExpenditures': -35482000000,
'changeInCash': -4232000000,
'changeToLiabilities': 8639000000,
'changeToNetincome': -6241000000,
'changeToOperatingActivities': 20551000000,
'depreciation': 36936000000,
'effectOfExchangeRate': 3245000000,
'investments': -65965000000,
'issuanceOfStock': 354000000,
'netBorrowings': -4231000000,
'netIncome': 87886000000,
'otherCashflowsFromFinancingActivities': 7357000000,
'otherCashflowsFromInvestingActivities': -8000000,
'repurchaseOfStock': -10872000000,
'totalCashFromFinancingActivities': -7392000000,
'totalCashFromOperatingActivities': 150975000000,
'totalCashflowsFromInvestingActivities': -151060000000}},
{'2018-03-31': {'capitalExpenditures': -19628000000,
'changeInCash': 56335000000,
'changeToLiabilities': 5690000000,
'changeToNetincome': 16967000000,
'changeToOperatingActivities': 10425000000,
'depreciation': 21885000000,
'effectOfExchangeRate': -6065000000,
'investments': -52936000000,
'issuanceOfStock': 399000000,
'netBorrowings': 33625000000,
'netIncome': 64093000000,
'otherCashflowsFromFinancingActivities': -13665000000,
'otherCashflowsFromInvestingActivities': -450000000,
'repurchaseOfStock': -10872000000,
'totalCashFromFinancingActivities': 20359000000,
'totalCashFromOperatingActivities': 125805000000,
'totalCashflowsFromInvestingActivities': -83764000000}},
{'2017-03-31': {'capitalExpenditures': -11006000000,
'changeInCash': 38227000000,
'changeToLiabilities': 4611000000,
'changeToNetincome': 15100000000,
'changeToOperatingActivities': 478000000,
'depreciation': 14185000000,
'effectOfExchangeRate': 2038000000,
'investments': -28582000000,
'issuanceOfStock': 14694000000,
'netBorrowings': 29333000000,
'netIncome': 43675000000,
'otherCashflowsFromFinancingActivities': 2069000000,
'otherCashflowsFromInvestingActivities': -253000000,
'repurchaseOfStock': -13182000000,
'totalCashFromFinancingActivities': 32914000000,
'totalCashFromOperatingActivities': 82854000000,
'totalCashflowsFromInvestingActivities': -79579000000}},
{'2016-03-31': {'capitalExpenditures': -10845000000,
'changeInCash': -1375000000,
'changeToLiabilities': 2350000000,
'changeToNetincome': -28625000000,
'changeToOperatingActivities': 3366000000,
'depreciation': 6977000000,
'effectOfExchangeRate': 466000000,
'investments': -36162000000,
'issuanceOfStock': 693000000,
'netBorrowings': 2478000000,
'netIncome': 71460000000,
'otherCashflowsFromFinancingActivities': 778000000,
'otherCashflowsFromInvestingActivities': 781000000,
'repurchaseOfStock': -19795000000,
'totalCashFromFinancingActivities': -15846000000,
'totalCashFromOperatingActivities': 56836000000,
'totalCashflowsFromInvestingActivities': -42831000000}}]}}
答案 0 :(得分:1)
ecommerce = ['CTRP', 'EBAY', 'GRUB', 'BABA', 'JD', 'EXPE', 'AMZN', 'BKNG', 'MPNGF']
yahoo_financials_ecommerce = YahooFinancials(ecommerce)
ecommerce_cash_flow_data = yahoo_financials_ecommerce.get_financial_stmts('annual', 'cash')
dict
中的DataFrames
:DataFrame
并将它们全部存储在dict
cashflowStatementHistory
是唯一的一级密钥,因此将数据设置为等于其值。pandas
拆包成一个单独的DataFrame
(例如df_dict['AMZN']
)比较容易。
value
的{{1}}是key
中的list
。dicts
每年都会在此级别打开包装(例如list comprehension
)range(len(data[tkr]))
将每个股票的年度数据合并到一个pd.concat
中。DataFrame
data = ecommerce_cash_flow_data['cashflowStatementHistory']
df_dict = dict()
for tkr in ecommerce:
df_dict[tkr] = pd.concat([pd.DataFrame(data[tkr][x]) for x in range(len(data[tkr]))],
sort=False, join='outer', axis=1)
与df_dict
组合在一起:pd.concat
将pd.concat
中的所有DataFrames
合并为一个df_dict
。DataFrame
df = pd.concat(df_dict, sort=True)
print(df.head())
df_l = pd.DataFrame(df.stack())
df_l.reset_index(inplace=True)
df_l.columns = ['ticker', 'financials', 'date', 'value']
print(df_l.head())