#pandas #dataframe #dummy-variable #quarter
#pandas #фрейм данных #Дата #фиктивная переменная
Вопрос:
У меня есть, по сути, 3 связанных вопроса, касающихся создания фиктивных переменных в ежеквартальном фрейме данных pandas, с которым я работаю. Первый: как я могу создать «фиктивную» переменную, которая установит 1 за последние четыре квартала для каждого идентификатора фирмы? Я хотел бы получить тот же результат, что и ниже:
Firm Quarter Dummy
A 2017-03-31 1
A 2016-12-31 1
A 2016-09-30 1
A 2016-06-30 1
A 2016-03-31 0
A 2015-12-31 0
A 2015-09-30 0
A 2015-06-30 0
A 2015-03-31 0
B 2009-06-30 1
B 2009-03-31 1
B 2008-12-31 1
B 2008-09-30 1
B 2008-06-30 0
B 2008-03-31 0
B 2007-12-31 0
B 2007-09-30 0
B 2007-06-30 0
.
.
.
Z . .
Z . .
Z . .
Мой второй вопрос: как создать «фиктивную» переменную, которая устанавливает 1 для четырех кварталов, через год после последнего квартала (учитывая разные даты последнего квартала для каждой фирмы)? как в приведенном ниже фрейме данных:
Firm Quarter Dummy
A 2017-03-31 0
A 2016-12-31 0
A 2016-09-30 0
A 2016-06-30 0
A 2016-03-31 1
A 2015-12-31 1
A 2015-09-30 1
A 2015-06-30 1
A 2015-03-31 0
B 2009-06-30 0
B 2009-03-31 0
B 2008-12-31 0
B 2008-09-30 0
B 2008-06-30 1
B 2008-03-31 1
B 2007-12-31 1
B 2007-09-30 1
B 2007-06-30 0
.
.
.
Z . .
Z . .
Z . .
И, наконец, что касается предыдущей таблицы, как мне избавиться от первых четырех кварталов (Dummy = 0) перед первым Dummy = 1 и сохранить кварталы, где dummy = 0 ПОСЛЕ последнего Dummy = 1 для каждого идентификатора фирмы?, чтобы получить окончательный фрейм данных следующим образом:
Firm Quarter Dummy
A 2016-03-31 1
A 2015-12-31 1
A 2015-09-30 1
A 2015-06-30 1
A 2015-03-31 0
B 2008-06-30 1
B 2008-03-31 1
B 2007-12-31 1
B 2007-09-30 1
B 2007-06-30 0
.
.
.
Z . .
Z . .
Z . .
Заранее большое спасибо за вашу помощь!!
Комментарии:
1. Ваш вопрос довольно запутанный. Вы ожидаете, что для каждой фирмы будут указаны последние 5 кварталов, в последнем из которых есть
Dummy = 0
, а в остальных 4 —Dummy = 1
? Или вы ожидаете 3 разных результата?2. Извините за путаницу и спасибо, что указали на это. Я ожидаю 2 результата. Первый вопрос не зависит от двух последних вопросов. Что касается первого вопроса, я только хочу создать фиктивную переменную, которая установит 1 для последних четырех кварталов (самых последних кварталов) и ноль для остальных. Это все для первого вопроса. Результирующий фрейм данных является желаемым результатом. Затем второй вопрос делится на два этапа, где конечным результатом будет последняя таблица. Надеюсь, на этот раз я объяснил это лучше 🙂
Ответ №1:
Для каждой фирмы, если мы нумеруем последний квартал как 1, предпоследний как 2 и так далее, То ваша проблема — просто игра с фильтрацией:
- Назначены все кварталы 1-4
Dummy = 1
. Остальное равно 0 - Назначены все кварталы 5-8
Dummy = 1
. Остальное равно 0. И принимать только кварталы 5 — 9.
Код:
s = df.sort_values('Quarter', ascending=False).groupby('Firm').cumcount().add(1).sort_index()
result1 = df.assign(Dummy=np.where(s.between(1, 4), 1, 0))
result2 = df.assign(Dummy=np.where(s.between(5, 8), 1, 0))[s.between(5, 9)]