У меня есть следующие тестовые данные:
import pandas as pd
import datetime
data = {'date': ['2014-01-01', '2014-01-02', '2014-01-03', '2014-01-04', '2014-01-05', '2014-01-06', '2014-01-07'],
'id': [1, 2, 2, 3, 4, 4, 5], 'name': ['Darren', 'Sabrina', 'Steve', 'Sean', 'Ray', 'Stef', 'Dany']}
data = pd.DataFrame(data)
data['date'] = pd.to_datetime(data['date'])
Вопрос заключается в следующем: Возвращаясь ко времени x дней (если смотреть из каждой записи), существует ли более y разных имен, которые имеют один и тот же идентификатор?
Вот код, который я написал. В моем примере я go возвращаюсь x = 2 дня и проверяю как минимум два разных имени (y = 1), имеющих один и тот же идентификатор. Если существуют хотя бы два разных имени, я сохраняю 1 в списке «result_store», иначе 0. Конечно, в этом примере возврат назад x дней невозможен, если i меньше x, но эта небольшая неточность не является проблемой для me.
def rule(data, x=2, y=1):
result_store = []
for i in range(data.shape[0]):
id = data['id'][i]
end_time = data['date'][i]
start_time = end_time-datetime.timedelta(days=x)
time_frame = data[(data['date'] >= start_time) & (data['date'] <= end_time)]
time_frame = time_frame.loc[time_frame['id'] == id]
distinct_names = time_frame['name'].nunique()
if distinct_names > y:
result_store.append(1)
else:
result_store.append(0)
return result_store
Результат -
[0, 0, 1, 0, 0, 1, 0]
На самом деле у меня тысячи строк, и мое решение очень медленное. Я также попытался распараллелить индекс i, используя parmap, но ускорение также не является удовлетворительным. Есть ли более эффективный способ сделать это? Может быть, с помощью pyspark?
Спасибо!