11.5 Gráficos de séries temporais
11.5.1 ts
Veja ?plot.ts
.
Exemplo 11.20 Em Python.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# Redefinindo zm1 (apenas para garantir que ele esteja definido)
np.random.seed(99)
data = np.random.randn(300).reshape(100, 3)
index = pd.date_range(start='2015-01-01', periods=100, freq='MS')
zm1 = pd.DataFrame(data, index=index, columns=['Série 1', 'Série 2', 'Série 3']) # Nomeando as colunas
# Série univariada
plt.figure(figsize=(10, 6))
plt.plot(zm1.index, zm1.iloc[:, 0]) # Plota a primeira coluna
plt.title('Série Univariada')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.show()
# Séries separadas
zm1.plot(subplots=True, figsize=(10, 8))
plt.suptitle('Séries Separadas')
plt.show()
# Séries sobrepostas
plt.figure(figsize=(10, 6))
for column in zm1.columns:
plt.plot(zm1.index, zm1[column], label=column)
plt.title('Séries Sobrepostas')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.legend()
plt.show()
# Séries sobrepostas (com seaborn)
plt.figure(figsize=(10, 6))
sns.lineplot(data=zm1)
plt.title('Séries Sobrepostas (Seaborn)')
plt.show()
# Séries sobrepostas (ggplot2 - tentativa)
try:
from plotnine import ggplot, aes, geom_line, labs
zm1_reset = zm1.reset_index().melt(id_vars='index', var_name='series', value_name='value')
plot_ggplot = (ggplot(zm1_reset, aes(x='index', y='value', color='series')) +
geom_line() +
labs(title='Séries Sobrepostas (ggplot2)')
)
print(plot_ggplot)
except ImportError:
print('plotnine não instalado, pulando a plotagem estilo ggplot2.')
11.5.2 zoo
Veja ?plot.zoo
.
Exemplo 11.21 Em Python.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# Redefinindo zm2 (apenas para garantir que ele esteja definido)
np.random.seed(99)
data = np.random.randn(300).reshape(100, 3)
index = pd.date_range(start='2015-01-01', periods=100, freq='MS')
zm2 = pd.DataFrame(data, index=index, columns=['Série 1', 'Série 2', 'Série 3'])
# Série univariada
plt.figure(figsize=(10, 6))
plt.plot(zm2.index, zm2.iloc[:, 0]) # Plota a primeira coluna
plt.title('Série Univariada')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.show()
# Séries separadas
zm2.plot(subplots=True, figsize=(10, 8))
plt.suptitle('Séries Separadas')
plt.show()
# Séries sobrepostas
plt.figure(figsize=(10, 6))
for i, column in enumerate(zm2.columns):
plt.plot(zm2.index, zm2[column], label=column, linestyle='-' if i % 2 == 0 else '--')
plt.title('Séries Sobrepostas')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.legend()
plt.show()
# Séries separadas (ggplot2 - tentativa)
try:
from plotnine import ggplot, aes, geom_line, labs, facet_wrap
zm2_reset = zm2.reset_index().melt(id_vars='index', var_name='series', value_name='value')
plot_ggplot = (ggplot(zm2_reset, aes(x='index', y='value')) +
geom_line() +
facet_wrap('series', ncol=1) + # Separa as séries em painéis
labs(title='Séries Separadas (ggplot2)')
)
print(plot_ggplot)
except ImportError:
print('plotnine não instalado, pulando a plotagem estilo ggplot2.')
11.5.3 xts
Veja ?plot.xts
.
Exemplo 11.22 Em Python.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# Redefinindo zm3 (apenas para garantir que ele esteja definido)
np.random.seed(99)
data = np.random.randn(300).reshape(100, 3)
index = pd.date_range(start='2015-01-01', periods=100, freq='MS')
zm3 = pd.DataFrame(data, index=index, columns=['Série 1', 'Série 2', 'Série 3'])
# Série univariada
plt.figure(figsize=(10, 6))
plt.plot(zm3.index, zm3.iloc[:, 0]) # Plota a primeira coluna
plt.title('Série Univariada')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.show()
# Séries separadas (multi.panel = TRUE)
zm3.plot(subplots=True, figsize=(10, 8))
plt.suptitle('Séries Separadas')
plt.show()
# Séries sobrepostas
plt.figure(figsize=(10, 6))
sns.lineplot(data=zm3)
plt.title('Séries Sobrepostas (Seaborn)')
plt.show()
# Séries separadas (ggplot2 - tentativa)
try:
from plotnine import ggplot, aes, geom_line, labs, facet_wrap
zm3_reset = zm3.reset_index().melt(id_vars='index', var_name='series', value_name='value')
plot_ggplot = (ggplot(zm3_reset, aes(x='index', y='value')) +
geom_line() +
facet_wrap('series', ncol=1) + # Separa as séries em painéis
labs(title='Séries Separadas (ggplot2)')
)
print(plot_ggplot)
except ImportError:
print('plotnine não instalado, pulando a plotagem estilo ggplot2.')
11.5.4 tsibble
Via tsibble
.
library(ggplot2)
library(feasts)
zm4 %>%
dplyr::filter(key == 'Series 1') %>%
ggplot2::autoplot(value) # série univariada
Exemplo 11.23 Em Python.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from plotnine import ggplot, aes, geom_line, facet_grid, labs, facet_wrap # Importando facet_wrap
# Redefinindo zm4 (apenas para garantir que ele esteja definido e no formato correto)
np.random.seed(99)
data = np.random.randn(300).reshape(100, 3)
index = pd.date_range(start='2015-01-01', periods=100, freq='MS')
zm4 = pd.DataFrame(data, index=index, columns=['Series 1', 'Series 2', 'Series 3'])
zm4 = zm4.reset_index().melt(id_vars='index', var_name='key', value_name='value')
# zm4 %>% dplyr::filter(key == 'Series 1') %>% ggplot2::autoplot(value) # série univariada
zm4_series1 = zm4[zm4['key'] == 'Series 1']
plot_series1 = (ggplot(zm4_series1, aes(x='index', y='value')) +
geom_line() +
labs(title='Série Univariada (Series 1)'))
print(plot_series1)
# ggplot2::autoplot(zm4, value) + facet_grid(key ~ .) # séries separadas verticalmente
plot_facet_vertical = (ggplot(zm4, aes(x='index', y='value')) +
geom_line() +
facet_grid('key ~ .') +
labs(title='Séries Separadas (Vertical)'))
print(plot_facet_vertical)
# ggplot2::autoplot(zm4, value) + facet_grid(. ~ key) # séries separadas horizontalmente
plot_facet_horizontal = (ggplot(zm4, aes(x='index', y='value')) +
geom_line() +
facet_grid('. ~ key') +
labs(title='Séries Separadas (Horizontal)'))
print(plot_facet_horizontal)
# ggplot2::autoplot(zm4, value) # séries sobrepostas
plot_overlaid = (ggplot(zm4, aes(x='index', y='value', color='key')) +
geom_line() +
labs(title='Séries Sobrepostas'))
print(plot_overlaid)
# ggplot2::autoplot(zm4, value) + facet_wrap(key) # Series separadas por facet_wrap
plot_facet_wrap = (ggplot(zm4, aes(x='index', y='value')) +
geom_line() +
facet_wrap('key') +
labs(title='Séries Separadas (Facet Wrap)'))
print(plot_facet_wrap)
11.5.5 TSstudio
TSstudio (Krispin 2023) fornece um conjunto de ferramentas para análise descritiva e preditiva de dados de séries temporais. Inclui funções para visualização interativa de objetos de séries temporais baseadas em plotly (Sievert 2020) e também funções para automação de previsão de séries temporais.
Exemplo 11.24 Em Python.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# Redefinindo zm1 (apenas para garantir que ele esteja definido)
np.random.seed(99)
data = np.random.randn(300).reshape(100, 3)
index = pd.date_range(start='2015-01-01', periods=100, freq='MS')
zm1 = pd.DataFrame(data, index=index, columns=['Série 1', 'Série 2', 'Série 3'])
# ts_plot(zm1[,1]) # série univariada
plt.figure(figsize=(10, 6))
plt.plot(zm1.index, zm1['Série 1'])
plt.title('Série Univariada (Série 1)')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.show()
# ts_plot(zm1, type = 'multiple') # séries separadas
zm1.plot(subplots=True, figsize=(10, 8))
plt.suptitle('Séries Separadas')
plt.show()
# ts_plot(zm1) # séries sobrepostas
plt.figure(figsize=(10, 6))
sns.lineplot(data=zm1)
plt.title('Séries Sobrepostas')
plt.xlabel('Tempo')
plt.ylabel('Valor')
plt.show()
Exercício 11.9 Leia a seguinte documentação.
11.5.6 Gráficos sazonais
A função stats::monthplot()
representa subséries sazonais de uma série temporal. Para cada temporada (ou outra categoria), é traçada uma série temporal. Esta função e suas correlatas extraem subséries de uma série temporal plotando-as em um quadro. Os métodos ts
, stl
e StructTS
usam a frequência registrada internamente e os horários de início e término para definir a escala e as temporadas.
Exemplo 11.25 Em Python.
import matplotlib.pyplot as plt
import pandas as pd
from statsmodels.datasets import co2
# Carregando o conjunto de dados co2 (equivalente a h02 em fpp2)
data = co2.load_pandas().data
data.index = data.index.to_period('M') # Convertendo o índice para períodos mensais
# Calculando a média mensal
monthly_avg = data.groupby(data.index.month)['co2'].mean()
# Plotando o gráfico de médias mensais
plt.figure(figsize=(10, 6))
plt.bar(monthly_avg.index, monthly_avg.values)
plt.title('Gráfico de Médias Mensais (CO2)')
plt.xlabel('Mês')
plt.ylabel('Média Mensal de CO2')
plt.xticks(monthly_avg.index) # Definindo os ticks do eixo x como os meses
plt.show()
A função forecast::ggseasonplot()
traça um gráfico sazonal conforme descrito na Seção 2.4 de (Rob J. Hyndman and Athanasopoulos 2021). É como um gráfico temporal, exceto que os dados são plotados em relação aos períodos em anos separados.
Exemplo 11.26 Em Python.
import matplotlib.pyplot as plt
import pandas as pd
from statsmodels.datasets import co2
# Carregando o conjunto de dados co2 (equivalente a h02 em fpp2)
data = co2.load_pandas().data
data.index = data.index.to_period('M')
# Criando um DataFrame com as colunas 'Year' e 'Month'
df = pd.DataFrame({
'Year': data.index.year,
'Month': data.index.month,
'CO2': data['co2']
})
# Plotando o gráfico sazonal
fig, axes = plt.subplots(1, 1, figsize=(10, 6), sharex=True)
for year in df['Year'].unique():
df_year = df[df['Year'] == year]
axes.plot(df_year['Month'], df_year['CO2'], label=year)
axes.set_title('Gráfico Sazonal (CO2)')
axes.set_xlabel('Mês')
axes.set_ylabel('CO2')
axes.legend(title='Ano')
plt.show()