我想为DataFrame中的某些时间序列数据计算扩展的z得分,但我想使用多列的均值和标准差来标准化数据,而不是每个列的均值和标准差。列分开。我相信我想使用groupby和DataFrame.expanding的某些组合,但我似乎无法弄明白。以下是一些示例数据:
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame(np.random.rand(5,5),
columns=list('ABCDE'),
index=pd.date_range('2016-12-31', periods=5))
df.index.name = 'DATE'
df
输入:
期望的输出:
我将行和数据系列的日期作为单独的列。我想要的是一个相同形状的新数据框架,我计算了扩展的Z-Score。我无法弄清楚如何处理df.expanding(2).mean()
方法来聚合多个列。也就是说,不是采用A列的扩展均值并从A列中的值中减去,我想采用A到E列中值的扩展均值,并从A中的值中减去该均值。 / p>
如果您考虑使用Excel,我所谈论的是=AVERAGE(B$2:B3)
和=AVERAGE($B$2:$F3)
之间的区别。要做到这一点非常简单(df.expanding(2).mean()
),但我无法弄清楚如何在我的生命中做到这一点。
我使用groupby
,stack()
和expanding()
的各种组合进行了很多实验,但无济于事。
答案 0 :(得分:0)
这是我自己尝试计算汇集所有列的扩展Z-Scores。关于如何更有效地做到这一点的评论将受到欢迎。
def pooled_expanding_zscore(df, min_periods=2):
"""Calculates an expanding Z-Score down the rows of the DataFrame while pooling all of the columns.
Assumes that indexes are not hierarchical.
Assumes that df does not have columns named 'exp_mean' and 'exp_std'.
"""
# Get last sorted column name
colNames = df.columns.values
colNames.sort()
lastCol = colNames[-1]
# Index name
indexName = df.index.name
# Normalize DataFrame
df_stacked = pd.melt(df.reset_index(),id_vars=indexName).sort_values(by=[indexName,'variable'])
# Calculates the expanding mean and standard deviation on df_stacked
# Keeps just the rows where 'variable'==lastCol
df_exp = df_stacked.expanding(2)['value']
df_stacked.loc[:,'exp_mean'] = df_exp.mean()
df_stacked.loc[:,'exp_std'] = df_exp.std()
exp_stats = (df_stacked.loc[df_stacked.variable==lastCol,:]
.reset_index()
.drop(['index','variable','value'], axis=1)
.set_index(indexName))
# add exp_mean and exp_std back to df
df = pd.concat([df,exp_stats],axis=1)
# Calculate Z-Score
df_mat = df.loc[:,colNames].as_matrix()
exp_mean_mat = df.loc[:,'exp_mean'].as_matrix()[:,np.newaxis]
exp_std_mat = df.loc[:,'exp_std'].as_matrix()[:,np.newaxis]
zScores = pd.DataFrame(
(df_mat - exp_mean_mat) / exp_std_mat,
index=df.index,
columns=colNames)
# Use min_periods to kill off early rows
zScores.iloc[:min_periods-1,:] = np.nan
return zScores