2016-04-19 2 views
7

Ho una serie di panda in cui ogni cella è una tupla. Sto provando a fare un rolling(). Apply() su quella serie, e la funzione che sto cercando di applicare non viene mai chiamata. Ecco un esempio sciocco che mostra di cosa sto parlando:Perché il mio pandas rolling(). Apply() non funziona quando la serie contiene raccolte?

>>> import pandas as pd 
>>> pd.__version__ 
u'0.18.0' 
>>> die = lambda x: 0/0 

>>> s = pd.Series(zip(range(5), range(5))) 
>>> s 
0 (0, 0) 
1 (1, 1) 
2 (2, 2) 
3 (3, 3) 
4 (4, 4) 
dtype: object 

Un semplice apply opere come previsto, nel senso che viene chiamata la funzione:

>>> s.apply(die) 
[...] 
ZeroDivisionError: integer division or modulo by zero 

Ma ma un rolling().apply() non fa niente per niente, e in particolare la funzione che dovrebbe essere applicato non viene mai chiamato:

>>> s.rolling(2).apply(die) 
0 (0, 0) 
1 (1, 1) 
2 (2, 2) 
3 (3, 3) 
4 (4, 4) 
dtype: object 

Questo è l'esempio più semplice che dimostra di cosa sto parlando, ma la stessa cosa accade con gli elenchi &.

Perché ciò accade e come posso applicare un rolling con una funzione personalizzata su una serie di raccolte?

+2

Credo che rolling(). Apply() ed expanding(). Apply() non siano implementati per gli oggetti. Ho fatto una domanda simile qualche ora fa http://stackoverflow.com/q/36717416/2285236 – ayhan

risposta

0

Questo non funziona perché la funzione pandas.DataFrame.rolling restituisce una finestra o di rotolamento sotto-classificati per la particolare operazione mentre pandas.DataFrame.applyApplicare funzione lungo l'asse di ingresso dataframe. Come menzionato da ayhan, nel post this.