Как мне индексировать данные после группировки и повторной выборки? - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть данные временных рядов за полный год для каждой минуты.

timestamp               day hour min rainfall_rate           
2010-01-01 00:00:00     1   0   0       x
2010-01-01 00:01:00     1   0   1       1
2010-01-01 00:02:00     1   0   2       2
2010-01-01 00:03:00     1   0   3       x
2010-01-01 00:04:00     1   0   4       5
...                            ...
2010-12-31 23:55:00     365 23  55      3
2010-12-31 23:56:00     365 23  56      9
2010-12-31 23:57:00     365 23  57      32
2010-12-31 23:58:00     365 23  58      12
2010-12-31 23:59:00     365 23  59      22

Я использовал sampled_df = rainfall_df.groupby(pd.Grouper(freq="M")).resample('D').sum(), чтобы сгруппировать данные по месяцам и рассчитать дневную сумму rainfall_rate.

Структура sampled_df. enter image description here Как отобразить ежемесячные данные по метке времени для каждого месяца. Как мне индексировать rainfall_rate? Мне нужны данные rainfall_rate ежедневно за каждый месяц. Также правильная группировка? Предположим, я хочу построить график timestamp vs rainfall_rate для месяца January. Как мне это сделать?

Я новичок в pandas.

1 Ответ

1 голос
/ 28 февраля 2020

Чтобы сгенерировать график из полученных пересчитанных данных, просто наберите DataFrame.plot. Однако, поскольку у вас есть мультииндекс с двумя временными метками для индикатора месяца и дня, позвоните DataFrame.reset_index, чтобы сбросить уровень избыточного месяца. А для указания c месячного графика запустите булево индексирование по индексу дня для указанного c month:

import matplotlib.pyplot as plt
...

# RESET INDEX AND FILTER COLUMNS
sampled_df = (sampled_df.reindex(['rainfall_rate'], axis='columns')
                        .reset_index(level=0, drop=True)
             )

### ALL MONTHS
sampled_df.plot(kind='line')

### ONLY JANUARY
sampled_df[sampled_df.index.month == 1].plot(kind='line')

Для демонстрации со случайными, заполненными данными:

Данные

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns

np.random.seed(22820)
rainfall_df = pd.DataFrame({'timestamp': pd.date_range('2010-01-01 00:00', 
                                                       '2010-12-31 23:59', 
                                                       freq="min"),
                            'rainfall_rate': np.random.normal(1, 2, 525600)
                           })

Повторная выборка

sampled_df = (rainfall_df.set_index('timestamp')
                         .groupby(pd.Grouper(freq="M"))
                         .resample('D')
                         .sum()
             )    

sampled_df.tail(10)
#             rainfall_rate
# timestamp
# 2010-12-22    1454.287302
# 2010-12-23    1367.539650
# 2010-12-24    1460.319823
# 2010-12-25    1464.392407
# 2010-12-26    1338.139227
# 2010-12-27    1454.540103
# 2010-12-28    1553.949133
# 2010-12-29    1301.670684
# 2010-12-30    1536.173442
# 2010-12-31    1333.492614

Графики

sampled_df = sampled_df.reset_index(level=0, drop=True)

### ALL MONTHS
sampled_df.plot(kind='line')

Year Plot

### ONLY JANUARY
sampled_df[sampled_df.index.month == 1].plot(kind='line')

Jan Plot

...