Интерполяция мультииндекса в панде - PullRequest
0 голосов
/ 20 декабря 2018

Мне нужно интерполировать мультииндексный фрейм данных:

, например:

это основной фрейм данных:

a    b    c    result
1    1    1    6
1    1    2    9
1    2    1    8
1    2    2    11
2    1    1    7
2    1    2    10
2    2    1    9
2    2    2    12

Мне нужно найти результат для:

1.3    1.7    1.55    

То, что я делал до сих пор, это добавление pd.Series внутри с NaN для каждого индекса в отдельности.

Как вы можете видеть.это кажется ОЧЕНЬ неэффективным способом.

Я был бы счастлив, если бы кто-то мог обогатить меня.

PS Я потратил некоторое время, просматривая SO, и если ответ там, я пропустил его:

Заполнить мультииндексный DataFrame Pandas с интерполяцией

Ресамплирование в мультииндексе Pandas

мультииндексный pandas dataframe, ND-интерполяция для пропущенных значений

Заполнить многоиндексный DataFrame Pandas интерполяцией

Алгоритм:

этап 1:

a    b    c    result
1    1    1    6
1    1    2    9
1    2    1    8
1    2    2    11
1.3    1    1    6.3
1.3    1    2    9.3
1.3    2    1    8.3
1.3    2    2    11.3
2    1    1    7
2    1    2    10
2    2    1    9
2    2    2    12

этап 2:

a    b    c    result
1    1    1    6
1    1    2    9
1    2    1    8
1    2    2    11
1.3    1    1    6.3
1.3    1    2    9.3
1.3    1.7    1    7.7
1.3    1.7    2    10.7
1.3    2    1    8.3
1.3    2    2    11.3
2    1    1    7
2    1    2    10
2    2    1    9
2    2    2    12

этап 3:

a    b    c    result
1    1    1    6
1    1    2    9
1    2    1    8
1    2    2    11
1.3    1    1    6.3
1.3    1    2    9.3
1.3    1.7    1    7.7
1.3    1.7    1.55    9.35
1.3    1.7    2    10.7
1.3    2    1    8.3
1.3    2    2    11.3
2    1    1    7
2    1    2    10
2    2    1    9
2    2    2    12

1 Ответ

0 голосов
/ 20 декабря 2018

Вы можете использовать scipy.interpolate.LinearNDInterpolator, чтобы делать то, что вы хотите.Если фрейм данных представляет собой MultiIndex со столбцами «a», «b» и «c», то:

from scipy.interpolate import LinearNDInterpolator as lNDI
print (lNDI(points=df.index.to_frame().values, values=df.result.values)([1.3, 1.7, 1.55]))

теперь, если у вас есть фрейм данных со всеми кортежами (a, b, c) в качестве индексаВы хотите рассчитать, вы можете сделать, например:

def pd_interpolate_MI (df_input, df_toInterpolate):
    from scipy.interpolate import LinearNDInterpolator as lNDI
    #create the function of interpolation
    func_interp = lNDI(points=df_input.index.to_frame().values, values=df_input.result.values)
    #calculate the value for the unknown index
    df_toInterpolate['result'] = func_interp(df_toInterpolate.index.to_frame().values)
    #return the dataframe with the new values
    return pd.concat([df_input, df_toInterpolate]).sort_index()

Затем, например, с вашими df и df_toI = pd.DataFrame(index=pd.MultiIndex.from_tuples([(1.3, 1.7, 1.55),(1.7, 1.4, 1.9)],names=df.index.names)), тогда вы получите

print (pd_interpolate_MI(df, df_toI))
              result
a   b   c           
1.0 1.0 1.00    6.00
        2.00    9.00
    2.0 1.00    8.00
        2.00   11.00
1.3 1.7 1.55    9.35
1.7 1.4 1.90   10.20
2.0 1.0 1.00    7.00
        2.00   10.00
    2.0 1.00    9.00
        2.00   12.00
...