Рассчитать z-балл, используя предыдущее значение строки - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть фрейм данных, похожий на этот:

 ids    value   
  1      0.1
  1      0.2
  1      0.14   
  2      0.22
    ....

Я пытаюсь перебрать все идентификаторы и вычислить новый столбец 'z-Score' для каждого идентификатора.

for id, row in df.groupby('ids'):
    row.reset_index(inplace=True)
    row.loc[0, 'z_score'] = 0
    row.loc[1, 'z_score'] = 0

    for i in range (2, len(row)):
        row.loc[i, 'z_score'] = (row.loc[i, value] - row.loc[0:i-1][value].mean()) / row.loc[0:i-1][value].std()
    print(row)
    # How to add each "row" back to the original dataframe? 

Первые два должны иметь z-балл 0. Затем используйте предыдущие значения (до i-1), чтобы вычислить среднее и стандартное отклонение для каждой итерации z-балла.Мой df будет выглядеть так:

 ids    value    z_score    
  1      0.1       ..              
  1      0.2       ..            
  1      0.14      ..          
  2      0.22      ..            
     ....

1 Ответ

0 голосов
/ 09 ноября 2018

Использование scipy.stats.zscore:

from scipy.stats import zscore

df['zscore'] =  df.groupby('ids')['value'].transform(zscore)
print(df)
   ids  value    zscore
0    1   0.10 -1.135550
1    1   0.20  1.297771
2    1   0.14 -0.162221
3    2   0.22       NaN

Или, придерживаясь панд,

df['zscore'] = df.groupby('ids').value.apply(
                    lambda x: (x - x.mean()) / x.std(ddof=0))
print(df)
       ids  value    zscore
    0    1   0.10 -1.135550
    1    1   0.20  1.297771
    2    1   0.14 -0.162221
    3    2   0.22       NaN

Если вы хотите расширить zscore, попробуйте groupby + expanding:

g = df.groupby('ids').value.expanding(min_periods=1)
df['zscore'] = (df['value'] - g.mean().values) / g.std(ddof=0).values

print(df)
   ids  value    zscore
0    1   0.10       NaN
1    1   0.20  1.000000
2    1   0.14 -0.162221
3    2   0.22       NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...