【问题标题】:YahooFinancials: Writing multidimensional dictionary to csvYahooFinancials:将多维字典写入 csv
【发布时间】:2018-08-01 14:27:22
【问题描述】:

有一个很好的包来加载财务数据,但是它将它存储在一个多维字典中,我无法弄清楚如何将数据正确地存储在 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 中按列/存储进行拆分。

【问题讨论】:

    标签: python-3.x csv dictionary multidimensional-array yahoo-api


    【解决方案1】:

    在转换为 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 的作者,感谢您使用该模块!

    【讨论】:

    • 谢谢!我使用“flat_dict”将其保存到 xlsx 中。虽然,我的代码看起来有点乱:import pandas as pd flatData = pd.DataFrame.from_dict(flat_dict, orient='index') flatData.reset_index(level=0, inplace=True) flatData.columns = ['Name','nr'] temp0 = flatData['Name'].str.split(',', expand=True) result = pd.concat([temp0,flatData['nr']], axis=1) writer = pd.ExcelWriter('Yahooprices.xlsx',engine='xlsxwriter') result.to_excel(writer, sheet_name='BalanceQt')
    猜你喜欢
    • 2021-12-30
    • 2017-07-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2014-08-20
    • 2012-11-04
    相关资源
    最近更新 更多