2017-03-03 7 views
0

次のコードを使用して、列見出しがシンボル名として2つのシンボルの終値を含む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 = data(symbol)を実行してdfを上書きしています。新しい列を追加するには、df [symbol] = data(symbol)のようなものを試してください。 – Vaishali

+0

@ A-Za-zエラー:NameError:name 'df'が定義されていません –

+0

@FurqanHashimしかし、データフレームオブジェクトを使用する前に、それはPythonのエラーがあなたに伝えているものです。 – Boud

答えて

0

あなたの問題はこの1つに非常に似ています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 –

関連する問題