2017-04-25 41 views
1

下面的代碼不工作的原因是讓我瘋了,我希望有人可以幫助我。熊貓數組長度不符合索引長度,工程每週但不是每月?

我有一些函數.resample()兩個數據的時間索引設置爲合併,創建一個傳遞到下面的代碼honey_adj_signals數據幀。 當我.resample()數據集的指標與'W'此代碼工作正常,但是當我嘗試'M'我得到一個錯誤「數組長度14指數長度15不匹配」根據碼輸出。

我不明白爲什麼會這樣,也沒有如何正確,我卡住了。

我上傳每週數據框的位置:

https://drive.google.com/open?id=0B4xdnV0LFZI1TmRnZllVSW52aWs

,月數據框的位置:

https://drive.google.com/open?id=0B4xdnV0LFZI1WnBSWVBpMzR2MGM

honey_adj_long_profits = pd.DataFrame({ 
     "Price": honey_adj_signals.loc[(honey_adj_signals["Signal"] == "Buy") & 
            honey_adj_signals["Regime"] == 1, "Price"], 
     "Profit": pd.Series(honey_adj_signals["Price"] - honey_adj_signals["Price"].shift(1)).loc[ 
      honey_adj_signals.loc[(honey_adj_signals["Signal"].shift(1) == "Buy") & (honey_adj_signals["Regime"].shift(1) == 1)].index 
     ].tolist(), 
     "End Date": honey_adj_signals["Price"].loc[ 
      honey_adj_signals.loc[(honey_adj_signals["Signal"].shift(1) == "Buy") & (honey_adj_signals["Regime"].shift(1) == 1)].index 
     ].index 
    }) 
print(honey_adj_long_profits) 

最終的輸出應該是這樣的(這是每週輸出的樣子)

   End Date  Price  Profit 
2008-03-09 2008-04-13 78.154000 -0.326000 
2008-04-20 2008-05-25 73.822002 -4.990003 
2008-06-15 2008-06-29 75.564000 -11.630000 
2008-07-20 2008-08-03 57.648001 13.965999 
2008-08-31 2008-10-12 57.467999 -23.675999 
2008-12-21 2009-01-04 33.970000 -0.047499 
2009-01-18 2009-02-08 34.144000 -0.934001 

回答

2

你要踢自己,當我告訴你什麼是錯的。

在您的每週數據的最後一個記錄是「賣出」信號,你正在處理此信息的方式是對的。你到達「買入」信號,然後你將其中一個轉移到'賣出'記錄。

在您的月度數據,你的最後一個記錄是「買入」信號,因此,當您試圖轉移到下一個「賣」的記錄出現指數長度誤差。爲了測試這一點,我刪除了每月數據中的最後一條記錄並運行了代碼。執行沒有錯誤。

我想。

+0

@Scott_Boston,自己踢了兩次。在此之前還添加了以下代碼,因此它是'even'並執行: 'if honey_adj_signals.iloc [-1,2] =='Buy': \t honey_adj_signals = honey_adj_signals.head(n =(len(honey_adj_signals) - 1)) else: \t honey_adj_signals = honey_adj_signals' – SDS

+0

非常漂亮! – MaxU