Interpolation sur DataFrame dans les pandas
J'ai un DataFrame, disons une surface de volatilité avec index comme temps et colonne comme grève. Comment faire une interpolation bidimensionnelle? Je peux reindex
mais comment puis-je gérer NaN
? Je sais que nous pouvons fillna(method='pad')
mais ce n'est même pas une interpolation linéaire. Est-il un moyen de brancher notre propre méthode d'interpolation?
2 réponses
, Vous pouvez utiliser DataFrame.interpolate
pour obtenir une interpolation linéaire.
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
Pour tout ce qui est plus complexe, vous devez déployer votre propre fonction qui traitera un objet Series
et remplir les valeurs NaN
comme vous le souhaitez et retourner un autre objet Series
.
Vieux thread mais je pensais partager ma solution avec l'extrapolation/interpolation 2d, en respectant les valeurs d'index, qui fonctionne également à la demande. Le Code a fini par être un peu bizarre, alors faites-moi savoir s'il y a une meilleure solution:
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