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?

26
demandé sur piRSquared 2012-05-05 22:25:59

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.

34
répondu Avaris 2018-01-16 20:00:32

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
6
répondu Nick Holden 2015-09-25 14:54:39