2881 lines
92 KiB
Plaintext
2881 lines
92 KiB
Plaintext
{
|
||
"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><NA></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><NA></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><NA></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><NA></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
|
||
}
|