2017-03-03 53 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 –