Ruptura_Projetada/promoção/promoção_EUD_ciclo07.ipynb
2025-09-08 16:38:02 -03:00

5289 lines
170 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": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_3428\\1229765338.py:39: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n",
" df0 = pd.read_sql(query, conn)\n"
]
}
],
"source": [
"import pyodbc\n",
"import configparser\n",
"import pandas as pd\n",
"import numpy as np \n",
"from datetime import datetime, time\n",
"\n",
"\n",
"config = configparser.ConfigParser()\n",
"config.read(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\CODIGOS\\relatório_improdutivo\\credenciais.ini\")\n",
"\n",
"# Conexão com o banco\n",
"conn = pyodbc.connect(\n",
" f\"DRIVER={{SQL Server}};\"\n",
" f\"SERVER={config['banco']['host']},1433;\"\n",
" f\"DATABASE=GINSENG;\"\n",
" f\"UID={config['banco']['user']};\"\n",
" f\"PWD={config['banco']['password']}\")\n",
"\n",
"#gerar query\n",
"query = '''\n",
"SELECT \n",
" e.pdv,\n",
" e.SKU,\n",
" COALESCE(e.SKU_PARA, e.SKU) AS SKU_FINAL,\n",
" e.[ESTOQUE ATUAL],\n",
" e.[ESTOQUE EM TRANSITO],\n",
" e.[PEDIDO PENDENTE],\n",
" d.salescurve AS Curva,\n",
" e.CATEGORIA,\n",
" d.dayswithoutsales AS DiasSemVenda,\n",
" d.nextcycleprojection,\n",
" d.secondtonextcycleprojection\n",
"FROM \n",
" estoque_mar e \n",
"LEFT JOIN draft d \n",
" ON d.loja_id = e.PDV \n",
" AND d.code = e.SKU\n",
"'''\n",
"df0 = pd.read_sql(query, conn)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"pdv\n",
"20997 27572\n",
"20992 26497\n",
"20969 26459\n",
"21007 13349\n",
"20995 12273\n",
" ... \n",
"23156 1978\n",
"24253 1414\n",
"24254 1362\n",
"24268 1246\n",
"24258 1008\n",
"Name: count, Length: 80, dtype: int64"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df0['pdv'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_3428\\1692316838.py:25: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n",
" dfv0 = pd.read_sql(query_vendas, conn)\n"
]
}
],
"source": [
"query_vendas = '''\n",
"SELECT \n",
"\tB.PDV, \n",
"\tB.SKU,\n",
"\tB.DESCRICAO,\n",
"\tSUM(CAST(b.VENDAS AS DECIMAL(18,2))) AS VENDAS_CICLO,\n",
"\tC.Ciclo\n",
"FROM base_vendas_bi b\n",
"INNER JOIN ciclos_data_2025 c \n",
" ON CAST(b.[DATA] AS DATE) = CONVERT(DATE, c.[Date], 103) AND C.MARCA = 'BOT'\n",
"LEFT JOIN (\n",
" SELECT SKU, MAX(ORIGEM) AS ORIGEM\n",
" FROM estoque_mar\n",
" GROUP BY SKU\n",
") e ON b.SKU = e.SKU\n",
"WHERE b.[DATA] > '2024-07-28'\n",
"GROUP BY\n",
"B.PDV, \n",
"\tB.SKU,\n",
"\tB.DESCRICAO,\n",
"\tC.Ciclo,\n",
"\tE.ORIGEM \n",
"'''\n",
"\n",
"dfv0 = pd.read_sql(query_vendas, conn)\n",
"\n",
"conn.close()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"df=df0"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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>PDV</th>\n",
" <th>SKU</th>\n",
" <th>DESCRICAO</th>\n",
" <th>VENDAS_CICLO</th>\n",
" <th>Ciclo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>20995</td>\n",
" <td>57551</td>\n",
" <td>DEM EUD DES COL VELVET INSPIRE 4ml</td>\n",
" <td>1.0</td>\n",
" <td>C202509</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>24255</td>\n",
" <td>53742</td>\n",
" <td>QDB CLEANSING OIL PRM 30ml</td>\n",
" <td>0.0</td>\n",
" <td>C202510</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>21277</td>\n",
" <td>49010</td>\n",
" <td>CBEM SAB BARR L/MEL 2x80g V7</td>\n",
" <td>1.0</td>\n",
" <td>C202411</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>22541</td>\n",
" <td>49929</td>\n",
" <td>GLAM KIT PINCEIS</td>\n",
" <td>2.0</td>\n",
" <td>C202414</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>12817</td>\n",
" <td>48785</td>\n",
" <td>MALBEC DES BDY SPR 100ml V4 PCK</td>\n",
" <td>12.0</td>\n",
" <td>C202412</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO VENDAS_CICLO Ciclo\n",
"0 20995 57551 DEM EUD DES COL VELVET INSPIRE 4ml 1.0 C202509\n",
"1 24255 53742 QDB CLEANSING OIL PRM 30ml 0.0 C202510\n",
"2 21277 49010 CBEM SAB BARR L/MEL 2x80g V7 1.0 C202411\n",
"3 22541 49929 GLAM KIT PINCEIS 2.0 C202414\n",
"4 12817 48785 MALBEC DES BDY SPR 100ml V4 PCK 12.0 C202412"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfv0.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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>PDV</th>\n",
" <th>SKU</th>\n",
" <th>DESCRICAO</th>\n",
" <th>C202411</th>\n",
" <th>C202412</th>\n",
" <th>C202413</th>\n",
" <th>C202414</th>\n",
" <th>C202415</th>\n",
" <th>C202416</th>\n",
" <th>C202417</th>\n",
" <th>...</th>\n",
" <th>C202504</th>\n",
" <th>C202505</th>\n",
" <th>C202506</th>\n",
" <th>C202507</th>\n",
" <th>C202508</th>\n",
" <th>C202509</th>\n",
" <th>C202510</th>\n",
" <th>C202511</th>\n",
" <th>C202512</th>\n",
" <th>C202513</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>11201</td>\n",
" <td>1004</td>\n",
" <td>FLORATTA DES COL MY BLUE 75ml</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>11201</td>\n",
" <td>1005</td>\n",
" <td>DEM FLORATTA DES COL MY BLUE 4ml</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11201</td>\n",
" <td>1078</td>\n",
" <td>MATCH SRUM CAP POS QUIMICA 50ml</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>11201</td>\n",
" <td>1296</td>\n",
" <td>PMPCK THE BLEND DES ANTIT AER 2x75g</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>11201</td>\n",
" <td>1302</td>\n",
" <td>PMPCK LILY DES ANTIT AER 2x75g</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 23 columns</p>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO C202411 C202412 \\\n",
"0 11201 1004 FLORATTA DES COL MY BLUE 75ml 0.0 0.0 \n",
"1 11201 1005 DEM FLORATTA DES COL MY BLUE 4ml 0.0 0.0 \n",
"2 11201 1078 MATCH SRUM CAP POS QUIMICA 50ml 0.0 0.0 \n",
"3 11201 1296 PMPCK THE BLEND DES ANTIT AER 2x75g 0.0 0.0 \n",
"4 11201 1302 PMPCK LILY DES ANTIT AER 2x75g 0.0 0.0 \n",
"\n",
" C202413 C202414 C202415 C202416 C202417 ... C202504 C202505 \\\n",
"0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"\n",
" C202506 C202507 C202508 C202509 C202510 C202511 C202512 C202513 \n",
"0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
"[5 rows x 23 columns]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"# 1. Agrupamento\n",
"df_agrupado = dfv0.groupby(['PDV', 'SKU', 'DESCRICAO', 'Ciclo'], as_index=False)['VENDAS_CICLO'].sum()\n",
"\n",
"# 2. Pivotar o DataFrame\n",
"df_pivotado = df_agrupado.pivot_table(\n",
" index=['PDV', 'SKU', 'DESCRICAO'],\n",
" columns='Ciclo',\n",
" values='VENDAS_CICLO',\n",
" fill_value=0 # Substitui NaN por 0\n",
")\n",
"\n",
"# 3. Resetar o índice para deixar como DataFrame normal (opcional)\n",
"df_vendas = df_pivotado.reset_index()\n",
"\n",
"# 4. (Opcional) Renomear colunas com prefixo \"Ciclo_\"\n",
"df_vendas.columns.name = None\n",
"df_vendas = df_vendas.rename(columns=lambda x: f'Ciclo_{x}' if isinstance(x, (int, str)) and str(x).isdigit() else x)\n",
"\n",
"# Resultado final\n",
"df_vendas.head()\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"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": 9,
"metadata": {},
"outputs": [],
"source": [
"# Caminho onde estão as subpastas com os arquivos CSV\n",
"\n",
"# Set the path to the folder containing CSV files\n",
"#folder_path = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C13\\DRAFT\" # arquivo dos drafts\n",
"\n",
"# Pattern to match all CSV files\n",
"#csv_files = glob.glob(os.path.join(folder_path, '*.csv'))\n",
"\n",
"# Read and concat all CSVs\n",
"#df_draft = pd.concat([pd.read_csv(file) for file in csv_files], ignore_index=True)\n",
"\n",
"\n",
"#df_draft.shape\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"#Caminho onde estão as subpastas com os arquivos CSV\n",
"#pasta_entrada = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C13\\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": 11,
"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\\EUDORA\\202511\\preço BI\\TABELA DE PREÇOS (2).xlsx\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['SKU1', 'SKU2', 'Descrição', 'MARCA', 'CATEGORIA', 'LINHA', 'UF',\n",
" 'Tipo Preço', 'PC', 'PV'],\n",
" dtype='object')"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_bi_preco.columns"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n",
"df_pdv = df_pdv.rename(columns={'DESCRIÇÃO':'DESCRIÇÃO PDV'})\n",
"df_pdv = df_pdv.drop(columns=['REGIÃO', 'ESTADO','CIDADE','GESTÃO', 'SUPERVISOR'])\n",
"df_pdv = df_pdv[~df_pdv['CANAL'].isin(['MTZ','LJ'])]\n",
"df_pdv = df_pdv[df_pdv['STATUS']!= \"INATIVO\"]\n",
"\n",
"df_pdv = df_pdv.drop(columns=['STATUS'])\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PDV\n",
"20968 1\n",
"20969 1\n",
"20970 1\n",
"20986 1\n",
"20988 1\n",
"20989 1\n",
"20991 1\n",
"20992 1\n",
"20993 1\n",
"20994 1\n",
"20995 1\n",
"20996 1\n",
"20997 1\n",
"20998 1\n",
"20999 1\n",
"21000 1\n",
"21001 1\n",
"21278 1\n",
"21375 1\n",
"21383 1\n",
"21495 1\n",
"22541 1\n",
"23703 1\n",
"23704 1\n",
"23711 1\n",
"23712 1\n",
"24255 1\n",
"24257 1\n",
"24269 1\n",
"24293 1\n",
"23813 1\n",
"Name: count, dtype: int64"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_pdv['PDV'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"df_pdv['MATCH'] = 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**ALTERAR NOME DA COLUNA \"ARQUIVO_ORIGEM\" PARA UMA DAS OPÇÕES ABAIXO:**\n",
"\n",
"*BOT.csv* \n",
"\n",
"*EUD.csv*\n",
"\n",
"*QDB.csv*"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"#df_estoque = df_estoque[df_estoque['Arquivo_Origem']== \"EUD.csv\"]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"calendario = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\CICLO 9\\CALENDARIO_CICLO\\Ciclo_Expandido_com_Datas.xlsx\")"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"calendario['Date'] = pd.to_datetime(calendario['Date'])\n",
"\n",
"# Get today (normalized to midnight)\n",
"today = pd.Timestamp(\"today\").normalize()\n",
"\n",
"calendario['NUM_CICLO'] = calendario['Ciclo'].str[-2:].astype(int)\n",
"calendario['ANO_CICLO'] = calendario['Ciclo'].str[0:5]\n",
"\n",
"\n",
"calendario = calendario[calendario['MARCA'] == \"EUDORA\"]\n",
"\n",
"calendario['CICLOMAIS2'] = calendario['ANO_CICLO'].astype(str) + (calendario['NUM_CICLO'].astype(int) + 2).astype(str).str.zfill(2)\n",
"\n",
"ciclo_mais2 = calendario[calendario['Date'].dt.normalize() == today]['CICLOMAIS2'].iloc[0]\n",
"\n",
"\n",
"# Filter rows where date matches today\n",
"filtered_calendario = calendario[calendario['Ciclo'] == ciclo_mais2][:1]\n",
"\n",
"\n",
"filtered_calendario['dias_ate_inicio'] = filtered_calendario['INICIO CICLO'].iloc[0] - today\n",
"\n",
"filtered_calendario['dias_ate_inicio'] = filtered_calendario['dias_ate_inicio'].dt.days.astype(int)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"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>MARCA</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>2430</th>\n",
" <td>C202515</td>\n",
" <td>2025-10-08</td>\n",
" <td>2025-10-28</td>\n",
" <td>21</td>\n",
" <td>EUDORA</td>\n",
" <td>2025-10-08</td>\n",
" <td>15</td>\n",
" <td>C2025</td>\n",
" <td>C202517</td>\n",
" <td>30</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Ciclo INICIO CICLO FIM CICLO DURAÇÃO MARCA Date NUM_CICLO \\\n",
"2430 C202515 2025-10-08 2025-10-28 21 EUDORA 2025-10-08 15 \n",
"\n",
" ANO_CICLO CICLOMAIS2 dias_ate_inicio \n",
"2430 C2025 C202517 30 "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"filtered_calendario"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"filtered_calendario['match'] = 1"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\EUDORA\\202515\\tabela promo\\Tabela-de-Promocao_C15-1755294384452.xlsx.xlsx\",skiprows=1)\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"df_tabela = df_tabela[df_tabela['Cód. Combo'].isna()]"
]
},
{
"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>Ciclo</th>\n",
" <th>Veiculo</th>\n",
" <th>Tipo de Promoção</th>\n",
" <th>Estratégia de Promoção</th>\n",
" <th>Tipo_mecanica</th>\n",
" <th>Promo Período Limitado?</th>\n",
" <th>EAM</th>\n",
" <th>Categoria</th>\n",
" <th>Cód. Combo</th>\n",
" <th>Código do Item</th>\n",
" <th>...</th>\n",
" <th>0.34.2</th>\n",
" <th>0.35.2</th>\n",
" <th>0.2.3</th>\n",
" <th>0.25.3</th>\n",
" <th>0.28.3</th>\n",
" <th>0.3.3</th>\n",
" <th>0.32.3</th>\n",
" <th>0.34.3</th>\n",
" <th>0.35.3</th>\n",
" <th>BSO</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>...</td>\n",
" <td>28.87</td>\n",
" <td>29.72</td>\n",
" <td>0.2</td>\n",
" <td>0.25</td>\n",
" <td>0.28</td>\n",
" <td>0.3</td>\n",
" <td>0.32</td>\n",
" <td>0.34</td>\n",
" <td>0.35</td>\n",
" <td>Sim</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>202515</td>\n",
" <td>Guia CF</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>NaN</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>52107</td>\n",
" <td>...</td>\n",
" <td>33.97</td>\n",
" <td>34.97</td>\n",
" <td>0.2</td>\n",
" <td>0.25</td>\n",
" <td>0.28</td>\n",
" <td>0.3</td>\n",
" <td>0.32</td>\n",
" <td>0.34</td>\n",
" <td>0.35</td>\n",
" <td>Sim</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>202515</td>\n",
" <td>Guia CF</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>NaN</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>50271</td>\n",
" <td>...</td>\n",
" <td>23.77</td>\n",
" <td>24.47</td>\n",
" <td>0.2</td>\n",
" <td>0.25</td>\n",
" <td>0.28</td>\n",
" <td>0.3</td>\n",
" <td>0.32</td>\n",
" <td>0.34</td>\n",
" <td>0.35</td>\n",
" <td>Sim</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>202515</td>\n",
" <td>Guia CF</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>NaN</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>57550</td>\n",
" <td>...</td>\n",
" <td>27.17</td>\n",
" <td>27.97</td>\n",
" <td>0.2</td>\n",
" <td>0.25</td>\n",
" <td>0.28</td>\n",
" <td>0.3</td>\n",
" <td>0.32</td>\n",
" <td>0.34</td>\n",
" <td>0.35</td>\n",
" <td>Sim</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>202515</td>\n",
" <td>Guia CF</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>NaN</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>52943</td>\n",
" <td>...</td>\n",
" <td>35.67</td>\n",
" <td>36.72</td>\n",
" <td>0.2</td>\n",
" <td>0.25</td>\n",
" <td>0.28</td>\n",
" <td>0.3</td>\n",
" <td>0.32</td>\n",
" <td>0.34</td>\n",
" <td>0.35</td>\n",
" <td>Sim</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 47 columns</p>\n",
"</div>"
],
"text/plain": [
" Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n",
"0 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"1 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n",
"2 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n",
"3 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n",
"4 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n",
"\n",
" Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n",
"0 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"1 NaN Não PERF. FEMININA NaN 52107 \n",
"2 NaN Não PERF. FEMININA NaN 50271 \n",
"3 NaN Não PERF. FEMININA NaN 57550 \n",
"4 NaN Não PERF. FEMININA NaN 52943 \n",
"\n",
" ... 0.34.2 0.35.2 0.2.3 0.25.3 0.28.3 0.3.3 0.32.3 0.34.3 0.35.3 \\\n",
"0 ... 28.87 29.72 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n",
"1 ... 33.97 34.97 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n",
"2 ... 23.77 24.47 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n",
"3 ... 27.17 27.97 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n",
"4 ... 35.67 36.72 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n",
"\n",
" BSO \n",
"0 Sim \n",
"1 Sim \n",
"2 Sim \n",
"3 Sim \n",
"4 Sim \n",
"\n",
"[5 rows x 47 columns]"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela.head()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"df_tabela = df_tabela[[ 'Ciclo', 'Veiculo',\n",
" 'Tipo de Promoção', 'Estratégia de Promoção',\n",
" 'Tipo_mecanica', 'Promo Período Limitado?',\n",
" 'EAM', 'Categoria',\n",
" 'Cód. Combo', 'Código do Item',\n",
" 'Descrição do Item', 'Chamada Promocional',\n",
" 'Valor do Guia', 'Preço Promocionado',\n",
" '% de Desconto', 'RE compra por',\n",
" 'RE Vende por', 'RE lucra (R$)']]"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"df_tabela['Código do Item'] = df_tabela['Código do Item'].astype(str).str.replace(\".0\",\"\",regex=False)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"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>Veiculo</th>\n",
" <th>Tipo de Promoção</th>\n",
" <th>Estratégia de Promoção</th>\n",
" <th>Tipo_mecanica</th>\n",
" <th>Promo Período Limitado?</th>\n",
" <th>EAM</th>\n",
" <th>Categoria</th>\n",
" <th>Cód. Combo</th>\n",
" <th>Código do Item</th>\n",
" <th>Descrição do Item</th>\n",
" <th>Chamada Promocional</th>\n",
" <th>Valor do Guia</th>\n",
" <th>Preço Promocionado</th>\n",
" <th>% de Desconto</th>\n",
" <th>RE compra por</th>\n",
" <th>RE Vende por</th>\n",
" <th>RE lucra (R$)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.90</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>202515</td>\n",
" <td>Guia CF</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>NaN</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>52107</td>\n",
" <td>EUDORA DIVA FABULOSA DESODORANTE COLONIA 100ML</td>\n",
" <td>EUDORA DIVA FABULOSA DESODORANTE COLONIA 100ML...</td>\n",
" <td>139.90</td>\n",
" <td>99.9</td>\n",
" <td>0.286</td>\n",
" <td>69.93</td>\n",
" <td>99.9</td>\n",
" <td>29.97</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>202515</td>\n",
" <td>Guia CF</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>NaN</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>50271</td>\n",
" <td>EUDORA DESODORANTE COLÔNIA KISS ME NOW 50ml VE...</td>\n",
" <td>EUDORA DESODORANTE COLÔNIA KISS ME NOW 50ml VE...</td>\n",
" <td>99.99</td>\n",
" <td>69.9</td>\n",
" <td>0.301</td>\n",
" <td>48.93</td>\n",
" <td>69.9</td>\n",
" <td>20.97</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>202515</td>\n",
" <td>Guia CF</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>NaN</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>57550</td>\n",
" <td>EUDORA VELVET MILANO DESODORANTE COLÔNIA 100ML</td>\n",
" <td>EUDORA VELVET MILANO DESODORANTE COLÔNIA 100ML...</td>\n",
" <td>119.90</td>\n",
" <td>79.9</td>\n",
" <td>0.334</td>\n",
" <td>55.93</td>\n",
" <td>79.9</td>\n",
" <td>23.97</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>202515</td>\n",
" <td>Guia CF</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>NaN</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>52943</td>\n",
" <td>Eudora Magnific Rouge Camélia Des Col 75 ML</td>\n",
" <td>Eudora Magnific Rouge Camélia Des Col 75 ML | ...</td>\n",
" <td>134.90</td>\n",
" <td>104.9</td>\n",
" <td>0.222</td>\n",
" <td>73.43</td>\n",
" <td>104.9</td>\n",
" <td>31.47</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n",
"0 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"1 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n",
"2 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n",
"3 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n",
"4 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n",
"\n",
" Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n",
"0 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"1 NaN Não PERF. FEMININA NaN 52107 \n",
"2 NaN Não PERF. FEMININA NaN 50271 \n",
"3 NaN Não PERF. FEMININA NaN 57550 \n",
"4 NaN Não PERF. FEMININA NaN 52943 \n",
"\n",
" Descrição do Item \\\n",
"0 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"1 EUDORA DIVA FABULOSA DESODORANTE COLONIA 100ML \n",
"2 EUDORA DESODORANTE COLÔNIA KISS ME NOW 50ml VE... \n",
"3 EUDORA VELVET MILANO DESODORANTE COLÔNIA 100ML \n",
"4 Eudora Magnific Rouge Camélia Des Col 75 ML \n",
"\n",
" Chamada Promocional Valor do Guia \\\n",
"0 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.90 \n",
"1 EUDORA DIVA FABULOSA DESODORANTE COLONIA 100ML... 139.90 \n",
"2 EUDORA DESODORANTE COLÔNIA KISS ME NOW 50ml VE... 99.99 \n",
"3 EUDORA VELVET MILANO DESODORANTE COLÔNIA 100ML... 119.90 \n",
"4 Eudora Magnific Rouge Camélia Des Col 75 ML | ... 134.90 \n",
"\n",
" Preço Promocionado % de Desconto RE compra por RE Vende por \\\n",
"0 84.9 0.292 59.43 84.9 \n",
"1 99.9 0.286 69.93 99.9 \n",
"2 69.9 0.301 48.93 69.9 \n",
"3 79.9 0.334 55.93 79.9 \n",
"4 104.9 0.222 73.43 104.9 \n",
"\n",
" RE lucra (R$) \n",
"0 25.47 \n",
"1 29.97 \n",
"2 20.97 \n",
"3 23.97 \n",
"4 31.47 "
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela.head()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"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>Veiculo</th>\n",
" <th>Tipo de Promoção</th>\n",
" <th>Estratégia de Promoção</th>\n",
" <th>Tipo_mecanica</th>\n",
" <th>Promo Período Limitado?</th>\n",
" <th>EAM</th>\n",
" <th>Categoria</th>\n",
" <th>Cód. Combo</th>\n",
" <th>Código do Item</th>\n",
" <th>Descrição do Item</th>\n",
" <th>Chamada Promocional</th>\n",
" <th>Valor do Guia</th>\n",
" <th>Preço Promocionado</th>\n",
" <th>% de Desconto</th>\n",
" <th>RE compra por</th>\n",
" <th>RE Vende por</th>\n",
" <th>RE lucra (R$)</th>\n",
" <th>SKU</th>\n",
" <th>SKU_FINAL</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.9</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.9</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.9</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.9</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.9</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n",
"0 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"1 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"2 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"3 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"4 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"\n",
" Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n",
"0 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"1 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"2 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"3 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"4 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"\n",
" Descrição do Item \\\n",
"0 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"1 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"2 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"3 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"4 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"\n",
" Chamada Promocional Valor do Guia \\\n",
"0 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n",
"1 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n",
"2 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n",
"3 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n",
"4 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n",
"\n",
" Preço Promocionado % de Desconto RE compra por RE Vende por \\\n",
"0 84.9 0.292 59.43 84.9 \n",
"1 84.9 0.292 59.43 84.9 \n",
"2 84.9 0.292 59.43 84.9 \n",
"3 84.9 0.292 59.43 84.9 \n",
"4 84.9 0.292 59.43 84.9 \n",
"\n",
" RE lucra (R$) SKU SKU_FINAL \n",
"0 25.47 94060 94060 \n",
"1 25.47 94060 94060 \n",
"2 25.47 94060 94060 \n",
"3 25.47 94060 94060 \n",
"4 25.47 94060 94060 "
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela = pd.merge(left=df_tabela,right=df0[['SKU','SKU_FINAL']],left_on='Código do Item',right_on='SKU',how='left')\n",
"df_tabela.head()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"df_tabela['Código do Item'] = np.where(df_tabela['SKU_FINAL'].notna(),df_tabela['SKU_FINAL'],df_tabela['Código do Item'])"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"df_tabela = df_tabela.drop(columns=['SKU','SKU_FINAL'])"
]
},
{
"cell_type": "code",
"execution_count": 29,
"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>Veiculo</th>\n",
" <th>Tipo de Promoção</th>\n",
" <th>Estratégia de Promoção</th>\n",
" <th>Tipo_mecanica</th>\n",
" <th>Promo Período Limitado?</th>\n",
" <th>EAM</th>\n",
" <th>Categoria</th>\n",
" <th>Cód. Combo</th>\n",
" <th>Código do Item</th>\n",
" <th>Descrição do Item</th>\n",
" <th>Chamada Promocional</th>\n",
" <th>Valor do Guia</th>\n",
" <th>Preço Promocionado</th>\n",
" <th>% de Desconto</th>\n",
" <th>RE compra por</th>\n",
" <th>RE Vende por</th>\n",
" <th>RE lucra (R$)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.9</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.9</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.9</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.9</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML</td>\n",
" <td>FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...</td>\n",
" <td>119.9</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n",
"0 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"1 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"2 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"3 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"4 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"\n",
" Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n",
"0 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"1 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"2 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"3 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"4 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"\n",
" Descrição do Item \\\n",
"0 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"1 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"2 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"3 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"4 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n",
"\n",
" Chamada Promocional Valor do Guia \\\n",
"0 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n",
"1 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n",
"2 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n",
"3 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n",
"4 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n",
"\n",
" Preço Promocionado % de Desconto RE compra por RE Vende por \\\n",
"0 84.9 0.292 59.43 84.9 \n",
"1 84.9 0.292 59.43 84.9 \n",
"2 84.9 0.292 59.43 84.9 \n",
"3 84.9 0.292 59.43 84.9 \n",
"4 84.9 0.292 59.43 84.9 \n",
"\n",
" RE lucra (R$) \n",
"0 25.47 \n",
"1 25.47 \n",
"2 25.47 \n",
"3 25.47 \n",
"4 25.47 "
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela.head()"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"df_tabela['MATCH'] = 1"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"df_tabela = pd.merge(left=df_tabela,right=df_pdv[['PDV','MATCH','UF','DESCRIÇÃO PDV','ANALISTA']],on='MATCH',how='inner')"
]
},
{
"cell_type": "code",
"execution_count": 32,
"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>Veiculo</th>\n",
" <th>Tipo de Promoção</th>\n",
" <th>Estratégia de Promoção</th>\n",
" <th>Tipo_mecanica</th>\n",
" <th>Promo Período Limitado?</th>\n",
" <th>EAM</th>\n",
" <th>Categoria</th>\n",
" <th>Cód. Combo</th>\n",
" <th>Código do Item</th>\n",
" <th>...</th>\n",
" <th>Preço Promocionado</th>\n",
" <th>% de Desconto</th>\n",
" <th>RE compra por</th>\n",
" <th>RE Vende por</th>\n",
" <th>RE lucra (R$)</th>\n",
" <th>MATCH</th>\n",
" <th>PDV</th>\n",
" <th>UF</th>\n",
" <th>DESCRIÇÃO PDV</th>\n",
" <th>ANALISTA</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20968</td>\n",
" <td>SE</td>\n",
" <td>HIB ITABAIANINHA</td>\n",
" <td>MARCYARA</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20969</td>\n",
" <td>AL</td>\n",
" <td>HIB MARECHAL DEOD</td>\n",
" <td>THAYLLAN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20970</td>\n",
" <td>BA</td>\n",
" <td>ER SAO SEBASTIAO</td>\n",
" <td>DARLIN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20986</td>\n",
" <td>BA</td>\n",
" <td>HIB OLINDINA</td>\n",
" <td>LUCAS</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>202515</td>\n",
" <td>Fora Guia</td>\n",
" <td>Promoção CF</td>\n",
" <td>Movimentar Flow</td>\n",
" <td>Desconto Direto</td>\n",
" <td>13/10 a 25/10</td>\n",
" <td>Não</td>\n",
" <td>PERF. FEMININA</td>\n",
" <td>NaN</td>\n",
" <td>94060</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20988</td>\n",
" <td>BA</td>\n",
" <td>HIB QUEIMADAS</td>\n",
" <td>DARLIN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 23 columns</p>\n",
"</div>"
],
"text/plain": [
" Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n",
"0 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"1 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"2 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"3 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"4 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n",
"\n",
" Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n",
"0 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"1 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"2 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"3 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"4 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n",
"\n",
" ... Preço Promocionado % de Desconto RE compra por RE Vende por \\\n",
"0 ... 84.9 0.292 59.43 84.9 \n",
"1 ... 84.9 0.292 59.43 84.9 \n",
"2 ... 84.9 0.292 59.43 84.9 \n",
"3 ... 84.9 0.292 59.43 84.9 \n",
"4 ... 84.9 0.292 59.43 84.9 \n",
"\n",
" RE lucra (R$) MATCH PDV UF DESCRIÇÃO PDV ANALISTA \n",
"0 25.47 1 20968 SE HIB ITABAIANINHA MARCYARA \n",
"1 25.47 1 20969 AL HIB MARECHAL DEOD THAYLLAN \n",
"2 25.47 1 20970 BA ER SAO SEBASTIAO DARLIN \n",
"3 25.47 1 20986 BA HIB OLINDINA LUCAS \n",
"4 25.47 1 20988 BA HIB QUEIMADAS DARLIN \n",
"\n",
"[5 rows x 23 columns]"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela.head()"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"df_tabela = df_tabela.drop_duplicates()"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Ciclo', 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA'],\n",
" dtype='object')"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela.columns"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
" 'nextcycleprojection', 'secondtonextcycleprojection'],\n",
" dtype='object')"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.columns"
]
},
{
"cell_type": "code",
"execution_count": 36,
"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>pdv</th>\n",
" <th>SKU</th>\n",
" <th>SKU_FINAL</th>\n",
" <th>ESTOQUE ATUAL</th>\n",
" <th>ESTOQUE EM TRANSITO</th>\n",
" <th>PEDIDO PENDENTE</th>\n",
" <th>Curva</th>\n",
" <th>CATEGORIA</th>\n",
" <th>DiasSemVenda</th>\n",
" <th>nextcycleprojection</th>\n",
" <th>secondtonextcycleprojection</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>20998</td>\n",
" <td>51213</td>\n",
" <td>51213</td>\n",
" <td>92</td>\n",
" <td>21</td>\n",
" <td>753</td>\n",
" <td>B</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>1.0</td>\n",
" <td>258.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20998</td>\n",
" <td>83960</td>\n",
" <td>83960</td>\n",
" <td>10</td>\n",
" <td>5</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>DESODORANTES</td>\n",
" <td>4.0</td>\n",
" <td>11.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20998</td>\n",
" <td>75293</td>\n",
" <td>75293</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>B</td>\n",
" <td>MAQUIAGEM</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>20998</td>\n",
" <td>75888</td>\n",
" <td>75888</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>MAQUIAGEM</td>\n",
" <td>27.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20998</td>\n",
" <td>52898</td>\n",
" <td>52898</td>\n",
" <td>341</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>B</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>1.0</td>\n",
" <td>43.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE \\\n",
"0 20998 51213 51213 92 21 753 \n",
"1 20998 83960 83960 10 5 0 \n",
"2 20998 75293 75293 6 1 0 \n",
"3 20998 75888 75888 3 0 0 \n",
"4 20998 52898 52898 341 0 0 \n",
"\n",
" Curva CATEGORIA DiasSemVenda nextcycleprojection \\\n",
"0 B PERFUMARIA 1.0 258.0 \n",
"1 C DESODORANTES 4.0 11.0 \n",
"2 B MAQUIAGEM 3.0 0.0 \n",
"3 C MAQUIAGEM 27.0 0.0 \n",
"4 B PERFUMARIA 1.0 43.0 \n",
"\n",
" secondtonextcycleprojection \n",
"0 0.0 \n",
"1 0.0 \n",
"2 0.0 \n",
"3 0.0 \n",
"4 0.0 "
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"df['pdv'] = df['pdv'].astype(str)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"df['SKU_FINAL'] = df['SKU_FINAL'].astype(str)\n"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"df_tabela['Código do Item'] = df_tabela['Código do Item'].astype('str')"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Ciclo', 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA'],\n",
" dtype='object')"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_tabela.columns"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"df_tabela['PDV'] = df_tabela['PDV'].astype(str)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"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_FINAL</th>\n",
" <th>pdv</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>51213</td>\n",
" <td>20998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>83960</td>\n",
" <td>20998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>75293</td>\n",
" <td>20998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>75888</td>\n",
" <td>20998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>52898</td>\n",
" <td>20998</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" SKU_FINAL pdv\n",
"0 51213 20998\n",
"1 83960 20998\n",
"2 75293 20998\n",
"3 75888 20998\n",
"4 52898 20998"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[['SKU_FINAL','pdv']].head()"
]
},
{
"cell_type": "code",
"execution_count": 43,
"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>pdv</th>\n",
" <th>SKU</th>\n",
" <th>SKU_FINAL</th>\n",
" <th>ESTOQUE ATUAL</th>\n",
" <th>ESTOQUE EM TRANSITO</th>\n",
" <th>PEDIDO PENDENTE</th>\n",
" <th>Curva</th>\n",
" <th>CATEGORIA</th>\n",
" <th>DiasSemVenda</th>\n",
" <th>nextcycleprojection</th>\n",
" <th>secondtonextcycleprojection</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>793</th>\n",
" <td>20991</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>24</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10946</th>\n",
" <td>20998</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>15</td>\n",
" <td>24</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35510</th>\n",
" <td>20995</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>13.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>45664</th>\n",
" <td>20996</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>53287</th>\n",
" <td>21278</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>73547</th>\n",
" <td>20969</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>62.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>77615</th>\n",
" <td>20992</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>92374</th>\n",
" <td>20968</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>92766</th>\n",
" <td>21495</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>107035</th>\n",
" <td>20997</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>109390</th>\n",
" <td>24255</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>117431</th>\n",
" <td>22541</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>INFANTIL</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>393788</th>\n",
" <td>21007</td>\n",
" <td>93403</td>\n",
" <td>93403</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>INFANTIL</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO \\\n",
"793 20991 93403 93403 0 1 \n",
"10946 20998 93403 93403 0 15 \n",
"35510 20995 93403 93403 0 0 \n",
"45664 20996 93403 93403 0 0 \n",
"53287 21278 93403 93403 0 0 \n",
"73547 20969 93403 93403 0 0 \n",
"77615 20992 93403 93403 0 0 \n",
"92374 20968 93403 93403 0 0 \n",
"92766 21495 93403 93403 0 0 \n",
"107035 20997 93403 93403 0 0 \n",
"109390 24255 93403 93403 0 0 \n",
"117431 22541 93403 93403 0 1 \n",
"393788 21007 93403 93403 0 0 \n",
"\n",
" PEDIDO PENDENTE Curva CATEGORIA DiasSemVenda nextcycleprojection \\\n",
"793 24 C INFANTIL 5.0 0.0 \n",
"10946 24 C INFANTIL 5.0 0.0 \n",
"35510 0 C INFANTIL 13.0 0.0 \n",
"45664 0 C INFANTIL 1.0 0.0 \n",
"53287 0 C INFANTIL 6.0 0.0 \n",
"73547 0 C INFANTIL 62.0 0.0 \n",
"77615 0 C INFANTIL 0.0 0.0 \n",
"92374 3 C INFANTIL 6.0 0.0 \n",
"92766 0 C INFANTIL 5.0 0.0 \n",
"107035 0 C INFANTIL 1.0 0.0 \n",
"109390 0 C INFANTIL 6.0 0.0 \n",
"117431 0 C INFANTIL 3.0 0.0 \n",
"393788 0 None INFANTIL NaN NaN \n",
"\n",
" secondtonextcycleprojection \n",
"793 0.0 \n",
"10946 0.0 \n",
"35510 0.0 \n",
"45664 0.0 \n",
"53287 0.0 \n",
"73547 0.0 \n",
"77615 0.0 \n",
"92374 0.0 \n",
"92766 0.0 \n",
"107035 0.0 \n",
"109390 0.0 \n",
"117431 0.0 \n",
"393788 NaN "
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[(df['SKU_FINAL']=='93403')]"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(10375, 34)"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final = pd.merge(left=df,right=df_tabela,right_on=['Código do Item','PDV'],left_on=['SKU_FINAL','pdv'],how='right')\n",
"df_final.shape "
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [],
"source": [
"df_final = pd.merge(left=df,right=df_tabela,right_on=['Código do Item','PDV'],left_on=['SKU','pdv'],how='right')"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo',\n",
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA'],\n",
" dtype='object')"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"df_final['pdv'] = df_final['PDV']\n",
"df_final['SKU_FINAL'] = df_final['Código do Item']"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML\n",
"1 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML\n",
"2 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML\n",
"3 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML\n",
"4 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML\n",
" ... \n",
"8923 ESTOJO LA VICTORIE INTENSE NAMORADOS 2025\n",
"8924 ESTOJO LA VICTORIE INTENSE NAMORADOS 2025\n",
"8925 ESTOJO LA VICTORIE INTENSE NAMORADOS 2025\n",
"8926 ESTOJO LA VICTORIE INTENSE NAMORADOS 2025\n",
"8927 ESTOJO LA VICTORIE INTENSE NAMORADOS 2025\n",
"Name: Descrição do Item, Length: 8928, dtype: object"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['Descrição do Item']"
]
},
{
"cell_type": "code",
"execution_count": 49,
"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>pdv</th>\n",
" <th>SKU</th>\n",
" <th>SKU_FINAL</th>\n",
" <th>ESTOQUE ATUAL</th>\n",
" <th>ESTOQUE EM TRANSITO</th>\n",
" <th>PEDIDO PENDENTE</th>\n",
" <th>Curva</th>\n",
" <th>CATEGORIA</th>\n",
" <th>DiasSemVenda</th>\n",
" <th>nextcycleprojection</th>\n",
" <th>...</th>\n",
" <th>Preço Promocionado</th>\n",
" <th>% de Desconto</th>\n",
" <th>RE compra por</th>\n",
" <th>RE Vende por</th>\n",
" <th>RE lucra (R$)</th>\n",
" <th>MATCH</th>\n",
" <th>PDV</th>\n",
" <th>UF</th>\n",
" <th>DESCRIÇÃO PDV</th>\n",
" <th>ANALISTA</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>20968</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>5</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>12.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20968</td>\n",
" <td>SE</td>\n",
" <td>HIB ITABAIANINHA</td>\n",
" <td>MARCYARA</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20969</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>11.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20969</td>\n",
" <td>AL</td>\n",
" <td>HIB MARECHAL DEOD</td>\n",
" <td>THAYLLAN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20970</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>10</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20970</td>\n",
" <td>BA</td>\n",
" <td>ER SAO SEBASTIAO</td>\n",
" <td>DARLIN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>20986</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>11</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20986</td>\n",
" <td>BA</td>\n",
" <td>HIB OLINDINA</td>\n",
" <td>LUCAS</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20988</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20988</td>\n",
" <td>BA</td>\n",
" <td>HIB QUEIMADAS</td>\n",
" <td>DARLIN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>20989</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>13</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20989</td>\n",
" <td>BA</td>\n",
" <td>HIB ENTRE RIOS</td>\n",
" <td>MARCYARA</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>20991</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>8</td>\n",
" <td>0</td>\n",
" <td>30</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20991</td>\n",
" <td>AL</td>\n",
" <td>HIB CAMPO ALEGRE</td>\n",
" <td>THAYLLAN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>20992</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>10</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20992</td>\n",
" <td>BA</td>\n",
" <td>ER CONC COITE</td>\n",
" <td>JEFFERSON</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>20993</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>35</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20993</td>\n",
" <td>BA</td>\n",
" <td>ER CANDEIAS</td>\n",
" <td>DARLIN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>20994</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>29</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20994</td>\n",
" <td>BA</td>\n",
" <td>ER SIMOES FILHO</td>\n",
" <td>LUCAS</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>20995</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>32.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20995</td>\n",
" <td>SE</td>\n",
" <td>ER LAGARTO</td>\n",
" <td>MARCYARA</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>20996</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20996</td>\n",
" <td>AL</td>\n",
" <td>ER ANTARES</td>\n",
" <td>JEFFERSON</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>20997</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>6</td>\n",
" <td>0</td>\n",
" <td>11</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20997</td>\n",
" <td>AL</td>\n",
" <td>ER PITANGUINHA</td>\n",
" <td>LUCAS</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>20998</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>14</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>26.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20998</td>\n",
" <td>AL</td>\n",
" <td>CD SERRARIA</td>\n",
" <td>VA</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>20999</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>17</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>20999</td>\n",
" <td>BA</td>\n",
" <td>HIB ESPLANADA</td>\n",
" <td>MARCYARA</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>21000</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>7</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>21000</td>\n",
" <td>BA</td>\n",
" <td>HIB SANTALUZ</td>\n",
" <td>DARLIN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>21001</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>7</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>21001</td>\n",
" <td>BA</td>\n",
" <td>HIB RIO REAL</td>\n",
" <td>LUCAS</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>21278</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>28.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>21278</td>\n",
" <td>SE</td>\n",
" <td>VD SOCORRO</td>\n",
" <td>JEFFERSON</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>21375</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>15</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>21375</td>\n",
" <td>BA</td>\n",
" <td>IPIRA HB</td>\n",
" <td>DARLIN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>21383</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>13</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>84.9</td>\n",
" <td>0.292</td>\n",
" <td>59.43</td>\n",
" <td>84.9</td>\n",
" <td>25.47</td>\n",
" <td>1</td>\n",
" <td>21383</td>\n",
" <td>BA</td>\n",
" <td>CAPIM GROSSO ER</td>\n",
" <td>DARLIN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>20 rows × 34 columns</p>\n",
"</div>"
],
"text/plain": [
" pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE \\\n",
"0 20968 94060 94060 5 0 0 \n",
"1 20969 94060 94060 1 0 5 \n",
"2 20970 94060 94060 10 0 0 \n",
"3 20986 94060 94060 11 0 0 \n",
"4 20988 94060 94060 9 0 0 \n",
"5 20989 94060 94060 13 0 0 \n",
"6 20991 94060 94060 8 0 30 \n",
"7 20992 94060 94060 10 0 0 \n",
"8 20993 94060 94060 35 0 0 \n",
"9 20994 94060 94060 29 0 0 \n",
"10 20995 94060 94060 0 0 4 \n",
"11 20996 94060 94060 2 0 0 \n",
"12 20997 94060 94060 6 0 11 \n",
"13 20998 94060 94060 0 0 14 \n",
"14 20999 94060 94060 17 0 0 \n",
"15 21000 94060 94060 7 0 0 \n",
"16 21001 94060 94060 7 0 0 \n",
"17 21278 94060 94060 0 0 0 \n",
"18 21375 94060 94060 15 0 0 \n",
"19 21383 94060 94060 13 0 0 \n",
"\n",
" Curva CATEGORIA DiasSemVenda nextcycleprojection ... \\\n",
"0 C PERFUMARIA 12.0 0.0 ... \n",
"1 C PERFUMARIA 11.0 0.0 ... \n",
"2 C PERFUMARIA 3.0 0.0 ... \n",
"3 C PERFUMARIA 0.0 0.0 ... \n",
"4 C PERFUMARIA 0.0 0.0 ... \n",
"5 C PERFUMARIA 0.0 0.0 ... \n",
"6 C PERFUMARIA 6.0 0.0 ... \n",
"7 C PERFUMARIA 0.0 0.0 ... \n",
"8 C PERFUMARIA 1.0 0.0 ... \n",
"9 C PERFUMARIA 4.0 0.0 ... \n",
"10 C PERFUMARIA 32.0 0.0 ... \n",
"11 C PERFUMARIA 4.0 0.0 ... \n",
"12 C PERFUMARIA 0.0 0.0 ... \n",
"13 C PERFUMARIA 26.0 0.0 ... \n",
"14 C PERFUMARIA 4.0 0.0 ... \n",
"15 C PERFUMARIA 0.0 0.0 ... \n",
"16 C PERFUMARIA 3.0 0.0 ... \n",
"17 C PERFUMARIA 28.0 0.0 ... \n",
"18 C PERFUMARIA 0.0 0.0 ... \n",
"19 C PERFUMARIA 0.0 0.0 ... \n",
"\n",
" Preço Promocionado % de Desconto RE compra por RE Vende por \\\n",
"0 84.9 0.292 59.43 84.9 \n",
"1 84.9 0.292 59.43 84.9 \n",
"2 84.9 0.292 59.43 84.9 \n",
"3 84.9 0.292 59.43 84.9 \n",
"4 84.9 0.292 59.43 84.9 \n",
"5 84.9 0.292 59.43 84.9 \n",
"6 84.9 0.292 59.43 84.9 \n",
"7 84.9 0.292 59.43 84.9 \n",
"8 84.9 0.292 59.43 84.9 \n",
"9 84.9 0.292 59.43 84.9 \n",
"10 84.9 0.292 59.43 84.9 \n",
"11 84.9 0.292 59.43 84.9 \n",
"12 84.9 0.292 59.43 84.9 \n",
"13 84.9 0.292 59.43 84.9 \n",
"14 84.9 0.292 59.43 84.9 \n",
"15 84.9 0.292 59.43 84.9 \n",
"16 84.9 0.292 59.43 84.9 \n",
"17 84.9 0.292 59.43 84.9 \n",
"18 84.9 0.292 59.43 84.9 \n",
"19 84.9 0.292 59.43 84.9 \n",
"\n",
" RE lucra (R$) MATCH PDV UF DESCRIÇÃO PDV ANALISTA \n",
"0 25.47 1 20968 SE HIB ITABAIANINHA MARCYARA \n",
"1 25.47 1 20969 AL HIB MARECHAL DEOD THAYLLAN \n",
"2 25.47 1 20970 BA ER SAO SEBASTIAO DARLIN \n",
"3 25.47 1 20986 BA HIB OLINDINA LUCAS \n",
"4 25.47 1 20988 BA HIB QUEIMADAS DARLIN \n",
"5 25.47 1 20989 BA HIB ENTRE RIOS MARCYARA \n",
"6 25.47 1 20991 AL HIB CAMPO ALEGRE THAYLLAN \n",
"7 25.47 1 20992 BA ER CONC COITE JEFFERSON \n",
"8 25.47 1 20993 BA ER CANDEIAS DARLIN \n",
"9 25.47 1 20994 BA ER SIMOES FILHO LUCAS \n",
"10 25.47 1 20995 SE ER LAGARTO MARCYARA \n",
"11 25.47 1 20996 AL ER ANTARES JEFFERSON \n",
"12 25.47 1 20997 AL ER PITANGUINHA LUCAS \n",
"13 25.47 1 20998 AL CD SERRARIA VA \n",
"14 25.47 1 20999 BA HIB ESPLANADA MARCYARA \n",
"15 25.47 1 21000 BA HIB SANTALUZ DARLIN \n",
"16 25.47 1 21001 BA HIB RIO REAL LUCAS \n",
"17 25.47 1 21278 SE VD SOCORRO JEFFERSON \n",
"18 25.47 1 21375 BA IPIRA HB DARLIN \n",
"19 25.47 1 21383 BA CAPIM GROSSO ER DARLIN \n",
"\n",
"[20 rows x 34 columns]"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.head(20)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [],
"source": [
"df_final['match'] = 1"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(8928, 40)"
]
},
"execution_count": 51,
"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='inner')\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PDV\n",
"20968 288\n",
"20969 288\n",
"20970 288\n",
"20986 288\n",
"20988 288\n",
"20989 288\n",
"20991 288\n",
"20992 288\n",
"20993 288\n",
"20994 288\n",
"20995 288\n",
"20996 288\n",
"20997 288\n",
"20998 288\n",
"20999 288\n",
"21000 288\n",
"21001 288\n",
"21278 288\n",
"21375 288\n",
"21383 288\n",
"21495 288\n",
"22541 288\n",
"23703 288\n",
"23704 288\n",
"23711 288\n",
"23712 288\n",
"24255 288\n",
"24257 288\n",
"24269 288\n",
"24293 288\n",
"23813 288\n",
"Name: count, dtype: int64"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.PDV.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(8928, 40)"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#df_final = pd.merge(left=df_final,right=df_pdv[['PDV', 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC','UF', 'MARCA', 'ANALISTA']],on = 'PDV',how='inner')\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [],
"source": [
"#df_final['SKU'] = df_final['SKU'].astype(str) \n",
"#df_final['PDV'] = df_final['PDV'].astype(str) \n",
"#df_final = pd.merge(left=df_final,right=df_estoque[['SKU_FINAL', 'DDV PREVISTO', 'COBERTURA ATUAL','PDV']],right_on=['PDV','SKU_FINAL'],left_on=['PDV','SKU'],how='left')\n",
"#df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype(str).str.replace('.0','',regex=False) \\n\\ndf_final = pd.merge(left=df_final,right=df_bi_preco[['SKU2', 'UF','Tipo Preço', 'PC', 'PV']],right_on=['UF','SKU2'],left_on=['UF','SKU_FINAL'],how='left')\\ndf_final.shape \""
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"r'''df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype(str).str.replace('.0','',regex=False) \n",
"\n",
"df_final = pd.merge(left=df_final,right=df_bi_preco[['SKU2', 'UF','Tipo Preço', 'PC', 'PV']],right_on=['UF','SKU2'],left_on=['UF','SKU_FINAL'],how='left')\n",
"df_final.shape ''' "
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"pdv\n",
"20968 288\n",
"20969 288\n",
"20970 288\n",
"20986 288\n",
"20988 288\n",
"20989 288\n",
"20991 288\n",
"20992 288\n",
"20993 288\n",
"20994 288\n",
"20995 288\n",
"20996 288\n",
"20997 288\n",
"20998 288\n",
"20999 288\n",
"21000 288\n",
"21001 288\n",
"21278 288\n",
"21375 288\n",
"21383 288\n",
"21495 288\n",
"22541 288\n",
"23703 288\n",
"23704 288\n",
"23711 288\n",
"23712 288\n",
"24255 288\n",
"24257 288\n",
"24269 288\n",
"24293 288\n",
"23813 288\n",
"Name: count, dtype: int64"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['pdv'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [],
"source": [
"#df_bi_preco['SKU1'] = df_bi_preco['SKU1'].astype(str).str.replace('.0','',regex=False) \n",
"\n",
"#df_final = pd.merge(left=df_final,right=df_bi_preco[['SKU1', 'SKU2', 'UF', 'PC', 'PV']],right_on=['UF','SKU1'],left_on=['UF','SKU'],how='left')\n",
"#df_final.shape "
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [],
"source": [
"#df_bi_preco = df_bi_preco[df_bi_preco['MARCA']=='EUDORA']"
]
},
{
"cell_type": "code",
"execution_count": 59,
"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": 60,
"metadata": {},
"outputs": [],
"source": [
"#df_estoque = df_estoque.rename(columns={'SKU_FINAL':'SKU_PARA_VALIDACAO'})\n",
"#df_final = pd.merge( left= df_final, right = df_estoque[['SKU_PARA_VALIDACAO','Arquivo_Origem']], left_on= 'SKU', right_on='SKU_PARA_VALIDACAO', how='left')"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio'],\n",
" dtype='object')"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [],
"source": [
"#df_final = df_final.drop(columns=['Desativação','Lançamento','Promoção Próximo Ciclo','Compra inteligente semanal/Sugestão de compra','Planograma','Carteira Bloqueada Para Novos Pedidos','Preço Sell In','Quantidade','Item analisado','Promoção Próximo Ciclo + 1','SKU_PARA_VALIDACAO','Ciclo_y'])"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(8928, 42)"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['PDV_SKU'] = df_final['PDV'].astype(str) + df_final['SKU_FINAL'].astype(str) \n",
"df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['SKU_FINAL'].astype(str)\n",
"\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 20968\n",
"1 20969\n",
"2 20970\n",
"3 20986\n",
"4 20988\n",
" ... \n",
"8923 24255\n",
"8924 24257\n",
"8925 24269\n",
"8926 24293\n",
"8927 23813\n",
"Name: PDV, Length: 8928, dtype: object"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['PDV']"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"secondtonextcycleprojection\n",
"0.0 4389\n",
"1.0 38\n",
"3.0 30\n",
"2.0 29\n",
"4.0 21\n",
"6.0 20\n",
"5.0 18\n",
"19.0 13\n",
"10.0 12\n",
"49.0 8\n",
"27.0 8\n",
"9.0 8\n",
"18.0 7\n",
"34.0 7\n",
"32.0 5\n",
"37.0 5\n",
"8.0 5\n",
"30.0 5\n",
"7.0 5\n",
"17.0 5\n",
"94.0 4\n",
"69.0 4\n",
"11.0 4\n",
"52.0 4\n",
"53.0 4\n",
"98.0 4\n",
"14.0 3\n",
"56.0 2\n",
"15.0 2\n",
"13.0 2\n",
"20.0 2\n",
"44.0 1\n",
"24.0 1\n",
"67.0 1\n",
"23.0 1\n",
"51.0 1\n",
"28.0 1\n",
"41.0 1\n",
"54.0 1\n",
"29.0 1\n",
"16.0 1\n",
"36.0 1\n",
"31.0 1\n",
"12.0 1\n",
"33.0 1\n",
"55.0 1\n",
"Name: count, dtype: int64"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['nextcycleprojection'].value_counts()\n",
"\n",
"df_final['secondtonextcycleprojection'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [],
"source": [
"#df_final['PROJEÇÃO DO CICLO PROMOCIONADO'] =df_final['Projeção Próximo Ciclo + 1'] - df_final['Projeção Próximo Ciclo'] # projeção do ciclo em estudo"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [],
"source": [
"#df_final['PROJEÇÃO DO CICLO PROMOCIONADO'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 68,
"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": 69,
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.rename(columns={'Arquivo_Origem': 'MARCA'})"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [],
"source": [
"#df_final = df_final[~df_final['MARCA'].isna()]\n",
"#df_final['MARCA'].isna().sum()"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(8928, 42)"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final = df_final.drop_duplicates()\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'PDV_SKU',\n",
" 'UFPRODUTO'],\n",
" dtype='object')"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['PDV', 'SKU', 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414',\n",
" 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n",
" 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C202509',\n",
" 'C202510', 'C202511', 'C202512', 'C202513'],\n",
" dtype='object')"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_vendas['PDV'] = df_vendas['PDV'].astype(str)\n",
"df_vendas['SKU'] = df_vendas['SKU'].astype(str)\n",
"\n",
"df_vendas.columns"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(8928, 42)"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 75,
"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>PDV</th>\n",
" <th>SKU</th>\n",
" <th>DESCRICAO</th>\n",
" <th>C202411</th>\n",
" <th>C202412</th>\n",
" <th>C202413</th>\n",
" <th>C202414</th>\n",
" <th>C202415</th>\n",
" <th>C202416</th>\n",
" <th>C202417</th>\n",
" <th>...</th>\n",
" <th>C202504</th>\n",
" <th>C202505</th>\n",
" <th>C202506</th>\n",
" <th>C202507</th>\n",
" <th>C202508</th>\n",
" <th>C202509</th>\n",
" <th>C202510</th>\n",
" <th>C202511</th>\n",
" <th>C202512</th>\n",
" <th>C202513</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>11201</td>\n",
" <td>1004</td>\n",
" <td>FLORATTA DES COL MY BLUE 75ml</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>11201</td>\n",
" <td>1005</td>\n",
" <td>DEM FLORATTA DES COL MY BLUE 4ml</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11201</td>\n",
" <td>1078</td>\n",
" <td>MATCH SRUM CAP POS QUIMICA 50ml</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>11201</td>\n",
" <td>1296</td>\n",
" <td>PMPCK THE BLEND DES ANTIT AER 2x75g</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>11201</td>\n",
" <td>1302</td>\n",
" <td>PMPCK LILY DES ANTIT AER 2x75g</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 23 columns</p>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO C202411 C202412 \\\n",
"0 11201 1004 FLORATTA DES COL MY BLUE 75ml 0.0 0.0 \n",
"1 11201 1005 DEM FLORATTA DES COL MY BLUE 4ml 0.0 0.0 \n",
"2 11201 1078 MATCH SRUM CAP POS QUIMICA 50ml 0.0 0.0 \n",
"3 11201 1296 PMPCK THE BLEND DES ANTIT AER 2x75g 0.0 0.0 \n",
"4 11201 1302 PMPCK LILY DES ANTIT AER 2x75g 0.0 0.0 \n",
"\n",
" C202413 C202414 C202415 C202416 C202417 ... C202504 C202505 \\\n",
"0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"\n",
" C202506 C202507 C202508 C202509 C202510 C202511 C202512 C202513 \n",
"0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
"[5 rows x 23 columns]"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_vendas.head()"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [],
"source": [
"df_final = pd.merge(df_final,df_vendas,left_on=['PDV','SKU'],right_on=['PDV','SKU'],how='left')"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'PDV_SKU',\n",
" 'UFPRODUTO', 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414',\n",
" 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n",
" 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C202509',\n",
" 'C202510', 'C202511', 'C202512', 'C202513'],\n",
" dtype='object')"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [],
"source": [
"df_final.iloc[:, -18:-1] = df_final.iloc[:, -18:-1].fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [],
"source": [
"# Define list of target columns\n",
"sales_2024_cols = df_final.columns[-18:-1]\n",
"# Create a new column with the row-wise max\n",
"df_final['PICO DE VENDAS 17CICLOS'] = df_final[sales_2024_cols].max(axis=1)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 80,
"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>pdv</th>\n",
" <th>SKU</th>\n",
" <th>SKU_FINAL</th>\n",
" <th>ESTOQUE ATUAL</th>\n",
" <th>ESTOQUE EM TRANSITO</th>\n",
" <th>PEDIDO PENDENTE</th>\n",
" <th>Curva</th>\n",
" <th>CATEGORIA</th>\n",
" <th>DiasSemVenda</th>\n",
" <th>nextcycleprojection</th>\n",
" <th>...</th>\n",
" <th>C202505</th>\n",
" <th>C202506</th>\n",
" <th>C202507</th>\n",
" <th>C202508</th>\n",
" <th>C202509</th>\n",
" <th>C202510</th>\n",
" <th>C202511</th>\n",
" <th>C202512</th>\n",
" <th>C202513</th>\n",
" <th>PICO DE VENDAS 17CICLOS</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>20968</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>5</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>12.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>8.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>8.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>11.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20969</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>11.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>5.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>43.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20970</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>10</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>20986</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>11</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20988</td>\n",
" <td>94060</td>\n",
" <td>94060</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>C</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 64 columns</p>\n",
"</div>"
],
"text/plain": [
" pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE \\\n",
"0 20968 94060 94060 5 0 0 \n",
"1 20969 94060 94060 1 0 5 \n",
"2 20970 94060 94060 10 0 0 \n",
"3 20986 94060 94060 11 0 0 \n",
"4 20988 94060 94060 9 0 0 \n",
"\n",
" Curva CATEGORIA DiasSemVenda nextcycleprojection ... C202505 C202506 \\\n",
"0 C PERFUMARIA 12.0 0.0 ... 8.0 0.0 \n",
"1 C PERFUMARIA 11.0 0.0 ... 5.0 3.0 \n",
"2 C PERFUMARIA 3.0 0.0 ... 0.0 0.0 \n",
"3 C PERFUMARIA 0.0 0.0 ... 0.0 0.0 \n",
"4 C PERFUMARIA 0.0 0.0 ... 0.0 0.0 \n",
"\n",
" C202507 C202508 C202509 C202510 C202511 C202512 C202513 \\\n",
"0 0.0 0.0 0.0 0.0 8.0 2.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 1.0 3.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 2.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
" PICO DE VENDAS 17CICLOS \n",
"0 11.0 \n",
"1 43.0 \n",
"2 2.0 \n",
"3 0.0 \n",
"4 0.0 \n",
"\n",
"[5 rows x 64 columns]"
]
},
"execution_count": 80,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.head()"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PDV\n",
"20968 292\n",
"20969 292\n",
"20995 292\n",
"20996 292\n",
"20997 292\n",
"20998 292\n",
"21278 292\n",
"22541 292\n",
"21495 291\n",
"20991 291\n",
"20989 288\n",
"20994 288\n",
"20988 288\n",
"20986 288\n",
"20970 288\n",
"20999 288\n",
"20992 288\n",
"20993 288\n",
"21000 288\n",
"21375 288\n",
"21001 288\n",
"21383 288\n",
"23703 288\n",
"23704 288\n",
"23711 288\n",
"23712 288\n",
"24255 288\n",
"24257 288\n",
"24269 288\n",
"24293 288\n",
"23813 288\n",
"Name: count, dtype: int64"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.PDV.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['C202413', 'C202414', 'C202415', 'C202416', 'C202417', 'C202501',\n",
" 'C202502', 'C202503', 'C202504', 'C202505', 'C202506', 'C202507',\n",
" 'C202508', 'C202509', 'C202510', 'C202511', 'C202512'],\n",
" dtype='object')"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sales_2024_cols"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"vendas_6_meses = df_final.columns[-8:-2]\n",
"\n",
"df_final['Pico Vendas Ultimos 6 ciclos'] = df_final[vendas_6_meses].max(axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'C202414'"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[-19]"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.7716087836785548\n"
]
}
],
"source": [
"CRESCIMENTO = (df_final[df_final.columns[-18]].sum() - df_final[df_final.columns[-3]].sum())/df_final[df_final.columns[-18]].sum() \n",
"print(CRESCIMENTO)\n",
"\n",
"df_final['CRESCIMENTO'] = .2"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [],
"source": [
"mesmo_ciclo_ano_passado = df_final.columns[-19]\n",
"ciclo_ano_passado = df_final.columns[-19:-18].str.split(\" \")[0][-1]\n",
"df_final[ciclo_ano_passado] = df_final[mesmo_ciclo_ano_passado]"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'C202415'"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[-19:-18].str.split(\" \")[0][-1]"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['C202413', 'C202414', 'C202415', 'C202416', 'C202417', 'C202501',\n",
" 'C202502', 'C202503', 'C202504', 'C202505', 'C202506', 'C202507',\n",
" 'C202508', 'C202509', 'C202510', 'C202511', 'C202512', 'C202513'],\n",
" dtype='object')"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[-21:-3]"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [],
"source": [
"vendas_todos_historicos = df_final.columns[-21:-3]\n",
"\n",
"df_final['MEDIANA DO HISTÓRICO'] = df_final[vendas_todos_historicos].median(axis=1)\n",
"\n",
"df_final['MEDIA DO HISTÓRICO'] = df_final[vendas_todos_historicos].mean(axis=1)\n",
"\n",
"df_final['MEDIANA DO HISTÓRICO'] = np.where(df_final['MEDIANA DO HISTÓRICO'] <1,df_final['MEDIA DO HISTÓRICO'],df_final['MEDIANA DO HISTÓRICO'])\n"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float64(0.7716087836785548)"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"CRESCIMENTO"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {},
"outputs": [],
"source": [
"df_final['PV GINSENG'] = np.where(df_final['CRESCIMENTO'] * df_final[ciclo_ano_passado] + df_final[ciclo_ano_passado] < df_final['MEDIANA DO HISTÓRICO'],\n",
" np.ceil(df_final['CRESCIMENTO'] * df_final['MEDIANA DO HISTÓRICO']+ df_final['MEDIANA DO HISTÓRICO']), \n",
" np.ceil(df_final['CRESCIMENTO']*df_final[ciclo_ano_passado]+df_final[ciclo_ano_passado]))"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {},
"outputs": [],
"source": [
"#df_final['PV GINSENG'] = np.where(df_final['PV GINSENG']<1, df_final['Projeção Próximo Ciclo + 1'],df_final['PV GINSENG'])"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [],
"source": [
"#df_final = df_final.rename(columns={df_final.columns[18]: \"C-4\", df_final.columns[19]: \"C-3\",df_final.columns[20]: \"C-2\",df_final.columns[21]: \"C-1\"})"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'PDV_SKU',\n",
" 'UFPRODUTO', 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414',\n",
" 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n",
" 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C202509',\n",
" 'C202510', 'C202511', 'C202512', 'C202513', 'PICO DE VENDAS 17CICLOS',\n",
" 'Pico Vendas Ultimos 6 ciclos', 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO',\n",
" 'MEDIA DO HISTÓRICO', 'PV GINSENG'],\n",
" dtype='object')"
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [],
"source": [
"df_final.drop(columns=df_final.columns[-21:-10], inplace=True)\n",
"\n",
"df_final.drop(columns=df_final.columns[-13:-11], inplace=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 96,
"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 = df_final\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [],
"source": [
"#df_final['Compra inteligente Próximo Ciclo']\n"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [],
"source": [
"#df_final['DDV PREVISTO'] = df_final['DDV PREVISTO'].fillna(0.01)\n"
]
},
{
"cell_type": "code",
"execution_count": 99,
"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": 100,
"metadata": {},
"outputs": [],
"source": [
"#df_final_dedup['DDV PREVISTO'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 101,
"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": 102,
"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": 103,
"metadata": {},
"outputs": [],
"source": [
"#df_final_dedup.columns"
]
},
{
"cell_type": "code",
"execution_count": 104,
"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": 105,
"metadata": {},
"outputs": [],
"source": [
"#df_final_dedup = df_final_dedup.rename(columns={'Ciclo_x':'Ciclo'})"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {},
"outputs": [],
"source": [
"df_final_dedup['SUGESTÃO ABTASTECIMENTO\t'] = ''\n",
"df_final_dedup['VENDAS R$ ABASTECIMENTO'] = ''\n"
]
},
{
"cell_type": "code",
"execution_count": 107,
"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": 108,
"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": 109,
"metadata": {},
"outputs": [],
"source": [
"#df_final_dedup.drop(columns=['dias_ate_inicio','SKU_FINAL','Projeção Próximo Ciclo + 1',\n",
"# 'CRESCIMENTO'],inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 110,
"metadata": {},
"outputs": [],
"source": [
"#df_final_dedup['MARCA'] = df_final_dedup['MARCA'].str.replace('.csv','',regex=False)"
]
},
{
"cell_type": "code",
"execution_count": 111,
"metadata": {},
"outputs": [],
"source": [
"#df_final_dedup['COB PROJETADA'] = df_final_dedup['COB PROJETADA'].fillna(999)"
]
},
{
"cell_type": "code",
"execution_count": 112,
"metadata": {},
"outputs": [],
"source": [
"#df_final_dedup.columns"
]
},
{
"cell_type": "code",
"execution_count": 113,
"metadata": {},
"outputs": [],
"source": [
"#marca_promo = df_estoque['Arquivo_Origem'].iloc[0].replace('.csv','')\n",
"#marca_promo"
]
},
{
"cell_type": "code",
"execution_count": 114,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'PDV_SKU',\n",
" 'UFPRODUTO', 'DESCRICAO', 'C202411', 'C202412', 'C202415', 'C202510',\n",
" 'C202511', 'C202512', 'C202513', 'PICO DE VENDAS 17CICLOS',\n",
" 'Pico Vendas Ultimos 6 ciclos', 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO',\n",
" 'MEDIA DO HISTÓRICO', 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t',\n",
" 'VENDAS R$ ABASTECIMENTO'],\n",
" dtype='object')"
]
},
"execution_count": 114,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 115,
"metadata": {},
"outputs": [],
"source": [
"# Passo 1: ordenar\n",
"df_sorted = df_final.sort_values(by='% de Desconto', ascending=False)\n",
"\n",
"# Passo 2: obter até 3 chamadas promocionais por grupo\n",
"promo_grouped = (\n",
" df_sorted.groupby(['SKU_FINAL', 'PDV'])['Chamada Promocional']\n",
" .apply(lambda x: x.dropna().unique()[:3])\n",
" .apply(pd.Series)\n",
" .rename(columns={0: 'MECÂNICA 1', 1: 'MECÂNICA 2', 2: 'MECÂNICA 3'})\n",
" .reset_index()\n",
")\n",
"\n",
"# Passo 3: base com maior % de desconto\n",
"df_base = df_sorted.drop_duplicates(subset=['SKU_FINAL', 'PDV'], keep='first').reset_index(drop=True)\n",
"\n",
"# Passo 4: merge com chamadas pivotadas\n",
"df_merged = df_base.merge(promo_grouped, on=['SKU_FINAL', 'PDV'], how='left')\n",
"\n",
"# Corrigir dicionário: agrupar e pegar o primeiro valor válido por (SKU_FINAL, PDV)\n",
"# Passo 1: dicionário com Cód. Combo único por SKU_FINAL+PDV\n",
"cod_combo_map = (\n",
" df_final\n",
" .dropna(subset=['Cód. Combo'])\n",
" .groupby(['SKU_FINAL', 'PDV'])['Cód. Combo']\n",
" .first()\n",
" .to_dict()\n",
")\n",
"\n",
"# Passo 2: gerar Series com os valores mapeados\n",
"cod_combo_series = df_merged.set_index(['SKU_FINAL', 'pdv']).index.map(cod_combo_map)\n",
"\n",
"# Passo 3: substituir os valores diretamente\n",
"df_merged['Cód. Combo'] = cod_combo_series.where(cod_combo_series.notna(), df_merged['Cód. Combo'])\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PDV\n",
"20986 196\n",
"20991 196\n",
"23712 196\n",
"23711 196\n",
"23704 196\n",
"23703 196\n",
"22541 196\n",
"21495 196\n",
"21383 196\n",
"21375 196\n",
"21278 196\n",
"21001 196\n",
"24269 196\n",
"23813 196\n",
"24255 196\n",
"24257 196\n",
"24293 196\n",
"20970 196\n",
"20969 196\n",
"20968 196\n",
"20999 196\n",
"21000 196\n",
"20996 196\n",
"20995 196\n",
"20997 196\n",
"20998 196\n",
"20989 196\n",
"20994 196\n",
"20992 196\n",
"20993 196\n",
"20988 196\n",
"Name: count, dtype: int64"
]
},
"execution_count": 116,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_merged.PDV.value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Columns to bring up front\n",
"priority_cols = [\n",
" 'PDV_SKU',\t'SKU',\t'MARCA','INICIO CICLO',\n",
" 'FIM CICLO',\t'DURAÇÃO','dias_ate_inicio',\t\n",
" 'UFPRODUTO',\t'Item Desativado',\t'Data Prevista Regularização',\n",
" 'ANALISTA',\t'UF',\t'PDV',\t'DESCRIÇÃO PDV',\t'Classe',\n",
" 'Descrição','MECÂNICA 1',\n",
" 'MECÂNICA 2', 'MECÂNICA 3','Estoque Atual',\t'COBERTURA ATUAL',\n",
" 'Estoque em Transito',\t'Pedido Pendente',\t'PICO DE VENDAS 2024','Pico Vendas Ultimos 6 ciclos',\n",
" 'C-4',\t'C-3',\t'C-2',\t'C-1',\t'Histórico de Vendas do Ciclo Atual',\n",
" 'Dias sem venda'\n",
"]\n",
"\n",
"# All remaining columns\n",
"other_cols = [col for col in df_merged.columns if col not in priority_cols]\n",
"\n",
"# Reorder\n",
"df_merged = df_merged[priority_cols + other_cols]\n"
]
},
{
"cell_type": "code",
"execution_count": 117,
"metadata": {},
"outputs": [],
"source": [
"df_merged['INICIO CICLO'] = pd.to_datetime(df_merged['INICIO CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')\n",
"\n",
"df_merged['FIM CICLO'] = pd.to_datetime(df_merged['FIM CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')"
]
},
{
"cell_type": "code",
"execution_count": 118,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'PDV_SKU',\n",
" 'UFPRODUTO', 'DESCRICAO', 'C202411', 'C202412', 'C202415', 'C202510',\n",
" 'C202511', 'C202512', 'C202513', 'PICO DE VENDAS 17CICLOS',\n",
" 'Pico Vendas Ultimos 6 ciclos', 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO',\n",
" 'MEDIA DO HISTÓRICO', 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t',\n",
" 'VENDAS R$ ABASTECIMENTO', 'MECÂNICA 1', 'MECÂNICA 2', 'MECÂNICA 3'],\n",
" dtype='object')"
]
},
"execution_count": 118,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_merged.columns"
]
},
{
"cell_type": "code",
"execution_count": 119,
"metadata": {},
"outputs": [],
"source": [
"df_merged = df_merged.loc[:, ~df_merged.columns.str.endswith('_y')]\n"
]
},
{
"cell_type": "code",
"execution_count": 120,
"metadata": {},
"outputs": [],
"source": [
"df_merged.columns = df_merged.columns.str.replace('_x$', '', regex=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 121,
"metadata": {},
"outputs": [],
"source": [
"df_merged['DESCRICAO'] = df_merged['Descrição do Item']"
]
},
{
"cell_type": "code",
"execution_count": 122,
"metadata": {},
"outputs": [],
"source": [
"df_merged['SKU'] = np.where(df_merged['SKU'].isna(),df_merged['SKU_FINAL'],df_merged['SKU'])"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {},
"outputs": [],
"source": [
"df_merged = df_merged.drop(columns=['Veiculo',\t'Tipo de Promoção',\t'Estratégia de Promoção','Tipo_mecanica'\n",
" ,'Chamada Promocional','MATCH','match','Descrição do Item','CRESCIMENTO',\n",
" 'Cód. Combo'])"
]
},
{
"cell_type": "code",
"execution_count": 124,
"metadata": {},
"outputs": [],
"source": [
"df_merged = df_merged.drop(columns=['Código do Item','PDV','RE compra por',\t'RE Vende por',\t'RE lucra (R$)','INICIO CICLO',\n",
" 'FIM CICLO','Ciclo','CATEGORIA','ANALISTA','dias_ate_inicio','PDV_SKU','UFPRODUTO',\n",
" 'VENDAS R$ ABASTECIMENTO','DURAÇÃO','MEDIANA DO HISTÓRICO','DURAÇÃO'])"
]
},
{
"cell_type": "code",
"execution_count": 125,
"metadata": {},
"outputs": [],
"source": [
"df_merged = df_merged.rename(columns={'nextcycleprojection':'PROJEÇÃO PROX CICLO'\t,'secondtonextcycleprojection':'PROJEÇÃO PROX CICLO +1'})"
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {},
"outputs": [],
"source": [
"df_merged.columns = df_merged.columns.str.upper()"
]
},
{
"cell_type": "code",
"execution_count": 127,
"metadata": {},
"outputs": [],
"source": [
"#df_merged = df_merged[['UF','PDV','DESCRIÇÃO PDV','SKU','DESCRICAO','EAM','CATEGORIA','CURVA','ESTOQUE ATUAL','ESTOQUE EM TRANSITO','PEDIDO PENDENTE','DIASSEMVENDA','PROJEÇÃO PROX CICLO','PROJEÇÃO PROX CICLO +1','PROMO PERÍODO LIMITADO?','VALOR DO GUIA','PREÇO PROMOCIONADO','% DE DESCONTO','PICO DE VENDAS 17CICLOS','PICO VENDAS ULTIMOS 6 CICLOS','MEDIA DO HISTÓRICO']]"
]
},
{
"cell_type": "code",
"execution_count": 128,
"metadata": {},
"outputs": [],
"source": [
"df_merged['MEDIA DO HISTÓRICO'] = round(df_merged['MEDIA DO HISTÓRICO'],0)"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {},
"outputs": [],
"source": [
"df_merged[df_merged.columns[19:26]] = df_merged[df_merged.columns[19:26]].fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [],
"source": [
"# Colunas que devem estar na frente\n",
"colunas_inicio = [\n",
" 'UF', 'PDV', 'DESCRIÇÃO PDV', 'SKU', 'DESCRICAO', 'EAM', 'CATEGORIA', 'CURVA',\n",
" 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DIASSEMVENDA',\n",
" 'PROJEÇÃO PROX CICLO', 'PROJEÇÃO PROX CICLO +1', 'PROMO PERÍODO LIMITADO?',\n",
" 'VALOR DO GUIA', 'PREÇO PROMOCIONADO', '% DE DESCONTO',\n",
" 'PICO DE VENDAS 17CICLOS', 'PICO VENDAS ULTIMOS 6 CICLOS', 'MEDIA DO HISTÓRICO'\n",
"]\n",
"\n",
"# Colunas que devem estar no fim\n",
"colunas_fim = [\n",
" 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t'\n",
"]\n",
"\n",
"# Todas as outras colunas (não estão nem no início nem no fim)\n",
"colunas_meio = [col for col in df_merged.columns if col not in colunas_inicio + colunas_fim]\n",
"\n",
"# Reordena o DataFrame\n",
"df_merged = df_merged[colunas_inicio + colunas_meio + colunas_fim]\n"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [],
"source": [
"df_merged = df_merged.drop_duplicates()"
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'2025-09-03'"
]
},
"execution_count": 132,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hoje=datetime.today().strftime('%Y-%m-%d')\n",
"hoje"
]
},
{
"cell_type": "code",
"execution_count": 134,
"metadata": {},
"outputs": [],
"source": [
"\n",
"from openpyxl import load_workbook\n",
"from openpyxl.styles import PatternFill, Font\n",
"\n",
"\n",
"# Export to Excel\n",
"output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\EUD_promoção_{ciclo_mais2}_{hoje}.xlsx'\n",
"with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n",
" df_merged.to_excel(writer, index=False, sheet_name='Sheet1')\n",
"\n",
"# Apply styles\n",
"wb = load_workbook(output_file)\n",
"ws = wb['Sheet1']\n",
"\n",
"# Style header\n",
"header_fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid') # Light Blue\n",
"header_font = Font(color='FFFFFF', bold=True) # White & Bold\n",
"\n",
"for cell in ws[1]:\n",
" cell.fill = header_fill\n",
" cell.font = header_font\n",
"\n",
"# Style rows: gray/white alternating\n",
"gray_fill = PatternFill(start_color='DDDDDD', end_color='DDDDDD', fill_type='solid') # Light gray\n",
"\n",
"for i, row in enumerate(ws.iter_rows(min_row=2, max_row=ws.max_row), start=2):\n",
" if i % 2 == 0:\n",
" for cell in row:\n",
" cell.fill = gray_fill\n",
"\n",
"# Save styled workbook\n",
"wb.save(output_file)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"coisas q saem\n",
"\n",
"Lançamento\n",
"Subcategoria\n",
"Projeção Próximo Ciclo \n",
"Promoção Próximo Ciclo\n",
"Compra inteligente semanal/Sugestão de compra\n",
"Compra inteligente Próximo Ciclo\n",
"Planograma\n",
"Carteira Bloqueada Para Novos Pedidos\n",
"Quantidade por caixa\n",
"Preço Sell In\n",
"Quantidade\n",
"Item analisado\n",
"Tipo Preço\n",
"\n",
">>>>>>>>>>>>>NAO ESTÁ PEGANDO O MERGE COM O DF_ESTOQUE\n",
"\n",
"\n",
"CRIAR PROJEÇÃO DE VENDA DO CICLO ATUAL\n",
"Compra inteligente Próximo Ciclo + 1 >>>>>>> RENAME PRA NOROMAL"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}