<jupyter_start><jupyter_text>Importando as Bibliotecas<jupyter_code>import pandas as pd
import pandera as pa<jupyter_output><empty_output><jupyter_text>Extraindo e Limpando os dados<jupyter_code># Informando os valores ausentes
valores_ausentes = ['**','****','*****','###!','####','NULL']

# não esquecer de colocar o separador, se não o sistema não reconhece / parse_date é para converter o tipo de dados de object para datetime
df = pd.read_csv("ocorrencia_2010_2020.csv", sep=";", parse_dates=['ocorrencia_dia'], dayfirst=True, na_values=valores_ausentes)

# Selecionando somente as colunas que quero manipular
df = df[['codigo_ocorrencia','codigo_ocorrencia2','ocorrencia_classificacao','ocorrencia_cidade','ocorrencia_uf','ocorrencia_aerodromo','ocorrencia_dia','ocorrencia_hora','total_recomendacoes']]

df.head(10)<jupyter_output><empty_output><jupyter_text>Validando os Dados<jupyter_code># O Pandera serve para validar os tipos de dados nas colunas

schema = pa.DataFrameSchema(
    columns ={
        "codigo": pa.Column(pa.Int, required= False), #Informando que esta coluna não é requirida, evitando erro caso ela não esteja no dataset 
        "codigo_ocorrencia": pa.Column(pa.Int),
        "codigo_ocorrencia2": pa.Column(pa.Int),
        "ocorrencia_classificacao": pa.Column(pa.String),
        "ocorrencia_cidade": pa.Column(pa.String),
        "ocorrencia_uf": pa.Column(pa.String, pa.Check.str_length(2,2), nullable=True), # validar o tamanho da coluna
        "ocorrencia_aerodromo": pa.Column(pa.String, nullable=True),
        "ocorrencia_dia": pa.Column(pa.DateTime),
        "ocorrencia_hora": pa.Column(pa.String, pa.Check.str_matches(r'^([0-1]?[0-9]|[2][0-3]):([0-5][0-9])(:[0-5][0-9])?$'), nullable=True), # validando a hora
        "total_recomendacoes": pa.Column(pa.Int)
    }
)
schema.validate(df)
df.dtypes
df.head()
# O loc busca pelo indice ou nome da coluna
df.loc[1]

# o iloc busca pelo indice da linha ou coluna

df.iloc[1,3]

# Exibe A ÚLTIMA LINHA DO DATASET, SÓ FUNCIONAR COM O ILOC, NÃO FUNCIONA USAR INDICE -1 COM O LOC
df.iloc[-1]
# EXIBE ATÉ O 15 PORQUE TRABALHA COM OS VALORES Do LABEL

df.loc[10:15]
# EXIBE ATÉ O 14 PORQUE TRABALHA COM ÍNDICE

df.iloc[10:15]
df.loc[:, 'ocorrencia_uf']
df['ocorrencia_uf']
df.isna().sum()
df.isnull().sum()
# Localizando valores nulos em uma determinada coluna
# Sintaxe1: df.loc[df.ocorrencia_ud.isnull()]
# Sintaxe2: abaixo

filtro_uf = df.ocorrencia_uf.isnull()

df.loc[filtro_uf]

filtro_aerodromo = df.ocorrencia_aerodromo.isnull()

df.loc[filtro_aerodromo]
filtro_hora = df.ocorrencia_hora.isnull()

df.loc[filtro_hora]
# O que não tiver igual o valor cheio, é porque é um valor nulo
df.count()
# Ocorrências com mais de 10 recomendações

filtro_ocorrencia_10 = df.total_recomendacoes > 10

df.loc[filtro_ocorrencia_10]

# Ocorrências com mais de 10 recomendações
# Selecionado colunas

filtro_ocorrencia_10 = df.total_recomendacoes > 10

df.loc[filtro_ocorrencia_10, ['ocorrencia_cidade', 'total_recomendacoes']]
# Filtrando Classificaçao =  INCIDENTE GRAVE
# Sintaxe1: df.loc[df.ocorrencia_classificacao == 'INCIDENTE GRAVE']

filtro_classificacao = df.ocorrencia_classificacao == 'INCIDENTE GRAVE'

df.loc[filtro_classificacao, ['ocorrencia_cidade', 'total_recomendacoes']]
# Filtrando UF = AM
# Sintaxe1: df.loc[df.ocorrencia_classificacao == 'INCIDENTE GRAVE']

filtro_uf = df.ocorrencia_uf == 'AM'

df.loc[filtro_uf, ['ocorrencia_cidade', 'ocorrencia_uf', 'total_recomendacoes']]
# Filtro composto com a CLASSIFICAÇÃO = 'INCIDENTE GRAVE' e UF = 'AM'
# Sintaxe Padrão: df.loc[filtro_classificacao & filtro_uf]

filtro_classificacao = df.ocorrencia_classificacao == 'INCIDENTE GRAVE'
filtro_uf = df.ocorrencia_uf == 'AM'

df.loc[filtro_classificacao & filtro_uf, ['ocorrencia_cidade', 'ocorrencia_uf', 'total_recomendacoes']]

#df.loc[filtro_classificacao, ['ocorrencia_cidade', 'total_recomendacoes']]
# Sintaxe Padrão: df.loc[filtro_classificacao & filtro_uf]

df.loc[filtro_classificacao & filtro_uf]
df.head()
# App para buscar a Classificação do Incidente E a Unidade Federativa

classificacao = input('Informe a Classificação do Incidente: ')
uf = input('Informe a Unidade Federativa do Incidente: ')

filtro_classificacao = df.ocorrencia_classificacao == classificacao
filtro_uf = df.ocorrencia_uf == uf

df.loc[filtro_classificacao & filtro_uf, ['ocorrencia_cidade', 'ocorrencia_uf', 'total_recomendacoes']]

# App para buscar a Classificação do Incidente OU a Unidade Federativa

classificacao = input('Informe a Classificação do Incidente: ')
uf = input('Informe a Unidade Federativa do Incidente: ')

filtro_classificacao = df.ocorrencia_classificacao == classificacao
filtro_uf = df.ocorrencia_uf == uf

df.loc[filtro_classificacao | filtro_uf, ['ocorrencia_cidade', 'ocorrencia_uf', 'total_recomendacoes']]

# App para buscar a (Classificação do Incidente = INCIDENTE GRAVE OU INCIDENTE) E Unidade Federativa = SP

# tem que indicar a prioridade no filtro OU utilizando parênteses

filtro_classificacao = (df.ocorrencia_classificacao == 'INCIDENTE GRAVE') | (df.ocorrencia_classificacao == 'INCIDENTE')
filtro_uf = df.ocorrencia_uf == 'SP'

df.loc[filtro_classificacao & filtro_uf]

# Outra forma de realizar o mesmo filtro anterior é usando a função ISIN
# Com esta opção é possível inserir vários filtros

filtro_classificacao = df.ocorrencia_classificacao.isin(['INCIDENTE GRAVE', 'INCIDENTE'])
filtro_uf = df.ocorrencia_uf.isin(['SP', 'AM'])

df.loc[filtro_classificacao & filtro_uf]
# Ocorrências cuja cidade iniciem com a letra C

filtro_c = df.ocorrencia_cidade.str[0] == 'C'

df.loc[filtro_c]
# Ocorrências cuja cidade terminam com a letra A

filtro_a = df.ocorrencia_cidade.str[-1] == 'A'

df.loc[filtro_a]
# Ocorrências cuja cidade terminam com 'MA'
# Fatiando do penúltimo até o final

filtro_ma = df.ocorrencia_cidade.str[-2:] == 'MA'

df.loc[filtro_ma]
# FILTRA TODAS PALAVRAS QUE CONTÉM 'MA' INDEPENDENTE DA LOCALIZAÇÃO

filtro_ma_contains = df.ocorrencia_cidade.str.contains('MA')

df.loc[filtro_ma_contains]
#FILTRA TODAS PALAVRAS QUE CONTÉM 'MA' OU 'US' INDEPENDENTE DA LOCALIZAÇÃO

filtro_ma_us_contains = df.ocorrencia_cidade.str.contains('MA|US')

df.loc[filtro_ma_contains]
# Ocorrência do Ano 2015

filtro_ano = df.ocorrencia_dia.dt.year == 2015

df.loc[filtro_ano]
# Ocorrência do Ano 2015 e mês 5

filtro_ano = df.ocorrencia_dia.dt.year == 2015
filtro_mes = df.ocorrencia_dia.dt.month == 5

df.loc[filtro_ano & filtro_mes]
# Ocorrência do Ano 2015 e mês 5, SOMENTE EM UMA LINHA, NÃO ESQUECER DE INSERIR A PRIORIDADE COM ()

filtro_ano_mes = (df.ocorrencia_dia.dt.year == 2015) & (df.ocorrencia_dia.dt.month == 5)

df.loc[filtro_ano_mes]
# Ocorrência do Ano 2015, mês 5 e dia 20

filtro_ano = df.ocorrencia_dia.dt.year == 2015
filtro_mes = df.ocorrencia_dia.dt.month == 5
filtro_ano_mes_dia = df.ocorrencia_dia.dt.day == 20

df.loc[filtro_ano & filtro_mes & filtro_ano_mes_dia]
# Ocorrência do Ano 2015, mês 5 e dia 20 até dia 30

filtro_ano = df.ocorrencia_dia.dt.year == 2015
filtro_mes = df.ocorrencia_dia.dt.month == 5
filtro_ano_mes_dia = (df.ocorrencia_dia.dt.day >= 20) & (df.ocorrencia_dia.dt.day <= 30)

df.loc[filtro_ano & filtro_mes & filtro_ano_mes_dia]
# Criando uma nova coluna e concatenando o dia e a hora da ocorrência
# É necessário converter a data para string
# Por último converte o valor novamente para uma data usando o pd.to_datetime

df['ocorrencia_dia_hora'] = pd.to_datetime(df.ocorrencia_dia.astype(str) + ' ' + df.ocorrencia_hora)
df.head()
filtro1 = df.ocorrencia_dia_hora >= '2010-01-03 11:00:00'
filtro2 = df.ocorrencia_dia_hora <= '2010-01-08 13:00:00'

df.loc[filtro1 & filtro2]
# Ocorrências do ano 2015 e mês 03
filtro_ano = df.ocorrencia_dia.dt.year == 2015
filtro_dia = df.ocorrencia_dia.dt.day == 3

df_2015_03 = df.loc[filtro_ano & filtro_dia]
df_2015_03
df_2015_03.count()
# Agrupando do uma determinada categoria

df_2015_03.groupby(['codigo_ocorrencia']).count()

# Contando por código de ocorrência

df_2015_03.groupby(['codigo_ocorrencia']).codigo_ocorrencia.count()
# Contando por ocorrencia_classificacao

df_2015_03.groupby(['ocorrencia_classificacao']).codigo_ocorrencia.count()
df_2015_03.groupby(['ocorrencia_classificacao']).ocorrencia_aerodromo.count()
# É MELHOR CONTAR PELO SIZE, POIS ELE CONTA O NUMERO DE LINHAS EM UMA COLUNA

df_2015_03.groupby(['ocorrencia_classificacao']).size()

# Ordenando do menor para o maior

df_2015_03.groupby(['ocorrencia_classificacao']).size().sort_values()
# Ordenando do maior para o menor

df_2015_03.groupby(['ocorrencia_classificacao']).size().sort_values(ascending=False)
# Agrupando por região Sudeste
filtro1 = df.ocorrencia_dia.dt.year == 2010
filtro2 = df.ocorrencia_uf.isin(['SP', 'MG', 'ES', 'RJ'])

df_sudeste_2010 = df.loc[filtro1 & filtro2]
df_sudeste_2010
# Para poder realizar a contagem de algum valor, é necessário agrupar

df_sudeste_2010.groupby('ocorrencia_classificacao').count()

# É MELHOR USAR O SIZE!!

df_sudeste_2010.groupby(['ocorrencia_classificacao', 'ocorrencia_uf']).size()

df_sudeste_2010.groupby(['ocorrencia_classificacao', 'ocorrencia_uf']).size().sum()
# É MELHOR USAR O SIZE!!

df_sudeste_2010.groupby(['ocorrencia_cidade', 'ocorrencia_uf', 'ocorrencia_classificacao']).size()

# É MELHOR USAR O SIZE!!

df_sudeste_2010.groupby(['ocorrencia_cidade', 'ocorrencia_uf', 'ocorrencia_classificacao']).size().sort_values(ascending=False)

# Contando Ocorrência por Cidades

df_sudeste_2010.groupby(['ocorrencia_cidade']).size().sort_values(ascending=False)

filtro_rio = df_sudeste_2010.ocorrencia_cidade == 'RIO DE JANEIRO'

df_sudeste_2010.loc[filtro_rio].total_recomendacoes.sum()
# contage de ocrrencia por cidade

df_sudeste_2010.groupby(['ocorrencia_cidade']).total_recomendacoes.sum().sort_values(ascending=False)
# contagem do total de recomendações por aerodromo

df_sudeste_2010.groupby(['ocorrencia_aerodromo']).total_recomendacoes.sum().sort_values(ascending=False)

# contagem do total de recomendações por aerodromo
# SEM EXCLUIR OS NAs

df_sudeste_2010.groupby(['ocorrencia_aerodromo'], dropna = False).total_recomendacoes.sum().sort_values(ascending=False)

# selecionando dados da região sudeste que tenham recomendações

filtro_sudeste_2010 = df_sudeste_2010.total_recomendacoes > 0

df_sudeste_2010.groupby(['ocorrencia_cidade']).total_recomendacoes.sum().sort_values(ascending=False)

# selecionando dados da região sudeste que tenham recomendações

filtro_sudeste_2010 = df_sudeste_2010.total_recomendacoes > 0

df_sudeste_2010.loc[filtro_sudeste_2010].groupby(['ocorrencia_cidade']).total_recomendacoes.sum().sort_values(ascending=False)

# Agrupanfo o total de recomendaçoes por meses

df_sudeste_2010.loc[filtro_sudeste_2010].groupby(['ocorrencia_cidade', df_sudeste_2010.ocorrencia_dia.dt.month]).total_recomendacoes.sum().sort_values(ascending=False)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11559362623192411, 'fraction_numerical': 0.030763562678456296, 'mean_word_length': 6.321645313553607, 'pattern_counts': {'":': 10, '<': 15, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '134638', 'license': 'MIT', 'n_tokens_mistral': 4889, 'n_tokens_neox': 4556, 'n_words': 851, 'path': 'Transformacao_Agracacao.ipynb', 'repo_name': 'danielcanavarro/ETL_BootCamp_Carrefour', 'size': '10857'}