用 Pandas 插值 CubicSpline

问题描述

我有一个包含 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.7],[2,17,37,57,82,102,127,147,31.2,31.5,32.7,33.2,32.9,33.3]],columns = ['index','ResidMat','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)

解决方法

在查看这段代码的配置文件后,大部分时间都花在了插值上,所以我建议最好的方法是使用 pandaralel。 Make Pandas DataFrame apply() use all cores? 有详细信息。我最喜欢这种方法......(下面的大纲代码)

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 会话从适用于 Linux 的 Windows 子系统 (WSL) 执行时才有效。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...