Нормализовать или масштабировать столбцы на pandas мультииндекс - PullRequest
0 голосов
/ 04 марта 2020

У меня большой массив данных, который содержит два индекса. Первый - это индексирование даты, а второй - индекс меток, который происходит каждый день в произвольном порядке. Каждый столбец должен быть нормализован или масштабирован между -1 и 1 ежедневно. Iv'e приложил изображение, которое показывает области, которые должны быть нормализованы. Так что в основном мне нужны данные, нормализованные по столбцам и дням, если это имеет смысл. Поскольку данные, с которыми я работаю, настолько велики, я включил некоторый пример кода, который генерирует реплику для тестирования.

import pandas as pd
import numpy as np

#For repeatability
np.random.seed(0)

#The index's
arrays = [
    np.array([
        "Day1", "Day1", "Day1", "Day1", "Day1", 
        "Day2", "Day2", "Day2", "Day2", "Day2",
        "Day3", "Day3", "Day3", "Day3", "Day3"
    ]),
    np.array([
        "a", "b", "c", "d", "e", 
        "a", "b", "c", "d", "e", 
        "a", "b", "c", "d", "e"
    ])
]

#Create the sample dataframe 
df = pd.DataFrame(np.random.randn(15, 4), index=arrays, columns=["100", "200", "300", "400"])

#Output the dataframe
print(df) #End of code

"""
             100       200       300       400
Day1 a  1.764052  0.400157  0.978738  2.240893
     b  1.867558 -0.977278  0.950088 -0.151357
     c -0.103219  0.410599  0.144044  1.454274
     d  0.761038  0.121675  0.443863  0.333674
     e  1.494079 -0.205158  0.313068 -0.854096
Day2 a -2.552990  0.653619  0.864436 -0.742165
     b  2.269755 -1.454366  0.045759 -0.187184
     c  1.532779  1.469359  0.154947  0.378163
     d -0.887786 -1.980796 -0.347912  0.156349
     e  1.230291  1.202380 -0.387327 -0.302303
Day3 a -1.048553 -1.420018 -1.706270  1.950775
     b -0.509652 -0.438074 -1.252795  0.777490
     c -1.613898 -0.212740 -0.895467  0.386902
     d -0.510805 -1.180632 -0.028182  0.428332
     e  0.066517  0.302472 -0.634322 -0.362741
"""

Ниже приведен вывод этого примера с полями, которые мне нужно масштабировать между: 1 и 1

enter image description here

Нет, индексы не помечены.

Я не очень знаком с группой pandas но это может быть то, что нужно использовать. Я открыт для любого метода или предложения.

1 Ответ

1 голос
/ 04 марта 2020

Самый простой способ - использовать пакет scikit-learn в дополнение к pandas.

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(-1,1))

# Group by level 0, which is the first index corresponding to 'Dayx'
# After applying the scaling function (which output a Numpy array), convert it to a dataframe

df_scaled = df.groupby(level=0).apply(lambda x : pd.DataFrame(scaler.fit_transform(x), columns=x.columns, index=x.index).round(5))

print(df_scaled)

, что дает вам:

            100      200      300      400
Day1 a  0.89496  0.98495  1.00000  1.00000
     b  1.00000 -1.00000  0.93135 -0.54589
     c -1.00000  1.00000 -1.00000  0.49168
     d -0.12293  0.58365 -0.28161 -0.23246
     e  0.62098  0.11266 -0.59500 -1.00000
Day2 a -1.00000  0.52713  1.00000 -1.00000
     b  1.00000 -0.69484 -0.30804 -0.00925
     c  0.69438  1.00000 -0.13358  1.00000
     d -0.30944 -1.00000 -0.93703  0.60402
     e  0.56893  0.84524 -1.00000 -0.21476
Day3 a -0.32714 -1.00000 -1.00000  1.00000
     b  0.31425  0.14014 -0.45953 -0.01429
     c -1.00000  0.40178 -0.03366 -0.35194
     d  0.31288 -0.72205  1.00000 -0.31613
     e  1.00000  1.00000  0.27758 -1.00000

Далее, чтобы помочь вам понять groupby, он фактически разделяет фрейм данных в соответствии с указанной вами группой (т. Е. В приведенном выше примере группа является индексом первого уровня, Dayx. Первая группа по сути выглядит следующим образом:

             100       200       300       400
Day1 a  1.764052  0.400157  0.978738  2.240893
     b  1.867558 -0.977278  0.950088 -0.151357
     c -0.103219  0.410599  0.144044  1.454274
     d  0.761038  0.121675  0.443863  0.333674
     e  1.494079 -0.205158  0.313068 -0.854096

и функция scaler.fit_transform() затем применяется к каждому из этих кадров данных (в группах).

Надеюсь, это поможет!

...