<jupyter_start><jupyter_text>Construção da base<jupyter_code>import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns

import datetime as dt
# número de linhas na base
n = 150<jupyter_output><empty_output><jupyter_text>________ Base de gastos __Coluna de datas__<jupyter_code># criando série de datas aleatórios em janeiro
# https://stackoverflow.com/questions/50559078/generating-random-dates-within-a-given-range-in-pandas

def random_dates(start, end, n, unit='D'):

    ndays = (end - start).days + 1
    
    dates = pd.to_timedelta(np.random.rand(n) * ndays, unit=unit) + start
    
    return pd.Series(dates).sort_values().apply(lambda x: x.date()).reset_index(drop=True)

np.random.seed(42)
start = pd.to_datetime('2021-01-01')
end = pd.to_datetime('2021-01-31')

# série de datas aleatórias, ordenadas
dates = random_dates(start, end, n)

# deixa no formato br
dates = dates.apply(lambda x: dt.datetime.strftime(x, "%d-%m-%y"))

dates<jupyter_output><empty_output><jupyter_text>__Coluna de nome de clientes__<jupyter_code># alguns dos nomes mais comuns no brasil https://pt.wikipedia.org/wiki/Lista_de_prenomes_mais_comuns_no_Brasil

nomes1 = "<NAME>".split()
nomes2 = "<NAME> <NAME>".split()

# série de nomes completa
nomes_inicial = pd.Series(nomes1 + nomes2)

# sobrenomes mais comuns
# https://www.maioresemelhores.com/sobrenomes-mais-comuns-no-brasil/
sobrenomes = "<NAME>".split()
sobrenomes = pd.Series(sobrenomes).sample(nomes_inicial.shape[0], replace=True).reset_index(drop=True)

# juntando nomes e sobrenomes
nomes_inicial = nomes_inicial + " " + sobrenomes

# série de nomes amostrados aleatoriamente
nomes = nomes_inicial.sample(n, random_state=42, replace=True).reset_index(drop=True)

# check - tudo bem se tiver mais operações de certos clientes
display(nomes.value_counts())

nomes.value_counts().sum() == n<jupyter_output><empty_output><jupyter_text>__Colunas de gastos e número de parcelas__<jupyter_code># gerando distribuição log-normal com média e std 1k
# tem que corrigir os parâmetros 
# vide https://stackoverflow.com/questions/51609299/python-np-lognormal-gives-infinite-results-for-big-average-and-st-dev

mu, sigma = 0.8e3, 0.8e3

# corrigindo os parâmetros
normal_std = np.sqrt(np.log(1 + (sigma/mu)**2))
normal_mean = np.log(mu) - normal_std**2 / 2

# criando a série
# arredonda pra duas casas decimais
np.random.seed(42)
gastos = pd.Series(np.random.lognormal(normal_mean, 
                                       normal_std, 
                                       n)).apply(lambda x: round(float(x), 2))

# pra deixar mais realístico, vamos deixar 40% dos gastos como números inteiros
ints = gastos.sample(frac=0.4).apply(lambda x: round(x, 0))
gastos.loc[ints.index] = ints

# check.. média e std próximos de 1k
display(gastos.describe())

# tem que se parecer com uma log-normal
sns.histplot(gastos, kde=True)
plt.show()

#########################################################################################

# número de parcelas
# se gasto for menor que 100 reais, uma parcela
# se for entre 100 e a média (1e3), parcela aleatória entre 1 e 5
# se for maior que a média, parcela entre 1 e 11 (não 12 vezes pra não passar do ano)
parcelas = gastos.apply(lambda x: 
                        1 if x < 100 else
                        (np.random.randint(1, 6) if x < mu else np.random.randint(1, 12)))

display(parcelas.describe())

# #########################################################################################

# pra dificultar rsrs
gastos.loc[ints.index] = gastos.loc[ints.index].apply(lambda x: str(x) + "0")
gastos = gastos.apply(lambda x: "R$ " + str(x)).apply(lambda x: x.replace(".", ","))
# construindo o dataframe

df_gastos = pd.DataFrame()

df_gastos["nm_cliente"] = nomes

df_gastos["valor_operacao"] = gastos

df_gastos["num_parcelas"] = parcelas

df_gastos["dt_operacao"] = dates

# pra dificultar hehe
df_gastos["mes_atual"] = "jan/21"

df_gastos<jupyter_output><empty_output><jupyter_text>______ Base de limites<jupyter_code># pra começar, vamos mexer um pouco na série de nomes

# primeira coisa, vamos botar espaços extras no começo e no final
nomes_final = " " + nomes_inicial + "    "

# vamos escolher alguns nomes pra deixar em maiúscula
maiuscula = nomes_final.sample(frac=0.4).apply(lambda x: x.upper())
nomes_final.loc[maiuscula.index] = maiuscula

# vamos escolher alguns nomes pra deixar no formato sobrenome, nome
invertido = nomes_final.sample(frac=0.3).apply(lambda x: x.split()[1] + ", " + x.split()[0])
nomes_final.loc[invertido.index] = invertido

nomes_final
# limites, bem simples

np.random.seed(42)
limites = pd.Series(np.random.randint(1, 225, nomes_final.shape[0])*25)

limites = limites.apply(lambda x: "R$ " + str(x) + ",00")
# datas de fechamento

fechamento = pd.Series(pd.to_datetime(['2021-01-05', 
                                      '2021-01-15', 
                                      '2021-01-25'])).sample(nomes_final.shape[0],
                                                             replace=True,
                                                             random_state=42).reset_index(drop=True)

fechamento = fechamento.apply(lambda x: dt.datetime.strftime(x, "%d-%m-%y"))
df_limites = pd.DataFrame()

# nome diferente de coluna
df_limites["cliente"] = nomes_final

df_limites["limite"] = limites

df_limites["dt_fechamento"] = fechamento

df_limites<jupyter_output><empty_output><jupyter_text>__Exportando as bases__<jupyter_code>with pd.ExcelWriter("gastos_limites.xlsx") as writer:
    
    df_gastos.to_excel(writer, sheet_name = "gastos")
    
    df_limites.to_excel(writer, sheet_name = "limites")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1510361784334387, 'fraction_numerical': 0.02388479100807868, 'mean_word_length': 4.0, 'pattern_counts': {'":': 0, '<': 31, '<?xml version=': 0, '>': 29, 'https://': 4, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 8, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '205746', 'license': 'Unlicense', 'n_tokens_mistral': 2183, 'n_tokens_neox': 2077, 'n_words': 441, 'path': 'construcao_base_projeto.ipynb', 'repo_name': 'martinlietz/squadcinza_projeto3', 'size': '5896'}