我遇到了一个用Python编写我的第一个代码的问题。我有一个从while循环生成值的代码。我的目标是建立包含诸如({['Date','Rev Growth','EPS LTM','DPS LTM','EPS Growth LTM','EPS Growth - NTM','EV/EBITDA - LTM','PE LTM','PE NTM','PEG','FCF Yield NTM','Div Yield']
)之类的列标题的DataFrame,然后添加由循环生成的值。我正在使用print()
函数获取值,这意味着循环工作正常,但是我与数据框部件堆叠在一起。
while count < today_new:
count = count + relativedelta(months=+i)
gra1 = ek.get_data(instruments=mylist2,fields=field1, parameters=param)[0].iloc[0][1]
gra2 = ek.get_data(instruments=mylist2,fields=field2, parameters=param)[0].iloc[0][1]
gra3 = ek.get_data(instruments=mylist2,fields=field3, parameters=param)[0].iloc[0][1]
if np.isnan(gra3):
gra3 = "0"
else:
gra3
gra4 = ek.get_data(instruments=mylist2,fields=field4, parameters=param1)[0].iloc[0][1]
gra5 = ek.get_data(instruments=mylist2,fields=field5, parameters=param)[0].iloc[0][1]
gra6 = ek.get_data(instruments=mylist2,fields=field6, parameters=param1)[0].iloc[0][1] / ek.get_data(instruments=mylist2,fields=field6_1, parameters=param)[0].iloc[0][1]
if np.isnan(gra6):
gra6 = "0"
else:
gra6
gra7 = ek.get_data(instruments=mylist2,fields=field7, parameters=param)[0].iloc[0][1]
if np.isnan(gra7):
gra7 = "0"
else:
gra7
gra8 = ek.get_data(instruments=mylist2,fields=field8, parameters=param2)[0].iloc[0][1]
if np.isnan(gra8):
gra8 = "0"
else:
gra8
gra9 = ek.get_data(instruments=mylist2,fields=field9, parameters=param2)[0].iloc[0][1]
if np.isnan(gra9):
gra9 = "0"
else:
gra9
gra10 = ek.get_data(instruments=mylist2,fields=field10, parameters=param2)[0].iloc[0][1]
if np.isnan(gra10):
gra10 = "0"
else:
gra10
gra11 = ek.get_data(instruments=mylist2,fields=field11, parameters=param1)[0].iloc[0][1]
if np.isnan(gra11):
gra11 = "0"
else:
gra11
答案 0 :(得分:0)
如果我理解正确,我将在字典中收集所有标头及其值,并构建数据框。在这里,我将向您展示一个数据帧,其中的单行包含一些标头和随机值。我会假设:
import pandas as pd
Count = 5
gar1 = 6
gar2 = 7
dictionary_to_store = {}
dictionary_to_store['Date'] = Count
dictionary_to_store['Rev Growth'] = gar1
dictionary_to_store ['EPS LTM'] = gar2
df = pd.DataFrame.from_dict(dictionary_to_store, orient = 'index').T
将在一行中为您提供数据框,如下所示
Date Rev Growth EPS LTM
0 5 6 7
但是当您要在数据框中添加索引时,可以使用以下方法
import collections
from collections import defaultdict
d = defaultdict(dict)
d['a']['b'] = 1
d['c']['e'] = 4
d['f']['g'] = 7
df = pd.DataFrame.from_dict(d, orient='index')
它给出:
b e g
a 1.0 NaN NaN
c NaN 4.0 NaN
f NaN NaN 7.0
或者您始终可以进行转置来翻转数据框
pd.DataFrame.from_dict(d, orient='index').T
会给予
a c f
b 1.0 NaN NaN
e NaN 4.0 NaN
g NaN NaN 7.0
我认为在您的情况下,您需要使用第二种方法并在while循环之前初始化字典并保持其更新。您的键将是标题,值是Count,gar1 ...总是很好地显示所需的输出以及您的问题中的示例输入数据。请告诉我是否有帮助。
#您能否运行以下
dictionary_to_store = {}
while count < today_new:
count = count + relativedelta(months=+i)
dictionary_to_store['Date'] = count
gra1 = ek.get_data(instruments=mylist2,fields=field1, parameters=param)[0].iloc[0][1]
dictionary_to_store['Rev growth'] = gar1
gra2 = ek.get_data(instruments=mylist2,fields=field2, parameters=param)[0].iloc[0][1]
dictionary_to_store['column3'] = gar2
gra3 = ek.get_data(instruments=mylist2,fields=field3, parameters=param)[0].iloc[0][1]
if np.isnan(gra3):
gra3 = "0"
else:
gra3
dictionary_to_store['column4'] = gar3
gra4 = ek.get_data(instruments=mylist2,fields=field4, parameters=param1)[0].iloc[0][1]
dictionary_to_store['column5'] = gar4
gra5 = ek.get_data(instruments=mylist2,fields=field5, parameters=param)[0].iloc[0][1]
dictionary_to_store['column6'] = gar5
,依此类推。然后使用
构建数据框df = pd.DataFrame.from_dict(dictionary_to_store, orient = 'index').T
您可能只会得到最后一行,因为每次运行循环时,字典都会使用每个键中的最后一个值进行更新。要摆脱这种情况,您可能需要使用您拥有的可迭代对象。这可以通过使用我上面提到的第二种方法来完成。例如,对于“日期”列,您可以执行以下操作
dictionary_to_store = defaultdict(dict)
dictionary_to_store['your iterable']['Date'] = count
使用所提供的代码,我不确定您可以迭代使用什么。您已经使用了一些额外的函数调用relativedelta,在其中更新了“ i”,不确定是什么。