熊猫pct_change不切实际的值

时间:2018-07-19 13:26:56

标签: python pandas

我执行以下python代码:

data_extracted = data_extracted.interpolate(method='linear', 
axis=0).ffill().bfill()
data_extracted = data_extracted.replace([np.inf, -np.inf], np.nan).fillna(0)
data_pct_change = data_extracted.pct_change(axis=0).replace([np.inf, -np.inf], 
np.nan)
data_pct_change = data_pct_change.fillna(0)
print(data_pct_change)

这是输入(数据提取,示例):

ARTICLE_NUMBER    400115897090  500109158982  
DATE                                                                     
2016-01-18            NaN            NaN        
2016-02-01         5914.0         8776.0        
2016-02-15            NaN            NaN           
2016-02-29            NaN         4402.0          
2016-03-14         6214.0         6880.0         
2016-04-04         6766.0         7942.0          
2016-04-11         6454.0         7528.0         
2016-04-25         6070.0         7534.0          
2016-05-16         6778.0         7066.0         
2016-05-30         6856.0            NaN            
2016-06-20         7132.0         7138.0        
2016-06-27         7384.0         7426.0        
2016-07-18         8830.0         8614.0        
2016-08-01         9448.0         9166.0        
2016-08-15         8824.0         9676.0         
2016-08-22         8500.0         8974.0        
2016-09-12         6226.0         6868.0        
2016-10-03         6754.0         7426.0        
2016-11-07            NaN         8296.0        
2016-11-14         7858.0         8116.0         
2016-11-21         8212.0         9070.0         
2016-12-05            NaN            NaN           
2016-12-19         9428.0         8284.0  

然后执行上面的代码,我得到以下结果:

ARTICLE_NUMBER   400115897090  500109158982  
DATE                                                                     
2016-01-18       0.000000       0.000000        
2016-02-01       0.000000       0.000000         
2016-02-15       0.000000       0.000000      
2016-02-29       0.000000       0.000000     
2016-03-14       0.000000       0.000000     
2016-04-04       0.000000       0.000000      
2016-04-11       0.000000       0.000000       
2016-04-25       0.000000       0.000000      
2016-05-16       0.000000       0.000000      
2016-05-30       0.000000       0.000000       
2016-06-20       0.000000       0.000000       
2016-06-27       0.000000       0.000000       
2016-07-18       0.000000       0.000000      
2016-08-01       0.000000       0.000000       
2016-08-15       0.000000       0.000000      
2016-08-22      13.384615     252.600000      
2016-09-12      -0.221925       0.807571      
2016-10-03       0.407216       0.172339      
2016-11-07      -0.104396      -0.109044      
2016-11-14       0.053170       0.299499       
2016-11-21      -0.029773      -0.020572      
2016-12-05       0.111074      -0.798490      
2016-12-19       0.099970       4.998371     

为什么我会得到这样的错误结果?我知道浮点精度,但这真的很奇怪。 例如:2016-08-22:从9676增加到9742,增长了252%。这绝对是错误的,同时还有0.000000 谁能解释我为什么?这是Python 3,带有版本为2.02.0的pandas。 非常感谢

1 个答案:

答案 0 :(得分:1)

您可以利用shift中的pandas函数将其转换为矢量化操作。首先要做的是确保DATE是您的索引。如果您已经将DATE设置为索引,则可以跳过此设置。

data_extracted.set_index("DATE", inplace=True)

接下来,您可以制作一个新的DataFrame,将所有行向下移动一位。

shifted = data_extracted.shift(1)

现在您可以使用以下两个DataFrame进行简单的pct更改计算:

pct_change = (data_extracted - shifted) / shifted

如果任一DataFrame中的行存在NaN值,则结果将是NaN中的pct_change。您问题中“ 2016-08-22”示例的值是-0.07,在给定值9676和8974的情况下应该是预期值。