2017-09-03 83 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