2012-05-05 14 views
25

Ho un DataFrame, ad esempio una superficie di volatilità con indice come orario e colonna come strike. Come si fa l'interpolazione bidimensionale? Posso reindex ma come faccio a trattare con NaN? So che possiamo fillna(method='pad') ma non è nemmeno l'interpolazione lineare. C'è un modo in cui possiamo inserire il nostro metodo per fare l'interpolazione?Interpolazione su DataFrame in panda

risposta

33

È possibile utilizzare DataFrame.interpolate per ottenere un'interpolazione lineare.

In : df = pandas.DataFrame(numpy.random.randn(5,3), index=['a','c','d','e','g']) 

In : df 
Out: 
      0   1   2 
a -1.987879 -2.028572 0.024493 
c 2.092605 -1.429537 0.204811 
d 0.767215 1.077814 0.565666 
e -1.027733 1.330702 -0.490780 
g -1.632493 0.938456 0.492695 

In : df2 = df.reindex(['a','b','c','d','e','f','g']) 

In : df2 
Out: 
      0   1   2 
a -1.987879 -2.028572 0.024493 
b  NaN  NaN  NaN 
c 2.092605 -1.429537 0.204811 
d 0.767215 1.077814 0.565666 
e -1.027733 1.330702 -0.490780 
f  NaN  NaN  NaN 
g -1.632493 0.938456 0.492695 

In : df2.interpolate() 
Out: 
      0   1   2 
a -1.987879 -2.028572 0.024493 
b 0.052363 -1.729055 0.114652 
c 2.092605 -1.429537 0.204811 
d 0.767215 1.077814 0.565666 
e -1.027733 1.330702 -0.490780 
f -1.330113 1.134579 0.000958 
g -1.632493 0.938456 0.492695 

Per qualcosa di più complesso, è necessario roll-out la propria funzione, che si occuperà di un oggetto Series e riempire NaN valori come ti piace e tornare un altro oggetto Series.

+0

Avaris, grazie mille per le vostre risposte! – archlight

+12

Sarebbe una buona idea incorporare questa opzione come opzione in fillna. – DanB

+1

Cosa succede se un'altra dimensione (o categoria) è mantenuta costante (separata) nella fase di interpolazione? cioè, come posso combinare la tua meravigliosa soluzione con un groupby? In questo momento, se ci sono valori ripetuti dell'indice (ad esempio sono identici tra le diverse categorie che desidero raggruppare), il passaggio reindex() fallisce, sostenendo "Reindexing valido solo con oggetti Index con valore univoco". (Forse questa dovrebbe essere una nuova domanda?) – CPBL

6

Vecchio thread ma ho pensato di condividere la mia soluzione con 2d estrapolazione/interpolazione, nel rispetto dei valori dell'indice, che funziona anche su richiesta. Il codice è risultato un po 'strano, quindi fatemi sapere se esiste una soluzione migliore:

import pandas 
from numpy import nan 
import numpy 

dataGrid = pandas.DataFrame({1: {1: 1, 3: 2}, 
          2: {1: 3, 3: 4}}) 


def getExtrapolatedInterpolatedValue(x, y): 
    global dataGrid 
    if x not in dataGrid.index: 
     dataGrid.ix[x] = nan 
     dataGrid = dataGrid.sort() 
     dataGrid = dataGrid.interpolate(method='index', axis=0).ffill(axis=0).bfill(axis=0) 

    if y not in dataGrid.columns.values: 
     dataGrid = dataGrid.reindex(columns=numpy.append(dataGrid.columns.values, y)) 
     dataGrid = dataGrid.sort_index(axis=1) 
     dataGrid = dataGrid.interpolate(method='index', axis=1).ffill(axis=1).bfill(axis=1) 

    return dataGrid[y][x] 


print getExtrapolatedInterpolatedValue(2, 1.4) 
>>2.3 
+0

Bella soluzione. Funziona molto bene per me. Grazie per aver postato! – HeinzKurt