gpt4 book ai didi

python - 为 Pandas 创建自定义插值函数

转载 作者:行者123 更新时间:2023-11-28 21:07:07 25 4
gpt4 key购买 nike

我目前正在尝试使用 pandas 清理和填充一些缺失的时间序列数据。插值函数工作得很好,但是它没有我的数据集所需的一些(不太广泛使用的)插值函数。几个例子是一个简单的“最后”有效数据点,它会创建类似于阶跃函数的东西,或者类似于对数或几何插值的东西。

浏览文档,似乎没有办法传递自定义插值函数。这种功能是否直接存在于 pandas 中?如果没有,是否有人做过任何 pandas-fu 以通过其他方式有效地应用自定义插值?

最佳答案

Pandas 提供的插值方法是scipy.interpolate.interp1d 提供的。 - 不幸的是,它似乎无法以任何方式扩展。我必须做类似的事情来应用 SLERP 四元数插值(使用 numpy-quaternion ),并且我设法非常有效地做到了。我将在此处复制代码,希望您可以根据自己的目的对其进行调整:

def interpolate_slerp(data):
if data.shape[1] != 4:
raise ValueError('Need exactly 4 values for SLERP')
vals = data.values.copy()
# quaternions has size Nx1 (each quaternion is a scalar value)
quaternions = quaternion.as_quat_array(vals)
# This is a mask of the elements that are NaN
empty = np.any(np.isnan(vals), axis=1)
# These are the positions of the valid values
valid_loc = np.argwhere(~empty).squeeze(axis=-1)
# These are the indices (e.g. time) of the valid values
valid_index = data.index[valid_loc].values
# These are the valid values
valid_quaternions = quaternions[valid_loc]
# Positions of the missing values
empty_loc = np.argwhere(empty).squeeze(axis=-1)
# Missing values before first or after last valid are discarded
empty_loc = empty_loc[(empty_loc > valid_loc.min()) & (empty_loc < valid_loc.max())]
# Index value for missing values
empty_index = data.index[empty_loc].values
# Important bit! This tells you the which valid values must be used as interpolation ends for each missing value
interp_loc_end = np.searchsorted(valid_loc, empty_loc)
interp_loc_start = interp_loc_end - 1
# These are the actual values of the interpolation ends
interp_q_start = valid_quaternions[interp_loc_start]
interp_q_end = valid_quaternions[interp_loc_end]
# And these are the indices (e.g. time) of the interpolation ends
interp_t_start = valid_index[interp_loc_start]
interp_t_end = valid_index[interp_loc_end]
# This performs the actual interpolation
# For each missing value, you have:
# * Initial interpolation value
# * Final interpolation value
# * Initial interpolation index
# * Final interpolation index
# * Missing value index
interpolated = quaternion.slerp(interp_q_start, interp_q_end, interp_t_start, interp_t_end, empty_index)
# This puts the interpolated values into place
data = data.copy()
data.iloc[empty_loc] = quaternion.as_float_array(interpolated)
return data

诀窍在于 np.searchsorted,它可以非常快速地为每个值找到正确的插值结束。这种方法的局限性在于:

  • 您的插值函数必须有点quaternion.slerp 那样工作(这不奇怪,因为它有常规的 ufunc 广播行为)。
  • 它只适用于每一端只需要一个值的插值方法,所以如果你想要,例如像三次插值之类的东西(你不需要,因为已经提供了)这是行不通的。

关于python - 为 Pandas 创建自定义插值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41895857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com