<jupyter_start><jupyter_text>Projeto detecção de ações discrepantes  A distribuição de ações (processos jurídicos) é realizada diariamente durante todo o ano, de forma eletrônica atualmente. Algumas fraudes podem ocorrer durante este processo, pois alguns advogados possuem a prática de distribuir a mesma ação ou ações com as mesmas partes diversas vezes, com o objetivo que o processo siga para um ator jurídico do seu interesse. Outro fator que pode acontecer são diversas distribuições em um único dia ou dias próximos devido a demissões em massa. Com este projeto, objetivou-se criar um sistema capaz de identificar distribuição de ações em massa. Os dados utilizados neste exemplo são oriundos de uma empresa real e por este motivo nomes que possam identificar a empresa serão substituídos por "xxxxx".<jupyter_code>import numpy as np
import pandas as pd
import psycopg2
import statistics

import carga_s3 as int_s3
import projeto_mari as mari
import process_sqc as int_sqc
settings = {
    'database':'base_xxxxx',
    'user':'postgres',
    'password':'******',
    'host':'localhost',
    'port':'*****'
}
conn = psycopg2.connect(**settings)
df = pd.read_sql("SELECT * FROM processos", con=conn)
df['trimestre'] = df.data_distribuicao_tratada.apply(lambda row: row.quarter)
df['data_distribuicao_tratada'] = df.data_distribuicao_tratada.apply(lambda row: str(row))
df = mari.clear_datas(df)
df['data_tratada'] = mari.get_data(df)
df['ano'] = mari.year_get(df)
df['mes'] = mari.month_get(df)
#######################TEST##########################
df1 = df[['numero', 'data_tratada', 'ano', 'mes', 'uf', 'comarca_tratada', 'juiz', 'valor_acao', 'vara_tipo', 'vara_numero']]
df1.to_csv("dados_xxxxx_tratados.csv", index=False)
df2 = df1.groupby(['data_tratada']).size().reset_index(name='acoes')
df2.head()
df2.to_csv("dados_xxxxxxx_tratados.csv", index=False)
####################################################
df1 = df[df['ano'] == '2018']
df_t1 = df1[df1['trimestre'] == 1.0]
df_t2 = df1[df1['trimestre'] == 2.0]
df_t3 = df1[df1['trimestre'] == 3.0]
df_t4 = df1[df1['trimestre'] == 4.0]
def shewhart_chart(df,m):
    factors = pd.read_csv("factors_control_chart.csv")
    
    #Control Limits for the R Chart
    r_mean = df['Ampl'].mean()
    ucl_r = factors['D4'][m-2]*r_mean
    lcl_r = factors['D3'][m-2]*r_mean
    
    #Control Limits for the X Chart
    x_mean = df['Mean'].mean()
    ucl_x = x_mean + factors['A2'][m-2]*r_mean
    lcl_x = x_mean - factors['A2'][m-2]*r_mean
    
    return(ucl_r, ucl_x) 
    
    
def mari_summary(df, name, window=30, step=30):
    """
    Funcao para extrair valores extremos da distribuicao de acoes por estado.
    df = dataframe
    name = coluna que sera filtrada
    window = tamanho da janela movel
    step = tamanho do passo da janela movel - se igual a window temos uma janela tradicional (step <= window)
    """
    
    df6 = pd.DataFrame({})
    comarcas_frames = pd.DataFrame({})
    empty_sample = 0
    
    for i in df[f'{name}'].unique():
        df1 = df[df[f'{name}'] == i]
        df2 = df1.groupby('data_tratada').size().reset_index(name='acoes')
        limit_inf = 0
        limit_sup = window
        n = 0  #numero de janelas
        m = window #numero de amostras contidas na janela
        df4 = pd.DataFrame({})
        
        
        while (limit_sup < len(df2['data_tratada'])):
            df3 = pd.DataFrame({f'{name}':[i],
                                'SumAcoes':df2['acoes'][limit_inf:limit_sup].sum(),
                                'DataRangeMax':df2['data_tratada'][limit_inf]+'><'+df2['data_tratada'][limit_sup],
                                'Mean':[df2['acoes'][limit_inf:limit_sup].mean()],
                                'Ampl':[df2['acoes'][limit_inf:limit_sup].max() - df2['acoes'][limit_inf:limit_sup].min()],
                                'Median':[statistics.median(df2['acoes'][limit_inf:limit_sup])]})
            df4 = pd.concat([df4,df3])
            limit_inf += step
            limit_sup += step
            n += 1
        if not df4.empty:
            if n >= 10:
                ucl_r, ucl_x = shewhart_chart(df4,m)
                df5 = df4[((df4['Mean'] >= ucl_x) | (df4['Ampl'] >= ucl_r)) & (df4['Ampl'] >= 4)]
                df6 = pd.concat([df6, df5])
            else:
                df2['comarca_tratada'] = np.repeat(i, [len(df2.acoes)], axis=0)
                comarcas_frames = pd.concat([comarcas_frames, df2])
                empty_sample += 1
        else:
            df2['comarca_tratada'] = np.repeat(i, [len(df2.acoes)], axis=0)
            comarcas_frames = pd.concat([comarcas_frames, df2])
            empty_sample += 1
        
    comarcas_frames = comarcas_frames[comarcas_frames['acoes']>1] 
    geral_ucl = int_sqc.shewhart_moving_range(comarcas_frames.acoes)
    df_frames = comarcas_frames[comarcas_frames['acoes'] > geral_ucl]
            
    return  df6, df_frames, comarcas_frames<jupyter_output><empty_output><jupyter_text>Teste Trimestre 1-2018<jupyter_code>result_t1, resultb_t1, c_t1 = mari_summary(df_t1, 'comarca_tratada', window=3, step=2)
result_t1
resultb_t1<jupyter_output><empty_output><jupyter_text>Cusum tabular<jupyter_code>df_res, H = int_sqc.cusum_standardized(xi=c_t1.acoes)
df_res['comarca_tratada'] = c['comarca_tratada']
df_res[df_res['ci_pos']>H]<jupyter_output><empty_output><jupyter_text>EWMA<jupyter_code>df_res, H = int_sqc.ewma_chart(xi=c_t1.acoes)
df_res['comarca_tratada'] = c_t1['comarca_tratada']
df_res[df_res['ucl']>H]
mari.get_zoom(df, 'comarca_tratada', 'NITERÓI', '2018-01-01','2018-03-31')<jupyter_output><empty_output><jupyter_text>Teste Trimestre 2-2018<jupyter_code>result_t2, resultb_t2, c_t2 = mari_summary(df_t2, 'comarca_tratada', window=3, step=2)
result_t2
resultb_t2<jupyter_output><empty_output><jupyter_text>Cusum tabular<jupyter_code>df_res, H = int_sqc.cusum_standardized(xi=c_t1.acoes)
df_res['comarca_tratada'] = c['comarca_tratada']
df_res[df_res['ci_pos']>H]
mari.get_zoom(df, 'comarca_tratada', 'SÃO JOÃO DE MERITI', '2018-04-01','2018-06-31')<jupyter_output><empty_output><jupyter_text>Teste Trimestre 3 - 2018<jupyter_code>result_t3, resultb_t3, c_t3 = mari_summary(df_t3, 'comarca_tratada', window=3, step=2)
result_t3
resultb_t3
mari.get_zoom(df, 'comarca_tratada', 'NILÓPOLIS', '2018-07-01','2018-09-31')<jupyter_output><empty_output><jupyter_text>Teste Trimestre 4 - 2018<jupyter_code>result_t4, resultb_t4, c_t4 = mari_summary(df_t4, 'comarca_tratada', window=3, step=2)
result_t4
resultb_t4<jupyter_output><empty_output><jupyter_text>Cusum tabular<jupyter_code>df_res, H = int_sqc.cusum_standardized(xi=c_t4.acoes)
df_res['comarca_tratada'] = c_t4['comarca_tratada']
df_res[df_res['ci_pos']>H]<jupyter_output><empty_output><jupyter_text>EWMA<jupyter_code>df_res, H = int_sqc.ewma_chart(xi=c_t4.acoes)

df_res['comarca_tratada'] = c_t4['comarca_tratada']
df_res[df_res['ucl']>H]
mari.get_zoom(df, 'comarca_tratada', 'NILÓPOLIS', '2018-10-01','2018-12-31')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15407682421819222, 'fraction_numerical': 0.03098671997715265, 'mean_word_length': 4.27012791572611, 'pattern_counts': {'":': 0, '<': 44, '<?xml version=': 0, '>': 53, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '159091', 'license': 'MIT', 'n_tokens_mistral': 2915, 'n_tokens_neox': 2824, 'n_words': 477, 'path': 'Testes_mari_SHEWHART.ipynb', 'repo_name': 'WesleyJw/Deteccao-Numero-de-Acoes', 'size': '7003'}