In [1]:
%matplotlib notebook

from matplotlib import pyplot
from pandas import Series
from random import randrange
from statsmodels.tsa.seasonal import seasonal_decompose
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import statsmodels.api as sm
import xlrd

plt.rcParams['figure.figsize'] = [7, 3]

In [ ]:
def decompose(file, sheet_names, serie_column, frequency, model, **kwargs):
    # Load spreadsheet
    xl = pd.ExcelFile(file)

    # Select the data sheet 
    df = xl.parse(sheet_names)

    # Select serie and drop string date
    serie = df[['Data',serie_column]]
    
    # Include a "DatetimeIndex" object in the dataset to perform the decompose
    serie.index = pd.DatetimeIndex(freq="m", start=pd.datetime(2011, 3, 1), periods=89)

    # Remove string date
    del serie['Data']
    
    # Change the name of the serie to avoid conflict with numerical names
    serie.columns = ['serie']

    # Convert string to numbers and replace commas
    serie = serie.apply(lambda x: x.str.replace(',','.'))
    serie = serie.apply(pd.to_numeric, errors='ignore')

    # Decompose
    res = sm.tsa.seasonal_decompose(serie.serie.interpolate(), freq=frequency, model=model)

    # Show graph
    resplot = res.plot()

    # Save the image
    resplot.savefig(serie_column + '_seasonal_decompose.png', dpi=600)

Sumário das colunas

Percentual da carteira de crédito com atraso entre 15 e 90 dias

- 21003 - Total - %
- 21004 - Pessoas jurídicas - Total - %
- 21005 - Pessoas físicas - Total - %

Percentual da carteira de crédito com recursos livres com atraso entre 15 e 90 dias

- 21006 - Total - %
- 21007 - Pessoas jurídicas - Total - %
- 21033 - Pessoas físicas - Total - %

Percentual da carteira de crédito com recursos livres com atraso entre 15 e 90 dias

- 21008 - Pessoas jurídicas - Desconto de duplicatas e recebíveis - %
- 21009 - Pessoas jurídicas - Desconto de cheques - %
- 21010 - Pessoas jurídicas - Antecipação de faturas de cartão de crédito - %
- 21011 - Pessoas jurídicas - Capital de giro com prazo de até 365 dias - %
- 21012 - Pessoas jurídicas - Capital de giro com prazo superior a 365 dias - %
- 21013 - Pessoas jurídicas - Capital de giro rotativo - %
- 21014 - Pessoas jurídicas - Capital de giro total - %
- 21015 - Pessoas jurídicas - Conta garantida - %
- 21016 - Pessoas jurídicas - Cheque especial - %
- 21017 - Pessoas jurídicas - Aquisição de veículos - %
- 21018 - Pessoas jurídicas - Aquisição de outros bens - %
- 21019 - Pessoas jurídicas - Aquisição de bens total - %
- 21020 - Pessoas jurídicas - Arrendamento mercantil de veículos - %
- 21021 - Pessoas jurídicas - Arrendamento mercantil de outros bens - %
- 21022 - Pessoas jurídicas - Arrendamento mercantil total - %
- 21023 - Pessoas jurídicas - Vendor - %
- 21024 - Pessoas jurídicas - Compror - %
- 21025 - Pessoas jurídicas - Cartão de crédito rotativo - %
- 21026 - Pessoas jurídicas - Cartão de crédito parcelado - %
- 21027 - Pessoas jurídicas - Cartão de crédito total - %
- 21028 - Pessoas jurídicas - Adiantamento sobre contratos de câmbio (ACC) - %
- 21029 - Pessoas jurídicas - Financiamento a importações - %
- 21030 - Pessoas jurídicas - Financiamento a exportações - %
- 21031 - Pessoas jurídicas - Repasse externo - %
- 21032 - Pessoas jurídicas - Outros créditos livres - %

Percentual da carteira de crédito com recursos livres com atraso entre 15 e 90 dias

- 21034 - Pessoas físicas - Cheque especial - %
- 21035 - Pessoas físicas - Crédito pessoal não consignado - %
- 21036 - Pessoas físicas - Crédito pessoal não consignado vinculado à composição de dívidas - %
- 21037 - Pessoas físicas - Crédito pessoal consignado para trabalhadores do setor privado - %
- 21038 - Pessoas físicas - Crédito pessoal consignado para trabalhadores do setor público - %
- 21039 - Pessoas físicas - Crédito pessoal consignado para aposentados e pensionistas do INSS - %
- 21040 - Pessoas físicas - Crédito pessoal consignado total - %
- 21041 - Pessoas físicas - Crédito pessoal total - %
- 21042 - Pessoas físicas - Aquisição de veículos - %
- 21043 - Pessoas físicas - Aquisição de outros bens - %
- 21044 - Pessoas físicas - Aquisição de bens total - %
- 21045 - Pessoas físicas - Arrendamento mercantil de veículos - %
- 21046 - Pessoas físicas - Arrendamento mercantil de outros bens - %
- 21047 - Pessoas físicas - Arrendamento mercantil total - %
- 21048 - Pessoas físicas - Cartão de crédito rotativo - %
- 21049 - Pessoas físicas - Cartão de crédito parcelado - %
- 21050 - Pessoas físicas - Cartão de crédito total - %
- 21051 - Pessoas físicas - Desconto de cheques - %
- 21052 - Pessoas físicas - Outros créditos livres - %

Percentual da carteira de crédito com recursos direcionados com atraso entre 15 e 90 dias

- 21053 - Total - %
- 21054 - Pessoas jurídicas - Total - %
- 21066 - Pessoas físicas - Total - %

Percentual da carteira de crédito com recursos direcionados com atraso entre 15 e 90 dias

- 21055 - Pessoas jurídicas - Crédito rural com taxas de mercado - %
- 21056 - Pessoas jurídicas - Crédito rural com taxas reguladas - %
- 21057 - Pessoas jurídicas - Crédito rural total - %
- 21058 - Pessoas jurídicas - Financiamento imobiliário com taxas de mercado - %
- 21059 - Pessoas jurídicas - Financiamento imobiliário com taxas reguladas - %
- 21060 - Pessoas jurídicas - Financiamento imobiliário total - %
- 21061 - Pessoas jurídicas - Capital de giro com recursos do BNDES - %
- 21062 - Pessoas jurídicas - Financiamento de investimentos com recursos do BNDES - %
- 21063 - Pessoas jurídicas - Financiamento agroindustrial com recursos do BNDES - %
- 21064 - Pessoas jurídicas - Financiamento com recursos do BNDES total - %
- 21065 - Pessoas jurídicas - Outros créditos direcionados - %

Percentual da carteira de crédito com recursos direcionados com atraso entre 15 e 90 dias

- 21067 - Pessoas físicas - Crédito rural com taxas de mercado - %
- 21068 - Pessoas físicas - Crédito rural com taxas reguladas - %
- 21069 - Pessoas físicas - Crédito rural total - %
- 21070 - Pessoas físicas - Financiamento imobiliário com taxas de mercado - %
- 21071 - Pessoas físicas - Financiamento imobiliário com taxas reguladas - %
- 21072 - Pessoas físicas - Financiamento imobiliário total - %
- 21073 - Pessoas físicas - Capital de giro com recursos do BNDES - %
- 21074 - Pessoas físicas - Financiamento de investimentos com recursos do BNDES - %
- 21075 - Pessoas físicas - Financiamento agroindustrial com recursos do BNDES - %
- 21076 - Pessoas físicas - Financiamento com recursos do BNDES total - %
- 21077 - Pessoas físicas - Microcrédito destinado a consumo - %
- 21078 - Pessoas físicas - Microcrédito destinado a microempreendedores - %
- 21080 - Pessoas físicas - Microcrédito total - %
- 21081 - Pessoas físicas - Outros créditos direcionados - %

Inadimplência da carteira de crédito

- 21082 - Total - %
- 21083 - Pessoas jurídicas - Total - %
- 21084 - Pessoas físicas - Total - %
- 21085 - com recursos livres - Total - %

Inadimplência da carteira de crédito com recursos livres

- 21086 - Pessoas jurídicas - Total - %
- 21087 - Pessoas jurídicas - Desconto de duplicatas e recebíveis - %
- 21088 - Pessoas jurídicas - Desconto de cheques - %
- 21089 - Pessoas jurídicas - Antecipação de faturas de cartão de crédito - %
- 21090 - Pessoas jurídicas - Capital de giro com prazo de até 365 dias - %
- 21091 - Pessoas jurídicas - Capital de giro com prazo superior a 365 dias - %
- 21092 - Pessoas jurídicas - Capital de giro rotativo - %
- 21093 - Pessoas jurídicas - Capital de giro total - %
- 21094 - Pessoas jurídicas - Conta garantida - %
- 21105 - Pessoas jurídicas - Cartão de crédito parcelado - %
- 21106 - Pessoas jurídicas - Cartão de crédito total - %
- 21107 - Pessoas jurídicas - Adiantamento sobre contratos de câmbio (ACC) - %
- 21108 - Pessoas jurídicas - Financiamento a importações - %
- 21109 - Pessoas jurídicas - Financiamento a exportações - %
- 21110 - Pessoas jurídicas - Repasse externo - %
- 21111 - Pessoas jurídicas - Outros créditos livres - %

Inadimplência da carteira de crédito com recursos livres

- 21112 - Pessoas físicas - Total - %
- 21113 - Pessoas físicas - Cheque especial - %
- 21114 - Pessoas físicas - Crédito pessoal não consignado - %
- 21115 - Pessoas físicas - Crédito pessoal não consignado vinculado à composição de dívidas - %
- 21116 - Pessoas físicas - Crédito pessoal consignado para trabalhadores do setor privado - %
- 21117 - Pessoas físicas - Crédito pessoal consignado para trabalhadores do setor público - %
- 21118 - Pessoas físicas - Crédito pessoal consignado para aposentados e pensionistas do INSS - %
- 21119 - Pessoas físicas - Crédito pessoal consignado total - %
- 21120 - Pessoas físicas - Crédito pessoal total - %
- 21121 - Pessoas físicas - Aquisição de veículos - %
- 21122 - Pessoas físicas - Aquisição de outros bens - %
- 21123 - Pessoas físicas - Aquisição de bens total - %
- 21124 - Pessoas físicas - Arrendamento mercantil de veículos - %
- 21125 - Pessoas físicas - Arrendamento mercantil de outros bens - %
- 21126 - Pessoas físicas - Arrendamento mercantil total - %
- 21127 - Pessoas físicas - Cartão de crédito rotativo - %
- 21128 - Pessoas físicas - Cartão de crédito parcelado - %
- 21129 - Pessoas físicas - Cartão de crédito total - %
- 21130 - Pessoas físicas - Desconto de cheques - %
- 21131 - Pessoas físicas - Outros créditos livres - %

Inadimplência da carteira de crédito com recursos direcionados

- 21132 - Total - %
- 21133 - Pessoas jurídicas - Total - %
- 21145 - Pessoas físicas - Total - %

Inadimplência da carteira de crédito com recursos direcionados

- 21134 - Pessoas jurídicas - Crédito rural com taxas de mercado - %
- 21135 - Pessoas jurídicas - Crédito rural com taxas reguladas - %
- 21136 - Pessoas jurídicas - Crédito rural total - %
- 21137 - Pessoas jurídicas - Financiamento imobiliário com taxas de mercado - %
- 21138 - Pessoas jurídicas - Financiamento imobiliário com taxas reguladas - %
- 21139 - Pessoas jurídicas - Financiamento imobiliário total - %
- 21140 - Pessoas jurídicas - Capital de giro com recursos do BNDES - %
- 21141 - Pessoas jurídicas - Financiamento de investimentos com recursos do BNDES - %
- 21142 - Pessoas jurídicas - Financiamento agroindustrial com recursos do BNDES - %
- 21143 - Pessoas jurídicas - Financiamento com recursos do BNDES total - %
- 21144 - Pessoas jurídicas - Outros créditos direcionados - %

Inadimplência da carteira de crédito com recursos direcionados

- 21146 - Pessoas físicas - Crédito rural com taxas de mercado - %
- 21147 - Pessoas físicas - Crédito rural com taxas reguladas - %
- 21148 - Pessoas físicas - Crédito rural total - %
- 21149 - Pessoas físicas - Financiamento imobiliário com taxas de mercado - %
- 21150 - Pessoas físicas - Financiamento imobiliário com taxas reguladas - %
- 21151 - Pessoas físicas - Financiamento imobiliário total - %
- 21152 - Pessoas físicas - Capital de giro com recursos do BNDES - %
- 21153 - Pessoas físicas - Financiamento de investimentos com recursos do BNDES - %
- 21154 - Pessoas físicas - Financiamento agroindustrial com recursos do BNDES - %
- 21155 - Pessoas físicas - Financiamento com recursos do BNDES total - %
- 21156 - Pessoas físicas - Microcrédito destinado a consumo - %
- 21157 - Pessoas físicas - Microcrédito destinado a microempreendedores - %
- 21159 - Pessoas físicas - Microcrédito total - %
- 21160 - Pessoas físicas - Outros créditos direcionados - %

In [ ]:
# Generate graph 
decompose('inadimplencia.xlsx', 'debt', '21003', 12, 'additive')

In [2]:
file = 'inadimplencia.xlsx'
sheet_names = 'debt'
serie_column = '21003'

# Load spreadsheet
xl = pd.ExcelFile(file)

# Select the data sheet 
df = xl.parse(sheet_names)

# Select serie and drop string date
serie = df[['Data',serie_column]]
    
# Include a "DatetimeIndex" object in the dataset to perform the decompose
serie.index = pd.DatetimeIndex(freq="m", start=pd.datetime(2011, 3, 1), periods=89)

# Remove string date
del serie['Data']
    
# Change the name of the serie to avoid conflict with numerical names
serie.columns = ['serie']

# Convert string to numbers and replace commas
serie = serie.apply(lambda x: x.str.replace(',','.'))
serie = serie.apply(pd.to_numeric, errors='ignore')



# # simple line plot
# plt.plot(serie)
# plt.title('Serie', fontsize=24)
# plt.ylabel('%')
# plt.xlabel('Year')
# plt.show()



# # Show graph
# resplot = res.plot()

# # Save the image
# resplot.savefig(serie_column + '_seasonal_decompose.png', dpi=600)

In [3]:
y = serie

In [ ]:
# define figure and axes
fig, axes = plt.subplots(2, 2, sharey=False, sharex=False);
fig.set_figwidth(9);
fig.set_figheight(5);
 
# push data to each ax
#upper left
axes[0][0].plot(y.index, y, label='Original');
axes[0][0].plot(y.index, y.rolling(window=4).mean(), label='4-Months Rolling Mean', color='crimson');
axes[0][0].set_xlabel("Years");
axes[0][0].set_ylabel("Passengers");
axes[0][0].set_title("4-Months Moving Average");
axes[0][0].legend(loc='best');
 
# upper right
axes[0][1].plot(y.index, y, label='Original')
axes[0][1].plot(y.index, y.rolling(window=6).mean(), label='6-Months Rolling Mean', color='crimson');
axes[0][1].set_xlabel("Years");
axes[0][1].set_ylabel("Passengers");
axes[0][1].set_title("6-Months Moving Average");
axes[0][1].legend(loc='best');
 
# lower left
axes[1][0].plot(y.index, y, label='Original');
axes[1][0].plot(y.index, y.rolling(window=8).mean(), label='8-Months Rolling Mean', color='crimson');
axes[1][0].set_xlabel("Years");
axes[1][0].set_ylabel("Passengers");
axes[1][0].set_title("8-Months Moving Average");
axes[1][0].legend(loc='best');
 
# lower right
axes[1][1].plot(y.index, y, label='Original');
axes[1][1].plot(y.index, y.rolling(window=12).mean(), label='12-Months Rolling Mean', color='crimson');
axes[1][1].set_xlabel("Years");
axes[1][1].set_ylabel("Passengers");
axes[1][1].set_title("12-Months Moving Average");
axes[1][1].legend(loc='best');
plt.tight_layout();
plt.show()

In [4]:
window=12

# calculate moving averages
rolling_mean = y.rolling(12).mean()
rolling_std = y.rolling(12).std()
 
# plot statistics
plt.plot(y, label='Original')
plt.plot(rolling_mean, color='crimson', label='Moving average mean')
plt.plot(rolling_std, color='darkslateblue', label='Moving average standard deviation')
plt.legend(loc='best')
plt.title('Rolling Mean & Standard Deviation')
plt.show(block=False)



In [ ]:


In [ ]:


In [7]:
# create new columns to DataFrame by extracting a string representing 
# the time under the control of an explicit format string
# '%b' extracts the month in locale's abbreviated name from the index

y['Month'] = y.index.strftime('%b')
y['Year'] = y.index.year

In [8]:
# create nice axes names
month_names = pd.date_range(start='2011-03-01', periods=12, freq='MS').strftime('%b')

In [ ]:
# reshape data using 'Year' as index and 'Month' as column
df_piv_line = y.pivot(index='Month', columns='Year', values='serie')

In [17]:
df_piv_line = df_piv_line.reindex(index=month_names)

In [18]:
# create line plot
df_piv_line.plot(colormap='jet')
plt.title('Seasonal Effect per Month', fontsize=24)
plt.ylabel('%')
plt.legend(loc='best', bbox_to_anchor=(1.0, 0.5))
plt.show()



In [ ]:


In [21]:
# # create new columns to DataFrame by extracting a string representing 
# # the time under the control of an explicit format string
# # '%b' extracts the month in locale's abbreviated name from the index
# df = pd.read_csv('./data/passengers.csv', header=0, index_col=0, parse_dates=True, sep=';')
# df['Month'] = df.index.strftime('%b')
# df['Year'] = df.index.year
 
# create nice axes names
month_names = pd.date_range(start='2011-03-01', periods=12, freq='MS').strftime('%b')
 
# reshape date
df_piv_box = y.pivot(index='Year', columns='Month', values='serie')
 
# reindex pivot table with 'month_names'
df_piv_box = df_piv_box.reindex(columns=month_names)
 
# create a box plot
fig, ax = plt.subplots();
df_piv_box.plot(ax=ax, kind='box');
ax.set_title('Seasonal Effect per Month', fontsize=24);
ax.set_xlabel('Month');
ax.set_ylabel('Passengers');
ax.xaxis.set_ticks_position('bottom');
fig.tight_layout();
plt.show()