Преобразовать DataFrame в 3D-массив для RNN Keras-tensorflow? - PullRequest
1 голос
/ 04 августа 2020

Проблемы

У меня есть данные о транзакциях каждого клиента за 31 день до того, как они уйдут (у некоторых клиентов меньше 31 дня) в Dataframe Как преобразовать его в 3D-массив и площадку с 0 для Keras RNN? и Убедитесь, что он совпадает с другим фреймом данных цели

Структура данных

Этот образец игрушки для работы

df = pd.DataFrame({
        'Customer_id' : [112]*27 + [223]*31 + [256]*30
        ,'DATE' : np.concatenate([np.concatenate([np.arange(20200701,20200728) , np.arange(20200501,20200532)]), np.arange(20200501,20200531)])
        ,'Last_date_before_churn' :[20200727]*27 + [20200531]*31 + [20200530]*30
        ,'Feature1':np.random.uniform(0.1,0.9,88)
        ,'Feature2':np.random.uniform(0.1,0.9,88)
    })

# edit to replicate actual data
df = df.drop(15,axis = 0)


target = pd.DataFrame({
    'Customer_id' : [256,112,223]
    ,'IS_Churn':[1,0,1]
})

У нас 3 клиента [ 112 223 256]. У 112 есть 27 дней до того, как он перестанет работать, а у 223 есть 31 день до того, как он перестанет работать. Текущая форма - (88, 4), но нам нужно изменить форму на (3,31,2) -> 3 клиента, 31 временной шаг и 2 функции. Таким образом, третье измерение - это каждый Customer_id, который соответствует целевому фрейму данных

Другая сложная часть -

, у каждого клиента свой диапазон дат. в то время как мы можем посмотреть на «Last_date_before_churn» - это последняя дата в диапазоне 31 день. например, последняя дата для клиента 112 - 27 июля, у нас могут быть данные единственной даты с 1 июля по 15 июля, а затем с 17 июля по 27 июля. Таким образом, мы должны добавить дату с 27 июня на 30 июня, а затем также на 16 июля, чтобы она стала 31 день

То, что я пробовал

Я пробовал использовать для l oop, но потребовалось навсегда для моих фактических данных из 27 928 258 строк набора данных

result = []
for index, Cid in enumerate(df.Customer_id.unique()):
    result.append(df[df['Customer_id'] == Cid].iloc[:, :])

1 Ответ

0 голосов
/ 04 августа 2020

Я не знаю, с такими огромными данными мое решение будет работать или нет. Я все равно возьму на него go.

import pandas as pd
import numpy as np


df = pd.DataFrame({
        'Customer_id' : [112]*27 + [223]*31 + [256]*30
        ,'DATE' : np.concatenate([np.concatenate([np.arange(20200701,20200728) , np.arange(20200501,20200532)]), np.arange(20200501,20200531)])
        ,'Feature1':np.random.uniform(0.1,0.9,88)
        ,'Feature2':np.random.uniform(0.1,0.9,88)
    })
    
# Getting unique customer ids.
Series_customer_ids = df['Customer_id'].unique()

# Final array having the result.
final = np.zeros((Series_customer_ids.shape[0], 31, 2))

# Used for indexing first dimension of `final`
i = 0

for customer_id in Series_customer_ids:
    # `n_days` is the number of days for each customer. Assumed <=31.
    n_days = df[df['Customer_id']==customer_id].shape[0]
    if n_days > 0:
        np.place(
            # Location in `final` array.
            final[i],
            # Mask
            [(True, True) for _ in range(31)],
            # Pad for 31 - `n_days`.
            np.pad(
                df[df['Customer_id']==customer_id][['Feature1', 'Feature2']].to_numpy(),
                ((0, 31 - n_days), (0,0)),
                'constant'
            )
        )
    i += 1

# `final` contains the answer.

print(final.shape)
# (customer id count, days of month, features per observation)
# (3, 31, 2)

Опять же, он может выйти из строя из-за ограничений памяти, или это займет целую вечность.

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