Ruptura_Projetada/Lançamentos/boti_script_lançamentos.ipynb
2025-08-26 13:57:11 -03:00

950 lines
30 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "4dda0350",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np \n",
"import glob\n",
"import os "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4d6a9919",
"metadata": {},
"outputs": [],
"source": [
"# Caminho onde estão as subpastas com os arquivos CSV\n",
"\n",
"# Set the path to the folder containing CSV files\n",
"folder_path = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\DRAFT_HISTÓRICO DE VENDAS_MAR\" # arquivo dos drafts\n",
"\n",
"# Pattern to match all CSV files\n",
"csv_files = glob.glob(os.path.join(folder_path, '*.csv'))\n",
"\n",
"# Read and concat all CSVs\n",
"df_draft = pd.concat([pd.read_csv(file) for file in csv_files], ignore_index=True)\n",
"\n",
"df_draft['match'] = 1 \n",
"\n",
"df_draft.shape\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9fdbd4df",
"metadata": {},
"outputs": [],
"source": [
"df_draft.columns"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e72bee99",
"metadata": {},
"outputs": [],
"source": [
"#df_draft = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\DRAFT_HISTÓRICO DE VENDAS_MAR\\pegou em excel\\DRAFT_PDVS_SEM_23701-20992_20250423090756.xlsx\",sheet_name='BOTICARIO')\n",
"\n",
"\n",
"#df_draft['match'] = 1 \n",
"\n",
"#df_draft.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7d0f7992",
"metadata": {},
"outputs": [],
"source": [
"df_draft = df_draft.drop(columns='Quantidade')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "aa56ee52",
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"# Caminho onde estão as subpastas com os arquivos CSV\n",
"pasta_entrada = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\ESTOQUE_ATUAL\"\n",
"\n",
"# Lista todas as subpastas dentro de \"ESTOQUE\"\n",
"subpastas = [os.path.join(pasta_entrada, d) for d in os.listdir(pasta_entrada) if os.path.isdir(os.path.join(pasta_entrada, d))]\n",
"\n",
"df_list = []\n",
"\n",
"# Percorre todas as subpastas\n",
"for subpasta in subpastas:\n",
" arquivos = [f for f in os.listdir(subpasta) if f.endswith(\".csv\")]\n",
" nome_pasta = os.path.basename(subpasta) # Obtém o nome da pasta\n",
"\n",
" for arquivo in arquivos:\n",
" caminho_arquivo = os.path.join(subpasta, arquivo)\n",
" try:\n",
" df = pd.read_csv(caminho_arquivo, encoding=\"utf-8\", low_memory=False) # Melhor para grandes volumes de dados\n",
" df[\"Arquivo_Origem\"] = arquivo # Adiciona o nome do arquivo de origem\n",
" df[\"Pasta_Origem\"] = nome_pasta # Adiciona o nome da pasta de origem\n",
" df_list.append(df)\n",
" except Exception as e:\n",
" print(f\"Erro ao ler o arquivo {arquivo}: {e}\")\n",
"\n",
"if df_list:\n",
" df_estoque = pd.concat(df_list, ignore_index=True)\n",
"\n",
"df_estoque['PDV'] = df_estoque['PDV'].astype(str)\n",
"\n",
"df_estoque['SKU_FINAL'] = np.where(df_estoque['SKU_PARA'] == \"-\", df_estoque['SKU'], df_estoque['SKU_PARA'])\n",
"\n",
"df_estoque['SKU_FINAL']=df_estoque['SKU_FINAL'].astype(str)\n",
"\n",
"df_estoque = df_estoque[df_estoque['Arquivo_Origem']== \"BOT.csv\"]\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "db3b7495",
"metadata": {},
"outputs": [],
"source": [
"df_bi_vendas = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\VENDAS BI\\data (1).xlsx\")\n",
"\n",
"df_bi_vendas['Ciclo_ultimos2'] = df_bi_vendas['Ciclo'].str.rsplit('.', n=1).str[-1]\n",
"\n",
"df_bi_vendas['Ciclo_ano'] = df_bi_vendas['Ciclo'].str.rsplit('.', n=1).str[0]\n",
"\n",
"df_bi_vendas['Ciclo_ano'] = df_bi_vendas['Ciclo_ano'].str.replace(\"C\",\"\")\n",
"\n",
"df_bi_vendas['CICLO_FINAL'] = 'C20' + df_bi_vendas['Ciclo_ano'].astype(str) + df_bi_vendas['Ciclo_ultimos2'].astype(str)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "113a3032",
"metadata": {},
"outputs": [],
"source": [
"df_bi_vendas.columns"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "29504e7c",
"metadata": {},
"outputs": [],
"source": [
"df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\PDV\\PDV_ATT.xlsx\")\n",
"\n",
"df_pdv_origi = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\PDV\\PDV_ATT.xlsx\")\n",
"\n",
"df_pdv = df_pdv.rename(columns={'DESCRIÇÃO':'DESCRIÇÃO PDV'})\n",
"\n",
"df_pdv = df_pdv.drop(columns=['REGIÃO', 'ESTADO','CIDADE','GESTÃO', 'status'])\n",
"\n",
"df_pdv['PDV'] = df_pdv['PDV DESC'].str.split(\"-\").str[0].str.strip()\n",
"\n",
"df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])\n",
"\n",
"#ignorando a PDV que ainda não está online\n",
"df_pdv = df_pdv[df_pdv['DESCRIÇÃO PDV'] != '23813-COMERCIO-HIB VALENTE']\n",
"\n",
"df_pdv = df_pdv[df_pdv['SUPERVISOR'] != \"Inativa\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7c7c8be1",
"metadata": {},
"outputs": [],
"source": [
"df_pdv['PDV'] = df_pdv['PDV'].fillna(0).astype('int64')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ae39bc1e",
"metadata": {},
"outputs": [],
"source": [
"calendario = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\CICLO 9\\CALENDARIO_CICLO\\Ciclo_Expandido_com_Datas.xlsx\")\n",
"\n",
"calendario['Date'] = pd.to_datetime(calendario['Date'])\n",
"\n",
"# Get today (normalized to midnight)\n",
"today = pd.Timestamp(\"today\").normalize()\n",
"\n",
"calendario['NUM_CICLO'] = calendario['Ciclo'].str[-2:].astype(int)\n",
"\n",
"calendario['ANO_CICLO'] = calendario['Ciclo'].str[0:5]\n",
"\n",
"calendario = calendario[calendario['MARCA'] == \"BOTICARIO\"]\n",
"\n",
"calendario['CICLOMAIS2'] = calendario['ANO_CICLO'].astype(str) + (calendario['NUM_CICLO'].astype(int) + 3).astype(str).str.zfill(2) #<<< MUDAR O \"4\" (CICLO ATUAL + 4 PARA ACHAR O CICLO DA SUGESTÃO) EX: C202505 -> C202509\n",
"ciclo_mais2 = calendario[calendario['Date'].dt.normalize() == today]['CICLOMAIS2'].iloc[0]\n",
"\n",
"# Filter rows where date matches today\n",
"filtered_calendario = calendario[calendario['Ciclo'] == ciclo_mais2][:1]\n",
"\n",
"filtered_calendario['dias_ate_inicio'] = filtered_calendario['INICIO CICLO'].iloc[0] - today\n",
"\n",
"filtered_calendario['dias_ate_inicio'] = filtered_calendario['dias_ate_inicio'].dt.days.astype(int)\n",
"\n",
"filtered_calendario['match'] = 1\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5589e67c",
"metadata": {},
"outputs": [],
"source": [
"filtered_calendario"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5ac3914a",
"metadata": {},
"outputs": [],
"source": [
"df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\TABELA_PEDIDO\\Pedidos Semanais Especiais - BOT - 202510 (2).xlsx\")\n",
"\n",
"df_tabela = df_tabela[df_tabela['Região'] == 'NNE'] \n",
"\n",
"df_tabela = df_tabela[(df_tabela['Canal'] != 'Ecomm') | (df_tabela['Canal'] != 'Ecomm | VD') | (df_tabela['Canal'] != 'Ecomm | Loja')] #perguntar se isso aqui é vdd\n",
"\n",
"df_tabela['Canal'] = np.where((df_tabela['Canal'] == \"Loja\") | (df_tabela['Canal'] == \"Todos\") | (df_tabela['Canal'] == \"Loja | VD\"),\"TODOS\",\"VD\")\n",
"\n",
"df_tabela = df_tabela[df_tabela['Tipo de promoção'].str.contains('Lançamentos', na=False)]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "af3d5a5c",
"metadata": {},
"outputs": [],
"source": [
"df_tabela['Tipo de promoção'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1a338b98",
"metadata": {},
"outputs": [],
"source": [
"df_similares = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\PRODUTO_SIMILAR\\PRODUTOS SIMILARES.xlsx\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "39ddc830",
"metadata": {},
"outputs": [],
"source": [
"df_similares = pd.merge(left=df_similares,right=calendario[['Ciclo','INICIO CICLO','FIM CICLO','DURAÇÃO']], how= 'left', left_on = 'CICLO SIMILAR',right_on = 'Ciclo' )\n",
"\n",
"df_similares = df_similares.drop(columns=['INICIO DO CICLO SIMILAR','FIM DO CICLO SIMILAR', 'DURAÇÃO DO CICLO DO SIMILAR','Ciclo','DESCRIÇÃO SIMILAR'])\n",
"\n",
"df_similares = df_similares.rename(columns={'INICIO CICLO':'INICIO CICLO SIMILAR','FIM CICLO':'FIM CICLO SIMILAR','DURAÇÃO':'DURAÇÃO CICLO SIMILAR'})\n",
"df_similares.drop_duplicates(inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c2eb0975",
"metadata": {},
"outputs": [],
"source": [
"df_draft = df_draft.rename(columns={'Descrição':'DESCRIÇÃO SIMILAR'})\n",
"\n",
"df_draft = df_draft.drop(columns=['Subcategoria', 'Lançamento', 'Desativação',\n",
" 'Dias sem venda',\n",
" 'Promoção Próximo Ciclo', 'Promoção Próximo Ciclo + 1','Compra inteligente semanal/Sugestão de compra',\n",
" 'Compra inteligente Próximo Ciclo',\n",
" 'Compra inteligente Próximo Ciclo + 1', 'Item Desativado',\n",
" 'Data Prevista Regularização', 'Carteira Bloqueada Para Novos Pedidos',\n",
" 'Planograma', 'Quantidade por caixa', 'Preço Sell In','Item analisado', 'Histórico de Vendas do Ciclo 202505'])\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2390c5b2",
"metadata": {},
"outputs": [],
"source": [
"df_draft['PROJEÇÃO DE VENDAS CICLO'] = df_draft['Projeção Próximo Ciclo + 1'] - df_draft['Projeção Próximo Ciclo']"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c6d00ef5",
"metadata": {},
"outputs": [],
"source": [
"df_venda_diaria = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\VENDAS_PRATICO\\VENDAS SIMI C10 - FormFiltroConsultaVendaSintetica_09_05_2025_11_30_54.xls\")\n",
"\n",
"df_venda_diaria.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a82629ba",
"metadata": {},
"outputs": [],
"source": [
"df_venda_diaria['PDV'] = df_venda_diaria['Unidade de Negócio'].str.split(\"-\").str[0].str.strip()\n",
"\n",
"df_venda_diaria['Dia'] = pd.to_datetime(df_venda_diaria['Dia'], format='%d/%m/%Y')\n",
"\n",
"df_venda_diaria = pd.merge(left=df_venda_diaria,right=calendario[['Ciclo','Date']],left_on='Dia',right_on='Date',how='inner')\n",
"\n",
"df_venda_diaria = df_venda_diaria.drop(columns='Date')\n",
"\n",
"df_venda_diaria.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4cd37229",
"metadata": {},
"outputs": [],
"source": [
"df_venda_diaria = df_venda_diaria.drop_duplicates()\n",
"\n",
"df_venda_diaria.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "15773282",
"metadata": {},
"outputs": [],
"source": [
"df_venda_agrupado = df_venda_diaria.groupby(['PDV', 'Código do Produto','Ciclo'])['Quantidade'].sum().reset_index()\n",
"df_venda_agrupado"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6dad6151",
"metadata": {},
"outputs": [],
"source": [
"df_pdv['MATCH'] = 1\n",
"\n",
"df_similares['MATCH'] = 1\n",
"\n",
"df_similares = pd.merge(left=df_similares,right=df_pdv,right_on=['MATCH'],left_on=['MATCH'],how='inner')\n",
"\n",
"df_similares = df_similares.drop_duplicates()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c2b33a11",
"metadata": {},
"outputs": [],
"source": [
"df_similares.columns"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "63c52601",
"metadata": {},
"outputs": [],
"source": [
"df_final = pd.merge(left=df_similares,right=df_draft,right_on=['SKU','PDV'],left_on=['PRODUTO SIMILAR','PDV'],how='left')\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "90a54c84",
"metadata": {},
"outputs": [],
"source": [
"df_final = pd.merge(left=df_final, right=filtered_calendario[['Ciclo','INICIO CICLO','FIM CICLO','DURAÇÃO','match','dias_ate_inicio']], on='match',how='left')\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "15b16b69",
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"#df_final = pd.merge(left=df_final,right=df_pdv[['PDV', 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC','UF','ANALISTA','SUPERVISOR']],on = 'PDV',how='inner')\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6a453dc4",
"metadata": {},
"outputs": [],
"source": [
"df_bi_vendas = df_bi_vendas.rename(columns={'Quantidade':'Vendas Ciclo Lançamento'})"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a2a92cc7",
"metadata": {},
"outputs": [],
"source": [
"\n",
"df_bi_vendas['SKU2'] = df_bi_vendas['SKU2'].astype(str) \n",
"\n",
"df_final['PRODUTO SIMILAR'] = df_final['PRODUTO SIMILAR'].astype(str)\n",
"\n",
"df_bi_vendas['PDV'] = df_bi_vendas['PDV'].astype('Int64') \n",
"\n",
"df_final['SKU'] = df_final['SKU'].astype(str)\n",
"\n",
"df_final = pd.merge(left=df_final,right=df_bi_vendas,right_on=['PDV','SKU2','CICLO_FINAL'],left_on=['PDV','PRODUTO SIMILAR','CICLO SIMILAR'],how='left')\n",
"df_final.shape "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2f11abcb",
"metadata": {},
"outputs": [],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "085cde87",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.drop(columns=['SKU','match',\n",
" 'Ciclo_y',\n",
" 'SKU1', 'SKU2', 'Campanha','TOTAL PV',\n",
" 'Ciclo_ultimos2', 'Ciclo_ano', 'CICLO_FINAL'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "57d4871f",
"metadata": {},
"outputs": [],
"source": [
"df_final['CANAL'] = np.where((df_final['CANAL'] == 'LJ') | (df_final['CANAL'] == 'HIB'), \"TODOS\" , np.where((df_final['CANAL'] == 'CD') | (df_final['CANAL'] == 'VD'), \"VD\", df_final['CANAL']))\n",
"\n",
"df_final['CANAL'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e4e5868e",
"metadata": {},
"outputs": [],
"source": [
"df_tabela['Código'] = df_tabela['Código'].astype(str)\n",
"df_final['PRODUTO LANÇAMENTO'] = df_final['PRODUTO LANÇAMENTO'].astype(str)\n",
"\n",
"df_final = pd.merge(left=df_final,right=df_tabela[['Canal', 'Código','Ação consumidor','IAF','Foco','Marca','Categoria',\n",
" 'Percentual de desconto consumidor', 'Ação revendedor',\n",
" 'Percentual de desconto revendedor','Tipo de promoção']],right_on=['Código'],left_on=['PRODUTO LANÇAMENTO'],how='left')\n",
"df_final.shape "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d6b65a39",
"metadata": {},
"outputs": [],
"source": [
"df_estoque = df_estoque.rename(columns={'SKU_FINAL':'SKU_PARA_VALIDACAO'})"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "aaa90522",
"metadata": {},
"outputs": [],
"source": [
"df_estoque['PDV'] = df_estoque['PDV'].astype('int64')\n",
"\n",
"df_final = pd.merge( left= df_final, right = df_estoque[['SKU_PARA_VALIDACAO','Arquivo_Origem','PDV']], left_on= ['PRODUTO SIMILAR','PDV'], right_on=['SKU_PARA_VALIDACAO','PDV'], how='left')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "94f1a76f",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.drop(columns=[\n",
"'SKU_PARA_VALIDACAO'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c3395775",
"metadata": {},
"outputs": [],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e5f7cefc",
"metadata": {},
"outputs": [],
"source": [
"df_final.columns[35:41]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "efa6b757",
"metadata": {},
"outputs": [],
"source": [
"df_final['PDV_SKU'] = df_final['PDV'].astype(str) + df_final['PRODUTO SIMILAR'].astype(str) \n",
"\n",
"df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['PRODUTO SIMILAR'].astype(str)\n",
"\n",
"\n",
"VENDA_SIMILAR_6_MESES= df_final.columns[35:41]\n",
"\n",
"df_final['Pico Vendas Similar Ultimos 6 ciclos'] = df_final[VENDA_SIMILAR_6_MESES].max(axis=1)\n",
"\n",
"df_final = df_final.drop_duplicates()\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f10b3982",
"metadata": {},
"outputs": [],
"source": [
"df_venda_agrupado['PDV'] = df_venda_agrupado['PDV'].astype('int64')\n",
"\n",
"df_final['CICLO SIMILAR'] = df_final['CICLO SIMILAR'].astype(str)\n",
"\n",
"df_venda_agrupado['Código do Produto'] = df_venda_agrupado['Código do Produto'].astype(str)\n",
"\n",
"df_final = pd.merge(left=df_final,right=df_venda_agrupado,right_on=['PDV','Código do Produto','Ciclo'],left_on=['PDV','PRODUTO SIMILAR','CICLO SIMILAR'],how='left')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8f96e45b",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.drop(columns=['Ciclo','Código do Produto','Vendas Ciclo Lançamento'])\n",
"\n",
"df_final = df_final.rename(columns={'Quantidade':'Vendas Ciclo Lançamento'})"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5801d05b",
"metadata": {},
"outputs": [],
"source": [
"df_final.columns[25:41]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "41c64323",
"metadata": {},
"outputs": [],
"source": [
"# Suponha que os meses estão nas colunas 10 a 26 (17 colunas = 17 meses)\n",
"colunas_mensais = df_final.columns[25:41]\n",
"\n",
"# Passo 1: Soma todas as linhas (itens) por mês → resultado: total por mês\n",
"soma_mensal = df_final[colunas_mensais].sum()\n",
"\n",
"# Passo 2: Calcula a variação percentual de um mês para o outro\n",
"variacao_mensal = soma_mensal.pct_change()\n",
"variacao_mensal = variacao_mensal.dropna()\n",
"\n",
"variacao_mensal = variacao_mensal[np.isfinite(variacao_mensal)]\n",
"\n",
"# Passo 3: Calcula a média da variação (ignorando o primeiro NaN)\n",
"media_variacao = variacao_mensal[1:].mean()\n",
"\n",
"# Calcula média e desvio padrão\n",
"media = variacao_mensal.mean()\n",
"desvio = variacao_mensal.std()\n",
"\n",
"# Define limite (ex: 2 desvios padrão)\n",
"limite_superior = media + 2 * desvio\n",
"limite_inferior = media - 2 * desvio\n",
"\n",
"# Filtra dados dentro do limite\n",
"filtro = variacao_mensal.between(limite_inferior, limite_superior)\n",
"df_filtrado = variacao_mensal[filtro]\n",
"CRESCIMENTO = round(df_filtrado.mean(),4)\n",
"\n",
"df_final['CRESCIMENTO'] = CRESCIMENTO\n",
"\n",
"CRESCIMENTO\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "02565655",
"metadata": {},
"outputs": [],
"source": [
"variacao_mensal.info"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "137f5531",
"metadata": {},
"outputs": [],
"source": [
"df_final.columns[27:28]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3c027cfc",
"metadata": {},
"outputs": [],
"source": [
"venda_similar_mesmo_ciclo_ano_passado = df_final.columns[27:28] #<<<<<<< CICLO ATUAL É [37:38]\n",
"ciclo_ano_passado = df_final.columns[27:28].str.split(\" \")[0][-1]\n",
"df_final[ciclo_ano_passado] = df_final[venda_similar_mesmo_ciclo_ano_passado]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "28f74b58",
"metadata": {},
"outputs": [],
"source": [
"df_final['Vendas Ciclo Lançamento'] = df_final['Vendas Ciclo Lançamento'].fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "58642d77",
"metadata": {},
"outputs": [],
"source": [
"vendas_todos_historicos = df_final.columns[25:41]\n",
"\n",
"df_final['MEDIANA DO HISTÓRICO'] = df_final[vendas_todos_historicos].dropna().median(axis=1)\n",
"\n",
"df_final['MEDIA DO HISTÓRICO'] = df_final[vendas_todos_historicos].dropna().mean(axis=1)\n",
"\n",
"df_final['MEDIANA DO HISTÓRICO'] = np.where(df_final['MEDIANA DO HISTÓRICO'] > 0, df_final['MEDIANA DO HISTÓRICO'], df_final['MEDIA DO HISTÓRICO'] )#validar se foi\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "69473155",
"metadata": {},
"outputs": [],
"source": [
"crescimento = df_final['CRESCIMENTO']\n",
"vendas_lanc = df_final['Vendas Ciclo Lançamento']\n",
"pico_similar = df_final['Pico Vendas Similar Ultimos 6 ciclos']\n",
"mediana_hist = df_final['MEDIANA DO HISTÓRICO']\n",
"\n",
"# Primeiro cálculo intermediário\n",
"df_final['PV GINSENG'] = np.where(df_final['CRESCIMENTO'] * df_final[ciclo_ano_passado] + df_final[ciclo_ano_passado] < df_final['MEDIANA DO HISTÓRICO'],\n",
" round(df_final['CRESCIMENTO'] * df_final['MEDIANA DO HISTÓRICO']+ df_final['MEDIANA DO HISTÓRICO'],0), \n",
" round(df_final['CRESCIMENTO']*df_final[ciclo_ano_passado]+df_final[ciclo_ano_passado],0))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d29a3365",
"metadata": {},
"outputs": [],
"source": [
"df_final.columns[25:38]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3cf3efe7",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.rename(columns={df_final.columns[38]: \"C-4\", df_final.columns[39]: \"C-3\",df_final.columns[40]: \"C-2\",df_final.columns[41]: \"C-1\"})\n",
"\n",
"df_final.drop(columns=df_final.columns[25:38], inplace=True)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "303291c9",
"metadata": {},
"outputs": [],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2b8b3551",
"metadata": {},
"outputs": [],
"source": [
"\n",
"marca_promo = df_estoque['Arquivo_Origem'].iloc[0].replace('.csv','')\n",
"\n",
"df_final['INICIO CICLO'] = pd.to_datetime(df_final['INICIO CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')\n",
"\n",
"df_final['FIM CICLO'] = pd.to_datetime(df_final['FIM CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')\n",
"\n",
"df_final['INICIO CICLO SIMILAR'] = pd.to_datetime(df_final['INICIO CICLO SIMILAR'], dayfirst=True).dt.strftime('%d/%m/%Y')\n",
"\n",
"df_final['FIM CICLO SIMILAR'] = pd.to_datetime(df_final['FIM CICLO SIMILAR'], dayfirst=True).dt.strftime('%d/%m/%Y')\n",
"\n",
"\n",
"\n",
"df_final = df_final.rename(columns={'Ciclo_x': 'Ciclo'})"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3900ec24",
"metadata": {},
"outputs": [],
"source": [
"df_final = pd.merge(left=df_final,right=df_pdv_origi[['PDV','CANAL','UF']],how='inner',on='PDV')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f8ba376a",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.drop(columns=['CANAL_x','UF_x','Categoria_y'])\n",
"\n",
"df_final = df_final.rename(columns={'CANAL_y':'CANAL', 'UF_y':'UF','MARCA_x':'MARCA','Categoria_x':'Categoria'})"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7d904672",
"metadata": {},
"outputs": [],
"source": [
"# Columns to bring up front\n",
"priority_cols = [\n",
" 'Ciclo','INICIO CICLO','FIM CICLO','ANALISTA','SUPERVISOR','UF','CANAL','PDV', 'DESCRIÇÃO PDV','DURAÇÃO',\t\n",
" 'Classe','PRODUTO LANÇAMENTO','DESCRIÇÃO DO LANÇAMENTO','MARCA','Foco',\n",
" 'PRODUTO SIMILAR','DESCRIÇÃO SIMILAR','CICLO SIMILAR','INICIO CICLO SIMILAR','FIM CICLO SIMILAR','DURAÇÃO CICLO SIMILAR',\n",
" 'Ação consumidor',\t'Percentual de desconto consumidor','Ação revendedor','Percentual de desconto revendedor','Estoque Atual',\n",
" 'Estoque em Transito',\t'Pedido Pendente','DESCRIÇÃO SIMILAR', 'Histórico de Vendas do Ciclo Atual',\n",
"\t'C-4',\t'C-3',\t'C-2',\t'C-1'\n",
"]\n",
"\n",
"# All remaining columns\n",
"other_cols = [col for col in df_final.columns if col not in priority_cols]\n",
"\n",
"# Reorder\n",
"df_final = df_final[priority_cols + other_cols]\n",
"\n",
"df_final['SUGESTÃO ABTASTECIMENTO'] = ''\n",
"\n",
"df_final['SUGESTÃO COMERCIAL'] = ''\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "43f96709",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.drop(columns=['Marca','CRESCIMENTO','Canal','Código','Tipo de promoção','dias_ate_inicio','PDV DESC','UFPRODUTO','Arquivo_Origem','UFPRODUTO',\n",
" 'PDV_SKU','MEDIANA DO HISTÓRICO','MEDIA DO HISTÓRICO'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "23d6fe59",
"metadata": {},
"outputs": [],
"source": [
"df_final['chave'] = df_final['PDV'].astype(str) + df_final['PRODUTO LANÇAMENTO'].astype(str)\n",
"\n",
"chaves_duplicadas = (\n",
" df_final.groupby('chave')['Percentual de desconto consumidor']\n",
" .count()\n",
" .loc[lambda x: x == 2]\n",
" .index\n",
")\n",
"\n",
"# Selecionar essas linhas\n",
"duplicadas = df_final[df_final['chave'].isin(chaves_duplicadas)]\n",
"\n",
"# Filtrar apenas os grupos onde pelo menos uma linha tem 0.0\n",
"grupos_com_zero = duplicadas.groupby('chave').filter(\n",
" lambda g: (g['Percentual de desconto consumidor'] == \"0,00\").any()\n",
")\n",
"\n",
"# Remover apenas as linhas com 0.0 dessas chaves\n",
"limpos = grupos_com_zero[grupos_com_zero['Percentual de desconto consumidor'] != \"0,00\"]\n",
"\n",
"# Concatenar com o restante do dataframe que não foi afetado\n",
"resto = df_final[~df_final['chave'].isin(grupos_com_zero['chave'])]\n",
"df_final = pd.concat([resto, limpos], ignore_index=True)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "08faefd9",
"metadata": {},
"outputs": [],
"source": [
"\n",
"from openpyxl import load_workbook\n",
"from openpyxl.styles import PatternFill, Font\n",
"\n",
"\n",
"# Export to Excel\n",
"output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\Lançamento!!!_{marca_promo}_{ciclo_mais2}_20.05!!.xlsx'\n",
"with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n",
" df_final.to_excel(writer, index=False, sheet_name='Sheet1')\n",
"\n",
"# Apply styles\n",
"wb = load_workbook(output_file)\n",
"ws = wb['Sheet1']\n",
"\n",
"# Style header\n",
"header_fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid') # Light Blue\n",
"header_font = Font(color='FFFFFF', bold=True) # White & Bold\n",
"\n",
"for cell in ws[1]:\n",
" cell.fill = header_fill\n",
" cell.font = header_font\n",
"\n",
"# Style rows: gray/white alternating\n",
"gray_fill = PatternFill(start_color='DDDDDD', end_color='DDDDDD', fill_type='solid') # Light gray\n",
"\n",
"for i, row in enumerate(ws.iter_rows(min_row=2, max_row=ws.max_row), start=2):\n",
" if i % 2 == 0:\n",
" for cell in row:\n",
" cell.fill = gray_fill\n",
"\n",
"# Save styled workbook\n",
"wb.save(output_file)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f039df31",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}