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
È 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
.
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
Bella soluzione. Funziona molto bene per me. Grazie per aver postato! – HeinzKurt
- 1. Finestra scorrevole su panda Dataframe
- 2. Dataframe Unisci in Panda
- 3. Interpolazione di una serie storica su un altro in panda
- 4. Tabella Pytables in panda DataFrame
- 5. striature trovando in panda dataframe
- 6. panda DataFrame valore impostato su maschera booleana
- 7. Calcolo efficiente su un dataframe panda
- 8. Curtosi su Panda dataframe doent funziona
- 9. Ordinamento personalizzato in dataframe panda
- 10. Blocca intestazione in panda dataframe
- 11. panda: normalizzare un DataFrame
- 12. intesa panda dataframe indicizzazione
- 13. panda dataframe perno problema
- 14. mediana di panda dataframe
- 15. binning un dataframe in panda in Python
- 16. cerca "non-contiene" su un dataframe in panda
- 17. classifica dati su una finestra a rotazione in panda DataFrame
- 18. Come ruotare un dataframe in Panda?
- 19. Serializzazione di un panda DataFrame
- 20. XML per i panda dataframe
- 21. ritorna logaritmiche a panda dataframe
- 22. l'indicizzazione di un dataframe panda
- 23. Panda: campionamento di un DataFrame
- 24. Panda unione ritorno dataframe vuoto
- 25. panda dataframe rimuovi colonna costante
- 26. Comprensione lista panda in un dataframe
- 27. Converti matrice sparsa (csc_matrix) in dataframe panda
- 28. Espandere colonna dataframe panda in più righe
- 29. assegnazione vectorize condizionale in panda dataframe
- 30. SQLAlchemy Conversione ORM in panda DataFrame
Avaris, grazie mille per le vostre risposte! – archlight
Sarebbe una buona idea incorporare questa opzione come opzione in fillna. – DanB
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