2017-06-29 56 views
1

我在PythonProgramming.net上關注財務教程,並且在嘗試將幾個數據框合併到一個大型數據框時遇到了問題。我創建了一個函數來做到這一點:Pandas .join無法將S&P500股票數據結合起來

def compile_data(): 
    with open ("sp500tickers.pickle", "rb") as f: 
     tickers = pickle.load(f) 

    main_df = pd.DataFrame() 

    for count,ticker in enumerate(tickers): 
     try: 
      df = pd.read_csv('stock_dfs/{}.csv'.format(ticker)) 
      df.set_index('Date', inplace=True) 
      df.rename(columns={'Close':ticker}, inplace=True) 
      df.drop(['Open','High','Low','Volume'], 1, inplace=True) 
      if main_df.empty: 
       main_df = df 
      else: 
       main_df.join(df, how='outer') 
       print(main_df.head()) 
      if count % 10 == 0: 
       print(count) 
     except Exception: 
      pass 

    print(main_df.head()) 
    main_df.to_csv('sp500joinedcloses.csv') 

(該我用的try /除了在上面的代碼原因是因爲我把所有的行情對於S & P500的名單,但沒能從Google Finance API抓取所有人的數據......如此一來,如果它試圖找到我沒有的csv,它仍會將我所擁有的數據合併在一起,而不會產生錯誤。)

當我運行這個函數時,它會創建一個名爲sp500joinedcloses.csv的CSV,但它只包含一個代碼的數據,即ABBV。我知道它正在迭代代碼,因爲如果我在for循環中添加一個print(ticker),所有正確的代碼都會被打印出來。

還值得注意的是,ABBV不是我應該包含在數據框中的第一個csv。他們首先應該有一個文件是AAPL,然後是ABBV。不知道爲什麼它似乎跳過AAPL。

我將不勝感激任何幫助。我是熊貓的初學者,真的很想學習一切。

回答

2

IIUC:

你不想使用join,你不能無論如何,如果你開始與一個空的數據幀。使用pd.concat代替:

main_df = pd.concat([main_df, df], axis=1) 

不過,我會推薦它來取代你的整個過程:

def read_file(ticker): 
    df = pd.read_csv('stock_dfs/{}.csv'.format(ticker)).set_index('Date') 
    return df.Close.rename(ticker) 

with open ("sp500tickers.pickle", "rb") as f: 
    tickers = pickle.load(f) 

main_df = pd.concat([read_file(t) for t in tickers], axis=1) 
+0

感謝您的見解。如果main_df.empty:main_df = df,那麼在這種情況下會加入不起作用,因爲我有這行: –

+0

@BenSprenger'main_df = main_df.join(df,how ='outer')'可能會工作...試試吧 – piRSquared

+0

@BenSprenger我仍然會推薦我的流程。 – piRSquared