Python 时间序列的线性翘曲

Python 时间序列的线性翘曲,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据帧,df: import pandas as pd import numpy as np np.random.seed(123) s = np.arange(5) df = pd.DataFrame() for i in s: s_df = pd.DataFrame({'time':np.arange(100), 'x':np.arange(100), 'y':np.a

我有一个熊猫数据帧,df:

import pandas as pd
import numpy as np
np.random.seed(123)

s  = np.arange(5)
df = pd.DataFrame()
for i in s:
    s_df = pd.DataFrame({'time':np.arange(100),
                         'x':np.arange(100),
                         'y':np.arange(100),
                         'r':np.random.randint(60,100)})
    s_df['unit'] = str(i)
    df = df.append(s_df)

我希望为每个“单位”选择“x”和“y”数据,从“时间”0到其值“r”,然后扭曲所选数据以适应新的标准化时间刻度0-100。新的数据帧看起来应该相同,但是x和y将被拉伸以适应新的时间刻度

我想你可以从这个开始修改:

df.groupby('unit', as_index=False, group_keys=False)\
  .apply(lambda g: g[g.time <= g.r.max()].pipe(lambda x: x.assign(x = np.interp(x.time * 100/x.r.max(), g.time, g.x),
                                                                  y = np.interp(x.time * 100/x.r.max(), g.time, g.y))))

我认为您可以从这个开始,修改:

df.groupby('unit', as_index=False, group_keys=False)\
  .apply(lambda g: g[g.time <= g.r.max()].pipe(lambda x: x.assign(x = np.interp(x.time * 100/x.r.max(), g.time, g.x),
                                                                  y = np.interp(x.time * 100/x.r.max(), g.time, g.y))))

此数据集的预期输出是什么?如果您不介意,请使用np.random.seed(123)修复随机元素。谢谢。新的数据框看起来应该是一样的,但是一旦选择了“x”和“y”,它们的“r”将具有不同的长度,它们将被扭曲以适应“时间”,这意味着它们的斜率在绘制时都应该略有不同。您希望从该数据集获得什么样的输出?如果您不介意,请使用np.random.seed(123)修复随机元素。谢谢。新的数据框看起来应该是一样的,但是一旦选择了“x”和“y”,它们的“r”将具有不同的长度,它们将被扭曲以适应“时间”,这意味着它们的斜率在绘制时都应该略有不同。很好,虽然时间应保持不变,且x和y值应为warped@jtm_beta要使用什么公式扭曲x和y?我现在不理解这个概念。在以前冗长的实现中,我使用了np.linspace和np.interp。上面的结果就是我想要的,但是x和y数据都应该改变。因此,新数据帧的形状将是相同的,但x和y的斜率将发生变化。恐怕我不知道该怎么办formula@jtm_beta请参见编辑,我不确定这是否正是您需要的。很好,尽管时间应该保持不变,x和y值应该保持不变warped@jtm_beta要使用什么公式扭曲x和y?我现在不理解这个概念。在以前冗长的实现中,我使用了np.linspace和np.interp。上面的结果就是我想要的,但是x和y数据都应该改变。因此,新数据帧的形状将是相同的,但x和y的斜率将发生变化。恐怕我不知道该怎么办formula@jtm_beta见编辑,我不确定这正是你需要的。