Получить таблицу частот из многоиндексных дат в пандах - PullRequest
0 голосов
/ 29 мая 2018

Вот тестовые данные

import numpy as np
import pandas as pd
import datetime

# multi-indexed dataframe via cartesian join
df1 = pd.DataFrame([1, 2, 3])
df2 = pd.DataFrame(pd.date_range(start='2016', end='2018', freq='M'))
df1['key'] = 0
df2['key'] = 0
df = df1.merge(df2, how='outer', on='key')
del df1, df2
del df['key']
df.columns = ['id','date']

df['value'] = pd.DataFrame(np.random.randn(len(df)))

df.set_index(['date', 'id'], inplace=True)
df.sort_index(inplace=True)
df.head()

вывод:

                  value
date       id
2016-01-31 1   0.245029
           2  -2.141292
           3   1.521566
2016-02-29 1   0.870639
           2   1.407977

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

Моя цель - создать таблицу частотных наблюдений за месяцем. Это близко к тому, что я хочу:

df.groupby(pd.Grouper(level='date',freq='M')).count()

Но это дает вертикальный список.Мои данные намного больше, чем у этого небольшого MWE, поэтому я бы хотел уместить их более компактно, а также посмотреть, есть ли сезонные закономерности (то есть много наблюдений в декабре или июне).

Мне кажется, что это должно работать, но это не так:

df.groupby([df.index.levels[0].month, df.index.levels[0].year]).count()

Я получаю ошибку ValueError: Grouper and axis must be same length.

Это дает то, что я ищу, но мне кажется, что с индексом времени должно быть проще:

df.reset_index(inplace=True)
df['month'] = df['date'].dt.month
df['year'] = df['date'].dt.year
df.groupby(['month', 'year'])['value'].count().unstack().T

вывод:

month  1   2   3   4   5   6   7   8   9   10  11  12
year
2016    3   3   3   3   3   3   3   3   3   3   3   3
2017    3   3   3   3   3   3   3   3   3   3   3   3

ТакжеТак как это всего лишь быстрая проверка, я бы не стал сбрасывать индекс, а затем заново устанавливать индекс (и удалять месяц и год) каждый раз, чтобы просмотреть эту таблицу.

1 Ответ

0 голосов
/ 29 мая 2018

Мне кажется, нужно Index.get_level_values для выбора первого уровня MultiIndex:

idx = df.index.get_level_values(0)
df1 = df.groupby([idx.year, idx.month])['value'].count().unstack()

Или:

df1 = df.groupby([idx.year, idx.month]).size().unstack()

Разница между count иsize равно count опущено NaN с, а size нет.


print (df1)
date  1   2   3   4   5   6   7   8   9   10  11  12
date                                                
2016   3   3   3   3   3   3   3   3   3   3   3   3
2017   3   3   3   3   3   3   3   3   3   3   3   3
...