Интерполировать CubicSpline с Pandas

У меня есть фрейм данных с ResidMat и Price, я использую scipy, чтобы найти интерполированный CubicSpline. Я использовал CubicSpline и подал заявку, чтобы найти все данные в моем наборе данных. Но это не очень быстро, потому что в этом случае больше нет данных. У меня будет более сотни данных, и это очень медленно. У вас есть идея сделать это, но, может быть, с матрицей?

Спасибо,

    def add_interpolated_price(row, generic_residmat):
        from scipy.interpolate import CubicSpline
        residmats = row[['ResidMat']].values
        prices = row[['Price']].values
        cs = CubicSpline(residmats, prices)
        return float(cs(generic_residmat))

    df = pd.DataFrame([[1,18,38,58,83,103,128,148,32.4,32.5,33.8,33.5,32.8,32.4,32.7],[2,17,37,57,82,102,127,147,31.2,31.5,32.7,33.2,32.5,32.9,33.3]],columns = ['index','ResidMat','ResidMat','ResidMat','ResidMat','ResidMat','ResidMat','ResidMat','Price','Price','Price','Price','Price','Price','Price'],index=['2010-06-25','2010-06-28'])
    my_resimmat = 30
    df['Generic_Value'] =  df.apply(lambda row: add_interpolated_price(row, generic_residmat=my_resimmat), axis=1)

person Flo Cp    schedule 05.01.2021    source источник
comment
Попробовал код и оказалось, что я получил TypeError: Cannot convert bool to numpy.ndarray   -  person Paul Brennan    schedule 05.01.2021
comment
Спасибо, Пол, да, мой плохой. df['Generic_Value'] = df.apply (лямбда-строка: add_interpolated_price (строка, generic_residmat = my_resimmat), ось = 1)   -  person Flo Cp    schedule 05.01.2021


Ответы (1)


Глядя на профиль этого кода, большая часть времени уходит на интерполяцию, поэтому лучшее, что я бы посоветовал, это использовать пандараллель. Заставить Pandas DataFrame apply() использовать все ядра? есть подробности. Мне больше всего нравится этот метод... (схема кода ниже)

from pandarallel import pandarallel
from math import sin

pandarallel.initialize()

def func(x):
    return sin(x**2)

df.parallel_apply(func, axis=1)

но это работает только в Linux и Macos, в Windows Pandarallel будет работать, только если сеанс Python выполняется из подсистемы Windows для Linux (WSL).

person Paul Brennan    schedule 05.01.2021
comment
Здравствуйте, Павел, хорошая идея! Я попробую это! Спасибо за ваше время - person Flo Cp; 06.01.2021