2017-03-03 426 views
0

我正在使用以下代码来创建一个DataFrame,其中包含两个符号的结尾价格,分别以列标题作为它们的符号名称。使用for循环来构建DataFrame

symbols=['KEL','PAEL'] 
start_date = '2016-05-01' 
end_date = '2017-03-02' 
allocation = 50000 


def data(symbol): 
    dates=pd.date_range(start_date,end_date) 
    df=pd.DataFrame(index=dates) 
    df_temp=pd.read_csv('/home/furqan/Desktop/python_data/{}.csv'.format(str(symbol)),usecols=['Date','Close'], 
          parse_dates=True,index_col='Date',na_values=['nan']) 
    df_temp = df_temp.rename(columns={'Close': symbol}) 
    df=df.join(df_temp) 
    df=df.fillna(method='ffill') 
    df=df.fillna(method='bfill') 
    return df 

for symbol in symbols: 
    df=data(symbol) 
    pass 
print(df) 

当我运行上面的代码时,它会用新符号覆盖列而不是在DataFrame中创建其他列。

如果我想要它为DataFrame中的每个新符号创建新列,那么如何在不使用函数内的任何for循环的情况下实现该功能。

预计outoput:

   KEL PAEL 
2016-05-01 7.07 61.74 
2016-05-02 7.07 61.74 
2016-05-03 7.21 62.19 
2016-05-04 7.21 62.72 
2016-05-05 7.20 64.24 
2016-05-06 7.17 63.88 
2016-05-07 7.17 63.88 
2016-05-08 7.17 63.88 
2016-05-09 7.25 64.12 
2016-05-10 7.28 65.59 
2016-05-11 7.43 65.78 

输出我:

   PAEL 
2016-05-01 61.74 
2016-05-02 61.74 
2016-05-03 62.19 
2016-05-04 62.72 
2016-05-05 64.24 
2016-05-06 63.88 
2016-05-07 63.88 
2016-05-08 63.88 
2016-05-09 64.12 
2016-05-10 65.59 
2016-05-11 65.78 
+0

在你的循环,你正在做DF =数据(符号)覆盖你DF。你应该尝试像df [symbol] = data(symbol)那样添加一个新列 – Vaishali

+0

@A-Za-z它会导致一个错误:NameError:name'df'没有被定义 –

+0

@FurqanHashim,但是你仍然需要创建dataframe对象在使用之前,这就是python错误告诉你的。 – Boud

回答

0

你的问题非常类似这样的:https://stackoverflow.com/a/42591863/3027854

你正在为这个错误由​​@A指出-Za-z是df=data(symbol)您正在覆盖您的数据框,因此您丢失了KEL的数据,只剩下PAEL

基本上你需要保留data(symbol)方法返回的数据帧。并迟到合并它们。

实施例:

symbols=['one', 'two'] 
start_date = '2016-05-01' 
end_date = '2017-03-02' 
allocation = 50000 


def data(symbol): 
    dates=pd.date_range(start_date, end_date) 
    df=pd.DataFrame(index=dates) 
    df_temp=pd.read_csv('{}.csv'.format(str(symbol)),usecols=['Date','Close'], 
          parse_dates=True,index_col='Date',na_values=['nan']) 
    df_temp = df_temp.rename(columns={'Close': symbol}) 
    df = df.join(df_temp) 
    df = df.fillna(method='ffill') 
    df = df.fillna(method='bfill') 
    return df 

all_dataframes = [] 
for symbol in symbols: 
    all_dataframes.append(data(symbol)) 

df = pd.concat(all_dataframes, axis=1) 

输出:

  one two 
2016-05-01 b f 
2016-05-02 d f 
2016-05-03 d h 
2016-05-04 d h 

one.csv:

Date,Close 
2016-05-01,b 
2016-05-02,d 

two.csv:

Date,Close 
2016-05-01,f 
2016-05-03,h 

这4条线应该做的伎俩为您提供:

all_dataframes = [] 
    for symbol in symbols: 
     all_dataframes.append(data(symbol)) 

    df = pd.concat(all_dataframes, axis=1) 
+0

完美。谢谢@Vikash Singh –