Интерполяция на DataFrame в пандах

У меня есть DataFrame, скажем, поверхность волатильности с индексом как время и столбец как страйк. Как мне сделать двухмерную интерполяцию? Я могуreindex но как мне иметь дело сNaN? Я знаю мы можемfillna(method='pad') но это даже не линейная интерполяция. Есть ли способ, которым мы можем подключить наш собственный метод для интерполяции?

Ответы на вопрос(2)

Решение Вопроса

Вы можете использоватьDataFrame.interpolate чтобы получить линейную интерполяцию.

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

Для чего-то более сложного, вам нужно развернуть свою собственную функцию, которая будет иметь дело сSeries объект и заполнитьNaN значения, как вам нравится, и вернуть еще одинSeries объект.

 The Red Pea30 нояб. 2014 г., 20:41
Можно также использовать метод интерполяции DataFrame?df2.interpolate() потому чтоdf2.interpolate() == df2.apply(pandas.Series.interpolate) (по крайней мере для меня,pandas.__version__ == 0.14)
 CPBL26 мая 2013 г., 04:46
Что если в шаге интерполяции есть другое измерение (или категория) для постоянного (отдельного) измерения? то есть, как я могу совместить ваше замечательное решение с группой? Прямо сейчас, если существуют повторяющиеся значения индекса (например, они идентичны для разных категорий, по которым я хочу сгруппировать), этап reindex () завершается неудачно, утверждая, что «переиндексация действительна только для объектов индекса с уникальным значением». (Может быть, это должен быть новый вопрос?)
 archlight07 мая 2012 г., 18:28
Avaris, Большое спасибо за ответы!
 DanB11 сент. 2012 г., 06:05
Было бы неплохо включить это в качестве опции в fillna.
 Bicubic04 июн. 2013 г., 07:56
Отличный и несколько непонятный ответ. Было бы неплохо иметь удобную функцию для этого, где вы можете выбрать оси для интерполяции по

но думал, что поделюсь своим решением с 2d экстраполяцией / интерполяцией, учитывая значения индекса, который также работает по требованию. Код закончился немного странно, поэтому дайте мне знать, если есть лучшее решение:

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
 HeinzKurt19 окт. 2015 г., 14:47
Красивое решение. Работает очень хорошо для меня. Спасибо за публикацию!

Ваш ответ на вопрос