2016-03-24 6 views
1

Um eine generische Notation in meinem Code zu haben, möchte ich meine ursprüngliche Zeitreihe als gleitenden Durchschnitt über 1 Periode ausdrücken. Ganz unerwartet Pandas pd.rolling_mean-Funktion, die beiden sind nicht genau das gleiche:Möglicher Fehler in Pandas Rolling Mean wenn window = 1

import pandas as pd 
import numpy as np 

np.random.seed(1) 

ts = pd.Series(np.random.rand(1000)) 

mavg = pd.rolling_mean(ts, 1) 

(ts - mavg).describe() 
Out[120]: 
count 1.000000e+03 
mean  6.284973e-16 
std  3.877250e-16 
min  -3.330669e-16 
25%  3.330669e-16 
50%  5.551115e-16 
75%  8.881784e-16 
max  1.554312e-15 
dtype: float64 

any((ts - mavg).dropna()>0) 
Out[121]: True 

dabei um einen Fehler in Betracht gezogen werden sollte, oder bin ich etwas fehlt?

Antwort

3

Die Zahlen sind sehr klein und gut im Bereich des numerischen "Rauschens", das durch die Funktionsweise von Floats verursacht wird. Floats können nicht alle Zahlen genau darstellen. Daher haben Sie oft kleine "Residuen" übrig, wenn Sie mit Floats rechnen. Überprüfen Sie gegen ein kleines Epsilon:

>>> any((ts - mavg).dropna().abs() > 1e-14) 
False 
0

Der Unterschied kommt von den Gleitkommaberechnungen. Floats sind nicht genau gleich, wenn Sie Berechnungen durchführen, da sie intern dargestellt werden. Innerhalb dieser "Rundungsfehler" sind Ihre Nummern identisch.