Использование преобразования z в фрейме данных

#python #numpy

#python #numpy

Вопрос:

Я использую RetailRocket в качестве своего набора данных. Я присвоил каждому событию значение, view = 1, addtocart = 2, transaction = 3. Теперь я хочу использовать z-преобразование для нормализации значений. К сожалению, я получил ошибку. В чем моя ошибка?

Это мой код z-преобразования:

 df = df.sample(frac=1, random_state=42)
x = df[["visitorid", "itemid"]].values
#y = df["code"].values
y = df["code"].apply(lambda x: (x - x.mean()) / x.std()).values
# Assuming training on 90% of the data and validating on 10%.
train_indices = int(0.9 * df.shape[0])
x_train, x_val, y_train, y_val = (
    x[:train_indices],
    x[train_indices:],
    y[:train_indices],
    y[train_indices:],
)
print(y)
  

Я нашел эту формулу для z-преобразования с numpy :

 X = (X - X.mean()) / X.std()
  

Ошибка:

 ---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-2712d78bf2a4> in <module>()
      2 x = df[["visitorid", "itemid"]].values
      3 #y = df["code"].values
----> 4 y = df["code"].apply(lambda x: (x - x.mean()) / x.std()).values
      5 # Assuming training on 90% of the data and validating on 10%.
      6 train_indices = int(0.9 * df.shape[0])

1 frames
pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-7-2712d78bf2a4> in <lambda>(x)
      2 x = df[["visitorid", "itemid"]].values
      3 #y = df["code"].values
----> 4 y = df["code"].apply(lambda x: (x - x.mean()) / x.std()).values
      5 # Assuming training on 90% of the data and validating on 10%.
      6 train_indices = int(0.9 * df.shape[0])

AttributeError: 'int' object has no attribute 'mean'
  

Ответ №1:

Поскольку вы используете apply(lambda x: ...) , x будет просто одно значение. При попытке использовать x.mean() для этого единственного значения будет ошибка.

Вместо этого вы хотите использовать mean и std для всего столбца. Используя apply , это можно сделать следующим образом:

 col = 'code'
df['z_score'] = df[col].apply(lambda x: (x - df[col].mean()) / df[col].std())
  

Однако это быстрее без apply :

 df['z_score'] = (df[col] - df[col].mean())/df[col].std()
  

Ответ №2:

Может быть, вам это нужно:

 y = (df["code"] - df["code"].mean() / df["code"].std().values
  

Мне нравится этот метод: (Высокопроизводительный, если ваш набор данных содержит более 15 000 строк)

 df.eval('(code-code.mean())/code.std()')