Моя цель - иметь возможность искать конкретную информацию о сотруднике на определенную дату. У меня есть функция, которая работает, но она довольно интенсивная память, когда я имею дело с более чем 100 000 сотрудников.Объединить файлы на основе диапазона дат?
DF1 (реестр):
employee_id | manager | effective_date | expiration_date
abc Fred 2016-02-03 2016-03-07
abc John 2016-03-08 2999-12-31
Таким образом, используя dataframe выше, эта функция будет производить dataframe, который создавал бы строку для каждой даты между 2016-02-03 до 2016-03-08 для КАЖДОГО employee_id. Это означает, что я могу сделать pd.merge(raw, roster, on=['employee_id', 'effective_date'])
def add_roster(df, date_col):
min_date = df[date_col].min() #min date of the raw data I am joining
roster = df2
current_roster = roster.groupby(['employee_id'])['effective_date'].idxmax() #max date in the roster
rows = roster.ix[current_roster]
rows['effective_date'] = pd.to_datetime(dt.date.today()) #makes sure there is a date up until current date
current = pd.concat([roster, rows], ignore_index=True)
current = current.sort_values(['avaya_id', 'effective_date'], ascending=True)
roster = current.groupby(['employee_id']).apply(
lambda x: x.set_index('effective_date').resample('D').first().ffill()) #this is filling the roster up so there is an entry for every date
roster = roster.reset_index(level=0, drop=True).reset_index()
roster = roster[roster['effective_date'] >= min_date]
return roster
Это работает, но теперь я имею дело с большим количеством сотрудников, так что кажется немного неэффективным. Есть лучший способ сделать это?
В данных также имеется срок годности.
Могу ли я сделать pd.merge, что говорит что-то вроде:
Регистрация на employee_id where date >= effective_date and date < expiration_date
?
Я хочу наиболее эффективный способ объединения данных в определенную дату.
DF2 (сырые)
employee_id | date | data_count_1 | data_count_2
abc 2016-02-18 10 56
abc 2016-02-28 19 102
abc 2016-06-21 5 4
DF3 (Желаемый выход):
employee_id | date | data_count_1 | data_count_2 | manager
abc 2016-02-18 10 56 Fred
abc 2016-02-28 19 102 Fred
abc 2016-06-21 5 4 John
Менеджер должен быть Фред на 2/18 и 2/28, потому что он находится между EFFECTIVE_DATE и EXPIRATION_DATE. 3/08, менеджер для сотрудника abc - Джон, и после этого изменений нет. Это означает, что на 6/21 менеджер - Джон.
Я редактировал функцию. На самом деле этот реестр является еще одним фреймворком данных. Я читаю из базы данных в отдельном фрейме данных, но этот файл данных имеет только эффективные и срочные даты. С исходными данными, с которыми я соединяюсь, является отдельный блок данных, но он может иметь данные для любой даты. Я хочу, чтобы иметь возможность присоединиться на основе employee_id и даты, пока дата находится между эффективной и истекающей датой. – trench
Конечно, я сделал редактирование. Я пытаюсь посмотреть, кто менеджер на определенную дату, которая находится между датами действия и срока действия и добавляет их в DF2, который является примером сырых данных. DF3 - желаемый выход. – trench