我在名为“ df”的数据帧中有时间序列数据,并且下面给出了用于计算z得分的代码:

mean = df.mean()
standard_dev = df.std()
z_score = (df - mean) / standard_dev


我想使用相应的观察值和记录观察点时已知的数据为每个观察值计算z分数。即,我不想使用标准偏差,而是要包含在特定时间点之后发生的数据。我只想使用时间t,t-1,t-2的数据。

我该怎么做呢?

最佳答案

您可以分配两个新列,其中包含先前项目的均值和标准差。我在这里假设您的时间序列数据在“ time_series_data”列中:

len_ = len(df)
df['mean_past'] = [np.mean(df['time_series_data'][0:lv+1]) for lv in range(len_)]
df['std_past'] = [np.std(df['time_series_data'][0:lv+1]) for lv in range(len_)]
df['z_score'] = (df['time_series_data'] - df['mean_past']) / df['std_past']


编辑:如果要对所有列进行z评分,则可以定义一个函数,该函数计算z评分并将其应用于数据框的所有列:

def z_score_column(column):
    len_ = len(column)
    mean = [np.mean(column[0:lv+1]) for lv in range(0,len_)]
    std =  [np.std(column[0:lv+1]) for lv in range(0,len_)]
    return [(c-m)/s for c,m,s in zip(column, mean, std)]

df = pd.DataFrame(np.random.rand(10,5))
df.apply(z_score_column)

关于python - Pandas :计算Z分数以避免“前瞻”偏见,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60238203/

10-10 05:23