2017-09-03 77 views
0

我有一個數據框與股票價格。以下,但本例中正好爲4500行股價獲取iteritems中的所有列循環熊貓

>> 
DATE  MMM  US Equity AIR  US Equity 
1/3/2000 47.19    17.56 
1/4/2000 45.31    17.63 
1/5/2000 46.63    17.81 
1/6/2000 50.38    17.94 

我創建了移動使用平均iteritems與後續

>>>for stockname, stock in df.iteritems():  
# Create 10,30,50,100 and 200D MAvgs        
MA10D = stock.rolling(10).mean() 
MA30D = stock.rolling(30).mean() 
MA50D = stock.rolling(50).mean() 
MA100D = stock.rolling(100).mean() 
MA200D = stock.rolling(200).mean() 
df_stockname = pd.concat([df[[1]],MA10D,MA30D,MA50D,MA100D,MA200D],axis=1) 

問題是,這隻能說明在循環的最後一個項目( AIR US Equity股票)。我如何獲得MA10D,MA30D等等的迴路中的第一隻股票(即MMM美國股票是df中的第一隻股票)。我該如何做到這一點

我最終希望能夠創建兩個數據幀,每個股票與股票價格,MA10D,MA30D,MA50D,MA100D和MA200D一個。所以我最終需要一種方法來命名每個數據幀並更改concat中的df [[#]]。

+0

爲什麼你需要iteritems這個?您可以直接應用滾動平均值。 –

+0

我剛剛使用了另一個在stackoverflow上提供的答案。如果你有更好的方法,那麼很高興應用它。最初這個人建議這將是一個好方法,因爲最終我的數據幀將會非常大(10,000列),響應者說這種方式使用更少的內存。我試圖找到如何獲得單個項目,這樣我可以將每個單獨的股票的所有信息組合在一起,因此需要到iteritems循環內的個人股票列 –

回答

0

這是你正在嘗試做什麼?

results = {} 

# Create 10,30,50,100 and 200D MAvgs        
for stockname, stock in df.iteritems(): 
    df_copy = pd.DataFrame(stock) 
    df_copy[stockname + '_MA10D'] = stock.rolling(10).mean() 
    df_copy[stockname + '_MA30D'] = stock.rolling(30).mean() 
    df_copy[stockname + '_MA50D'] = stock.rolling(50).mean() 
    df_copy[stockname + '_MA100D'] = stock.rolling(100).mean() 
    df_copy[stockname + '_MA200D'] = stock.rolling(200).mean() 
    results[stockname] = df_copy 

下面是應該執行和完整版的結果:

data = { 
    'MMM': (47.19, 45.31, 46.63, 50.38), 
    'AIR': (17.56, 17.63, 17.81, 17.94) 
} 
index = pd.Index(pd.date_range("01/03/2000", "01/06/2000"), name='DATE') 
df = pd.DataFrame(data=data, index=index) 

results = {} 

# Create 10,30,50,100 and 200D MAvgs        
for stockname, stock in df.iteritems(): 
    df_copy = pd.DataFrame(stock) 
    df_copy[stockname + '_MA10D'] = stock.rolling(10).mean() 
    df_copy[stockname + '_MA30D'] = stock.rolling(30).mean() 
    df_copy[stockname + '_MA50D'] = stock.rolling(50).mean() 
    df_copy[stockname + '_MA100D'] = stock.rolling(100).mean() 
    df_copy[stockname + '_MA200D'] = stock.rolling(200).mean() 
    results[stockname] = df_copy 

print(results['MMM']) 
print(results['AIR']) 

輸出:

   MMM MMM_MA10D MMM_MA30D MMM_MA50D MMM_MA100D MMM_MA200D 
DATE                  
2000-01-03 47.19  NaN  NaN  NaN   NaN   NaN 
2000-01-04 45.31  NaN  NaN  NaN   NaN   NaN 
2000-01-05 46.63  NaN  NaN  NaN   NaN   NaN 
2000-01-06 50.38  NaN  NaN  NaN   NaN   NaN 
       AIR AIR_MA10D AIR_MA30D AIR_MA50D AIR_MA100D AIR_MA200D 
DATE                  
2000-01-03 17.56  NaN  NaN  NaN   NaN   NaN 
2000-01-04 17.63  NaN  NaN  NaN   NaN   NaN 
2000-01-05 17.81  NaN  NaN  NaN   NaN   NaN 
2000-01-06 17.94  NaN  NaN  NaN   NaN   NaN 
+0

這似乎使我的電腦(spyder3編輯器)崩潰,每當我點擊結果字典。如何才能獲得字典中唯一的第一個數據幀 –

+0

結果是一個Python字典。它應該包含兩個DataFrame。獲取第一個,如下所示:'results ['MMM']' – Bill