Масштаб в пределах уровня pandas мультииндекс - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь классифицировать последовательности LSTM на основе отклонения последнего значения во временном ряду от предыдущих значений в этом же временном ряду. Данные хранятся в мультииндексе Pandas с индексами: user_id, date и 8 функциями для каждой комбинации пользователя и даты.

Что я хотел бы сделать, так это применить масштабатор scikit-learn (например, RobustScaler) в контексте каждой серии, а не во всей данной функции.

Например, используя фрейм данных из , этот вопрос .

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
"""

Я бы хотел все значения для объекта «100» в День 1 масштабируются относительно друг друга, но без учета значений для объекта «100» в День 2 и без учета значений для объекта «200» в День1.

Подход, предложенный в связанном вопросе, заключается в использовании df.apply для создания масштабированной копии исходного кадра данных, но это очень медленно для большого количества записей. Существует ли векторизованный подход к масштабированию в пределах определенного уровня индекса?

Моя конечная цель - получить массив 3D numpy из кадра данных формы: (день, буква, объекты), поэтому решения, которые проходят через numpy, хороши. Я попробовал некоторые подходы из этого вопроса , но мне кажется, что я что-то неправильно понимаю, поскольку результаты, хотя и гораздо быстрее, не соответствуют (медленным) результатам метода df.apply.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...