{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np \n", "import glob\n", "import os " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# O QUE PRECISA PRA RODAR ESSE CÓDIGO:\n", "\n", "# Arquivo Draft\n", "# Arquivo Estoque\n", "# Arquivo BI preço\n", "# Arquivo pdv\n", "# Arquivo Calendario\n", "# Arquivo tabela de compra\n", "\n", "#Atualizar o nome da marca no filtro do estoque." ] }, { "cell_type": "code", "execution_count": null, "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\\DB_PROMOÇÕES\\EUDORA\\202511\\DRAFT_PDVS_SEM_\" # 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", "\n", "df_draft.shape\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_draft['match'] = 1 \n" ] }, { "cell_type": "code", "execution_count": null, "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\\DB_PROMOÇÕES\\EUDORA\\202511\\estoque\"\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" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_bi_preco = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\EUDORA\\202511\\preço BI\\TABELA DE PREÇOS (2).xlsx\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_bi_preco.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\EUDORA\\202509\\arquivos pra gerar\\pdvs\\PDV_ATT.xlsx\")\n", "df_pdv = df_pdv.rename(columns={'DESCRIÇÃO':'DESCRIÇÃO PDV'})\n", "df_pdv = df_pdv.drop(columns=['REGIÃO', 'ESTADO','CIDADE','GESTÃO', 'SUPERVISOR', 'STATUS'])\n", "df_pdv['PDV'] = df_pdv['PDV DESC'].str.split(\"-\").str[0].str.strip()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#ignorando a PDV que ainda não está online\n", "df_pdv = df_pdv[df_pdv['DESCRIÇÃO PDV'] != '23813-COMERCIO-HIB VALENTE']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_pdv['MATCH'] = 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**ALTERAR NOME DA COLUNA \"ARQUIVO_ORIGEM\" PARA UMA DAS OPÇÕES ABAIXO:**\n", "\n", "*BOT.csv* \n", "\n", "*EUD.csv*\n", "\n", "*QDB.csv*" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_estoque = df_estoque[df_estoque['Arquivo_Origem']== \"EUD.csv\"]" ] }, { "cell_type": "code", "execution_count": null, "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\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "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", "calendario['ANO_CICLO'] = calendario['Ciclo'].str[0:5]\n", "\n", "\n", "calendario = calendario[calendario['MARCA'] == \"EUDORA\"]\n", "\n", "calendario['CICLOMAIS2'] = calendario['ANO_CICLO'].astype(str) + (calendario['NUM_CICLO'].astype(int) + 2).astype(str).str.zfill(2)\n", "\n", "ciclo_mais2 = calendario[calendario['Date'].dt.normalize() == today]['CICLOMAIS2'].iloc[0]\n", "\n", "\n", "# Filter rows where date matches today\n", "filtered_calendario = calendario[calendario['Ciclo'] == ciclo_mais2][:1]\n", "\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" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "filtered_calendario" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "filtered_calendario['match'] = 1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\EUDORA\\202511\\tabela promo\\Tabela-de-Promocoes_C11-(1)-1747747476284.xlsx.xlsx\")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_tabela = df_tabela[[ 'Ciclo', 'Veiculo',\n", " 'Tipo de Promoção', 'Estratégia de Promoção',\n", " 'Tipo_mecanica', 'Promo Período Limitado?',\n", " 'EAM', 'Categoria',\n", " 'Cód. Combo', 'Código do Item',\n", " 'Descrição do Item', 'Chamada Promocional',\n", " 'Valor do Guia', 'Preço Promocionado',\n", " '% de Desconto', 'RE compra por',\n", " 'RE Vende por', 'RE lucra (R$)']]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_tabela['Código do Item'] = df_tabela['Código do Item'].astype(str).str.replace(\".0\",\"\",regex=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_tabela['MATCH'] = 1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_tabela = pd.merge(left=df_tabela,right=df_pdv[['PDV','MATCH','UF','DESCRIÇÃO PDV','ANALISTA']],on='MATCH',how='inner')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_tabela = df_tabela.drop_duplicates()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_tabela.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_draft['PDV'] = df_draft['PDV'].astype(str)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_draft['SKU'] = df_draft['SKU'].astype(str)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_tabela['Código do Item'] = df_tabela['Código do Item'].astype('str')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final = pd.merge(left=df_draft,right=df_tabela,right_on=['Código do Item','PDV'],left_on=['SKU','PDV'],how='right')\n", "df_final.shape " ] }, { "cell_type": "code", "execution_count": null, "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='inner')\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#df_final = pd.merge(left=df_final,right=df_pdv[['PDV', 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC','UF', 'MARCA', 'ANALISTA']],on = 'PDV',how='inner')\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final['SKU'] = df_final['SKU'].astype(str) \n", "df_final['PDV'] = df_final['PDV'].astype(str) \n", "df_final = pd.merge(left=df_final,right=df_estoque[['SKU_FINAL', 'DDV PREVISTO', 'COBERTURA ATUAL','PDV']],right_on=['PDV','SKU_FINAL'],left_on=['PDV','SKU'],how='left')\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype(str).str.replace('.0','',regex=False) \n", "\n", "df_final = pd.merge(left=df_final,right=df_bi_preco[['SKU1', 'SKU2', 'UF','Tipo Preço', 'PC', 'PV']],right_on=['UF','SKU2'],left_on=['UF','SKU'],how='left')\n", "df_final.shape " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_bi_preco['SKU1'] = df_bi_preco['SKU1'].astype(str).str.replace('.0','',regex=False) \n", "\n", "df_final = pd.merge(left=df_final,right=df_bi_preco[['SKU1', 'SKU2', 'UF', 'PC', 'PV']],right_on=['UF','SKU1'],left_on=['UF','SKU'],how='left')\n", "df_final.shape " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#df_bi_preco = df_bi_preco[df_bi_preco['MARCA']=='EUDORA']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final['PRECO DE COMPRA'] = np.where(~df_final['PC_x'].isna(),df_final['PC_x'],df_final['PC_y'])\n", "\n", "df_final['PRECO DE VENDA'] = np.where(~df_final['PV_x'].isna(),df_final['PV_x'],df_final['PV_y'])\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_estoque = df_estoque.rename(columns={'SKU_FINAL':'SKU_PARA_VALIDACAO'})\n", "df_final = pd.merge( left= df_final, right = df_estoque[['SKU_PARA_VALIDACAO','Arquivo_Origem']], left_on= 'SKU', right_on='SKU_PARA_VALIDACAO', how='left')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop(columns=['Desativação','Lançamento',\n", "'Promoção Próximo Ciclo',\n", "'Compra inteligente semanal/Sugestão de compra',\n", "'Planograma',\n", "'Carteira Bloqueada Para Novos Pedidos',\n", "'Preço Sell In',\n", "'Quantidade',\n", "'Item analisado',\n", "'Promoção Próximo Ciclo + 1',\n", "'SKU_PARA_VALIDACAO',\n", "'Ciclo_y'\n", "])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final['PDV_SKU'] = df_final['PDV'].astype(str) + df_final['SKU'].astype(str) \n", "df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['SKU'].astype(str)\n", "\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final['Projeção Próximo Ciclo + 1'].value_counts()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final['PROJEÇÃO DO CICLO PROMOCIONADO'] =df_final['Projeção Próximo Ciclo + 1'] - df_final['Projeção Próximo Ciclo'] # projeção do ciclo em estudo" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final['PROJEÇÃO DO CICLO PROMOCIONADO'].value_counts()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final['Data Prevista Regularização'] = df_final['Data Prevista Regularização'].astype(str).replace('0','REGULAR')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final = df_final.rename(columns={'Arquivo_Origem': 'MARCA'})" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final = df_final[~df_final['MARCA'].isna()]\n", "df_final['MARCA'].isna().sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop_duplicates()\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Define list of target columns\n", "sales_2024_cols = df_final.columns[6:24]\n", "# Create a new column with the row-wise max\n", "df_final['PICO DE VENDAS 2024'] = df_final[sales_2024_cols].max(axis=1)\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "vendas_6_meses = df_final.columns[17:23]\n", "\n", "df_final['Pico Vendas Ultimos 6 ciclos'] = df_final[vendas_6_meses].max(axis=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final.columns[6:23]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "CRESCIMENTO = (df_final[df_final.columns[6]].sum() - df_final[df_final.columns[22]].sum())/df_final[df_final.columns[6]].sum() \n", "print(CRESCIMENTO)\n", "\n", "df_final['CRESCIMENTO'] = .2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mesmo_ciclo_ano_passado = df_final.columns[8:9]\n", "ciclo_ano_passado = df_final.columns[8:9].str.split(\" \")[0][-1]\n", "df_final[ciclo_ano_passado] = df_final[mesmo_ciclo_ano_passado]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final.columns[8:9].str.split(\" \")[0][-1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "vendas_todos_historicos = df_final.columns[6:23]\n", "\n", "df_final['MEDIANA DO HISTÓRICO'] = df_final[vendas_todos_historicos].median(axis=1)\n", "\n", "df_final['MEDIA DO HISTÓRICO'] = df_final[vendas_todos_historicos].mean(axis=1)\n", "\n", "df_final['MEDIANA DO HISTÓRICO'] = np.where(df_final['MEDIANA DO HISTÓRICO'] <1,df_final['MEDIA DO HISTÓRICO'],df_final['MEDIANA DO HISTÓRICO'])\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "CRESCIMENTO" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "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", " np.ceil(df_final['CRESCIMENTO'] * df_final['MEDIANA DO HISTÓRICO']+ df_final['MEDIANA DO HISTÓRICO']), \n", " np.ceil(df_final['CRESCIMENTO']*df_final[ciclo_ano_passado]+df_final[ciclo_ano_passado]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final['PV GINSENG'] = np.where(df_final['PV GINSENG']<1, df_final['Projeção Próximo Ciclo + 1'],df_final['PV GINSENG'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final = df_final.rename(columns={df_final.columns[18]: \"C-4\", df_final.columns[19]: \"C-3\",df_final.columns[20]: \"C-2\",df_final.columns[21]: \"C-1\"})" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final.drop(columns=df_final.columns[6:18], inplace=True)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# List all columns except the two\n", "cols_to_group_by = df_final.columns.difference(['DDV PREVISTO', 'COBERTURA ATUAL'])\n", "\n", "# Group and aggregate\n", "df_final_dedup = (\n", " df_final\n", " .groupby(list(cols_to_group_by), dropna=False)[['DDV PREVISTO', 'COBERTURA ATUAL']]\n", " .max()\n", " .reset_index()\n", ")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final['Compra inteligente Próximo Ciclo']\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['DDV PREVISTO'] = df_final_dedup['DDV PREVISTO'].fillna(0.01)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['DDV PREVISTO'] = np.where(\n", " df_final_dedup['DDV PREVISTO'] == 0,\n", " 0.01,\n", " df_final_dedup['DDV PREVISTO']\n", ")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['DDV PREVISTO'].value_counts()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['EST PROJE FINAL CICLO ATUAL'] = (df_final_dedup['Estoque Atual'] + df_final_dedup['Estoque em Transito']) - round(df_final_dedup['dias_ate_inicio'] * df_final_dedup['DDV PREVISTO'],0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['EST PROJE FINAL CICLO ATUAL'] = np.where(df_final_dedup['EST PROJE FINAL CICLO ATUAL']<0,0,df_final_dedup['EST PROJE FINAL CICLO ATUAL'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['VENDAS R$ PV GINSENG'] = df_final_dedup['PRECO DE VENDA'] * df_final_dedup['PV GINSENG']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup = df_final_dedup.rename(columns={'Ciclo_x':'Ciclo'})" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['SUGESTÃO ABTASTECIMENTO\t'] = ''\n", "df_final_dedup['VENDAS R$ ABASTECIMENTO'] = ''\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['RBV 202406'] = df_final_dedup['PRECO DE VENDA'] * df_final_dedup[ciclo_ano_passado] " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['COB PROJETADA'] = np.where(\n", " df_final_dedup['DDV PREVISTO'] != 0,\n", " (df_final_dedup['EST PROJE FINAL CICLO ATUAL'] + df_final_dedup['PV GINSENG']) / df_final_dedup['DDV PREVISTO'],\n", " 999)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup.drop(columns=['dias_ate_inicio','SKU_FINAL','Projeção Próximo Ciclo + 1',\n", " 'CRESCIMENTO'],inplace=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['MARCA'] = df_final_dedup['MARCA'].str.replace('.csv','',regex=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['COB PROJETADA'] = df_final_dedup['COB PROJETADA'].fillna(999)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final_dedup.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "marca_promo = df_estoque['Arquivo_Origem'].iloc[0].replace('.csv','')\n", "marca_promo" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Passo 1: ordenar\n", "df_sorted = df_final.sort_values(by='% de Desconto', ascending=False)\n", "\n", "# Passo 2: obter até 3 chamadas promocionais por grupo\n", "promo_grouped = (\n", " df_sorted.groupby(['SKU', 'PDV'])['Chamada Promocional']\n", " .apply(lambda x: x.dropna().unique()[:3])\n", " .apply(pd.Series)\n", " .rename(columns={0: 'MECÂNICA 1', 1: 'MECÂNICA 2', 2: 'MECÂNICA 3'})\n", " .reset_index()\n", ")\n", "\n", "# Passo 3: base com maior % de desconto\n", "df_base = df_sorted.drop_duplicates(subset=['SKU', 'PDV'], keep='first').reset_index(drop=True)\n", "\n", "# Passo 4: merge com chamadas pivotadas\n", "df_merged = df_base.merge(promo_grouped, on=['SKU', 'PDV'], how='left')\n", "\n", "# Corrigir dicionário: agrupar e pegar o primeiro valor válido por (SKU, PDV)\n", "# Passo 1: dicionário com Cód. Combo único por SKU+PDV\n", "cod_combo_map = (\n", " df_final\n", " .dropna(subset=['Cód. Combo'])\n", " .groupby(['SKU', 'PDV'])['Cód. Combo']\n", " .first()\n", " .to_dict()\n", ")\n", "\n", "# Passo 2: gerar Series com os valores mapeados\n", "cod_combo_series = df_merged.set_index(['SKU', 'PDV']).index.map(cod_combo_map)\n", "\n", "# Passo 3: substituir os valores diretamente\n", "df_merged['Cód. Combo'] = cod_combo_series.where(cod_combo_series.notna(), df_merged['Cód. Combo'])\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Columns to bring up front\n", "priority_cols = [\n", " 'PDV_SKU',\t'SKU',\t'MARCA','INICIO CICLO',\n", " 'FIM CICLO',\t'DURAÇÃO','dias_ate_inicio',\t\n", " 'UFPRODUTO',\t'Item Desativado',\t'Data Prevista Regularização',\n", " 'ANALISTA',\t'UF',\t'PDV',\t'DESCRIÇÃO PDV',\t'Classe',\n", " 'Descrição','MECÂNICA 1',\n", " 'MECÂNICA 2', 'MECÂNICA 3','Estoque Atual',\t'COBERTURA ATUAL',\n", " 'Estoque em Transito',\t'Pedido Pendente',\t'PICO DE VENDAS 2024','Pico Vendas Ultimos 6 ciclos',\n", " 'C-4',\t'C-3',\t'C-2',\t'C-1',\t'Histórico de Vendas do Ciclo Atual',\n", " 'Dias sem venda'\n", "]\n", "\n", "# All remaining columns\n", "other_cols = [col for col in df_merged.columns if col not in priority_cols]\n", "\n", "# Reorder\n", "df_merged = df_merged[priority_cols + other_cols]\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_merged['INICIO CICLO'] = pd.to_datetime(df_merged['INICIO CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')\n", "\n", "df_merged['FIM CICLO'] = pd.to_datetime(df_merged['FIM CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_merged.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_merged = df_merged.loc[:, ~df_merged.columns.str.endswith('_y')]\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_merged.columns = df_merged.columns.str.replace('_x$', '', regex=True)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_merged = df_merged.drop(columns=['Veiculo',\t'Tipo de Promoção',\t'Estratégia de Promoção','Tipo_mecanica'\n", " ,'Chamada Promocional','MATCH','match', 'SKU_FINAL','Descrição do Item','CRESCIMENTO',\n", " 'Cód. Combo'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_merged['SUGESTÃO ANALISTA'] = \"\"\n", "\n", "df_merged['SUGESTÃO COMERCIAL'] = \"\"" ] }, { "cell_type": "code", "execution_count": null, "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\\\\promoção_{marca_promo}_{ciclo_mais2}_04.06.xlsx'\n", "with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n", " df_merged.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": "markdown", "metadata": {}, "source": [ "coisas q saem\n", "\n", "Lançamento\n", "Subcategoria\n", "Projeção Próximo Ciclo \n", "Promoção Próximo Ciclo\n", "Compra inteligente semanal/Sugestão de compra\n", "Compra inteligente Próximo Ciclo\n", "Planograma\n", "Carteira Bloqueada Para Novos Pedidos\n", "Quantidade por caixa\n", "Preço Sell In\n", "Quantidade\n", "Item analisado\n", "Tipo Preço\n", "\n", ">>>>>>>>>>>>>NAO ESTÁ PEGANDO O MERGE COM O DF_ESTOQUE\n", "\n", "\n", "CRIAR PROJEÇÃO DE VENDA DO CICLO ATUAL\n", "Compra inteligente Próximo Ciclo + 1 >>>>>>> RENAME PRA NOROMAL" ] } ], "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": 2 }