У меня есть Pandas DataFrame, который я суммирую, используя groupby () , resample () и size () Функции:
freq = upgrade.groupby("UPGRADESTRATEGY")
type(freq)
<class 'pandas.core.groupby.groupby.DataFrameGroupBy'>
print(freq.resample('Q'))
DatetimeIndexResamplerGroupby [freq=<QuarterEnd: startingMonth=12>, axis=0, closed=right, label=right, convention=e, base=0]
print(freq.resample('Y'))
DatetimeIndexResamplerGroupby [freq=<YearEnd: month=12>, axis=0, closed=right, label=right, convention=e, base=0]
К моему удивлению, функция size () возвращает различные типы в зависимости от частоты дискретизации:
- , если я произвожу выборку за квартал, я получу Series ,
- Если я произвожу выборку по году, я получу DataFrame .
Код:
print(type(freq.resample('Q').size()))
<class 'pandas.core.series.Series'>
print(type(freq.resample('Y').size()))
<class 'pandas.core.frame.DataFrame'>
Выходы также семантически различны,поэтому я не могу повторно использовать один и тот же конвейер для обработки результатов.Я ожидал, что тип выходного объекта и структура выходных данных не зависят от частоты дискретизации, которую я использовал.
Вопросы:
- Почему яполучение другого типа объекта в результате использования функции size () , когда я использую разные частоты дискретизации?
- Как изменить код, чтобы получить тот же тип объекта и ту же структуру объекта независимо отуказанная частота дискретизации?
Я использую версию Pandas 0.23.4.
ОБНОВЛЕНИЕ:
Проблема, по-видимому, связана с данными-зависимый.Я свел его до 10 записей, что привело к изменению типа вывода.Я не могу объяснить, почему я получаю другой тип вывода здесь.Сортировка значений по дате не приводит к изменению результата.
u2.dtypes
UPGRADESTRATEGY object
SCENARIO_STARTDATE datetime64[ns]
dtype: object
Создает DataFrame.
print(u2.iloc[-105:-96])
UPGRADESTRATEGY SCENARIO_STARTDATE
18645 b 2016-12-20 14:48:57
18646 a 2017-01-07 16:58:44
18647 b 2017-01-11 14:39:58
18648 a 2017-01-10 15:42:22
18649 a 2017-01-10 10:07:34
18650 a 2017-01-12 15:31:14
18651 a 2017-01-13 12:44:02
18652 a 2017-01-13 14:51:59
18653 a 2016-12-12 22:30:01
type(u2.iloc[-105:-96].groupby(["UPGRADESTRATEGY"]).resample('Q', on='SCENARIO_STARTDATE').size())
pandas.core.frame.DataFrame
Создает Series.
print(u2.iloc[-104:-96])
UPGRADESTRATEGY SCENARIO_STARTDATE
18646 a 2017-01-07 16:58:44
18647 b 2017-01-11 14:39:58
18648 a 2017-01-10 15:42:22
18649 a 2017-01-10 10:07:34
18650 a 2017-01-12 15:31:14
18651 a 2017-01-13 12:44:02
18652 a 2017-01-13 14:51:59
18653 a 2016-12-12 22:30:01
type(u2.iloc[-104:-96].groupby(["UPGRADESTRATEGY"]).resample('Q', on='SCENARIO_STARTDATE').size())
pandas.core.series.Series
Вывод DataFrame:
u2.iloc[-105:-96].groupby(["UPGRADESTRATEGY"]).resample('Q', on='SCENARIO_STARTDATE').size()
SCENARIO_STARTDATE 2016-12-31 2017-03-31
UPGRADESTRATEGY
a 1 6
b 1 1
Серийный выход:
u2.iloc[-104:-96].groupby(["UPGRADESTRATEGY"]).resample('Q', on='SCENARIO_STARTDATE').size()
UPGRADESTRATEGY SCENARIO_STARTDATE
a 2016-12-31 1
2017-03-31 6
b 2017-03-31 1
dtype: int64
У меня нет идей!