Ruptura_Projetada/promoção/promoção_boti_ciclo07.ipynb
2025-06-23 14:30:35 -03:00

2881 lines
92 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 101,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np \n",
"import glob\n",
"import os \n",
"from openpyxl import load_workbook\n",
"from openpyxl.styles import PatternFill, Font\n",
"from datetime import datetime"
]
},
{
"cell_type": "code",
"execution_count": 102,
"metadata": {},
"outputs": [],
"source": [
"hoje = datetime.today().strftime('%Y-%m-%d')"
]
},
{
"cell_type": "code",
"execution_count": 103,
"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": 104,
"metadata": {},
"outputs": [],
"source": [
"df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C11\\TABELA DE PEDIDOS\\Pedidos Semanais Especiais - BOT - 202511 (1).xlsx\")\n",
"\n",
"df_tabela = df_tabela[df_tabela['Ação revendedor'].notna() | df_tabela['Ação consumidor'].notna()]\n",
"\n",
"df_tabela = df_tabela[df_tabela['Região'] == 'NNE'] \n",
"\n",
"df_tabela = df_tabela[(df_tabela['Canal'] != 'Ecomm')]\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['Categoria'] != \"EMBALAGENS\") | (df_tabela['Categoria'] != \"SUPORTE À VENDA\")]\n",
"\n",
"df_tabela = df_tabela[df_tabela['Tipo de pedido'] == 'Semanal']\n",
"\n",
"df_tabela = df_tabela[~df_tabela['Descrição'].str.contains('PRM')]\n",
"\n",
"df_tabela = df_tabela[df_tabela['Tipo de produto']!= 'EDICAO LIMITADA']\n",
"\n",
"df_tabela['Ação revendedor'] = np.where(df_tabela['Ação revendedor'].isna(),df_tabela['Ação consumidor'],df_tabela['Ação revendedor'])\n",
"\n",
"df_tabela['Percentual de desconto revendedor'] = np.where(df_tabela['Percentual de desconto revendedor'].isna(),df_tabela['Percentual de desconto consumidor'],df_tabela['Percentual de desconto revendedor'])\n",
"\n",
"df_tabela['MATCH'] = 1\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 105,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(332,)"
]
},
"execution_count": 105,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela['Código'].shape"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(332, 24)"
]
},
"execution_count": 106,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela.shape"
]
},
{
"cell_type": "code",
"execution_count": 107,
"metadata": {},
"outputs": [],
"source": [
"df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n",
"\n",
"df_pdv_origi = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n",
"\n",
"df_pdv = df_pdv.rename(columns={'DESCRIÇÃO':'DESCRIÇÃO PDV'})\n",
"\n",
"df_pdv = df_pdv[df_pdv['GESTÃO']!=\"Inativa\"]\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 = df_pdv[df_pdv['CANAL']!='MTZ']\n",
"\n",
"#df_pdv['CANAL'] = np.where((df_pdv['CANAL']=='LJ')|(df_pdv['CANAL']=='HIB')|(df_pdv['CANAL']=='CD'),'TODOS','VD')\n",
"\n",
"df_pdv['MATCH'] = 1\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [],
"source": [
"df_pdv = df_pdv.drop(columns=['pdv como texto','PDV DESC'])"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_17756\\3645011820.py:10: DtypeWarning: Columns (6,7) have mixed types. Specify dtype option on import or set low_memory=False.\n",
" df_draft = pd.concat([pd.read_csv(file) for file in csv_files], ignore_index=True)\n"
]
},
{
"data": {
"text/plain": [
"(127198, 46)"
]
},
"execution_count": 109,
"metadata": {},
"output_type": "execute_result"
}
],
"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\\BOTICARIO\\C11\\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",
"df_draft.shape\n"
]
},
{
"cell_type": "code",
"execution_count": 110,
"metadata": {},
"outputs": [],
"source": [
"df_draft = df_draft.drop(columns=['Descrição','Compra inteligente semanal/Sugestão de compra',\n",
" 'Compra inteligente Próximo Ciclo',\n",
" 'Compra inteligente Próximo Ciclo + 1','Planograma', 'Quantidade por caixa', 'Preço Sell In', 'Quantidade',\n",
" 'Item analisado', 'Subcategoria',\n",
" 'Lançamento', 'Desativação',\n",
" 'Promoção Próximo Ciclo', 'Categoria'])"
]
},
{
"cell_type": "code",
"execution_count": 111,
"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\\BOTICARIO\\C11\\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": 112,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Ciclo', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n",
" 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n",
" 'Subcategoria', 'Quantidade por caixa', 'Tipo de promoção', 'Catálogo',\n",
" 'Tipo de produto', 'Ação consumidor',\n",
" 'Percentual de desconto consumidor', 'Ação revendedor',\n",
" 'Percentual de desconto revendedor', 'Sortimento P', 'Sortimento M',\n",
" 'Sortimento G', 'MATCH'],\n",
" dtype='object')"
]
},
"execution_count": 112,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela.columns"
]
},
{
"cell_type": "code",
"execution_count": 113,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(332, 24)"
]
},
"execution_count": 113,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela.shape"
]
},
{
"cell_type": "code",
"execution_count": 114,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Canal\n",
"Todos 183\n",
"Loja 72\n",
"VD 67\n",
"Loja | VD 6\n",
"Ecomm | VD 2\n",
"Ecomm | Loja 2\n",
"Name: count, dtype: int64"
]
},
"execution_count": 114,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela['Canal'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"df_estoque['SKU_FINAL'] = df_estoque['SKU_FINAL'].astype('Int64')"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"df_tabela = pd.merge(left=df_tabela,right=df_estoque[['SKU','SKU_FINAL']],left_on='Código',right_on='SKU',how='left')\n",
"\n",
"df_tabela['Código'] = df_tabela['SKU_FINAL']\n",
"\n",
"df_tabela = df_tabela.drop(columns=['SKU','SKU_FINAL'])"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"315"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela['Código'].nunique()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"df_tabela = pd.merge(left=df_tabela,right=df_estoque[['SKU','SKU_FINAL']],left_on='Código',right_on='SKU_FINAL',how='left')\n",
"\n",
"df_tabela['Código'] = df_tabela['SKU_FINAL']\n",
"\n",
"df_tabela = df_tabela.drop(columns=['SKU','SKU_FINAL'])\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"df_tabela = df_tabela.drop_duplicates()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"df_tabela.to_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C11\\teste.xlsx\",index=False)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Ciclo</th>\n",
" <th>Região</th>\n",
" <th>Canal</th>\n",
" <th>Código</th>\n",
" <th>Descrição</th>\n",
" <th>IAF</th>\n",
" <th>Tipo de pedido</th>\n",
" <th>Foco</th>\n",
" <th>Unidade de negócio</th>\n",
" <th>Marca</th>\n",
" <th>...</th>\n",
" <th>Catálogo</th>\n",
" <th>Tipo de produto</th>\n",
" <th>Ação consumidor</th>\n",
" <th>Percentual de desconto consumidor</th>\n",
" <th>Ação revendedor</th>\n",
" <th>Percentual de desconto revendedor</th>\n",
" <th>Sortimento P</th>\n",
" <th>Sortimento M</th>\n",
" <th>Sortimento G</th>\n",
" <th>MATCH</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>202511</td>\n",
" <td>NNE</td>\n",
" <td>VD</td>\n",
" <td>74438</td>\n",
" <td>ARBO DES COL 100ml V4</td>\n",
" <td>Não</td>\n",
" <td>Semanal</td>\n",
" <td>Não</td>\n",
" <td>BOT</td>\n",
" <td>ARBO</td>\n",
" <td>...</td>\n",
" <td>Sim</td>\n",
" <td>REGULAR</td>\n",
" <td>NaN</td>\n",
" <td>0,00</td>\n",
" <td>VD - FAVORITOS PARA INÍCIOS ARBO - C11</td>\n",
" <td>35,00</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7440</th>\n",
" <td>202511</td>\n",
" <td>NNE</td>\n",
" <td>VD</td>\n",
" <td>57210</td>\n",
" <td>AU MIGOS PETS BANHO SECO ADULTOS 240ml</td>\n",
" <td>Não</td>\n",
" <td>Semanal</td>\n",
" <td>Não</td>\n",
" <td>BOT</td>\n",
" <td>AU.MIGOS PETS</td>\n",
" <td>...</td>\n",
" <td>Sim</td>\n",
" <td>REGULAR</td>\n",
" <td>NaN</td>\n",
" <td>0,00</td>\n",
" <td>VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ...</td>\n",
" <td>10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ...</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12624</th>\n",
" <td>202511</td>\n",
" <td>NNE</td>\n",
" <td>VD</td>\n",
" <td>57211</td>\n",
" <td>AU MIGOS PETS COL ADULTOS 60ml</td>\n",
" <td>Não</td>\n",
" <td>Semanal</td>\n",
" <td>Não</td>\n",
" <td>BOT</td>\n",
" <td>AU.MIGOS PETS</td>\n",
" <td>...</td>\n",
" <td>Sim</td>\n",
" <td>REGULAR</td>\n",
" <td>NaN</td>\n",
" <td>0,00</td>\n",
" <td>VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ...</td>\n",
" <td>10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ...</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17953</th>\n",
" <td>202511</td>\n",
" <td>NNE</td>\n",
" <td>VD</td>\n",
" <td>57209</td>\n",
" <td>AU MIGOS PETS COL FILHOTES 60ml</td>\n",
" <td>Não</td>\n",
" <td>Semanal</td>\n",
" <td>Não</td>\n",
" <td>BOT</td>\n",
" <td>AU.MIGOS PETS</td>\n",
" <td>...</td>\n",
" <td>Sim</td>\n",
" <td>REGULAR</td>\n",
" <td>NaN</td>\n",
" <td>0,00</td>\n",
" <td>VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ...</td>\n",
" <td>10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ...</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23578</th>\n",
" <td>202511</td>\n",
" <td>NNE</td>\n",
" <td>VD</td>\n",
" <td>57208</td>\n",
" <td>AU MIGOS PETS COND ADULTOS 400ml</td>\n",
" <td>Não</td>\n",
" <td>Semanal</td>\n",
" <td>Não</td>\n",
" <td>BOT</td>\n",
" <td>AU.MIGOS PETS</td>\n",
" <td>...</td>\n",
" <td>Sim</td>\n",
" <td>REGULAR</td>\n",
" <td>NaN</td>\n",
" <td>0,00</td>\n",
" <td>VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ...</td>\n",
" <td>10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ...</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1918086</th>\n",
" <td>202511</td>\n",
" <td>NNE</td>\n",
" <td>Loja</td>\n",
" <td>55477</td>\n",
" <td>SCH BOTIK SERUM FAC RESV/SILICIO VDA 2ml</td>\n",
" <td>Não</td>\n",
" <td>Semanal</td>\n",
" <td>Não</td>\n",
" <td>BOT</td>\n",
" <td>BOTIK</td>\n",
" <td>...</td>\n",
" <td>Sim</td>\n",
" <td>REGULAR</td>\n",
" <td>[BOT] AÇÃO DE FLUXO BOTIK CICACERAMIDAS COM DE...</td>\n",
" <td>10,00</td>\n",
" <td>[BOT] AÇÃO DE FLUXO BOTIK CICACERAMIDAS COM DE...</td>\n",
" <td>0,00</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1918662</th>\n",
" <td>202511</td>\n",
" <td>NNE</td>\n",
" <td>Ecomm | VD</td>\n",
" <td>83961</td>\n",
" <td>ARBO DES BDY SPR 100ml V6</td>\n",
" <td>Não</td>\n",
" <td>Semanal</td>\n",
" <td>Não</td>\n",
" <td>BOT</td>\n",
" <td>ARBO</td>\n",
" <td>...</td>\n",
" <td>Sim</td>\n",
" <td>REGULAR</td>\n",
" <td>[ECOMM] PAIS 2025 - COMBO ARBO - NNE</td>\n",
" <td>21,49</td>\n",
" <td>VD - FAVORITOS PARA INÍCIOS BODY SPRAY ARBO - C11</td>\n",
" <td>35,00</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1926362</th>\n",
" <td>202511</td>\n",
" <td>NNE</td>\n",
" <td>Ecomm | VD</td>\n",
" <td>73614</td>\n",
" <td>COFFEE DES COL DUO MAN 100ml</td>\n",
" <td>Não</td>\n",
" <td>Semanal</td>\n",
" <td>Não</td>\n",
" <td>BOT</td>\n",
" <td>COFFEE</td>\n",
" <td>...</td>\n",
" <td>Sim</td>\n",
" <td>REGULAR</td>\n",
" <td>[ECOMM] PAIS 2025 - COMBO COFFEE E BOTMEN</td>\n",
" <td>18,67</td>\n",
" <td>VD - COFFEE PERFUMARIA MASCULINA - LUCRO EXTRA...</td>\n",
" <td>20,00 | 25,00 | 30,00</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1931987</th>\n",
" <td>202511</td>\n",
" <td>NNE</td>\n",
" <td>Ecomm | Loja</td>\n",
" <td>52948</td>\n",
" <td>NSPA CREM ESF CPO AMEI DOUR 200g</td>\n",
" <td>Não</td>\n",
" <td>Semanal</td>\n",
" <td>Não</td>\n",
" <td>BOT</td>\n",
" <td>NATIVA SPA</td>\n",
" <td>...</td>\n",
" <td>Sim</td>\n",
" <td>REGULAR</td>\n",
" <td>[LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ...</td>\n",
" <td>7,82</td>\n",
" <td>[LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ...</td>\n",
" <td>0,00</td>\n",
" <td>Não sortido</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1937171</th>\n",
" <td>202511</td>\n",
" <td>NNE</td>\n",
" <td>Ecomm | Loja</td>\n",
" <td>58987</td>\n",
" <td>NSPA OL BIF DES HID CPO UVA MERL 200ml</td>\n",
" <td>Não</td>\n",
" <td>Semanal</td>\n",
" <td>Não</td>\n",
" <td>BOT</td>\n",
" <td>NATIVA SPA</td>\n",
" <td>...</td>\n",
" <td>Sim</td>\n",
" <td>REGULAR</td>\n",
" <td>[LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ...</td>\n",
" <td>14,88</td>\n",
" <td>[LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ...</td>\n",
" <td>0,00</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>Sortido</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>332 rows × 24 columns</p>\n",
"</div>"
],
"text/plain": [
" Ciclo Região Canal Código \\\n",
"0 202511 NNE VD 74438 \n",
"7440 202511 NNE VD 57210 \n",
"12624 202511 NNE VD 57211 \n",
"17953 202511 NNE VD 57209 \n",
"23578 202511 NNE VD 57208 \n",
"... ... ... ... ... \n",
"1918086 202511 NNE Loja 55477 \n",
"1918662 202511 NNE Ecomm | VD 83961 \n",
"1926362 202511 NNE Ecomm | VD 73614 \n",
"1931987 202511 NNE Ecomm | Loja 52948 \n",
"1937171 202511 NNE Ecomm | Loja 58987 \n",
"\n",
" Descrição IAF Tipo de pedido Foco \\\n",
"0 ARBO DES COL 100ml V4 Não Semanal Não \n",
"7440 AU MIGOS PETS BANHO SECO ADULTOS 240ml Não Semanal Não \n",
"12624 AU MIGOS PETS COL ADULTOS 60ml Não Semanal Não \n",
"17953 AU MIGOS PETS COL FILHOTES 60ml Não Semanal Não \n",
"23578 AU MIGOS PETS COND ADULTOS 400ml Não Semanal Não \n",
"... ... ... ... ... \n",
"1918086 SCH BOTIK SERUM FAC RESV/SILICIO VDA 2ml Não Semanal Não \n",
"1918662 ARBO DES BDY SPR 100ml V6 Não Semanal Não \n",
"1926362 COFFEE DES COL DUO MAN 100ml Não Semanal Não \n",
"1931987 NSPA CREM ESF CPO AMEI DOUR 200g Não Semanal Não \n",
"1937171 NSPA OL BIF DES HID CPO UVA MERL 200ml Não Semanal Não \n",
"\n",
" Unidade de negócio Marca ... Catálogo Tipo de produto \\\n",
"0 BOT ARBO ... Sim REGULAR \n",
"7440 BOT AU.MIGOS PETS ... Sim REGULAR \n",
"12624 BOT AU.MIGOS PETS ... Sim REGULAR \n",
"17953 BOT AU.MIGOS PETS ... Sim REGULAR \n",
"23578 BOT AU.MIGOS PETS ... Sim REGULAR \n",
"... ... ... ... ... ... \n",
"1918086 BOT BOTIK ... Sim REGULAR \n",
"1918662 BOT ARBO ... Sim REGULAR \n",
"1926362 BOT COFFEE ... Sim REGULAR \n",
"1931987 BOT NATIVA SPA ... Sim REGULAR \n",
"1937171 BOT NATIVA SPA ... Sim REGULAR \n",
"\n",
" Ação consumidor \\\n",
"0 NaN \n",
"7440 NaN \n",
"12624 NaN \n",
"17953 NaN \n",
"23578 NaN \n",
"... ... \n",
"1918086 [BOT] AÇÃO DE FLUXO BOTIK CICACERAMIDAS COM DE... \n",
"1918662 [ECOMM] PAIS 2025 - COMBO ARBO - NNE \n",
"1926362 [ECOMM] PAIS 2025 - COMBO COFFEE E BOTMEN \n",
"1931987 [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ... \n",
"1937171 [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ... \n",
"\n",
" Percentual de desconto consumidor \\\n",
"0 0,00 \n",
"7440 0,00 \n",
"12624 0,00 \n",
"17953 0,00 \n",
"23578 0,00 \n",
"... ... \n",
"1918086 10,00 \n",
"1918662 21,49 \n",
"1926362 18,67 \n",
"1931987 7,82 \n",
"1937171 14,88 \n",
"\n",
" Ação revendedor \\\n",
"0 VD - FAVORITOS PARA INÍCIOS ARBO - C11 \n",
"7440 VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ... \n",
"12624 VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ... \n",
"17953 VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ... \n",
"23578 VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ... \n",
"... ... \n",
"1918086 [BOT] AÇÃO DE FLUXO BOTIK CICACERAMIDAS COM DE... \n",
"1918662 VD - FAVORITOS PARA INÍCIOS BODY SPRAY ARBO - C11 \n",
"1926362 VD - COFFEE PERFUMARIA MASCULINA - LUCRO EXTRA... \n",
"1931987 [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ... \n",
"1937171 [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ... \n",
"\n",
" Percentual de desconto revendedor Sortimento P \\\n",
"0 35,00 Sortido \n",
"7440 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ... Sortido \n",
"12624 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ... Sortido \n",
"17953 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ... Sortido \n",
"23578 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ... Sortido \n",
"... ... ... \n",
"1918086 0,00 Sortido \n",
"1918662 35,00 Sortido \n",
"1926362 20,00 | 25,00 | 30,00 Sortido \n",
"1931987 0,00 Não sortido \n",
"1937171 0,00 Sortido \n",
"\n",
" Sortimento M Sortimento G MATCH \n",
"0 Sortido Sortido 1 \n",
"7440 Sortido Sortido 1 \n",
"12624 Sortido Sortido 1 \n",
"17953 Sortido Sortido 1 \n",
"23578 Sortido Sortido 1 \n",
"... ... ... ... \n",
"1918086 Sortido Sortido 1 \n",
"1918662 Sortido Sortido 1 \n",
"1926362 Sortido Sortido 1 \n",
"1931987 Sortido Sortido 1 \n",
"1937171 Sortido Sortido 1 \n",
"\n",
"[332 rows x 24 columns]"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"df_estoque = df_estoque.drop(columns=['DESCRICAO', 'CATEGORIA', 'CLASSE', 'FASES PRODUTO',\n",
" 'LANCAMENTO', 'DESATIVACAO','COBERTURA ALVO',\n",
" 'ESTOQUE DE SEGURANCA','COBERTURA PROJETADA', \n",
" 'Pasta_Origem'])"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>SKU</th>\n",
" <th>SKU_PARA</th>\n",
" <th>PDV</th>\n",
" <th>ESTOQUE ATUAL</th>\n",
" <th>ESTOQUE EM TRANSITO</th>\n",
" <th>PEDIDO PENDENTE</th>\n",
" <th>DDV PREVISTO</th>\n",
" <th>COBERTURA ATUAL</th>\n",
" <th>COBERTURA ATUAL + TRANSITO</th>\n",
" <th>Arquivo_Origem</th>\n",
" <th>SKU_FINAL</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>94394</td>\n",
" <td>-</td>\n",
" <td>20968</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>BOT.csv</td>\n",
" <td>94394</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>94394</td>\n",
" <td>-</td>\n",
" <td>20969</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>BOT.csv</td>\n",
" <td>94394</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>94394</td>\n",
" <td>-</td>\n",
" <td>20970</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>BOT.csv</td>\n",
" <td>94394</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>94394</td>\n",
" <td>-</td>\n",
" <td>20986</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>BOT.csv</td>\n",
" <td>94394</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>94394</td>\n",
" <td>-</td>\n",
" <td>20988</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>BOT.csv</td>\n",
" <td>94394</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>454599</th>\n",
" <td>4438</td>\n",
" <td>-</td>\n",
" <td>910291</td>\n",
" <td>9.0</td>\n",
" <td>10.0</td>\n",
" <td>0.0</td>\n",
" <td>0.78</td>\n",
" <td>11.0</td>\n",
" <td>24.0</td>\n",
" <td>QDB.csv</td>\n",
" <td>4438</td>\n",
" </tr>\n",
" <tr>\n",
" <th>454600</th>\n",
" <td>4431</td>\n",
" <td>-</td>\n",
" <td>21007</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>QDB.csv</td>\n",
" <td>4431</td>\n",
" </tr>\n",
" <tr>\n",
" <th>454601</th>\n",
" <td>4431</td>\n",
" <td>-</td>\n",
" <td>910173</td>\n",
" <td>2.0</td>\n",
" <td>10.0</td>\n",
" <td>0.0</td>\n",
" <td>0.40</td>\n",
" <td>5.0</td>\n",
" <td>30.0</td>\n",
" <td>QDB.csv</td>\n",
" <td>4431</td>\n",
" </tr>\n",
" <tr>\n",
" <th>454602</th>\n",
" <td>4431</td>\n",
" <td>-</td>\n",
" <td>910291</td>\n",
" <td>1.0</td>\n",
" <td>10.0</td>\n",
" <td>0.0</td>\n",
" <td>0.78</td>\n",
" <td>1.0</td>\n",
" <td>14.0</td>\n",
" <td>QDB.csv</td>\n",
" <td>4431</td>\n",
" </tr>\n",
" <tr>\n",
" <th>454603</th>\n",
" <td>1594</td>\n",
" <td>-</td>\n",
" <td>21007</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>QDB.csv</td>\n",
" <td>1594</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>454604 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" SKU SKU_PARA PDV ESTOQUE ATUAL ESTOQUE EM TRANSITO \\\n",
"0 94394 - 20968 0.0 0.0 \n",
"1 94394 - 20969 0.0 0.0 \n",
"2 94394 - 20970 0.0 0.0 \n",
"3 94394 - 20986 0.0 0.0 \n",
"4 94394 - 20988 0.0 0.0 \n",
"... ... ... ... ... ... \n",
"454599 4438 - 910291 9.0 10.0 \n",
"454600 4431 - 21007 0.0 0.0 \n",
"454601 4431 - 910173 2.0 10.0 \n",
"454602 4431 - 910291 1.0 10.0 \n",
"454603 1594 - 21007 2.0 0.0 \n",
"\n",
" PEDIDO PENDENTE DDV PREVISTO COBERTURA ATUAL \\\n",
"0 0.0 NaN NaN \n",
"1 0.0 NaN NaN \n",
"2 0.0 NaN NaN \n",
"3 0.0 NaN NaN \n",
"4 0.0 NaN NaN \n",
"... ... ... ... \n",
"454599 0.0 0.78 11.0 \n",
"454600 0.0 NaN NaN \n",
"454601 0.0 0.40 5.0 \n",
"454602 0.0 0.78 1.0 \n",
"454603 0.0 NaN NaN \n",
"\n",
" COBERTURA ATUAL + TRANSITO Arquivo_Origem SKU_FINAL \n",
"0 NaN BOT.csv 94394 \n",
"1 NaN BOT.csv 94394 \n",
"2 NaN BOT.csv 94394 \n",
"3 NaN BOT.csv 94394 \n",
"4 NaN BOT.csv 94394 \n",
"... ... ... ... \n",
"454599 24.0 QDB.csv 4438 \n",
"454600 NaN QDB.csv 4431 \n",
"454601 30.0 QDB.csv 4431 \n",
"454602 14.0 QDB.csv 4431 \n",
"454603 NaN QDB.csv 1594 \n",
"\n",
"[454604 rows x 11 columns]"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_estoque"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Users\\joao.herculano\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\openpyxl\\styles\\stylesheet.py:237: UserWarning: Workbook contains no default style, apply openpyxl's default\n",
" warn(\"Workbook contains no default style, apply openpyxl's default\")\n"
]
}
],
"source": [
"df_bi_preco = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C11\\preço BI\\TABELA DE PREÇOS (2).xlsx\")\n",
"\n",
"df_bi_preco = df_bi_preco.drop(columns=['Descrição','Tipo Preço','CATEGORIA','LINHA','MARCA'])\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(25232, 31)"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final = pd.merge(left=df_tabela,right=df_pdv,on='MATCH',how='left')\n",
"\n",
"df_final = df_final.drop_duplicates()\n",
"\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(25232, 62)"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['PDV'] = df_final['PDV'].astype('Int64')\n",
"df_final['Código'] = df_final['Código'].astype('Int64')\n",
"\n",
"\n",
"df_final = pd.merge(left=df_final,right=df_draft,left_on=['PDV','Código'],right_on=['PDV','SKU'],how='left')\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Series([], Name: Histórico de Vendas do Ciclo 202505, dtype: float64)"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final[(df_final['Código'] == 52023) & (df_final['PDV'] == 23712)]['Histórico de Vendas do Ciclo 202505']"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.drop(columns=['Sortimento P', 'Sortimento M',\n",
" 'Sortimento G','MARCA','SKU'])"
]
},
{
"cell_type": "code",
"execution_count": 28,
"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"
]
},
{
"cell_type": "code",
"execution_count": 29,
"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": "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": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Ciclo</th>\n",
" <th>INICIO CICLO</th>\n",
" <th>FIM CICLO</th>\n",
" <th>DURAÇÃO</th>\n",
" <th>Date</th>\n",
" <th>NUM_CICLO</th>\n",
" <th>ANO_CICLO</th>\n",
" <th>CICLOMAIS2</th>\n",
" <th>dias_ate_inicio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2241</th>\n",
" <td>C202511</td>\n",
" <td>2025-07-21</td>\n",
" <td>2025-08-10</td>\n",
" <td>21</td>\n",
" <td>2025-07-21</td>\n",
" <td>11</td>\n",
" <td>C2025</td>\n",
" <td>C202513</td>\n",
" <td>38</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Ciclo INICIO CICLO FIM CICLO DURAÇÃO Date NUM_CICLO \\\n",
"2241 C202511 2025-07-21 2025-08-10 21 2025-07-21 11 \n",
"\n",
" ANO_CICLO CICLOMAIS2 dias_ate_inicio \n",
"2241 C2025 C202513 38 "
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"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'] == \"BOTICARIO\"]\n",
"\n",
"calendario = calendario.drop(columns='MARCA')\n",
"\n",
"calendario['CICLOMAIS2'] = calendario['ANO_CICLO'].astype(str) + (calendario['NUM_CICLO'].astype(int) + 2).astype(str).str.zfill(2) # >>>>>>>>> MUDAR PRA CICLO CORRETO \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",
"filtered_calendario\n"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"filtered_calendario['MATCH'] = 1"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"#df_tabela = df_tabela[(df_tabela['Tipo de promoção'] == \"Revendedor\" ) | (df_tabela['Tipo de promoção'] == \"Promoções\") |(df_tabela['Tipo de promoção'] == \"Promoções | Revendedor\" )]"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"df_draft['PDV'] = df_draft['PDV'].astype(str)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(25232, 62)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"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": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(30861, 72)"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['Código'] = df_final['Código'].astype('Int64') \n",
"df_final['PDV'] = df_final['PDV'].astype('Int64') \n",
"\n",
"df_estoque['PDV'] = df_estoque['PDV'].astype('Int64') \n",
"df_estoque['SKU_FINAL'] = df_estoque['SKU_FINAL'].astype('Int64') \n",
"\n",
"df_final = pd.merge(left=df_final,right=df_estoque,right_on=['PDV','SKU_FINAL'],left_on=['PDV','Código'],how='left')\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(30861, 76)"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['Código'] = df_final['Código'].astype('str')\n",
"\n",
"df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype('str')\n",
"\n",
"df_final = pd.merge(left=df_final,right=df_bi_preco,right_on=['UF','SKU2'],left_on=['UF','Código'],how='left')\n",
"df_final.shape "
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(30950, 80)"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"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','Código'],how='left')\n",
"df_final.shape "
]
},
{
"cell_type": "code",
"execution_count": 39,
"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": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"CANAL\n",
"TODOS 23509\n",
"VD 6445\n",
"Name: count, dtype: int64"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"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": 41,
"metadata": {},
"outputs": [],
"source": [
"df_estoque = df_estoque.rename(columns={'SKU_FINAL':'SKU_PARA_VALIDACAO'})\n",
"\n",
"df_estoque['SKU_PARA_VALIDACAO'] = df_estoque['SKU_PARA_VALIDACAO'].astype('Int64')\n",
"\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')\n",
"\n",
"df_final = df_final.drop_duplicates()"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.drop(columns=['SKU1_x','SKU1_y','SKU2_x','SKU2_y','PC_x', 'PV_x','PC_y', 'PV_y','Subcategoria',\n",
"'Carteira Bloqueada Para Novos Pedidos',\n",
"'Quantidade por caixa'\n",
"])"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['SKU'].astype(str)\n"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [],
"source": [
"df_final['Projeção Próximo Ciclo + 1'] =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": 45,
"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": 46,
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.rename(columns={'Compra inteligente Próximo Ciclo + 1':'Compra inteligente Próximo Ciclo','Arquivo_Origem': 'MARCA'})"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.int64(0)"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final = df_final[~df_final['Marca'].isna()]\n",
"df_final['Marca'].isna().sum()"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(30950, 74)"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final = df_final.drop_duplicates()\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"df_final[df_final.columns[26:43]] = df_final[df_final.columns[26:43]].fillna(0)\n"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Histórico de Vendas do Ciclo 202409',\n",
" 'Histórico de Vendas do Ciclo 202410',\n",
" 'Histórico de Vendas do Ciclo 202411',\n",
" 'Histórico de Vendas do Ciclo 202412',\n",
" 'Histórico de Vendas do Ciclo 202413',\n",
" 'Histórico de Vendas do Ciclo 202414',\n",
" 'Histórico de Vendas do Ciclo 202415',\n",
" 'Histórico de Vendas do Ciclo 202416',\n",
" 'Histórico de Vendas do Ciclo 202417',\n",
" 'Histórico de Vendas do Ciclo 202501',\n",
" 'Histórico de Vendas do Ciclo 202502',\n",
" 'Histórico de Vendas do Ciclo 202503',\n",
" 'Histórico de Vendas do Ciclo 202504',\n",
" 'Histórico de Vendas do Ciclo 202505',\n",
" 'Histórico de Vendas do Ciclo 202506',\n",
" 'Histórico de Vendas do Ciclo 202507',\n",
" 'Histórico de Vendas do Ciclo 202508',\n",
" 'Histórico de Vendas do Ciclo Atual'],\n",
" dtype='object')"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[26:44]"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [],
"source": [
"# Define list of target columns\n",
"sales_2024_cols = df_final.columns[26:44]\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": 52,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Histórico de Vendas do Ciclo 202503',\n",
" 'Histórico de Vendas do Ciclo 202504',\n",
" 'Histórico de Vendas do Ciclo 202505',\n",
" 'Histórico de Vendas do Ciclo 202506',\n",
" 'Histórico de Vendas do Ciclo 202507',\n",
" 'Histórico de Vendas do Ciclo 202508',\n",
" 'Histórico de Vendas do Ciclo Atual'],\n",
" dtype='object')"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[37:44]"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [],
"source": [
"vendas_6_meses = df_final.columns[37:44]\n",
"\n",
"df_final['Pico Vendas Ultimos 6 ciclos'] = df_final[vendas_6_meses].max(axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Histórico de Vendas do Ciclo 202503',\n",
" 'Histórico de Vendas do Ciclo 202504',\n",
" 'Histórico de Vendas do Ciclo 202505',\n",
" 'Histórico de Vendas do Ciclo 202506',\n",
" 'Histórico de Vendas do Ciclo 202507',\n",
" 'Histórico de Vendas do Ciclo 202508',\n",
" 'Histórico de Vendas do Ciclo Atual'],\n",
" dtype='object')"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[37:44]"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_17756\\2592201544.py:24: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
" crescimento_por_pdv = df_final.groupby('PDV').apply(calcular_crescimento)\n"
]
}
],
"source": [
"# Define as colunas mensais\n",
"colunas_mensais = df_final.columns[26:43]\n",
"\n",
"# Agrupa por PDV e calcula crescimento médio por PDV\n",
"def calcular_crescimento(grupo):\n",
" soma_mensal = grupo[colunas_mensais].sum() # soma por mês\n",
" variacao_mensal = soma_mensal.pct_change().dropna() # variação percentual mês a mês\n",
" variacao_mensal = variacao_mensal[np.isfinite(variacao_mensal)]\n",
"\n",
" if len(variacao_mensal) == 0:\n",
" return pd.Series({'CRESCIMENTO': np.nan})\n",
"\n",
" media = variacao_mensal.mean()\n",
" desvio = variacao_mensal.std()\n",
"\n",
" limite_sup = media + 2 * desvio\n",
" limite_inf = media - 2 * desvio\n",
"\n",
" variacoes_filtradas = variacao_mensal[variacao_mensal.between(limite_inf, limite_sup)]\n",
" crescimento = round(variacoes_filtradas.mean(), 4)\n",
" return pd.Series({'CRESCIMENTO': crescimento})\n",
"\n",
"# Aplica a função por PDV\n",
"crescimento_por_pdv = df_final.groupby('PDV').apply(calcular_crescimento)\n",
"\n",
"# Merge do resultado de volta no dataframe original\n",
"df_final = df_final.merge(crescimento_por_pdv, on='PDV', how='left')\n"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float64(0.0564)"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Suponha que os meses estão nas colunas 10 a 26 (17 colunas = 17 meses)\n",
"colunas_mensais = df_final.columns[26:43]\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_GERAL'] = CRESCIMENTO\n",
"\n",
"CRESCIMENTO\n"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>CANAL</th>\n",
" <th>med_por_canal</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>TODOS</td>\n",
" <td>90.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>VD</td>\n",
" <td>715.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" CANAL med_por_canal\n",
"0 TODOS 90.5\n",
"1 VD 715.0"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vendas_todos_historicos = df_final.columns[26:44]\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",
"medi = df_final.groupby(['CANAL'])['MEDIANA DO HISTÓRICO'].max().reset_index()\n",
"medi = medi.rename(columns={'MEDIANA DO HISTÓRICO':'med_por_canal'})\n",
"\n",
"df_final = pd.merge(left=df_final, right=medi,on='CANAL',how='left')\n",
"\n",
"medi"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'202411'"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[28:29].str.split(\" \")[0][-1]"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"mesmo_ciclo_ano_passado = df_final.columns[28:29]\n",
"ciclo_ano_passado = df_final.columns[28:29].str.split(\" \")[0][-1]\n",
"df_final[ciclo_ano_passado] = df_final[mesmo_ciclo_ano_passado]"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(30950, 84)"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['CRESCIMENTO_FINAL'] = df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'] #crescimento do pdv\n",
"\n",
"df_final['CRESCIMENTO_FINAL'] = np.where(df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO']>0.8,0.8,df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'])\n",
"\n",
"df_final['CRESCIMENTO_FINAL'] = np.where(df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO']<0,0,df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'])\n",
"\n",
"df_final['MEDIANA DO HISTÓRICO'] = np.where(df_final['MEDIANA DO HISTÓRICO']==0,df_final['MEDIA DO HISTÓRICO'] ,df_final['MEDIANA DO HISTÓRICO'])\n",
"\n",
"# Primeiro cálculo intermediário\n",
"df_final['PV GINSENG'] = np.where(df_final['CRESCIMENTO_FINAL'] * df_final[ciclo_ano_passado] + df_final[ciclo_ano_passado] <1,\n",
" round(df_final['CRESCIMENTO_FINAL'] * df_final['MEDIANA DO HISTÓRICO']+ df_final['MEDIANA DO HISTÓRICO'],0), \n",
" round(df_final['CRESCIMENTO_FINAL']*df_final[ciclo_ano_passado]+df_final[ciclo_ano_passado],0))\n",
"\n",
"\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Histórico de Vendas do Ciclo 202409',\n",
" 'Histórico de Vendas do Ciclo 202410',\n",
" 'Histórico de Vendas do Ciclo 202411',\n",
" 'Histórico de Vendas do Ciclo 202412',\n",
" 'Histórico de Vendas do Ciclo 202413',\n",
" 'Histórico de Vendas do Ciclo 202414',\n",
" 'Histórico de Vendas do Ciclo 202415',\n",
" 'Histórico de Vendas do Ciclo 202416',\n",
" 'Histórico de Vendas do Ciclo 202417',\n",
" 'Histórico de Vendas do Ciclo 202501',\n",
" 'Histórico de Vendas do Ciclo 202502',\n",
" 'Histórico de Vendas do Ciclo 202503',\n",
" 'Histórico de Vendas do Ciclo 202504'],\n",
" dtype='object')"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[26:39]"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.rename(columns={df_final.columns[39]: \"C-4\", df_final.columns[40]: \"C-3\",df_final.columns[41]: \"C-2\",df_final.columns[42]: \"C-1\"})"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"df_final.drop(columns=df_final.columns[26:39], inplace=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 64,
"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": 65,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup['DDV PREVISTO'] = df_final_dedup['DDV PREVISTO'].fillna(0.01)\n"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"76 9.0\n",
"152 0.0\n",
"228 0.0\n",
"304 0.0\n",
"380 0.0\n",
" ... \n",
"30610 18.0\n",
"30708 129.0\n",
"30785 744.0\n",
"30861 1074.0\n",
"30937 113.0\n",
"Name: C-3, Length: 371, dtype: float64"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final_dedup[(df_final['PDV'] == 23712)]['C-3']"
]
},
{
"cell_type": "code",
"execution_count": 67,
"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": 68,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['202411', 'ANALISTA', 'Arquivo_Origem_x', 'Arquivo_Origem_y',\n",
" 'Ação consumidor', 'Ação revendedor', 'C-1', 'C-2', 'C-3', 'C-4',\n",
" 'CANAL', 'COBERTURA ATUAL + TRANSITO', 'CRESCIMENTO',\n",
" 'CRESCIMENTO_FINAL', 'CRESCIMENTO_GERAL', 'Canal', 'Categoria',\n",
" 'Catálogo', 'Ciclo_x', 'Ciclo_y', 'Classe', 'Código', 'DESCRIÇÃO PDV',\n",
" 'DURAÇÃO', 'Data Prevista Regularização', 'Descrição', 'Dias sem venda',\n",
" 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO', 'Estoque Atual',\n",
" 'Estoque em Transito', 'FIM CICLO', 'Foco',\n",
" 'Histórico de Vendas do Ciclo 202408',\n",
" 'Histórico de Vendas do Ciclo Atual', 'IAF', 'INICIO CICLO',\n",
" 'Item Desativado', 'MATCH', 'MEDIA DO HISTÓRICO',\n",
" 'MEDIANA DO HISTÓRICO', 'Marca', 'PDV', 'PEDIDO PENDENTE',\n",
" 'PICO DE VENDAS 2024', 'PRECO DE COMPRA', 'PRECO DE VENDA',\n",
" 'PV GINSENG', 'Pedido Pendente', 'Percentual de desconto consumidor',\n",
" 'Percentual de desconto revendedor', 'Pico Vendas Ultimos 6 ciclos',\n",
" 'Projeção Próximo Ciclo', 'Projeção Próximo Ciclo + 1',\n",
" 'Promoção Próximo Ciclo + 1', 'Região', 'SKU', 'SKU_FINAL', 'SKU_PARA',\n",
" 'SKU_PARA_VALIDACAO', 'SUPERVISOR', 'Tipo de pedido', 'Tipo de produto',\n",
" 'Tipo de promoção', 'UF', 'UFPRODUTO', 'Unidade de negócio',\n",
" 'dias_ate_inicio', 'med_por_canal', 'DDV PREVISTO', 'COBERTURA ATUAL'],\n",
" dtype='object')"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final_dedup.columns"
]
},
{
"cell_type": "code",
"execution_count": 69,
"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": 70,
"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": 71,
"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": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['SKU', 'SKU_PARA', 'PDV', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
" 'PEDIDO PENDENTE', 'DDV PREVISTO', 'COBERTURA ATUAL',\n",
" 'COBERTURA ATUAL + TRANSITO', 'Arquivo_Origem', 'SKU_PARA_VALIDACAO'],\n",
" dtype='object')"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_estoque.columns"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('Ação consumidor',\n",
" 'Percentual de desconto consumidor',\n",
" 'Ação revendedor',\n",
" 'Percentual de desconto revendedor',\n",
" '202408')"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Columns to bring up front\n",
"priority_cols = [\n",
" 'SKU',\t'Marca',\t'INICIO CICLO',\n",
" 'FIM CICLO',\t'DURAÇÃO',\t'PRECO DE COMPRA',\t'PRECO DE VENDA',\n",
" 'UFPRODUTO',\t'Item Desativado',\t'Data Prevista Regularização',\n",
" 'ANALISTA',\t'UF',\t'CANAL',\t'PDV',\t'DESCRIÇÃO PDV',\t'Classe',\n",
" 'Descrição',\t'Categoria',\n",
"\t'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\t'COBERTURA ATUAL',\n",
" '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_final_dedup.columns if col not in priority_cols]\n",
"\n",
"# Reorder\n",
"'Ação consumidor', 'Percentual de desconto consumidor', 'Ação revendedor', 'Percentual de desconto revendedor', '202408'\n"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [],
"source": [
"#df_final_dedup = df_final_dedup[priority_cols + other_cols]\n"
]
},
{
"cell_type": "code",
"execution_count": 75,
"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": 76,
"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": 77,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup.drop(df_final_dedup.columns[39:40], axis=1, inplace=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup.drop(columns=['dias_ate_inicio','SKU_FINAL',\n",
" 'CRESCIMENTO'],inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [],
"source": [
"#df_final_dedup['MARCA'] = df_final_dedup['MARCA'].str.replace('.csv','',regex=False)"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup['COB PROJETADA'] = df_final_dedup['COB PROJETADA'].fillna(999)"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'BOT'"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"marca_promo = df_estoque['Arquivo_Origem'].iloc[0].replace('.csv','')\n",
"marca_promo"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup['INICIO CICLO'] = pd.to_datetime(df_final_dedup['INICIO CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')\n",
"\n",
"df_final_dedup['FIM CICLO'] = pd.to_datetime(df_final_dedup['FIM CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup['Percentual de desconto revendedor'] = np.where((df_final_dedup['Percentual de desconto revendedor'].isna()) & (~df_final_dedup['Percentual de desconto consumidor'].isna()),df_final_dedup['Percentual de desconto consumidor'],df_final_dedup['Percentual de desconto revendedor'])"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [],
"source": [
"df_pdv_origi['PDV'] = df_pdv_origi['PDV'].astype('Int64')\n",
"df_final_dedup['PDV'] = df_final_dedup['PDV'].astype('Int64')\n",
"\n",
"\n",
"df_final_dedup = pd.merge(left=df_final_dedup,right=df_pdv_origi[['PDV','CANAL','UF']],how='left',on='PDV')"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.int64(0)"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final_dedup['Código'].isna().sum()"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup.to_excel(r'C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C11\\teste.xlsx')"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup = df_final_dedup[df_final_dedup['Código']!= '<NA>']\n"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [],
"source": [
"df_vdc = pd.read_csv(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C10\\VENDA VITORIA 2024\\VENDA VITORIA.csv\")\n",
"\n",
"df_vdc['PRODUTO'] = df_vdc['PRODUTO'].astype('Int64')\n",
"\n",
"df_final_dedup['Código'] = df_final_dedup['Código'].astype('Int64')\n",
"\n",
"df_final_dedup =pd.merge(left=df_final_dedup,right=df_vdc[['PDV GINSENG','PRODUTO',ciclo_ano_passado]],left_on= ['PDV','Código'],right_on= ['PDV GINSENG','PRODUTO'],how='left' )\n",
"\n",
"df_final_dedup[df_final_dedup.columns[-1]] = df_final_dedup[df_final_dedup.columns[-1]].fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>202411_x</th>\n",
" <th>ANALISTA</th>\n",
" <th>Arquivo_Origem_x</th>\n",
" <th>Arquivo_Origem_y</th>\n",
" <th>Ação consumidor</th>\n",
" <th>Ação revendedor</th>\n",
" <th>C-1</th>\n",
" <th>C-2</th>\n",
" <th>C-3</th>\n",
" <th>C-4</th>\n",
" <th>...</th>\n",
" <th>COBERTURA ATUAL</th>\n",
" <th>EST PROJE FINAL CICLO ATUAL</th>\n",
" <th>VENDAS R$ PV GINSENG</th>\n",
" <th>RBV 202406</th>\n",
" <th>COB PROJETADA</th>\n",
" <th>CANAL_y</th>\n",
" <th>UF_y</th>\n",
" <th>PDV GINSENG</th>\n",
" <th>PRODUTO</th>\n",
" <th>202411_y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.0</td>\n",
" <td>DANIEL</td>\n",
" <td>BOT.csv</td>\n",
" <td>BOT.csv</td>\n",
" <td>BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO</td>\n",
" <td>BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>166.0</td>\n",
" <td>4.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>166.666667</td>\n",
" <td>LJ</td>\n",
" <td>BA</td>\n",
" <td>NaN</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.0</td>\n",
" <td>DANIEL</td>\n",
" <td>BOT.csv</td>\n",
" <td>BOT.csv</td>\n",
" <td>BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO</td>\n",
" <td>BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>45.0</td>\n",
" <td>1.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>100.000000</td>\n",
" <td>LJ</td>\n",
" <td>VDC</td>\n",
" <td>NaN</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.0</td>\n",
" <td>DANIEL</td>\n",
" <td>BOT.csv</td>\n",
" <td>BOT.csv</td>\n",
" <td>BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO</td>\n",
" <td>BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>200.0</td>\n",
" <td>2.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>200.000000</td>\n",
" <td>LJ</td>\n",
" <td>BA</td>\n",
" <td>NaN</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.0</td>\n",
" <td>DANIEL</td>\n",
" <td>BOT.csv</td>\n",
" <td>BOT.csv</td>\n",
" <td>BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO</td>\n",
" <td>BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>83.333333</td>\n",
" <td>LJ</td>\n",
" <td>BA</td>\n",
" <td>NaN</td>\n",
" <td>&lt;NA&gt;</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.0</td>\n",
" <td>DANIEL</td>\n",
" <td>BOT.csv</td>\n",
" <td>BOT.csv</td>\n",
" <td>BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO</td>\n",
" <td>BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>100.0</td>\n",
" <td>1.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>100.000000</td>\n",
" <td>VD</td>\n",
" <td>VDC</td>\n",
" <td>23703.0</td>\n",
" <td>29046</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 76 columns</p>\n",
"</div>"
],
"text/plain": [
" 202411_x ANALISTA Arquivo_Origem_x Arquivo_Origem_y \\\n",
"0 0.0 DANIEL BOT.csv BOT.csv \n",
"1 0.0 DANIEL BOT.csv BOT.csv \n",
"2 0.0 DANIEL BOT.csv BOT.csv \n",
"3 0.0 DANIEL BOT.csv BOT.csv \n",
"4 0.0 DANIEL BOT.csv BOT.csv \n",
"\n",
" Ação consumidor \\\n",
"0 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO \n",
"1 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO \n",
"2 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO \n",
"3 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO \n",
"4 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO \n",
"\n",
" Ação revendedor C-1 C-2 C-3 C-4 ... \\\n",
"0 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO 0.0 0.0 0.0 1.0 ... \n",
"1 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO 0.0 2.0 0.0 0.0 ... \n",
"2 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO 2.0 0.0 0.0 1.0 ... \n",
"3 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO 3.0 0.0 0.0 3.0 ... \n",
"4 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO 4.0 0.0 0.0 0.0 ... \n",
"\n",
" COBERTURA ATUAL EST PROJE FINAL CICLO ATUAL VENDAS R$ PV GINSENG \\\n",
"0 166.0 4.0 NaN \n",
"1 45.0 1.0 NaN \n",
"2 200.0 2.0 NaN \n",
"3 0.0 3.0 NaN \n",
"4 100.0 1.0 NaN \n",
"\n",
" RBV 202406 COB PROJETADA CANAL_y UF_y PDV GINSENG PRODUTO 202411_y \n",
"0 NaN 166.666667 LJ BA NaN <NA> 0.0 \n",
"1 NaN 100.000000 LJ VDC NaN <NA> 0.0 \n",
"2 NaN 200.000000 LJ BA NaN <NA> 0.0 \n",
"3 NaN 83.333333 LJ BA NaN <NA> 0.0 \n",
"4 NaN 100.000000 VD VDC 23703.0 29046 0.0 \n",
"\n",
"[5 rows x 76 columns]"
]
},
"execution_count": 89,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final_dedup.head()"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'202411_y'"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final_dedup.columns[-1]"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup[df_final_dedup.columns[0]] = np.where(df_final_dedup[df_final_dedup.columns[-1]]>0,df_final_dedup[df_final_dedup.columns[-1]],df_final_dedup[df_final_dedup.columns[0]])"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup = df_final_dedup.drop(columns=['Arquivo_Origem_x','Arquivo_Origem_y','CANAL_x','Canal',\n",
" 'Ciclo_x','Ciclo_y','DURAÇÃO','FIM CICLO','Foco','INICIO CICLO','MATCH',\n",
" 'PRECO DE COMPRA','SKU','SKU_PARA','SKU_PARA_VALIDACAO',\n",
" 'Tipo de pedido',\t'Tipo de produto','UFPRODUTO','Unidade de negócio','EST PROJE FINAL CICLO ATUAL',\n",
" 'UF_x','RBV 202406','Região','Catálogo','SKU','VENDAS R$ PV GINSENG','Data Prevista Regularização',\n",
" 'IAF', 'Item Desativado','Tipo de promoção','PDV GINSENG','PRODUTO','202411_y',\n",
" 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO','COBERTURA ATUAL + TRANSITO',\n",
" 'DDV PREVISTO',\t'COB PROJETADA','COBERTURA ATUAL',\n",
" 'CRESCIMENTO_FINAL',\t'CRESCIMENTO_GERAL','med_por_canal','PEDIDO PENDENTE'])"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup = df_final_dedup.rename(columns={'CANAL_y':'CANAL','UF_y':'UF','Marca':'LINHA','202410_x':'202410'})\n"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['202411_x', 'ANALISTA', 'Ação consumidor', 'Ação revendedor', 'C-1',\n",
" 'C-2', 'C-3', 'C-4', 'Categoria', 'Classe', 'Código', 'DESCRIÇÃO PDV',\n",
" 'Descrição', 'Dias sem venda', 'Estoque Atual', 'Estoque em Transito',\n",
" 'Histórico de Vendas do Ciclo 202408',\n",
" 'Histórico de Vendas do Ciclo Atual', 'MEDIANA DO HISTÓRICO', 'LINHA',\n",
" 'PDV', 'PICO DE VENDAS 2024', 'PRECO DE VENDA', 'PV GINSENG',\n",
" 'Pedido Pendente', 'Percentual de desconto consumidor',\n",
" 'Percentual de desconto revendedor', 'Pico Vendas Ultimos 6 ciclos',\n",
" 'Projeção Próximo Ciclo', 'Projeção Próximo Ciclo + 1',\n",
" 'Promoção Próximo Ciclo + 1', 'SUPERVISOR', 'CANAL', 'UF'],\n",
" dtype='object')"
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final_dedup.columns"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_17756\\4017566689.py:1: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n",
" df_final_dedup[(df_final['PDV'] == 23712)]['C-3']\n"
]
},
{
"data": {
"text/plain": [
"76 9.0\n",
"152 0.0\n",
"228 0.0\n",
"304 0.0\n",
"380 0.0\n",
" ... \n",
"29314 6.0\n",
"29390 26.0\n",
"29466 137.0\n",
"29542 116.0\n",
"29618 23.0\n",
"Name: C-3, Length: 355, dtype: float64"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final_dedup[(df_final['PDV'] == 23712)]['C-3']"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [],
"source": [
"priority_cols = ['SUPERVISOR','ANALISTA','UF','CANAL','LINHA','PDV','DESCRIÇÃO PDV','Código','Descrição','Categoria', \n",
"'Classe','Percentual de desconto consumidor','Ação consumidor','Percentual de desconto revendedor','Ação revendedor','C-1',\n",
"'C-2', 'C-3', 'C-4','Histórico de Vendas do Ciclo Atual','Estoque Atual','Estoque em Transito','Pedido Pendente',\n",
"'Projeção Próximo Ciclo + 1','Projeção Próximo Ciclo']\n",
"\n",
"# All remaining columns\n",
"other_cols = [col for col in df_final_dedup.columns if col not in priority_cols]\n",
"\n",
"# Reorder\n",
"df_final_dedup = df_final_dedup[priority_cols + other_cols]\n",
"\n",
"df_final_dedup['SUGESTÃO ABASTECIMENTO'] = ''\n"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup = df_final_dedup.drop_duplicates()"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float64(75876.0)"
]
},
"execution_count": 98,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final_dedup['PV GINSENG'].sum()"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.int64(0)"
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final_dedup[df_final_dedup['PDV'] == 23712]['PICO DE VENDAS 2024'].isna().sum()"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {},
"outputs": [],
"source": [
"# Export to Excel\n",
"output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\promoção_{marca_promo}_{ciclo_mais2}.{hoje}.xlsx'\n",
"with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n",
" df_final_dedup.to_excel(writer, index=False)\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
}