Повторная выборка временных рядов панд, биннинг выключен - PullRequest
0 голосов
/ 10 декабря 2018

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

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

index = pd.date_range(start="1/1/2018", end="31/12/2018") 
df = pd.DataFrame(np.random.randint(100, size=len(index)), 
                  columns=["sales"], index=index)

>>> df.head()
            sales
2018-01-01     66
2018-01-02     18
2018-01-03     45
2018-01-04     92
2018-01-05     76

Теперь я делаю повторную выборку по одному месяцу, все выглядит хорошо:

>>>df.resample("1M").sum()

            sales
2018-01-31   1507
2018-02-28   1186
2018-03-31   1382
[...]
2018-11-30   1342
2018-12-31   1337

Если я попытаюсь выполнить повторную выборку по нескольким месяцам, хотя биннинг начинает выглядетьвыкл.Это особенно очевидно для 6M

df.resample("6M").sum()                                                           
            sales
2018-01-31   1507
2018-07-31   8393
2019-01-31   7283

Первый интервал составляет чуть более одного месяца, последний - на месяц вперед.Может быть, я должен установить closed="left", чтобы получить правильные ограничения:

df.resample("6M", closed="left").sum()                                            
            sales
2018-06-30   8090
2018-12-31   9054
2019-06-30     39

Теперь у меня есть дополнительная корзина в 2019 году с данными за 2018-12-31 ...

Этоработает правильно?я пропускаю какой-либо параметр, который должен установить?

РЕДАКТИРОВАТЬ: вот результат, который я ожидаю, повторная выборка один год с шестимесячными интервалами, первый интервал охватывает период с 1 января по 30 июня, второй интервал охватываетс 1 июля по 31 декабря.

df.resample("6M", closed="left").sum()                                            
            sales
2018-06-30   8090
2018-12-31   9093 # 9054 + 39

Обратите внимание, что здесь также есть некоторые сомнения относительно того, что происходит с данными 30 июня, идет ли оно в первом бине, как я ожидал, или во втором?Я имею в виду, что с последним мусорным баком это очевидно, но то же самое, вероятно, происходит во всех мусорных ведрах.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Псевдоним смещения времени M подразумевает частоту окончания месяца .Вам нужно 6MS, которое является псевдонимом частоты начала месяца:

df.resample('6MS').sum()

, что приводит к

            sales
2018-01-01   8130
2018-07-01   9563
2019-01-01      0

Также df.groupby(pd.Grouper(freq='6MS')).sum() можно использовать взаимозаменяемо.


Для большей ясности вы можете сравнить диапазоны напрямую:

>>> pd.date_range('2018-01-01', '2018-12-31', freq='6M')
DatetimeIndex(['2018-01-31', '2018-07-31'], dtype='datetime64[ns]', freq='6M')

>>> pd.date_range('2018-01-01', '2018-12-31', freq='6MS')
DatetimeIndex(['2018-01-01', '2018-07-01'], dtype='datetime64[ns]', freq='6MS')
0 голосов
/ 10 декабря 2018

Добавление np.random.seed(365) для проверки обоих наших выходов.

print(df.resample("6M", kind='period').sum())

         sales
2018-01   8794
2018-07   9033

будет ли это работать для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...