2015-07-22 133 views
2

我目前有以下代碼,它遍歷數據幀的每一行,並將某個單元格的先前行值賦予不同單元格的當前行。在熊貓數據幀上的矢量化操作

基本上,我們要做的是找出今天比較某個指標的「昨天」價值。正如你所期望的那樣,這很慢(特別是因爲我正在處理數十萬行數據幀)。

for index, row in symbol_df.iterrows(): 
    if index != 0: 
     symbol_df.loc[index, 'yesterday_sma_20'] = symbol_df.loc[index-1]['sma_20'] 
     symbol_df.loc[index, 'yesterday_roc_20'] = symbol_df.loc[index-1]['roc_20'] 
     symbol_df.loc[index, 'yesterday_roc_100'] = symbol_df.loc[index-1]['roc_100'] 
     symbol_df.loc[index, 'yesterday_atr_10'] = symbol_df.loc[index-1]['atr_10'] 
     symbol_df.loc[index, 'yesterday_vsma_20'] = symbol_df.loc[index-1]['vsma_20'] 

有沒有辦法將它變成矢量化操作?或者真的只是加速它的任何方式,而不是單獨遍歷每一行?

回答

4

我可能會忽略一些東西,但我認爲使用.shift()應該這樣做。

import pandas as pd 

df = pd.read_csv('test.csv') 
print df 

#   Date SMA_20 ROC_20 
# 0 7/22/2015 0.754889 0.807870 
# 1 7/23/2015 0.376448 0.791365 
# 2 7/22/2015 0.527232 0.407420 
# 3 7/24/2015 0.616281 0.027188 
# 4 7/22/2015 0.126556 0.274681 
# 5 7/25/2015 0.570008 0.864057 
# 6 7/22/2015 0.632057 0.746988 
# 7 7/26/2015 0.373405 0.883944 
# 8 7/22/2015 0.775591 0.453368 
# 9 7/27/2015 0.678638 0.313374 

df['y_SMA_20'] = df['SMA_20'].shift() 
df['y_ROC_20'] = df['ROC_20'].shift() 
print df 

#   Date SMA_20 ROC_20 y_SMA_20 y_ROC_20 
# 0 7/22/2015 0.754889 0.807870  NaN  NaN 
# 1 7/23/2015 0.376448 0.791365 0.754889 0.807870 
# 2 7/22/2015 0.527232 0.407420 0.376448 0.791365 
# 3 7/24/2015 0.616281 0.027188 0.527232 0.407420 
# 4 7/22/2015 0.126556 0.274681 0.616281 0.027188 
# 5 7/25/2015 0.570008 0.864057 0.126556 0.274681 
# 6 7/22/2015 0.632057 0.746988 0.570008 0.864057 
# 7 7/26/2015 0.373405 0.883944 0.632057 0.746988 
# 8 7/22/2015 0.775591 0.453368 0.373405 0.883944 
# 9 7/27/2015 0.678638 0.313374 0.775591 0.453368 
+0

非常感謝。我沒有意識到轉變。 – darkpool

+0

每個人都從某個地方開始。如果它幫助你,請接受答案。祝你好運! (我看到你在那裏做一些交易!) – Manhattan

+0

對不起,它不允許我早些接受答案。我認爲這是最短的時間。但是,我全職交易。再次感謝您的幫助。 – darkpool