2017-11-16 8 views
1

Wenn ich versuche, den Rollmedian der folgenden Serien zu finden, erhalte ich eine Liste von NaNs.Median eines Rollfensters ohne Nullen

I verwendet:

b = a[a!=0].rolling(100).median() 

a = tatsächliche Datenreihen (Datenrahmen). Hat eine Reihe von Nullen darin, dass ich ausschließen möchten, wenn der Median

finden

b = Roll mittlere

a [a! = 0] mir die folgende Serie gibt.

2017-10-05 NaN 2017-10-06 -0.001074 2017-10-09 -0.001804 2017-10-10 NaN 2017-10-11 NaN 2017-10-12 -0.001687 2017-10-13 NaN 2017-10-16 NaN 2017-10-17 NaN 2017-10-18 NaN 2017-10-19 NaN 2017-10-20 NaN 2017-10-23 -0.003972 2017-10-24 NaN 2017-10-25 -0.004663 2017-10-26 NaN 2017-10-27 NaN 2017-10-30 -0.003192 2017-10-31 NaN 2017-11-01 NaN 2017-11-02 NaN 2017-11-03 NaN t2017-11-06 NaN 2017-11-07 -0.000189 2017-11-08 NaN 2017-11-09 -0.003762 2017-11-10 -0.000898 2017-11-13 NaN 2017-11-14 -0.002310

der Ausgang ist nur eine Liste von NaNs.

was mache ich falsch? danke!

+0

Also, was in 'a' ist mit zu beginnen? Welche Version von Pandas? –

+0

a ist eine Liste von Zahlen mit vielen Nullen dazwischen. Es ist ein Datenrahmen. – helloworldlevel

+0

ich verwende 0.20.3 – helloworldlevel

Antwort

2

Scheint wie ein Fehler in Pandas.

Try this:

a[a!=0].rolling(window=100, center=False, min_periods=1).median() 
+0

das ist sehr nah. gut genug für mich! aber die Ergebnisse sind etwas anders als das, was Excel mir gibt. – helloworldlevel

+0

Kein Fehler. [** @ Vaishali **] (https://stackoverflow.com/a/47322255/2336654) erklärt es in ihrem Beitrag. – piRSquared

+0

Ich weiß nicht, was Excel macht, und Sie haben uns nicht genügend Daten zur Verfügung gestellt. Versuchen Sie es mit "centre = True". – wim

3

Da ein Datenrahmen ist und nicht eine Serie, wenn Sie versuchen, die Indizierung zu tun, werden Sie NaNs bekommen.

diese Serie Betrachten

s = pd.Series(np.random.randint(0,10, 20), index = pd.date_range(start = '01/01/2017', periods = 20)) 

Wenn Sie es drehen, werden Nullen

s[s!=0] 

Aber für den Datenrahmen fallen gelassen, wird der gleiche Code, um die NaNs einzuführen.

df = pd.DataFrame(np.random.randint(0,10, 20), index = pd.date_range(start = '01/01/2017', periods = 20)) 

Sie können dies umgehen, indem Sie die Spaltennamen angeben, während

Indizierung
df[df[0] != 0] #df[0] being the column 
+0

@piRSquared "DataFrame.median" ignoriert jedoch standardmäßig "nan", und da das Rolling Window nur für den Median auf "super" verweist, sollte es standardmäßig auch "nan" ignorieren. Wenn Sie versuchen, das Kwarg 'skipna = True' explizit zu übergeben, stürzt es irgendwo im C-Code ab. Ich nenne das immer noch einen Bug oder zumindest eine böse Überraschung ... – wim

+0

@wim das ist eine böse Überraschung. Ich überprüfe jetzt. Nach OP 'np.nan' tauchte jedoch unerwartet auf. Und dieser Beitrag erklärt warum. Wäre OP mit einer booleschen Serie gefiltert worden, hätten sie 'np.nan' nicht bekommen und es hätte funktionieren müssen. Das heißt, ich überprüfe, was Sie vorgeschlagen haben, weil das schlecht klingt! – piRSquared

+1

@piRSquared, ich verpasste die ganze Aktion in dieser letzten Nacht und gratuliere für 100K! – Vaishali