Как проверить каждую запись временного ряда, если имя / идентификатор есть в записях предыдущих лет? - PullRequest
0 голосов
/ 17 ноября 2018

Я застрял.

У меня есть фрейм данных, в котором строки создаются в тот момент, когда клиент указывает цену продукта.

Мои (усеченные) данные:

import pandas as pd

d = {'Quote Date': pd.to_datetime(['3/10/2016', '3/10/2016', '3/10/2016', 
                                   '3/10/2016', '3/11/2017']),
     'Customer Name': ['Alice', 'Alice', 'Bob', 'Frank', 'Frank']
    }

df = pd.DataFrame(data=d)

Я хочу проверить для каждой строки, является ли это первым взаимодействием, которое я имел с этим клиентом за год.Моя мысль состоит в том, чтобы сравнить имя клиента каждой строки с именем клиента в строках предыдущих лет.Если имя клиента строки не входит в подмножество предыдущего года, я добавлю значение True в новый столбец:

df['Is New']   

На практике форма информационного кадра будет близка к (150000000, 5) иБоюсь, что добавление вычисляемого столбца не будет хорошо масштабироваться.

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

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

1 Ответ

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

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

# Create example data
d = {'Quote Date': pd.to_datetime(['3/10/2016', 
                                   '3/10/2016', 
                                   '6/25/2016', 
                                   '1/1/2017', 
                                   '6/25/2017', 
                                   '9/29/2017']),
     'Customer Name': ['Alice', 'Bob', 'Alice', 'Frank', 'Bob', 'Frank']
    }
df = pd.DataFrame(d)
df.set_index('Quote Date', inplace=True)

# Solution
day = pd.DateOffset(days=1)
is_new = [s['Customer Name'] not in df.loc[i - 365*day:i-day]['Customer Name'].values
          for i, s in df.iterrows()]
df['Is New'] = is_new
df.reset_index(inplace=True)

# Result
df
  Quote Date Customer Name  Is New
0 2016-03-10         Alice    True
1 2016-03-10           Bob    True
2 2016-06-25         Alice   False
3 2017-01-01         Frank    True
4 2017-06-25           Bob    True
5 2017-09-29         Frank   False
...