YahooFinancials:将多维字典写入 csv
YahooFinancials: Writing multidimensional dictionary to csv
有一个加载财务数据的好包,但它将它存储在一个多维字典中,我不知道如何将数据正确地逐列存储在 csv 文件中。
from yahoofinancials import YahooFinancials
ticker = 'AAPL'
yahoo_financials = YahooFinancials(ticker)
balance_sheet_data_qt = yahoo_financials.get_financial_stmts('quarterly', 'balance')
import csv
with open("Yahooprices.csv", "w") as csv_file:
csv_app = csv.writer(csv_file, delimiter="\t")
for row in balance_sheet_data_qt["balanceSheetHistoryQuarterly"]["AAPL"][0].items():
csv_app.writerow(row)
我知道我想做的很简单,但是,我无法将它写入看起来像这样的 csv 文件:
我究竟做错了什么?
字典只有一个 .keys()
,大小为 1.. 然而,有很多 .items()
,我想在 csv 中按 columns/store 拆分。
在转换为 csv 之前,您是否尝试过 运行 通过 JSON 扁平化函数 JSON 对象?将具有非平面数据的 JSON 对象存储到 csv 中很棘手,因为 csv 是二维的,而 JSON 可以是多维的。首先尝试 运行 您尝试通过这样的函数保存为 csv 的对象:
# Function to Flatten return JSON data
def flatten_json(b, delim):
val = {}
for i in b.keys():
if isinstance(b[i], dict):
get = flatten_json(b[i], delim)
for j in get.keys():
val[i.replace(':', '_') + delim + j.replace(':', '_')] = get[j]
elif isinstance(b[i], list):
c = 1
for it in b[i]:
if isinstance(it, dict):
get = flatten_json(it, delim)
for j in get.keys():
val[i.replace(':', '_') + delim + j.replace(':', '_') + delim + str(c)] = get[j]
else:
val[i.replace(':', '_') + delim + str(c)] = it
c += 1
else:
val[i.replace(':', '_')] = b[i]
return val
其中 b 是您尝试展平的 python 字典,而 delim 是您要附加到新字段名称的列分隔符字符串,这些名称将需要作为展平的结果创建。
例如,
init_dict = {data1: string, data2: [string1, string2], data3: [{obj: val}, {obj: val2}], data4: {obj2: value}}
完成函数后:
flat_dict = flatten_json(init_dict, '__')
print(flat_dict.items())
现在将输出字典,如下所示,它是二维的和 csv 友好的:
{data1: string, data2__1: string1, data2__2: string2, data3__obj__2: val, data3__obj__2: val2, data4__obj2: value}
希望对您有所帮助!
顺便说一句,我也是 YahooFinancials 的作者,感谢您使用该模块!
有一个加载财务数据的好包,但它将它存储在一个多维字典中,我不知道如何将数据正确地逐列存储在 csv 文件中。
from yahoofinancials import YahooFinancials
ticker = 'AAPL'
yahoo_financials = YahooFinancials(ticker)
balance_sheet_data_qt = yahoo_financials.get_financial_stmts('quarterly', 'balance')
import csv
with open("Yahooprices.csv", "w") as csv_file:
csv_app = csv.writer(csv_file, delimiter="\t")
for row in balance_sheet_data_qt["balanceSheetHistoryQuarterly"]["AAPL"][0].items():
csv_app.writerow(row)
我知道我想做的很简单,但是,我无法将它写入看起来像这样的 csv 文件:
.keys()
,大小为 1.. 然而,有很多 .items()
,我想在 csv 中按 columns/store 拆分。
在转换为 csv 之前,您是否尝试过 运行 通过 JSON 扁平化函数 JSON 对象?将具有非平面数据的 JSON 对象存储到 csv 中很棘手,因为 csv 是二维的,而 JSON 可以是多维的。首先尝试 运行 您尝试通过这样的函数保存为 csv 的对象:
# Function to Flatten return JSON data
def flatten_json(b, delim):
val = {}
for i in b.keys():
if isinstance(b[i], dict):
get = flatten_json(b[i], delim)
for j in get.keys():
val[i.replace(':', '_') + delim + j.replace(':', '_')] = get[j]
elif isinstance(b[i], list):
c = 1
for it in b[i]:
if isinstance(it, dict):
get = flatten_json(it, delim)
for j in get.keys():
val[i.replace(':', '_') + delim + j.replace(':', '_') + delim + str(c)] = get[j]
else:
val[i.replace(':', '_') + delim + str(c)] = it
c += 1
else:
val[i.replace(':', '_')] = b[i]
return val
其中 b 是您尝试展平的 python 字典,而 delim 是您要附加到新字段名称的列分隔符字符串,这些名称将需要作为展平的结果创建。
例如,
init_dict = {data1: string, data2: [string1, string2], data3: [{obj: val}, {obj: val2}], data4: {obj2: value}}
完成函数后:
flat_dict = flatten_json(init_dict, '__')
print(flat_dict.items())
现在将输出字典,如下所示,它是二维的和 csv 友好的:
{data1: string, data2__1: string1, data2__2: string2, data3__obj__2: val, data3__obj__2: val2, data4__obj2: value}
希望对您有所帮助!
顺便说一句,我也是 YahooFinancials 的作者,感谢您使用该模块!