Ruptura_Projetada/Lançamentos/Script_lançamento_boti_v2.ipynb

6059 lines
198 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": 1,
"id": "6ad35669",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np \n",
"import glob\n",
"import os \n",
"from datetime import datetime"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "fa16d50c",
"metadata": {},
"outputs": [],
"source": [
"hoje = datetime.today().strftime('%Y-%m-%d')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "9fcdc77a",
"metadata": {},
"outputs": [],
"source": [
"calendario = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\CICLO 9\\CALENDARIO_CICLO\\Ciclo_Expandido_com_Datas.xlsx\")\n",
"\n",
"calendario['Date'] = pd.to_datetime(calendario['Date'])\n",
"\n",
"# Get today (normalized to midnight)\n",
"today = pd.Timestamp(\"today\").normalize()\n",
"\n",
"calendario['NUM_CICLO'] = calendario['Ciclo'].str[-2:].astype(int)\n",
"\n",
"calendario['ANO_CICLO'] = calendario['Ciclo'].str[0:5]\n",
"\n",
"calendario = calendario[calendario['MARCA'] == \"BOTICARIO\"]\n",
"\n",
"calendario['CICLOMAIS2'] = calendario['ANO_CICLO'].astype(str) + (calendario['NUM_CICLO'].astype(int) + 3).astype(str).str.zfill(2) #<<< MUDAR O \"4\" (CICLO ATUAL + 4 PARA ACHAR O CICLO DA SUGESTÃO) EX: C202505 -> C202509\n",
"ciclo_mais2 = calendario[calendario['Date'].dt.normalize() == today]['CICLOMAIS2'].iloc[0]\n",
"\n",
"# Filter rows where date matches today\n",
"filtered_calendario = calendario[calendario['Ciclo'] == ciclo_mais2][:1]\n",
"\n",
"filtered_calendario['dias_ate_inicio'] = filtered_calendario['INICIO CICLO'].iloc[0] - today\n",
"\n",
"filtered_calendario['dias_ate_inicio'] = filtered_calendario['dias_ate_inicio'].dt.days.astype(int)\n",
"\n",
"filtered_calendario['match'] = 1\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "bbec229d",
"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",
" <th>match</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2451</th>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>BOTICARIO</td>\n",
" <td>2025-11-03</td>\n",
" <td>16</td>\n",
" <td>C2025</td>\n",
" <td>C202519</td>\n",
" <td>59</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Ciclo INICIO CICLO FIM CICLO DURAÇÃO MARCA Date \\\n",
"2451 C202516 2025-11-03 2025-11-30 28 BOTICARIO 2025-11-03 \n",
"\n",
" NUM_CICLO ANO_CICLO CICLOMAIS2 dias_ate_inicio match \n",
"2451 16 C2025 C202519 59 1 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"filtered_calendario"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "0245ed28",
"metadata": {},
"outputs": [],
"source": [
"ciclo_lanc = filtered_calendario['Ciclo'].max()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7a3c1e6f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'C202516'"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ciclo_lanc"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "61ffc777",
"metadata": {},
"outputs": [],
"source": [
"df_similares = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BOT\\BOT - C16\\arquivos para geração da sugestão\\SIMILARES\\PRODUTOS SIMILARES - BOT.xlsx\")\n",
"\n",
"df_similares = pd.merge(left=df_similares,right=calendario[['Ciclo','INICIO CICLO','FIM CICLO','DURAÇÃO']], how= 'left', left_on = 'CICLO SIMILAR',right_on = 'Ciclo' )\n",
"\n",
"df_similares = df_similares.drop(columns=['Ciclo'])\n",
"\n",
"df_similares = df_similares.rename(columns={'INICIO CICLO':'INICIO CICLO SIMILAR','FIM CICLO':'FIM CICLO SIMILAR','DURAÇÃO':'DURAÇÃO CICLO SIMILAR'})\n",
"df_similares.drop_duplicates(inplace=True)\n",
"\n",
"df_similares['MATCH'] = 1\n",
"\n",
"df_similares = df_similares.drop(columns=['INICIO DO CICLO', 'FIM DO CICLO', 'DURAÇÃO CICLO','INICIO CICLO SIMILAR','FIM CICLO SIMILAR','DURAÇÃO CICLO SIMILAR'])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "ad836441",
"metadata": {},
"outputs": [],
"source": [
"df_similares['PRODUTO SIMILAR'] = df_similares['PRODUTO SIMILAR'].astype('str')\n",
"\n",
"df_similares['PRODUTO SIMILAR'] = df_similares['PRODUTO SIMILAR'].replace(r'\\.0$', '', regex=True)\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "fe922f62",
"metadata": {},
"outputs": [],
"source": [
"df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BOT\\BOT - C16\\arquivos para geração da sugestão\\TABELA DE PEDIDO\\Pedidos Semanais Especiais - BOT - 202516.xlsx\")\n",
"\n",
"df_tabela = df_tabela[df_tabela['Região'] == 'NNE'] \n",
"\n",
"df_tabela = df_tabela[(df_tabela['Canal'] != 'Ecomm') | (df_tabela['Canal'] != 'Ecomm | VD') | (df_tabela['Canal'] != 'Ecomm | Loja')] \n",
"\n",
"df_tabela['Canal'] = np.where((df_tabela['Canal'] == \"Loja\") | (df_tabela['Canal'] == \"Todos\") | (df_tabela['Canal'] == \"Loja | VD\"),\"TODOS\",\"VD\")\n",
"\n",
"df_tabela = df_tabela[df_tabela['Tipo de promoção'].str.contains('Lançamentos', na=False)]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "e0c55962",
"metadata": {},
"outputs": [],
"source": [
"df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n",
"df_pdv = df_pdv[~df_pdv['PDV'].isin([910173, 910291])]\n",
"\n",
"df_pdv_origi = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n",
"df_pdv_origi = df_pdv_origi[~df_pdv_origi['PDV'].isin([910173, 910291])]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "f93735d1",
"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>CANAL</th>\n",
" <th>DESCRIÇÃO</th>\n",
" <th>PDV DESC</th>\n",
" <th>REGIÃO</th>\n",
" <th>ESTADO</th>\n",
" <th>CIDADE</th>\n",
" <th>UF</th>\n",
" <th>MARCA</th>\n",
" <th>ANALISTA</th>\n",
" <th>GESTÃO</th>\n",
" <th>SUPERVISOR</th>\n",
" <th>STATUS</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [PDV, CANAL, DESCRIÇÃO, PDV DESC, REGIÃO, ESTADO, CIDADE, UF, MARCA, ANALISTA, GESTÃO, SUPERVISOR, STATUS]\n",
"Index: []"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_pdv[df_pdv['PDV']==910291]"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "a3a045d9",
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"df_pdv = df_pdv.rename(columns={'DESCRIÇÃO':'DESCRIÇÃO PDV'})\n",
"\n",
"df_pdv = df_pdv.drop(columns=['REGIÃO', 'ESTADO','CIDADE','GESTÃO','MARCA'])\n",
"\n",
"df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])\n",
"\n",
"#ignorando a PDV que ainda não está online\n",
"df_pdv = df_pdv[df_pdv['DESCRIÇÃO PDV'] != '23813-COMERCIO-HIB VALENTE']\n",
"\n",
"df_pdv = df_pdv[df_pdv['STATUS'] != \"INATIVO\"]\n",
"\n",
"df_pdv = df_pdv[df_pdv['STATUS'] != \"MATRIZ\"]\n",
"\n",
"df_pdv = df_pdv[df_pdv['SUPERVISOR'] != 'Inativa']\n",
"\n",
"df_pdv['MATCH'] = 1"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "df04a501",
"metadata": {},
"outputs": [],
"source": [
"df_similares = pd.merge(left=df_similares,right=df_pdv,right_on=['MATCH'],left_on=['MATCH'],how='inner')\n",
"\n",
"df_similares = df_similares.drop_duplicates()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "0da911af",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_31644\\1001187263.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",
" dfi = pd.read_sql(query, conn)\n"
]
}
],
"source": [
"import pyodbc\n",
"import configparser\n",
"\n",
"#query de vendas por ciclo\n",
"\n",
"config = configparser.ConfigParser()\n",
"config.read(r\"C:\\Users\\joao.herculano\\Documents\\Enviador de email\\credenciais.ini\")\n",
"\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",
"\n",
"query = f'''\n",
"SELECT \n",
" B.PDV, \n",
" B.SKU,\n",
" bd.SKU2, \n",
" COALESCE(bd.SKU2, b.SKU) AS SKU_FINAL,\n",
" B.DESCRICAO,\n",
" SUM(CAST(b.VENDAS AS DECIMAL(18,2))) AS VENDAS_CICLO,\n",
" C.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 base_depara bd on b.SKU = bd.SKU \n",
"WHERE CAST(b.[DATA] AS DATE) >= DATEADD(YEAR, -1, GETDATE())\n",
"GROUP BY\n",
" B.PDV, \n",
" B.SKU,\n",
" bd.SKU2,\n",
" B.DESCRICAO,\n",
" C.Ciclo\n",
"HAVING SUM(CAST(b.VENDAS AS DECIMAL(18,2))) > 0\n",
"'''\n",
"dfi = pd.read_sql(query, conn)\n",
"conn.close()\n",
"\n",
"dfi['SKU2'] = dfi['SKU2'].fillna(\"-\")\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "20634105",
"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_FINAL</th>\n",
" <th>DESCRICAO</th>\n",
" <th>C202413</th>\n",
" <th>C202414</th>\n",
" <th>C202415</th>\n",
" <th>C202416</th>\n",
" <th>C202417</th>\n",
" <th>C202501</th>\n",
" <th>C202502</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>12522</td>\n",
" <td>1004</td>\n",
" <td>FLORATTA DES COL MY BLUE 75ml</td>\n",
" <td>15.0</td>\n",
" <td>2.0</td>\n",
" <td>3.0</td>\n",
" <td>56.0</td>\n",
" <td>6.0</td>\n",
" <td>1.0</td>\n",
" <td>11.0</td>\n",
" <td>...</td>\n",
" <td>5.0</td>\n",
" <td>12.0</td>\n",
" <td>7.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>12522</td>\n",
" <td>1080</td>\n",
" <td>INTENSE GLOS LAB BUBBAL TUT/FRUT 5ml</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>10.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>7.0</td>\n",
" <td>17.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>12522</td>\n",
" <td>1296</td>\n",
" <td>PMPCK THE BLEND DES ANTIT AER 2x75g</td>\n",
" <td>1.0</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>2.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>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>12522</td>\n",
" <td>1302</td>\n",
" <td>PMPCK LILY DES ANTIT AER 2x75g</td>\n",
" <td>2.0</td>\n",
" <td>3.0</td>\n",
" <td>5.0</td>\n",
" <td>6.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>3.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>12522</td>\n",
" <td>1314</td>\n",
" <td>PMPCK ZAAD DES ANTIT AER 2x75g</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>1.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>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 21 columns</p>\n",
"</div>"
],
"text/plain": [
" PDV SKU_FINAL DESCRICAO C202413 C202414 \\\n",
"0 12522 1004 FLORATTA DES COL MY BLUE 75ml 15.0 2.0 \n",
"1 12522 1080 INTENSE GLOS LAB BUBBAL TUT/FRUT 5ml 0.0 4.0 \n",
"2 12522 1296 PMPCK THE BLEND DES ANTIT AER 2x75g 1.0 3.0 \n",
"3 12522 1302 PMPCK LILY DES ANTIT AER 2x75g 2.0 3.0 \n",
"4 12522 1314 PMPCK ZAAD DES ANTIT AER 2x75g 0.0 3.0 \n",
"\n",
" C202415 C202416 C202417 C202501 C202502 ... C202504 C202505 \\\n",
"0 3.0 56.0 6.0 1.0 11.0 ... 5.0 12.0 \n",
"1 0.0 10.0 2.0 2.0 1.0 ... 3.0 1.0 \n",
"2 3.0 2.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"3 5.0 6.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"4 1.0 1.0 0.0 0.0 0.0 ... 0.0 0.0 \n",
"\n",
" C202506 C202507 C202508 C202509 C202510 C202511 C202512 C202513 \n",
"0 7.0 2.0 0.0 1.0 2.0 5.0 3.0 0.0 \n",
"1 7.0 17.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 2.0 \n",
"3 3.0 4.0 0.0 4.0 4.0 2.0 1.0 2.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 \n",
"\n",
"[5 rows x 21 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"# 1. Agrupamento\n",
"df_agrupado = dfi.groupby(['PDV', 'SKU_FINAL', '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_FINAL', '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_pivotadowawa = df_pivotado.reset_index()\n",
"\n",
"# 4. (Opcional) Renomear colunas com prefixo \"Ciclo_\"\n",
"df_pivotadowawa.columns.name = None\n",
"df_pivotadowawa = df_pivotadowawa.rename(columns=lambda x: f'Ciclo_{x}' if isinstance(x, (int, str)) and str(x).isdigit() else x)\n",
"\n",
"# Resultado final\n",
"df_pivotadowawa.head()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "8289d835",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_31644\\268247862.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",
" df_draft_ = pd.read_sql(query_est_draft, conn)\n"
]
}
],
"source": [
"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",
"\n",
"query_est_draft = f'''\n",
"select em.PDV ,\n",
"COALESCE(em.SKU_PARA , em.SKU) as SKU,\n",
"em.DESCRICAO,\n",
"d.salescurve as curva,\n",
"d.codcategory as categoria,\n",
"d.nextcycleprojection as proj_mar\n",
",d.secondtonextcycleprojection as 'proj_mar+1',\n",
"em.[ESTOQUE ATUAL],em.[ESTOQUE EM TRANSITO],\n",
"em.[PEDIDO PENDENTE],\n",
"em.[DDV PREVISTO] ,\n",
"d.pricesellin as 'preço'\n",
"from estoque_mar em \n",
"left join draft d on d.code = COALESCE(em.SKU_PARA , em.SKU) and d.loja_id = em.PDV \n",
"where em.ORIGEM = 'BOT'\n",
"'''\n",
"df_draft_ = pd.read_sql(query_est_draft, conn)\n",
"conn.close()\n",
"\n",
"#FALTA ATUALIZAR QUERY"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "dd49288f",
"metadata": {},
"outputs": [],
"source": [
"df_draft = df_draft_"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "67dd3c27",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_31644\\1474679865.py:3: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" df_draft['ESTOQUE ATUAL'] = df_draft['ESTOQUE ATUAL'].astype(float)\n",
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_31644\\1474679865.py:5: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" df_draft['ESTOQUE EM TRANSITO'] = df_draft['ESTOQUE EM TRANSITO'].astype(float)\n",
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_31644\\1474679865.py:7: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" df_draft['PEDIDO PENDENTE'] = df_draft['PEDIDO PENDENTE'].astype(float)\n"
]
},
{
"data": {
"text/plain": [
"(356210, 12)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_draft = df_draft[~df_draft['DESCRICAO'].str.contains('OUI', na=False)]\n",
"\n",
"df_draft['ESTOQUE ATUAL'] = df_draft['ESTOQUE ATUAL'].astype(float)\n",
"\n",
"df_draft['ESTOQUE EM TRANSITO'] = df_draft['ESTOQUE EM TRANSITO'].astype(float)\n",
"\n",
"df_draft['PEDIDO PENDENTE'] = df_draft['PEDIDO PENDENTE'].astype(float)\n",
"\n",
"df_draft.shape"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "355778d6",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_31644\\1952797845.py:1: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].str.replace(',','.')\n",
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_31644\\1952797845.py:3: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].astype(float)\n",
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_31644\\1952797845.py:5: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].fillna(0)\n"
]
}
],
"source": [
"df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].str.replace(',','.')\n",
"\n",
"df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].astype(float)\n",
"\n",
"df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "d891c575",
"metadata": {},
"outputs": [],
"source": [
"df_draft = df_draft.groupby(['PDV','SKU','curva','categoria'])[['proj_mar','proj_mar+1','ESTOQUE ATUAL','ESTOQUE EM TRANSITO','PEDIDO PENDENTE','DDV PREVISTO','preço']].max().reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "3d13ef4c",
"metadata": {},
"outputs": [],
"source": [
"df_draft['SKU'] = df_draft['SKU'].astype('Int64')"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "5ca66c75",
"metadata": {},
"outputs": [],
"source": [
"df_draft = pd.merge(df_draft,df_pivotadowawa,left_on=['PDV','SKU'],right_on=['PDV','SKU_FINAL'],how='inner')"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "91298cde",
"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": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_draft.columns[13:31]"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "ed859826",
"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>curva</th>\n",
" <th>categoria</th>\n",
" <th>proj_mar</th>\n",
" <th>proj_mar+1</th>\n",
" <th>ESTOQUE ATUAL</th>\n",
" <th>ESTOQUE EM TRANSITO</th>\n",
" <th>PEDIDO PENDENTE</th>\n",
" <th>DDV PREVISTO</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",
" </tbody>\n",
"</table>\n",
"<p>0 rows × 31 columns</p>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [PDV, SKU, curva, categoria, proj_mar, proj_mar+1, ESTOQUE ATUAL, ESTOQUE EM TRANSITO, PEDIDO PENDENTE, DDV PREVISTO, preço, SKU_FINAL, DESCRICAO, C202413, C202414, C202415, C202416, C202417, C202501, C202502, C202503, C202504, C202505, C202506, C202507, C202508, C202509, C202510, C202511, C202512, C202513]\n",
"Index: []\n",
"\n",
"[0 rows x 31 columns]"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_draft[df_draft['PDV']==24293]"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "34e179cb",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_31644\\1731143361.py:24: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
" crescimento_por_pdv = df_draft.groupby('PDV').apply(calcular_crescimento)\n"
]
}
],
"source": [
"# Define as colunas mensais\n",
"colunas_mensais = df_draft.columns[13:31]\n",
"\n",
"# Agrupa por PDV e calcula crescimento médio por PDV\n",
"def calcular_crescimento(grupo):\n",
" soma_mensal = grupo[colunas_mensais].sum() # soma por mês\n",
" variacao_mensal = soma_mensal.pct_change().dropna() # variação percentual mês a mês\n",
" variacao_mensal = variacao_mensal[np.isfinite(variacao_mensal)]\n",
"\n",
" if len(variacao_mensal) == 0:\n",
" return pd.Series({'CRESCIMENTO': np.nan})\n",
"\n",
" media = variacao_mensal.mean()\n",
" desvio = variacao_mensal.std()\n",
"\n",
" limite_sup = media + 2 * desvio\n",
" limite_inf = media - 2 * desvio\n",
"\n",
" variacoes_filtradas = variacao_mensal[variacao_mensal.between(limite_inf, limite_sup)]\n",
" crescimento = round(variacoes_filtradas.mean(), 4)\n",
" return pd.Series({'CRESCIMENTO': crescimento})\n",
"\n",
"# Aplica a função por PDV\n",
"crescimento_por_pdv = df_draft.groupby('PDV').apply(calcular_crescimento)\n",
"\n",
"# Merge do resultado de volta no dataframe original\n",
"df_draft = df_draft.merge(crescimento_por_pdv, on='PDV', how='left')\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "94aa432f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 57890\n",
"1 57890\n",
"2 57890\n",
"3 57890\n",
"4 57890\n",
"Name: PRODUTO SIMILAR, dtype: Int64"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_similares['PRODUTO SIMILAR'] = df_similares['PRODUTO SIMILAR'].astype('Int64')\n",
"df_similares['PRODUTO SIMILAR'].head()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "38b0eb5d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PDV object\n",
"SKU Int64\n",
"dtype: object"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_draft[['PDV', 'SKU']].dtypes"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "4bc8c2b4",
"metadata": {},
"outputs": [],
"source": [
"df_draft['PDV'] = df_draft['PDV'].astype('Int64')\n",
"\n",
"df_final = pd.merge(left=df_similares,right=df_draft,right_on=['PDV', 'SKU'],left_on=['PDV','PRODUTO SIMILAR'],how='left')"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "2c9f011d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PRODUTO SIMILAR\n",
"57211 154\n",
"48999 154\n",
"48997 154\n",
"57890 77\n",
"58987 77\n",
"48685 77\n",
"56530 77\n",
"57871 77\n",
"51869 77\n",
"49418 77\n",
"49943 77\n",
"49893 77\n",
"56402 77\n",
"56385 77\n",
"48780 77\n",
"58132 77\n",
"Name: count, dtype: Int64"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_similares= df_similares[df_similares['PRODUTO SIMILAR'].notna()]\n",
"\n",
"df_similares['PRODUTO SIMILAR'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "0ff66803",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"SKU\n",
"48997 154\n",
"48999 154\n",
"57211 140\n",
"49943 121\n",
"49893 91\n",
"57871 77\n",
"58987 77\n",
"56402 77\n",
"56385 77\n",
"57890 76\n",
"48780 75\n",
"51869 73\n",
"48685 72\n",
"49418 71\n",
"58132 66\n",
"56530 31\n",
"Name: count, dtype: Int64"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['SKU'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "c1451562",
"metadata": {},
"outputs": [],
"source": [
"#df_venda_diaria = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BOT\\BOT - C12\\LANÇAMENTOS\\arquivos para geração da sugestão\\VENDAS_DIARIAS\\FormFiltroConsultaVendaSintetica_17_06_2025_14_04_40.xls\")\n",
"#df_venda_diaria.shape"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "64bde00b",
"metadata": {},
"outputs": [],
"source": [
"df_venda_diaria = pd.read_csv(\n",
" r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BOT\\BOT - C15\\arquivos para geração da sugestão\\VENDAS_DIARIAS\\vendas 20250815.csv\",\n",
" sep=';',\n",
" dtype={'SKU_2': str},decimal=',')"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "6ab155b5",
"metadata": {},
"outputs": [],
"source": [
"df_venda_diaria['VENDAS_CICLO'] = df_venda_diaria['VENDAS_CICLO'].str.replace(r'\\.', '', regex=True)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "1d25e5df",
"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>12522</td>\n",
" <td>51.944</td>\n",
" <td>COFFEE DES COL MAN SEDUC TCH PRM 10ml</td>\n",
" <td>11</td>\n",
" <td>C202307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20998</td>\n",
" <td>77.557</td>\n",
" <td>QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK</td>\n",
" <td>1</td>\n",
" <td>C202405</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20858</td>\n",
" <td>74.103</td>\n",
" <td>GLAMOUR DES COL SEC BL 75ml V4</td>\n",
" <td>5</td>\n",
" <td>C202409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5699</td>\n",
" <td>47.950</td>\n",
" <td>ZAAD EDP 95ml V6</td>\n",
" <td>12</td>\n",
" <td>C202406</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20993</td>\n",
" <td>50.297</td>\n",
" <td>ESTJ DEM LILY ESSENCE 4x4ml</td>\n",
" <td>2</td>\n",
" <td>C202416</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO VENDAS_CICLO \\\n",
"0 12522 51.944 COFFEE DES COL MAN SEDUC TCH PRM 10ml 11 \n",
"1 20998 77.557 QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK 1 \n",
"2 20858 74.103 GLAMOUR DES COL SEC BL 75ml V4 5 \n",
"3 5699 47.950 ZAAD EDP 95ml V6 12 \n",
"4 20993 50.297 ESTJ DEM LILY ESSENCE 4x4ml 2 \n",
"\n",
" Ciclo \n",
"0 C202307 \n",
"1 C202405 \n",
"2 C202409 \n",
"3 C202406 \n",
"4 C202416 "
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_venda_diaria.head()"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "5d0d79f2",
"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_Total</th>\n",
" <th>Ciclo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12522</td>\n",
" <td>51.944</td>\n",
" <td>COFFEE DES COL MAN SEDUC TCH PRM 10ml</td>\n",
" <td>11</td>\n",
" <td>C202307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20998</td>\n",
" <td>77.557</td>\n",
" <td>QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK</td>\n",
" <td>1</td>\n",
" <td>C202405</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20858</td>\n",
" <td>74.103</td>\n",
" <td>GLAMOUR DES COL SEC BL 75ml V4</td>\n",
" <td>5</td>\n",
" <td>C202409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5699</td>\n",
" <td>47.950</td>\n",
" <td>ZAAD EDP 95ml V6</td>\n",
" <td>12</td>\n",
" <td>C202406</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20993</td>\n",
" <td>50.297</td>\n",
" <td>ESTJ DEM LILY ESSENCE 4x4ml</td>\n",
" <td>2</td>\n",
" <td>C202416</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO Vendas_Total \\\n",
"0 12522 51.944 COFFEE DES COL MAN SEDUC TCH PRM 10ml 11 \n",
"1 20998 77.557 QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK 1 \n",
"2 20858 74.103 GLAMOUR DES COL SEC BL 75ml V4 5 \n",
"3 5699 47.950 ZAAD EDP 95ml V6 12 \n",
"4 20993 50.297 ESTJ DEM LILY ESSENCE 4x4ml 2 \n",
"\n",
" Ciclo \n",
"0 C202307 \n",
"1 C202405 \n",
"2 C202409 \n",
"3 C202406 \n",
"4 C202416 "
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#df_venda_diaria['Ciclo'] = df_venda_diaria['Ciclo'].str.replace(\"C\",\"C20\") \n",
"\n",
"df_venda_diaria = df_venda_diaria.rename(columns={'VENDAS_CICLO':'Vendas_Total'})\n",
"\n",
"df_venda_diaria.head()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "a93427da",
"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_Total</th>\n",
" <th>Ciclo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12522</td>\n",
" <td>51.944</td>\n",
" <td>COFFEE DES COL MAN SEDUC TCH PRM 10ml</td>\n",
" <td>11</td>\n",
" <td>C202307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20998</td>\n",
" <td>77.557</td>\n",
" <td>QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK</td>\n",
" <td>1</td>\n",
" <td>C202405</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20858</td>\n",
" <td>74.103</td>\n",
" <td>GLAMOUR DES COL SEC BL 75ml V4</td>\n",
" <td>5</td>\n",
" <td>C202409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5699</td>\n",
" <td>47.950</td>\n",
" <td>ZAAD EDP 95ml V6</td>\n",
" <td>12</td>\n",
" <td>C202406</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20993</td>\n",
" <td>50.297</td>\n",
" <td>ESTJ DEM LILY ESSENCE 4x4ml</td>\n",
" <td>2</td>\n",
" <td>C202416</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO Vendas_Total \\\n",
"0 12522 51.944 COFFEE DES COL MAN SEDUC TCH PRM 10ml 11 \n",
"1 20998 77.557 QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK 1 \n",
"2 20858 74.103 GLAMOUR DES COL SEC BL 75ml V4 5 \n",
"3 5699 47.950 ZAAD EDP 95ml V6 12 \n",
"4 20993 50.297 ESTJ DEM LILY ESSENCE 4x4ml 2 \n",
"\n",
" Ciclo \n",
"0 C202307 \n",
"1 C202405 \n",
"2 C202409 \n",
"3 C202406 \n",
"4 C202416 "
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_venda_diaria['Vendas_Total'] = df_venda_diaria['Vendas_Total'].str.replace(',', '.', regex=False)\n",
"\n",
"df_venda_diaria['Vendas_Total'] = df_venda_diaria['Vendas_Total'].astype('float')\n",
"\n",
"df_venda_diaria['Vendas_Total'] = round(df_venda_diaria['Vendas_Total'],0)\n",
"\n",
"df_venda_diaria['Vendas_Total'] = df_venda_diaria['Vendas_Total'].astype(str)\n",
"\n",
"df_venda_diaria['Vendas_Total'] = (\n",
" df_venda_diaria['Vendas_Total']\n",
" .str.replace('.0', '', regex=False)\n",
" .str.replace('.', '', regex=False)\n",
" .astype('Int64')\n",
")\n",
"\n",
"\n",
"df_venda_diaria.head()"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "7d973983",
"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_Total</th>\n",
" <th>Ciclo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [PDV, SKU, DESCRICAO, Vendas_Total, Ciclo]\n",
"Index: []"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_venda_diaria[(df_venda_diaria['PDV']==14668) & (df_venda_diaria['SKU']=='85096')]"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "6ddec856",
"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_Total</th>\n",
" <th>Ciclo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12522</td>\n",
" <td>51.944</td>\n",
" <td>COFFEE DES COL MAN SEDUC TCH PRM 10ml</td>\n",
" <td>11</td>\n",
" <td>C202307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20998</td>\n",
" <td>77.557</td>\n",
" <td>QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK</td>\n",
" <td>1</td>\n",
" <td>C202405</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20858</td>\n",
" <td>74.103</td>\n",
" <td>GLAMOUR DES COL SEC BL 75ml V4</td>\n",
" <td>5</td>\n",
" <td>C202409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5699</td>\n",
" <td>47.950</td>\n",
" <td>ZAAD EDP 95ml V6</td>\n",
" <td>12</td>\n",
" <td>C202406</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20993</td>\n",
" <td>50.297</td>\n",
" <td>ESTJ DEM LILY ESSENCE 4x4ml</td>\n",
" <td>2</td>\n",
" <td>C202416</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO Vendas_Total \\\n",
"0 12522 51.944 COFFEE DES COL MAN SEDUC TCH PRM 10ml 11 \n",
"1 20998 77.557 QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK 1 \n",
"2 20858 74.103 GLAMOUR DES COL SEC BL 75ml V4 5 \n",
"3 5699 47.950 ZAAD EDP 95ml V6 12 \n",
"4 20993 50.297 ESTJ DEM LILY ESSENCE 4x4ml 2 \n",
"\n",
" Ciclo \n",
"0 C202307 \n",
"1 C202405 \n",
"2 C202409 \n",
"3 C202406 \n",
"4 C202416 "
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_venda_diaria2 = df_venda_diaria.pivot_table(\n",
" index=[\"PDV\", \"SKU\", \"DESCRICAO\"],\n",
" columns=\"Ciclo\",\n",
" values=\"Vendas_Total\",\n",
" fill_value=0\n",
").reset_index()\n",
"\n",
"# Se quiser, reorganize as colunas colocando os ciclos ao final\n",
"df_venda_diaria.columns.name = None\n",
"\n",
"df_venda_diaria.head()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "882e68aa",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['PDV', 'SKU', 'DESCRICAO', 'Vendas_Total', 'Ciclo'], dtype='object')"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_venda_diaria.columns"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "0c288d75",
"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_Total</th>\n",
" <th>Ciclo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12522</td>\n",
" <td>51.944</td>\n",
" <td>COFFEE DES COL MAN SEDUC TCH PRM 10ml</td>\n",
" <td>11</td>\n",
" <td>C202307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20998</td>\n",
" <td>77.557</td>\n",
" <td>QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK</td>\n",
" <td>1</td>\n",
" <td>C202405</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20858</td>\n",
" <td>74.103</td>\n",
" <td>GLAMOUR DES COL SEC BL 75ml V4</td>\n",
" <td>5</td>\n",
" <td>C202409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5699</td>\n",
" <td>47.950</td>\n",
" <td>ZAAD EDP 95ml V6</td>\n",
" <td>12</td>\n",
" <td>C202406</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20993</td>\n",
" <td>50.297</td>\n",
" <td>ESTJ DEM LILY ESSENCE 4x4ml</td>\n",
" <td>2</td>\n",
" <td>C202416</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1663315</th>\n",
" <td>20996</td>\n",
" <td>83.039</td>\n",
" <td>QUASAR DES COL RUSH 100ml</td>\n",
" <td>1</td>\n",
" <td>C202415</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1663316</th>\n",
" <td>20970</td>\n",
" <td>52.025</td>\n",
" <td>BOTI BABY SAB LIQ GLIC V2 400ml</td>\n",
" <td>6</td>\n",
" <td>C202511</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1663317</th>\n",
" <td>20996</td>\n",
" <td>93.069</td>\n",
" <td>LA PIEL D/COL SPR CP PER AMBR DOUR 200ml</td>\n",
" <td>10</td>\n",
" <td>C202414</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1663318</th>\n",
" <td>13427</td>\n",
" <td>51.279</td>\n",
" <td>MAKE B BAS LIQ C/ GLYC TX 140 30g</td>\n",
" <td>1</td>\n",
" <td>C202309</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1663319</th>\n",
" <td>21278</td>\n",
" <td>52.014</td>\n",
" <td>CJ FLAC OUI EDP ICONIQUE INTENSE 3x1ml</td>\n",
" <td>2</td>\n",
" <td>C202511</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1663320 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO \\\n",
"0 12522 51.944 COFFEE DES COL MAN SEDUC TCH PRM 10ml \n",
"1 20998 77.557 QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK \n",
"2 20858 74.103 GLAMOUR DES COL SEC BL 75ml V4 \n",
"3 5699 47.950 ZAAD EDP 95ml V6 \n",
"4 20993 50.297 ESTJ DEM LILY ESSENCE 4x4ml \n",
"... ... ... ... \n",
"1663315 20996 83.039 QUASAR DES COL RUSH 100ml \n",
"1663316 20970 52.025 BOTI BABY SAB LIQ GLIC V2 400ml \n",
"1663317 20996 93.069 LA PIEL D/COL SPR CP PER AMBR DOUR 200ml \n",
"1663318 13427 51.279 MAKE B BAS LIQ C/ GLYC TX 140 30g \n",
"1663319 21278 52.014 CJ FLAC OUI EDP ICONIQUE INTENSE 3x1ml \n",
"\n",
" Vendas_Total Ciclo \n",
"0 11 C202307 \n",
"1 1 C202405 \n",
"2 5 C202409 \n",
"3 12 C202406 \n",
"4 2 C202416 \n",
"... ... ... \n",
"1663315 1 C202415 \n",
"1663316 6 C202511 \n",
"1663317 10 C202414 \n",
"1663318 1 C202309 \n",
"1663319 2 C202511 \n",
"\n",
"[1663320 rows x 5 columns]"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_venda_diaria"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "c7ddaf20",
"metadata": {},
"outputs": [],
"source": [
"#df_venda_diaria['PDV'] = df_venda_diaria['Unidade de Negócio'].str.split(\"-\").str[0].str.strip()\n",
"\n",
"#df_venda_diaria['Dia'] = pd.to_datetime(df_venda_diaria['Dia'], format='%d/%m/%Y')\n",
"\n",
"#df_venda_diaria = pd.merge(left=df_venda_diaria,right=calendario[['Ciclo','Date']],left_on='Dia',right_on='Date',how='inner')\n",
"\n",
"#df_venda_diaria = df_venda_diaria.drop(columns='Date')\n",
"\n",
"#df_venda_diaria.shape"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "7119556a",
"metadata": {},
"outputs": [],
"source": [
"# 'Dia' já está em formato datetime, então renomeamos para 'Data' diretamente\n",
"# ou apenas usamos 'Dia' como referência de data\n",
"\n",
"# Ordena o DataFrame para garantir que a cumulativa funcione corretamente\n",
"#df_venda_diaria = df_venda_diaria.sort_values(by=['Unidade de Negócio', 'Código do Produto', 'Dia'])\n",
"\n",
"# Calcula a quantidade acumulada até o dia para cada grupo\n",
"#df_venda_diaria['Quantidade Acumulada'] = (df_venda_diaria.groupby(['Unidade de Negócio', 'Código do Produto'])['Quantidade'].cumsum()) # acumulado por grupo até a data da linha\n",
"\n",
"#df_venda_diaria.shape"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "c707a1b6",
"metadata": {},
"outputs": [],
"source": [
"#df_venda_diaria = df_venda_diaria.drop_duplicates()\n",
"\n",
"#df_venda_agrupado = df_venda_diaria.fillna(0).groupby(['PDV', 'Código do Produto','Ciclo'])['Quantidade Acumulada'].max().reset_index()\n",
"#df_venda_agrupado"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "083ff829",
"metadata": {},
"outputs": [],
"source": [
"#df_venda_agrupado[(df_venda_agrupado['Ciclo']=='C202213')&(df_venda_agrupado['Código do Produto']==81054)&(df_venda_agrupado['PDV']=='20994')]"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "59707396",
"metadata": {},
"outputs": [],
"source": [
"#df_venda_agrupado[['Ciclo','Código do Produto','PDV']].dtypes"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "bdf6abbb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"CICLO SIMILAR object\n",
"PRODUTO SIMILAR Int64\n",
"PDV int64\n",
"dtype: object"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final[['CICLO SIMILAR','PRODUTO SIMILAR','PDV']].dtypes"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "dc452c72",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1527, 60)"
]
},
"execution_count": 47,
"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']], right_on='match',left_on='MATCH',how='left')\n",
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "c260e0e3",
"metadata": {},
"outputs": [],
"source": [
"#df_final = df_final.drop(columns=['PDV DESC','status','SKU','Descrição','Lançamento','Item analisado','Planograma','Quantidade por caixa'])"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "c9de258b",
"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>PRODUTO LANÇAMENTO</th>\n",
" <th>DESCRIÇÃO DO LANÇAMENTO</th>\n",
" <th>PRODUTO SIMILAR</th>\n",
" <th>DESCRIÇÃO SIMILAR</th>\n",
" <th>CICLO SIMILAR</th>\n",
" <th>FOCO</th>\n",
" <th>IAF</th>\n",
" <th>CATEGORIA</th>\n",
" <th>MARCA</th>\n",
" <th>% CONSUMIDOR</th>\n",
" <th>...</th>\n",
" <th>C202511</th>\n",
" <th>C202512</th>\n",
" <th>C202513</th>\n",
" <th>CRESCIMENTO</th>\n",
" <th>Ciclo</th>\n",
" <th>INICIO CICLO</th>\n",
" <th>FIM CICLO</th>\n",
" <th>DURAÇÃO</th>\n",
" <th>match</th>\n",
" <th>dias_ate_inicio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0382</td>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>24.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.0456</td>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>7.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0433</td>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.0701</td>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0421</td>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 60 columns</p>\n",
"</div>"
],
"text/plain": [
" PRODUTO LANÇAMENTO DESCRIÇÃO DO LANÇAMENTO \\\n",
"0 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"1 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"2 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"3 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"4 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"\n",
" PRODUTO SIMILAR DESCRIÇÃO SIMILAR CICLO SIMILAR \\\n",
"0 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"1 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"2 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"3 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"4 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"\n",
" FOCO IAF CATEGORIA MARCA % CONSUMIDOR ... C202511 C202512 \\\n",
"0 Não Não CUIDADOS COM A PELE LILY 15.01 ... 2.0 0.0 \n",
"1 Não Não CUIDADOS COM A PELE LILY 15.01 ... 24.0 1.0 \n",
"2 Não Não CUIDADOS COM A PELE LILY 15.01 ... 7.0 1.0 \n",
"3 Não Não CUIDADOS COM A PELE LILY 15.01 ... 1.0 1.0 \n",
"4 Não Não CUIDADOS COM A PELE LILY 15.01 ... 0.0 2.0 \n",
"\n",
" C202513 CRESCIMENTO Ciclo INICIO CICLO FIM CICLO DURAÇÃO match \\\n",
"0 0.0 0.0382 C202516 2025-11-03 2025-11-30 28 1 \n",
"1 0.0 -0.0456 C202516 2025-11-03 2025-11-30 28 1 \n",
"2 0.0 0.0433 C202516 2025-11-03 2025-11-30 28 1 \n",
"3 0.0 -0.0701 C202516 2025-11-03 2025-11-30 28 1 \n",
"4 0.0 0.0421 C202516 2025-11-03 2025-11-30 28 1 \n",
"\n",
" dias_ate_inicio \n",
"0 59 \n",
"1 59 \n",
"2 59 \n",
"3 59 \n",
"4 59 \n",
"\n",
"[5 rows x 60 columns]"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.head()"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "8a05450c",
"metadata": {},
"outputs": [],
"source": [
"df_final = pd.merge(left=df_final, right=calendario[['Ciclo','INICIO CICLO','FIM CICLO','DURAÇÃO']], right_on='Ciclo',left_on='CICLO SIMILAR',how='left')\n",
"df_final.shape\n",
"\n",
"df_final = df_final.drop_duplicates()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "cc65edab",
"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 Lançamento</th>\n",
" <th>Ciclo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12522</td>\n",
" <td>51.944</td>\n",
" <td>COFFEE DES COL MAN SEDUC TCH PRM 10ml</td>\n",
" <td>11</td>\n",
" <td>C202307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20998</td>\n",
" <td>77.557</td>\n",
" <td>QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK</td>\n",
" <td>1</td>\n",
" <td>C202405</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20858</td>\n",
" <td>74.103</td>\n",
" <td>GLAMOUR DES COL SEC BL 75ml V4</td>\n",
" <td>5</td>\n",
" <td>C202409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5699</td>\n",
" <td>47.950</td>\n",
" <td>ZAAD EDP 95ml V6</td>\n",
" <td>12</td>\n",
" <td>C202406</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20993</td>\n",
" <td>50.297</td>\n",
" <td>ESTJ DEM LILY ESSENCE 4x4ml</td>\n",
" <td>2</td>\n",
" <td>C202416</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO \\\n",
"0 12522 51.944 COFFEE DES COL MAN SEDUC TCH PRM 10ml \n",
"1 20998 77.557 QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK \n",
"2 20858 74.103 GLAMOUR DES COL SEC BL 75ml V4 \n",
"3 5699 47.950 ZAAD EDP 95ml V6 \n",
"4 20993 50.297 ESTJ DEM LILY ESSENCE 4x4ml \n",
"\n",
" Vendas Ciclo Lançamento Ciclo \n",
"0 11 C202307 \n",
"1 1 C202405 \n",
"2 5 C202409 \n",
"3 12 C202406 \n",
"4 2 C202416 "
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"df_venda_diaria = df_venda_diaria.rename(columns={'Vendas_Total':'Vendas Ciclo Lançamento'})\n",
"df_venda_diaria.head()"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "6367ac21",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 C202415\n",
"21 C202415\n",
"42 C202415\n",
"63 C202415\n",
"84 C202415\n",
" ... \n",
"25683 0\n",
"25684 0\n",
"25685 0\n",
"25686 0\n",
"25687 0\n",
"Name: CICLO SIMILAR, Length: 1527, dtype: object"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['CICLO SIMILAR'] = df_final['CICLO SIMILAR'].fillna('0')\n",
"df_final['CICLO SIMILAR'] "
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "b0af59cb",
"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 SIMILAR</th>\n",
" <th>PRODUTO SIMILAR</th>\n",
" <th>PDV</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>C202415</td>\n",
" <td>57890</td>\n",
" <td>12522</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>C202415</td>\n",
" <td>57890</td>\n",
" <td>12817</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>C202415</td>\n",
" <td>57890</td>\n",
" <td>12818</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63</th>\n",
" <td>C202415</td>\n",
" <td>57890</td>\n",
" <td>12820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>84</th>\n",
" <td>C202415</td>\n",
" <td>57890</td>\n",
" <td>12823</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" CICLO SIMILAR PRODUTO SIMILAR PDV\n",
"0 C202415 57890 12522\n",
"21 C202415 57890 12817\n",
"42 C202415 57890 12818\n",
"63 C202415 57890 12820\n",
"84 C202415 57890 12823"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final[['CICLO SIMILAR','PRODUTO SIMILAR','PDV']].head()"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "72925ca7",
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"df_final['PRODUTO SIMILAR'] = df_final['PRODUTO SIMILAR'].astype('Int64')\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "8b0bb174",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO', 'PRODUTO SIMILAR',\n",
" 'DESCRIÇÃO SIMILAR', 'CICLO SIMILAR', 'FOCO', 'IAF', 'CATEGORIA',\n",
" 'MARCA', '% CONSUMIDOR', 'MECANICA CONSUMIDOR', '% REVENDEDOR',\n",
" 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'MATCH', 'PDV', 'CANAL',\n",
" 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR', 'STATUS',\n",
" 'SKU', 'curva', 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
" 'SKU_FINAL', 'DESCRICAO', 'C202413', 'C202414', 'C202415', 'C202416',\n",
" 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n",
" 'C202506', 'C202507', 'C202508', 'C202509', 'C202510', 'C202511',\n",
" 'C202512', 'C202513', 'CRESCIMENTO', 'Ciclo_x', 'INICIO CICLO_x',\n",
" 'FIM CICLO_x', 'DURAÇÃO_x', 'match', 'dias_ate_inicio', 'Ciclo_y',\n",
" 'INICIO CICLO_y', 'FIM CICLO_y', 'DURAÇÃO_y'],\n",
" dtype='object')"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "3d924087",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 57890\n",
"21 57890\n",
"42 57890\n",
"63 57890\n",
"84 57890\n",
" ... \n",
"25683 58132\n",
"25684 58132\n",
"25685 58132\n",
"25686 58132\n",
"25687 58132\n",
"Name: PRODUTO SIMILAR, Length: 1527, dtype: Int64"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['PRODUTO SIMILAR']"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "c34b541a",
"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 Lançamento</th>\n",
" <th>Ciclo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12522</td>\n",
" <td>51.944</td>\n",
" <td>COFFEE DES COL MAN SEDUC TCH PRM 10ml</td>\n",
" <td>11</td>\n",
" <td>C202307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20998</td>\n",
" <td>77.557</td>\n",
" <td>QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK</td>\n",
" <td>1</td>\n",
" <td>C202405</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20858</td>\n",
" <td>74.103</td>\n",
" <td>GLAMOUR DES COL SEC BL 75ml V4</td>\n",
" <td>5</td>\n",
" <td>C202409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5699</td>\n",
" <td>47.950</td>\n",
" <td>ZAAD EDP 95ml V6</td>\n",
" <td>12</td>\n",
" <td>C202406</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20993</td>\n",
" <td>50.297</td>\n",
" <td>ESTJ DEM LILY ESSENCE 4x4ml</td>\n",
" <td>2</td>\n",
" <td>C202416</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1663315</th>\n",
" <td>20996</td>\n",
" <td>83.039</td>\n",
" <td>QUASAR DES COL RUSH 100ml</td>\n",
" <td>1</td>\n",
" <td>C202415</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1663316</th>\n",
" <td>20970</td>\n",
" <td>52.025</td>\n",
" <td>BOTI BABY SAB LIQ GLIC V2 400ml</td>\n",
" <td>6</td>\n",
" <td>C202511</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1663317</th>\n",
" <td>20996</td>\n",
" <td>93.069</td>\n",
" <td>LA PIEL D/COL SPR CP PER AMBR DOUR 200ml</td>\n",
" <td>10</td>\n",
" <td>C202414</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1663318</th>\n",
" <td>13427</td>\n",
" <td>51.279</td>\n",
" <td>MAKE B BAS LIQ C/ GLYC TX 140 30g</td>\n",
" <td>1</td>\n",
" <td>C202309</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1663319</th>\n",
" <td>21278</td>\n",
" <td>52.014</td>\n",
" <td>CJ FLAC OUI EDP ICONIQUE INTENSE 3x1ml</td>\n",
" <td>2</td>\n",
" <td>C202511</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1663320 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO \\\n",
"0 12522 51.944 COFFEE DES COL MAN SEDUC TCH PRM 10ml \n",
"1 20998 77.557 QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK \n",
"2 20858 74.103 GLAMOUR DES COL SEC BL 75ml V4 \n",
"3 5699 47.950 ZAAD EDP 95ml V6 \n",
"4 20993 50.297 ESTJ DEM LILY ESSENCE 4x4ml \n",
"... ... ... ... \n",
"1663315 20996 83.039 QUASAR DES COL RUSH 100ml \n",
"1663316 20970 52.025 BOTI BABY SAB LIQ GLIC V2 400ml \n",
"1663317 20996 93.069 LA PIEL D/COL SPR CP PER AMBR DOUR 200ml \n",
"1663318 13427 51.279 MAKE B BAS LIQ C/ GLYC TX 140 30g \n",
"1663319 21278 52.014 CJ FLAC OUI EDP ICONIQUE INTENSE 3x1ml \n",
"\n",
" Vendas Ciclo Lançamento Ciclo \n",
"0 11 C202307 \n",
"1 1 C202405 \n",
"2 5 C202409 \n",
"3 12 C202406 \n",
"4 2 C202416 \n",
"... ... ... \n",
"1663315 1 C202415 \n",
"1663316 6 C202511 \n",
"1663317 10 C202414 \n",
"1663318 1 C202309 \n",
"1663319 2 C202511 \n",
"\n",
"[1663320 rows x 5 columns]"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_venda_diaria"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "1efff472",
"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 Lançamento</th>\n",
" <th>Ciclo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12522</td>\n",
" <td>51944</td>\n",
" <td>COFFEE DES COL MAN SEDUC TCH PRM 10ml</td>\n",
" <td>11</td>\n",
" <td>C202307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20998</td>\n",
" <td>77557</td>\n",
" <td>QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK</td>\n",
" <td>1</td>\n",
" <td>C202405</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20858</td>\n",
" <td>74103</td>\n",
" <td>GLAMOUR DES COL SEC BL 75ml V4</td>\n",
" <td>5</td>\n",
" <td>C202409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5699</td>\n",
" <td>47950</td>\n",
" <td>ZAAD EDP 95ml V6</td>\n",
" <td>12</td>\n",
" <td>C202406</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20993</td>\n",
" <td>50297</td>\n",
" <td>ESTJ DEM LILY ESSENCE 4x4ml</td>\n",
" <td>2</td>\n",
" <td>C202416</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO \\\n",
"0 12522 51944 COFFEE DES COL MAN SEDUC TCH PRM 10ml \n",
"1 20998 77557 QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK \n",
"2 20858 74103 GLAMOUR DES COL SEC BL 75ml V4 \n",
"3 5699 47950 ZAAD EDP 95ml V6 \n",
"4 20993 50297 ESTJ DEM LILY ESSENCE 4x4ml \n",
"\n",
" Vendas Ciclo Lançamento Ciclo \n",
"0 11 C202307 \n",
"1 1 C202405 \n",
"2 5 C202409 \n",
"3 12 C202406 \n",
"4 2 C202416 "
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_venda_diaria['SKU'] = df_venda_diaria['SKU'].astype('str')\n",
"\n",
"df_venda_diaria['SKU'] = df_venda_diaria['SKU'].str.replace('.','')\n",
"\n",
"df_venda_diaria.head()"
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "62ea79f7",
"metadata": {},
"outputs": [],
"source": [
"df_final['PRODUTO SIMILAR'] = df_final['PRODUTO SIMILAR'].astype('str')"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "c5383011",
"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>PRODUTO LANÇAMENTO</th>\n",
" <th>DESCRIÇÃO DO LANÇAMENTO</th>\n",
" <th>PRODUTO SIMILAR</th>\n",
" <th>DESCRIÇÃO SIMILAR</th>\n",
" <th>CICLO SIMILAR</th>\n",
" <th>FOCO</th>\n",
" <th>IAF</th>\n",
" <th>CATEGORIA</th>\n",
" <th>MARCA</th>\n",
" <th>% CONSUMIDOR</th>\n",
" <th>...</th>\n",
" <th>Ciclo_x</th>\n",
" <th>INICIO CICLO_x</th>\n",
" <th>FIM CICLO_x</th>\n",
" <th>DURAÇÃO_x</th>\n",
" <th>match</th>\n",
" <th>dias_ate_inicio</th>\n",
" <th>Ciclo_y</th>\n",
" <th>INICIO CICLO_y</th>\n",
" <th>FIM CICLO_y</th>\n",
" <th>DURAÇÃO_y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>84</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>C202516</td>\n",
" <td>2025-11-03</td>\n",
" <td>2025-11-30</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 64 columns</p>\n",
"</div>"
],
"text/plain": [
" PRODUTO LANÇAMENTO DESCRIÇÃO DO LANÇAMENTO \\\n",
"0 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"21 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"42 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"63 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"84 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"\n",
" PRODUTO SIMILAR DESCRIÇÃO SIMILAR CICLO SIMILAR \\\n",
"0 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"21 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"42 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"63 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"84 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"\n",
" FOCO IAF CATEGORIA MARCA % CONSUMIDOR ... Ciclo_x \\\n",
"0 Não Não CUIDADOS COM A PELE LILY 15.01 ... C202516 \n",
"21 Não Não CUIDADOS COM A PELE LILY 15.01 ... C202516 \n",
"42 Não Não CUIDADOS COM A PELE LILY 15.01 ... C202516 \n",
"63 Não Não CUIDADOS COM A PELE LILY 15.01 ... C202516 \n",
"84 Não Não CUIDADOS COM A PELE LILY 15.01 ... C202516 \n",
"\n",
" INICIO CICLO_x FIM CICLO_x DURAÇÃO_x match dias_ate_inicio Ciclo_y \\\n",
"0 2025-11-03 2025-11-30 28 1 59 C202415 \n",
"21 2025-11-03 2025-11-30 28 1 59 C202415 \n",
"42 2025-11-03 2025-11-30 28 1 59 C202415 \n",
"63 2025-11-03 2025-11-30 28 1 59 C202415 \n",
"84 2025-11-03 2025-11-30 28 1 59 C202415 \n",
"\n",
" INICIO CICLO_y FIM CICLO_y DURAÇÃO_y \n",
"0 2024-10-14 2024-11-03 21.0 \n",
"21 2024-10-14 2024-11-03 21.0 \n",
"42 2024-10-14 2024-11-03 21.0 \n",
"63 2024-10-14 2024-11-03 21.0 \n",
"84 2024-10-14 2024-11-03 21.0 \n",
"\n",
"[5 rows x 64 columns]"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.head()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "c5cd5f42",
"metadata": {},
"outputs": [],
"source": [
"df_final = pd.merge(left=df_final, right = df_venda_diaria[['PDV','SKU','Ciclo','Vendas Ciclo Lançamento']], right_on=['Ciclo','SKU','PDV'],left_on=['CICLO SIMILAR','PRODUTO SIMILAR','PDV'],how='left')\n",
"\n",
"df_final = df_final.drop_duplicates()"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "4f22b782",
"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>PRODUTO LANÇAMENTO</th>\n",
" <th>DESCRIÇÃO DO LANÇAMENTO</th>\n",
" <th>PRODUTO SIMILAR</th>\n",
" <th>DESCRIÇÃO SIMILAR</th>\n",
" <th>CICLO SIMILAR</th>\n",
" <th>FOCO</th>\n",
" <th>IAF</th>\n",
" <th>CATEGORIA</th>\n",
" <th>MARCA</th>\n",
" <th>% CONSUMIDOR</th>\n",
" <th>...</th>\n",
" <th>DURAÇÃO_x</th>\n",
" <th>match</th>\n",
" <th>dias_ate_inicio</th>\n",
" <th>Ciclo_y</th>\n",
" <th>INICIO CICLO_y</th>\n",
" <th>FIM CICLO_y</th>\n",
" <th>DURAÇÃO_y</th>\n",
" <th>SKU_y</th>\n",
" <th>Ciclo</th>\n",
" <th>Vendas Ciclo Lançamento</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" <td>57890</td>\n",
" <td>C202415</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" <td>57890</td>\n",
" <td>C202415</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>&lt;NA&gt;</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 67 columns</p>\n",
"</div>"
],
"text/plain": [
" PRODUTO LANÇAMENTO DESCRIÇÃO DO LANÇAMENTO \\\n",
"0 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"1 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"2 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"3 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"4 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"\n",
" PRODUTO SIMILAR DESCRIÇÃO SIMILAR CICLO SIMILAR \\\n",
"0 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"1 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"2 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"3 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"4 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"\n",
" FOCO IAF CATEGORIA MARCA % CONSUMIDOR ... DURAÇÃO_x match \\\n",
"0 Não Não CUIDADOS COM A PELE LILY 15.01 ... 28 1 \n",
"1 Não Não CUIDADOS COM A PELE LILY 15.01 ... 28 1 \n",
"2 Não Não CUIDADOS COM A PELE LILY 15.01 ... 28 1 \n",
"3 Não Não CUIDADOS COM A PELE LILY 15.01 ... 28 1 \n",
"4 Não Não CUIDADOS COM A PELE LILY 15.01 ... 28 1 \n",
"\n",
" dias_ate_inicio Ciclo_y INICIO CICLO_y FIM CICLO_y DURAÇÃO_y SKU_y \\\n",
"0 59 C202415 2024-10-14 2024-11-03 21.0 57890 \n",
"1 59 C202415 2024-10-14 2024-11-03 21.0 NaN \n",
"2 59 C202415 2024-10-14 2024-11-03 21.0 NaN \n",
"3 59 C202415 2024-10-14 2024-11-03 21.0 57890 \n",
"4 59 C202415 2024-10-14 2024-11-03 21.0 NaN \n",
"\n",
" Ciclo Vendas Ciclo Lançamento \n",
"0 C202415 1 \n",
"1 NaN <NA> \n",
"2 NaN <NA> \n",
"3 C202415 2 \n",
"4 NaN <NA> \n",
"\n",
"[5 rows x 67 columns]"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.head()"
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "db516beb",
"metadata": {},
"outputs": [],
"source": [
"df_final.to_excel(r'C:\\Users\\joao.herculano\\Documents\\teste.xlsx',index=False)"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "bde12ed6",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final[df_final['PRODUTO LANÇAMENTO'].notna()]\n",
"df_final['Vendas Ciclo Lançamento'] = df_final['Vendas Ciclo Lançamento'].fillna(0)\n"
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "69c88d20",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.int64(19)"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['PDV'].value_counts().min()"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "f5206f50",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
" 'SKU_FINAL', 'DESCRICAO', 'C202413', 'C202414', 'C202415', 'C202416',\n",
" 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n",
" 'C202506'],\n",
" dtype='object')"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[29:46]"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "5e33d293",
"metadata": {},
"outputs": [],
"source": [
"df_jacobina = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\REGIÃO JACOBINA\\draft unificado.xlsx\")"
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "4d23ff5a",
"metadata": {},
"outputs": [],
"source": [
"df_jacobina = df_jacobina[['PDV', 'SKU','202408', '202409',\n",
" '202410', '202411', '202412', '202413', '202414', '202415', '202416',\n",
" '202417', '202501', '202502', '202503', '202504', '202505', '202506',\n",
" '202507']]"
]
},
{
"cell_type": "code",
"execution_count": 69,
"id": "5adc5831",
"metadata": {},
"outputs": [],
"source": [
"ciclos = [\n",
" '202408', '202409', '202410', '202411', '202412', '202413',\n",
" '202414', '202415', '202416', '202417', '202501', '202502',\n",
" '202503', '202504', '202505', '202506', '202507']\n",
"\n",
"df_jacobina[ciclos] = df_jacobina[ciclos].fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "d3dc8c38",
"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>202408</th>\n",
" <th>202409</th>\n",
" <th>202410</th>\n",
" <th>202411</th>\n",
" <th>202412</th>\n",
" <th>202413</th>\n",
" <th>202414</th>\n",
" <th>202415</th>\n",
" <th>202416</th>\n",
" <th>202417</th>\n",
" <th>202501</th>\n",
" <th>202502</th>\n",
" <th>202503</th>\n",
" <th>202504</th>\n",
" <th>202505</th>\n",
" <th>202506</th>\n",
" <th>202507</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>24269</td>\n",
" <td>49014</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>24268</td>\n",
" <td>49014</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>24269</td>\n",
" <td>49016</td>\n",
" <td>36</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>14</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>19</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>10</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>24268</td>\n",
" <td>49016</td>\n",
" <td>12</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>11</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>24269</td>\n",
" <td>48141</td>\n",
" <td>32</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>95</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>41</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>67</td>\n",
" <td>4</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PDV SKU 202408 202409 202410 202411 202412 202413 202414 \\\n",
"0 24269 49014 1 0 5 1 1 1 2 \n",
"1 24268 49014 1 0 4 4 2 5 1 \n",
"2 24269 49016 36 3 1 1 1 0 14 \n",
"3 24268 49016 12 3 1 2 2 2 0 \n",
"4 24269 48141 32 2 3 95 3 2 41 \n",
"\n",
" 202415 202416 202417 202501 202502 202503 202504 202505 202506 \\\n",
"0 2 1 1 3 0 4 0 2 1 \n",
"1 3 4 4 3 0 2 4 2 0 \n",
"2 2 2 1 1 19 1 2 2 10 \n",
"3 0 3 11 4 3 0 4 2 1 \n",
"4 3 3 1 1 1 0 67 4 10 \n",
"\n",
" 202507 \n",
"0 0 \n",
"1 1 \n",
"2 0 \n",
"3 0 \n",
"4 2 "
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_jacobina.head()"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "4169aba0",
"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>PRODUTO LANÇAMENTO</th>\n",
" <th>DESCRIÇÃO DO LANÇAMENTO</th>\n",
" <th>PRODUTO SIMILAR</th>\n",
" <th>DESCRIÇÃO SIMILAR</th>\n",
" <th>CICLO SIMILAR</th>\n",
" <th>FOCO</th>\n",
" <th>IAF</th>\n",
" <th>CATEGORIA</th>\n",
" <th>MARCA</th>\n",
" <th>% CONSUMIDOR</th>\n",
" <th>...</th>\n",
" <th>DURAÇÃO_x</th>\n",
" <th>match</th>\n",
" <th>dias_ate_inicio</th>\n",
" <th>Ciclo_y</th>\n",
" <th>INICIO CICLO_y</th>\n",
" <th>FIM CICLO_y</th>\n",
" <th>DURAÇÃO_y</th>\n",
" <th>SKU_y</th>\n",
" <th>Ciclo</th>\n",
" <th>Vendas Ciclo Lançamento</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" <td>57890</td>\n",
" <td>C202415</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" <td>57890</td>\n",
" <td>C202415</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>1</td>\n",
" <td>59</td>\n",
" <td>C202415</td>\n",
" <td>2024-10-14</td>\n",
" <td>2024-11-03</td>\n",
" <td>21.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 67 columns</p>\n",
"</div>"
],
"text/plain": [
" PRODUTO LANÇAMENTO DESCRIÇÃO DO LANÇAMENTO \\\n",
"0 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"1 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"2 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"3 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"4 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"\n",
" PRODUTO SIMILAR DESCRIÇÃO SIMILAR CICLO SIMILAR \\\n",
"0 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"1 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"2 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"3 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"4 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"\n",
" FOCO IAF CATEGORIA MARCA % CONSUMIDOR ... DURAÇÃO_x match \\\n",
"0 Não Não CUIDADOS COM A PELE LILY 15.01 ... 28 1 \n",
"1 Não Não CUIDADOS COM A PELE LILY 15.01 ... 28 1 \n",
"2 Não Não CUIDADOS COM A PELE LILY 15.01 ... 28 1 \n",
"3 Não Não CUIDADOS COM A PELE LILY 15.01 ... 28 1 \n",
"4 Não Não CUIDADOS COM A PELE LILY 15.01 ... 28 1 \n",
"\n",
" dias_ate_inicio Ciclo_y INICIO CICLO_y FIM CICLO_y DURAÇÃO_y SKU_y \\\n",
"0 59 C202415 2024-10-14 2024-11-03 21.0 57890 \n",
"1 59 C202415 2024-10-14 2024-11-03 21.0 NaN \n",
"2 59 C202415 2024-10-14 2024-11-03 21.0 NaN \n",
"3 59 C202415 2024-10-14 2024-11-03 21.0 57890 \n",
"4 59 C202415 2024-10-14 2024-11-03 21.0 NaN \n",
"\n",
" Ciclo Vendas Ciclo Lançamento \n",
"0 C202415 1 \n",
"1 NaN 0 \n",
"2 NaN 0 \n",
"3 C202415 2 \n",
"4 NaN 0 \n",
"\n",
"[5 rows x 67 columns]"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['PRODUTO SIMILAR'] = df_final['PRODUTO SIMILAR'].astype('Int64')\n",
"\n",
"df_final.head()"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "1c4f5d9d",
"metadata": {},
"outputs": [],
"source": [
"df_final = pd.merge(left=df_final,right=df_jacobina,left_on=['PRODUTO SIMILAR','PDV'],right_on=['SKU','PDV'],how='left')"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "2529e624",
"metadata": {},
"outputs": [],
"source": [
"# Gera pares de colunas: coluna estática ↔ coluna de histórico\n",
"pares_validos = [\n",
" (ciclo, f'Histórico de Vendas do Ciclo {ciclo}')\n",
" for ciclo in ciclos\n",
" if ciclo in df_final.columns and f'Histórico de Vendas do Ciclo {ciclo}' in df_final.columns\n",
"]\n",
"\n",
"# Separa os nomes das colunas\n",
"colunas_estaticas = [c[0] for c in pares_validos]\n",
"colunas_historico = [c[1] for c in pares_validos]\n",
"\n",
"# Aplica a regra: se valor na coluna estática for maior, sobrescreve no histórico\n",
"for col_estatica, col_hist in zip(colunas_estaticas, colunas_historico):\n",
" df_final[col_hist] = df_final[col_estatica].where(\n",
" df_final[col_estatica] > df_final[col_hist],\n",
" df_final[col_hist]\n",
" )\n"
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "fc094fae",
"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>PRODUTO LANÇAMENTO</th>\n",
" <th>DESCRIÇÃO DO LANÇAMENTO</th>\n",
" <th>PRODUTO SIMILAR</th>\n",
" <th>DESCRIÇÃO SIMILAR</th>\n",
" <th>CICLO SIMILAR</th>\n",
" <th>FOCO</th>\n",
" <th>IAF</th>\n",
" <th>CATEGORIA</th>\n",
" <th>MARCA</th>\n",
" <th>% CONSUMIDOR</th>\n",
" <th>...</th>\n",
" <th>202415</th>\n",
" <th>202416</th>\n",
" <th>202417</th>\n",
" <th>202501</th>\n",
" <th>202502</th>\n",
" <th>202503</th>\n",
" <th>202504</th>\n",
" <th>202505</th>\n",
" <th>202506</th>\n",
" <th>202507</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>57890</td>\n",
" <td>LILY CREM ACET DES HID CPO GARDENIA 250g</td>\n",
" <td>C202415</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>LILY</td>\n",
" <td>15.01</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1522</th>\n",
" <td>58132</td>\n",
" <td>CUIDE-SE BEM DELEITE CHOCOLATUDO</td>\n",
" <td>58132</td>\n",
" <td>CUIDE-SE BEM DELEITE CHOCOLATUDO</td>\n",
" <td>0</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>CUIDE-SE BEM</td>\n",
" <td>-</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1523</th>\n",
" <td>58132</td>\n",
" <td>CUIDE-SE BEM DELEITE CHOCOLATUDO</td>\n",
" <td>58132</td>\n",
" <td>CUIDE-SE BEM DELEITE CHOCOLATUDO</td>\n",
" <td>0</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>CUIDE-SE BEM</td>\n",
" <td>-</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>24.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>1524</th>\n",
" <td>58132</td>\n",
" <td>CUIDE-SE BEM DELEITE CHOCOLATUDO</td>\n",
" <td>58132</td>\n",
" <td>CUIDE-SE BEM DELEITE CHOCOLATUDO</td>\n",
" <td>0</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>CUIDE-SE BEM</td>\n",
" <td>-</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>89.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>1525</th>\n",
" <td>58132</td>\n",
" <td>CUIDE-SE BEM DELEITE CHOCOLATUDO</td>\n",
" <td>58132</td>\n",
" <td>CUIDE-SE BEM DELEITE CHOCOLATUDO</td>\n",
" <td>0</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>CUIDE-SE BEM</td>\n",
" <td>-</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1526</th>\n",
" <td>58132</td>\n",
" <td>CUIDE-SE BEM DELEITE CHOCOLATUDO</td>\n",
" <td>58132</td>\n",
" <td>CUIDE-SE BEM DELEITE CHOCOLATUDO</td>\n",
" <td>0</td>\n",
" <td>Não</td>\n",
" <td>Não</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>CUIDE-SE BEM</td>\n",
" <td>-</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1527 rows × 85 columns</p>\n",
"</div>"
],
"text/plain": [
" PRODUTO LANÇAMENTO DESCRIÇÃO DO LANÇAMENTO \\\n",
"0 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"1 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"2 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"3 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"4 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g \n",
"... ... ... \n",
"1522 58132 CUIDE-SE BEM DELEITE CHOCOLATUDO \n",
"1523 58132 CUIDE-SE BEM DELEITE CHOCOLATUDO \n",
"1524 58132 CUIDE-SE BEM DELEITE CHOCOLATUDO \n",
"1525 58132 CUIDE-SE BEM DELEITE CHOCOLATUDO \n",
"1526 58132 CUIDE-SE BEM DELEITE CHOCOLATUDO \n",
"\n",
" PRODUTO SIMILAR DESCRIÇÃO SIMILAR CICLO SIMILAR \\\n",
"0 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"1 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"2 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"3 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"4 57890 LILY CREM ACET DES HID CPO GARDENIA 250g C202415 \n",
"... ... ... ... \n",
"1522 58132 CUIDE-SE BEM DELEITE CHOCOLATUDO 0 \n",
"1523 58132 CUIDE-SE BEM DELEITE CHOCOLATUDO 0 \n",
"1524 58132 CUIDE-SE BEM DELEITE CHOCOLATUDO 0 \n",
"1525 58132 CUIDE-SE BEM DELEITE CHOCOLATUDO 0 \n",
"1526 58132 CUIDE-SE BEM DELEITE CHOCOLATUDO 0 \n",
"\n",
" FOCO IAF CATEGORIA MARCA % CONSUMIDOR ... 202415 \\\n",
"0 Não Não CUIDADOS COM A PELE LILY 15.01 ... NaN \n",
"1 Não Não CUIDADOS COM A PELE LILY 15.01 ... NaN \n",
"2 Não Não CUIDADOS COM A PELE LILY 15.01 ... NaN \n",
"3 Não Não CUIDADOS COM A PELE LILY 15.01 ... NaN \n",
"4 Não Não CUIDADOS COM A PELE LILY 15.01 ... NaN \n",
"... ... ... ... ... ... ... ... \n",
"1522 Não Não PERFUMARIA CUIDE-SE BEM - ... NaN \n",
"1523 Não Não PERFUMARIA CUIDE-SE BEM - ... 0.0 \n",
"1524 Não Não PERFUMARIA CUIDE-SE BEM - ... 0.0 \n",
"1525 Não Não PERFUMARIA CUIDE-SE BEM - ... NaN \n",
"1526 Não Não PERFUMARIA CUIDE-SE BEM - ... NaN \n",
"\n",
" 202416 202417 202501 202502 202503 202504 202505 202506 202507 \n",
"0 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"... ... ... ... ... ... ... ... ... ... \n",
"1522 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1523 0.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"1524 0.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"1525 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1526 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
"[1527 rows x 85 columns]"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "dcff1fcb",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "bebabb9f",
"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": 76,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[35:53]"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "0a1bb832",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.2"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Suponha que os meses estão nas colunas 10 a 26 (17 colunas = 17 meses)\n",
"colunas_mensais = df_final.columns[35:53]\n",
"# Passo 1: Soma todas as linhas (itens) por mês → resultado: total por mês\n",
"soma_mensal = df_final[colunas_mensais].sum()\n",
"\n",
"# Passo 2: Calcula a variação percentual de um mês para o outro\n",
"variacao_mensal = soma_mensal.pct_change()\n",
"variacao_mensal = variacao_mensal.dropna()\n",
"\n",
"variacao_mensal = variacao_mensal[np.isfinite(variacao_mensal)]\n",
"\n",
"# Passo 3: Calcula a média da variação (ignorando o primeiro NaN)\n",
"media_variacao = variacao_mensal[1:].mean()\n",
"\n",
"# Calcula média e desvio padrão\n",
"media = variacao_mensal.mean()\n",
"desvio = variacao_mensal.std()\n",
"\n",
"# Define limite (ex: 2 desvios padrão)\n",
"limite_superior = media + 2 * desvio\n",
"limite_inferior = media - 2 * desvio\n",
"\n",
"# Filtra dados dentro do limite\n",
"filtro = variacao_mensal.between(limite_inferior, limite_superior)\n",
"df_filtrado = variacao_mensal[filtro]\n",
"CRESCIMENTO = round(df_filtrado.mean(),4)\n",
"\n",
"CRESCIMENTO = 0.2 if CRESCIMENTO < 0.2 else CRESCIMENTO\n",
"\n",
"df_final['CRESCIMENTO_GERAL'] = CRESCIMENTO\n",
"\n",
"CRESCIMENTO\n"
]
},
{
"cell_type": "code",
"execution_count": 78,
"id": "a9647c32",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.drop(columns='Ciclo_y')\n",
"\n",
"df_final = df_final.rename(columns={'Ciclo_x': 'Ciclo',\t'INICIO CICLO_x': 'INICIO CICLO',\t'FIM CICLO_x':'FIM CICLO' ,'DURAÇÃO_x':'DURAÇÃO',\n",
" \t'INICIO CICLO_y': 'INICIO CICLO SIMILAR' ,\t'FIM CICLO_y': 'FIM CICLO SIMILAR','DURAÇÃO_y':'DURAÇÃO CICLO SIMILAR'})"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "b107e519",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['C202507', 'C202508', 'C202509', 'C202510', 'C202511', 'C202512',\n",
" 'C202513'],\n",
" dtype='object')"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[46:53]"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "8290853c",
"metadata": {},
"outputs": [],
"source": [
"VENDA_SIMILAR_6_MESES= df_final.columns[46:53]\n",
"df_final['Pico Vendas Similar Ultimos 6 ciclos'] = df_final[VENDA_SIMILAR_6_MESES].max(axis=1)\n",
"\n",
"df_final['Pico Vendas Similar Ultimos 6 ciclos'] = df_final['Pico Vendas Similar Ultimos 6 ciclos'].fillna(0)\n",
"\n",
"df_final['MEDIANA DO HISTÓRICO'] = df_final[colunas_mensais].median(axis=1, skipna=True)\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 81,
"id": "d8b30560",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 1.5\n",
"1 3.5\n",
"2 1.0\n",
"3 1.0\n",
"4 1.0\n",
" ... \n",
"1522 0.0\n",
"1523 0.0\n",
"1524 0.0\n",
"1525 0.0\n",
"1526 0.0\n",
"Length: 1527, dtype: float64"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final[colunas_mensais].median(axis=1, skipna=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "07f043f2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>CANAL</th>\n",
" <th>UF</th>\n",
" <th>PRODUTO LANÇAMENTO</th>\n",
" <th>med_por_canal</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>CD</td>\n",
" <td>AL</td>\n",
" <td>48780</td>\n",
" <td>3.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>CD</td>\n",
" <td>AL</td>\n",
" <td>49154</td>\n",
" <td>29.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>CD</td>\n",
" <td>AL</td>\n",
" <td>49193</td>\n",
" <td>19.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>CD</td>\n",
" <td>AL</td>\n",
" <td>49893</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>CD</td>\n",
" <td>AL</td>\n",
" <td>49943</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>242</th>\n",
" <td>VD</td>\n",
" <td>SE</td>\n",
" <td>88301</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>243</th>\n",
" <td>VD</td>\n",
" <td>SE</td>\n",
" <td>88730</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>244</th>\n",
" <td>VD</td>\n",
" <td>SE</td>\n",
" <td>88889</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>245</th>\n",
" <td>VD</td>\n",
" <td>SE</td>\n",
" <td>88911</td>\n",
" <td>5.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>246</th>\n",
" <td>VD</td>\n",
" <td>SE</td>\n",
" <td>89446</td>\n",
" <td>4.5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>247 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" CANAL UF PRODUTO LANÇAMENTO med_por_canal\n",
"0 CD AL 48780 3.5\n",
"1 CD AL 49154 29.0\n",
"2 CD AL 49193 19.5\n",
"3 CD AL 49893 0.0\n",
"4 CD AL 49943 0.0\n",
".. ... .. ... ...\n",
"242 VD SE 88301 2.0\n",
"243 VD SE 88730 0.0\n",
"244 VD SE 88889 0.0\n",
"245 VD SE 88911 5.5\n",
"246 VD SE 89446 4.5\n",
"\n",
"[247 rows x 4 columns]"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"medi = df_final.groupby(['CANAL','UF','PRODUTO LANÇAMENTO'])['MEDIANA DO HISTÓRICO'].max().reset_index()\n",
"medi = medi.rename(columns={'MEDIANA DO HISTÓRICO':'med_por_canal'})\n",
"medi"
]
},
{
"cell_type": "code",
"execution_count": 83,
"id": "94abddce",
"metadata": {},
"outputs": [],
"source": [
"#df_final = pd.merge(left=df_final, right=medi,on=['CANAL','UF'],how='inner')\n"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "c4fbc613",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 EDICAO LIMITADA\n",
"1 EDICAO LIMITADA\n",
"2 EDICAO LIMITADA\n",
"3 EDICAO LIMITADA\n",
"4 EDICAO LIMITADA\n",
" ... \n",
"1522 REGULAR\n",
"1523 REGULAR\n",
"1524 REGULAR\n",
"1525 REGULAR\n",
"1526 REGULAR\n",
"Name: TIPO DE PRODUTO, Length: 1527, dtype: object"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['TIPO DE PRODUTO']"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "df26720c",
"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 Lançamento</th>\n",
" <th>Ciclo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12522</td>\n",
" <td>51944</td>\n",
" <td>COFFEE DES COL MAN SEDUC TCH PRM 10ml</td>\n",
" <td>11</td>\n",
" <td>C202307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20998</td>\n",
" <td>77557</td>\n",
" <td>QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK</td>\n",
" <td>1</td>\n",
" <td>C202405</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20858</td>\n",
" <td>74103</td>\n",
" <td>GLAMOUR DES COL SEC BL 75ml V4</td>\n",
" <td>5</td>\n",
" <td>C202409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5699</td>\n",
" <td>47950</td>\n",
" <td>ZAAD EDP 95ml V6</td>\n",
" <td>12</td>\n",
" <td>C202406</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>20993</td>\n",
" <td>50297</td>\n",
" <td>ESTJ DEM LILY ESSENCE 4x4ml</td>\n",
" <td>2</td>\n",
" <td>C202416</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" PDV SKU DESCRICAO \\\n",
"0 12522 51944 COFFEE DES COL MAN SEDUC TCH PRM 10ml \n",
"1 20998 77557 QDB BASE LIQ SUPERMAT COR 06 Q 30ml RPCK \n",
"2 20858 74103 GLAMOUR DES COL SEC BL 75ml V4 \n",
"3 5699 47950 ZAAD EDP 95ml V6 \n",
"4 20993 50297 ESTJ DEM LILY ESSENCE 4x4ml \n",
"\n",
" Vendas Ciclo Lançamento Ciclo \n",
"0 11 C202307 \n",
"1 1 C202405 \n",
"2 5 C202409 \n",
"3 12 C202406 \n",
"4 2 C202416 "
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_venda_diaria.head()"
]
},
{
"cell_type": "code",
"execution_count": 86,
"id": "ef979be5",
"metadata": {},
"outputs": [],
"source": [
"df_dourado = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\DADOS DOURADO\\VENDA\\compilado de vendas.xlsx\")\n",
"\n",
"df_dourado['Data de venda'] = pd.to_datetime(df_dourado['Data de venda'], dayfirst=True)\n",
"\n",
"df_dourado['de para pdv'] = df_dourado['de para pdv'].astype(str)\n",
"\n",
"df_dourado['de para pdv'] = df_dourado['de para pdv'].str.replace(r'\\.0$', '', regex=True)\n",
"\n",
"# 'Dia' já está em formato datetime, então renomeamos para 'Data' diretamente\n",
"# ou apenas usamos 'Dia' como referência de data\n",
"\n",
"# Ordena o DataFrame para garantir que a cumulativa funcione corretamente\n",
"df_venda_diaria = df_venda_diaria.sort_values(by=['PDV', 'SKU', 'Ciclo'])\n",
"\n",
"# Calcula a quantidade acumulada até o dia para cada grupo\n",
"df_dourado['Quantidade Acumulada dourado'] = (\n",
" df_dourado\n",
" .groupby(['de para pdv', 'sku'])['Quantidade Vendida']\n",
" .cumsum()\n",
") # acumulado por grupo até a data da linha\n",
"\n",
"df_dourado = pd.merge(left=df_dourado,right=calendario[['Date','Ciclo']],left_on='Data de venda',right_on='Date',how='inner')\n",
"\n",
"\n",
"\n",
"df_dourado_agrupado = df_dourado.groupby(['de para pdv','sku','Ciclo'])['Quantidade Acumulada dourado'].max().reset_index()\n",
"\n",
"df_dourado_agrupado = df_dourado_agrupado.rename(columns={'Ciclo':'Ciclo dourado'})\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 87,
"id": "41eb7ebf",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 12522\n",
"1 12817\n",
"2 12818\n",
"3 12820\n",
"4 12823\n",
"Name: PDV, dtype: object"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['PDV'] = df_final['PDV'].astype(str)\n",
"df_final['PDV'].head()"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "6dbe67bb",
"metadata": {},
"outputs": [],
"source": [
"df_final = pd.merge(left=df_final, right = df_dourado_agrupado, right_on=['Ciclo dourado','sku','de para pdv'],left_on=['CICLO SIMILAR','PRODUTO SIMILAR','PDV'],how='left')\n",
"\n",
"df_final['Quantidade Acumulada dourado'] = df_final['Quantidade Acumulada dourado'].fillna(0)\n",
"\n",
"\n",
"df_final['Vendas Ciclo Lançamento'] = np.where(df_final['Quantidade Acumulada dourado'] > 0, df_final['Quantidade Acumulada dourado'], df_final['Vendas Ciclo Lançamento'])\n",
"\n",
"df_final = df_final.drop(columns='Quantidade Acumulada dourado')\n",
"\n",
"\n",
"df_final = df_final.drop(columns='Ciclo dourado')"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "7986b8fa",
"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>CP VIVA BEM</th>\n",
" <th>Protheus</th>\n",
" <th>PDVDEPARA.Practico</th>\n",
" <th>Canal</th>\n",
" <th>Endereço</th>\n",
" <th>CNPJ</th>\n",
" <th>CNPJ Locação</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>3559</td>\n",
" <td>70101.0</td>\n",
" <td>23713.0</td>\n",
" <td>MATRIZ - LJ</td>\n",
" <td>Rua Zeferino Correia, nº 17, Centro, CEP 45.00...</td>\n",
" <td>14.378.160/0001-83</td>\n",
" <td>14.378.160/0001-83</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>7292</td>\n",
" <td>70103.0</td>\n",
" <td>23712.0</td>\n",
" <td>LOJA</td>\n",
" <td>Al. Rio Branco, nº 373, Centro, Cândido Sales ...</td>\n",
" <td>14.378.160/0006-98</td>\n",
" <td>14.378.160/0006-98</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>8708</td>\n",
" <td>70102.0</td>\n",
" <td>23711.0</td>\n",
" <td>VD</td>\n",
" <td>Al. Lima Guerra, nº 04, Centro, Vitória da Con...</td>\n",
" <td>14.378.160/0005-07</td>\n",
" <td>14.378.160/0001-83</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>8931</td>\n",
" <td>NaN</td>\n",
" <td>23710.0</td>\n",
" <td>NaN</td>\n",
" <td>Avenida Rosa Cruz, nº 80, Hiper B Preço Loja B...</td>\n",
" <td>14.378.160/0008-50</td>\n",
" <td>14.378.160/0008-50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>11191</td>\n",
" <td>70108.0</td>\n",
" <td>23709.0</td>\n",
" <td>LOJA</td>\n",
" <td>Av. Juracy Magalhães, nº 3340, Shopping Conqui...</td>\n",
" <td>14.378.160/0009-30</td>\n",
" <td>14.378.160/0001-83</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" CP VIVA BEM Protheus PDVDEPARA.Practico Canal \\\n",
"0 3559 70101.0 23713.0 MATRIZ - LJ \n",
"1 7292 70103.0 23712.0 LOJA \n",
"2 8708 70102.0 23711.0 VD \n",
"3 8931 NaN 23710.0 NaN \n",
"4 11191 70108.0 23709.0 LOJA \n",
"\n",
" Endereço CNPJ \\\n",
"0 Rua Zeferino Correia, nº 17, Centro, CEP 45.00... 14.378.160/0001-83 \n",
"1 Al. Rio Branco, nº 373, Centro, Cândido Sales ... 14.378.160/0006-98 \n",
"2 Al. Lima Guerra, nº 04, Centro, Vitória da Con... 14.378.160/0005-07 \n",
"3 Avenida Rosa Cruz, nº 80, Hiper B Preço Loja B... 14.378.160/0008-50 \n",
"4 Av. Juracy Magalhães, nº 3340, Shopping Conqui... 14.378.160/0009-30 \n",
"\n",
" CNPJ Locação \n",
"0 14.378.160/0001-83 \n",
"1 14.378.160/0006-98 \n",
"2 14.378.160/0001-83 \n",
"3 14.378.160/0008-50 \n",
"4 14.378.160/0001-83 "
]
},
"execution_count": 89,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_depara_vdc = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\Vitoria da Conquista\\HISTORICO VENDAS VITORIA DA CONQUISTA\\Filiais - Vitoria da Conquista 4.xlsx\")\n",
"\n",
"df_depara_vdc.head()"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "09efe938",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'df_vdc = pd.read_parquet(r\"C:\\\\Users\\\\joao.herculano\\\\GRUPO GINSENG\\\\Assistência Suprimentos - 2025\\\\SUPRIMENTOS\\\\Vitoria da Conquista\\\\HISTORICO VENDAS VITORIA DA CONQUISTA\\\\VENDAS VITORIA DA CONQUISTA\\\\concatenado.parquet\")\\n\\ndf_vdc[\\'PDV\\'] = df_vdc[\\'Quebra\\'].str.split(\" -\").str[0]\\n\\ndf_vdc[\\'PDV\\'] = df_vdc[\\'PDV\\'].astype(\\'int64\\')\\n\\ndf_vdc = df_vdc.rename(columns={\\'Quebra2\\':\\'DATA VENDA\\'})\\n\\ndf_vdc[\\'DATA VENDA\\'] = pd.to_datetime(df_vdc[\\'DATA VENDA\\'], format=\\'%d/%m/%Y\\')'"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r'''df_vdc = pd.read_parquet(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\Vitoria da Conquista\\HISTORICO VENDAS VITORIA DA CONQUISTA\\VENDAS VITORIA DA CONQUISTA\\concatenado.parquet\")\n",
"\n",
"df_vdc['PDV'] = df_vdc['Quebra'].str.split(\" -\").str[0]\n",
"\n",
"df_vdc['PDV'] = df_vdc['PDV'].astype('int64')\n",
"\n",
"df_vdc = df_vdc.rename(columns={'Quebra2':'DATA VENDA'})\n",
"\n",
"df_vdc['DATA VENDA'] = pd.to_datetime(df_vdc['DATA VENDA'], format='%d/%m/%Y')'''"
]
},
{
"cell_type": "code",
"execution_count": 91,
"id": "330154b2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"df_vdc = pd.merge(df_vdc,df_depara_vdc[['CP VIVA BEM','PDVDEPARA.Practico']],left_on='PDV',right_on='CP VIVA BEM',how='inner')\\n\\ndf_vdc['Quantidade'] = df_vdc['Quantidade'].str.replace(r',000$','',regex=True)\\n\\ndf_vdc['Quantidade'] = df_vdc['Quantidade'].astype('Int64') \""
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"'''df_vdc = pd.merge(df_vdc,df_depara_vdc[['CP VIVA BEM','PDVDEPARA.Practico']],left_on='PDV',right_on='CP VIVA BEM',how='inner')\n",
"\n",
"df_vdc['Quantidade'] = df_vdc['Quantidade'].str.replace(r',000$','',regex=True)\n",
"\n",
"df_vdc['Quantidade'] = df_vdc['Quantidade'].astype('Int64') '''"
]
},
{
"cell_type": "code",
"execution_count": 92,
"id": "09cc2f82",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"df_vdc['Quantidade Acumulada vdc'] = (\\n df_vdc\\n .groupby(['PDVDEPARA.Practico', 'Código'])['Quantidade']\\n .cumsum()\\n) # acumulado por grupo até a data da linha\""
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"\n",
"\n",
"\n",
"# 'Dia' já está em formato datetime, então renomeamos para 'Data' diretamente\n",
"# ou apenas usamos 'Dia' como referência de data\n",
"\n",
"# Ordena o DataFrame para garantir que a cumulativa funcione corretamente\n",
"#df_venda_diaria = df_venda_diaria.sort_values(by=['PDV', 'SKU', 'Ciclo'])\n",
"\n",
"# Calcula a quantidade acumulada até o dia para cada grupo\n",
"r'''df_vdc['Quantidade Acumulada vdc'] = (\n",
" df_vdc\n",
" .groupby(['PDVDEPARA.Practico', 'Código'])['Quantidade']\n",
" .cumsum()\n",
") # acumulado por grupo até a data da linha'''"
]
},
{
"cell_type": "code",
"execution_count": 93,
"id": "5a827c08",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"df_vdc = pd.merge(left=df_vdc,right=calendario[['Date','Ciclo']],left_on='DATA VENDA',right_on='Date',how='inner')\\n\\ndf_vdc_agrupado = df_vdc.groupby(['PDVDEPARA.Practico',\\t'Código','Ciclo'])['Quantidade Acumulada vdc'].max().reset_index()\\n\\ndf_vdc_agrupado = df_vdc_agrupado.rename(columns={'Ciclo':'Ciclo vdc'})\\n\\n\\ndf_vdc_agrupado['PDVDEPARA.Practico'] = df_vdc_agrupado['PDVDEPARA.Practico'].astype(str).str.replace(r'\\\\.0$', '', regex=True)\\ndf_vdc_agrupado.head()\""
]
},
"execution_count": 93,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r'''df_vdc = pd.merge(left=df_vdc,right=calendario[['Date','Ciclo']],left_on='DATA VENDA',right_on='Date',how='inner')\n",
"\n",
"df_vdc_agrupado = df_vdc.groupby(['PDVDEPARA.Practico',\t'Código','Ciclo'])['Quantidade Acumulada vdc'].max().reset_index()\n",
"\n",
"df_vdc_agrupado = df_vdc_agrupado.rename(columns={'Ciclo':'Ciclo vdc'})\n",
"\n",
"\n",
"df_vdc_agrupado['PDVDEPARA.Practico'] = df_vdc_agrupado['PDVDEPARA.Practico'].astype(str).str.replace(r'\\.0$', '', regex=True)\n",
"df_vdc_agrupado.head()'''\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 94,
"id": "4933b6d2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'df_vdc_agrupado = df_vdc_agrupado.astype(str)\\n\\ndf_vdc_agrupado = df_vdc_agrupado.replace()'"
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r'''df_vdc_agrupado = df_vdc_agrupado.astype(str)\n",
"\n",
"df_vdc_agrupado = df_vdc_agrupado.replace()'''"
]
},
{
"cell_type": "code",
"execution_count": 95,
"id": "8d5f2c33",
"metadata": {},
"outputs": [],
"source": [
"#df_vdc.to_excel(r\"C:\\Users\\joao.herculano\\Documents\\df_vdc.xlsx\",index=False)"
]
},
{
"cell_type": "code",
"execution_count": 96,
"id": "63fea2ea",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"df_vdc_agrupado['PDVDEPARA.Practico'] = df_vdc_agrupado['PDVDEPARA.Practico'].astype(str)\\n\\ndf_vdc_agrupado['PDVDEPARA.Practico'].head()\""
]
},
"execution_count": 96,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r'''df_vdc_agrupado['PDVDEPARA.Practico'] = df_vdc_agrupado['PDVDEPARA.Practico'].astype(str)\n",
"\n",
"df_vdc_agrupado['PDVDEPARA.Practico'].head()'''"
]
},
{
"cell_type": "code",
"execution_count": 97,
"id": "84b5917c",
"metadata": {},
"outputs": [],
"source": [
"df_final['PRODUTO SIMILAR'] = df_final['PRODUTO SIMILAR'].astype('Int64')"
]
},
{
"cell_type": "code",
"execution_count": 98,
"id": "ca911bd1",
"metadata": {},
"outputs": [],
"source": [
"#df_vdc_agrupado['Código'] = df_vdc_agrupado['Código'].astype('Int64')"
]
},
{
"cell_type": "code",
"execution_count": 99,
"id": "8ec14143",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"df_final = pd.merge(left=df_final, right = df_vdc_agrupado, right_on=['Ciclo vdc','Código','PDVDEPARA.Practico'],left_on=['CICLO SIMILAR','PRODUTO SIMILAR','PDV'],how='left')\\n\\ndf_final['Quantidade Acumulada vdc'] = pd.to_numeric(\\n df_final['Quantidade Acumulada vdc'],\\n errors='coerce' # valores inválidos viram NaN\\n).fillna(0).astype('Int64')\\n\\n\\ndf_final['Vendas Ciclo Lançamento'] = np.where(df_final['Quantidade Acumulada vdc'] > 0, df_final['Quantidade Acumulada vdc'], df_final['Vendas Ciclo Lançamento'])\\n\\ndf_final = df_final.drop(columns='Quantidade Acumulada vdc')\\n\\n\\ndf_final = df_final.drop(columns='Ciclo vdc')\""
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r'''df_final = pd.merge(left=df_final, right = df_vdc_agrupado, right_on=['Ciclo vdc','Código','PDVDEPARA.Practico'],left_on=['CICLO SIMILAR','PRODUTO SIMILAR','PDV'],how='left')\n",
"\n",
"df_final['Quantidade Acumulada vdc'] = pd.to_numeric(\n",
" df_final['Quantidade Acumulada vdc'],\n",
" errors='coerce' # valores inválidos viram NaN\n",
").fillna(0).astype('Int64')\n",
"\n",
"\n",
"df_final['Vendas Ciclo Lançamento'] = np.where(df_final['Quantidade Acumulada vdc'] > 0, df_final['Quantidade Acumulada vdc'], df_final['Vendas Ciclo Lançamento'])\n",
"\n",
"df_final = df_final.drop(columns='Quantidade Acumulada vdc')\n",
"\n",
"\n",
"df_final = df_final.drop(columns='Ciclo vdc')'''\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 100,
"id": "1a625e69",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1527, 91)"
]
},
"execution_count": 100,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"# Cálculo do crescimento\n",
"crescimento_final = df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO']\n",
"crescimento_final = crescimento_final.clip(lower=0.2, upper=0.8) # limita entre 0 e 0.8\n",
"df_final['CRESCIMENTO_FINAL'] = crescimento_final\n",
"\n",
"df_final['CRESCIMENTO_FINAL'] = np.where(df_final['CRESCIMENTO_FINAL'].isna(),df_final['CRESCIMENTO_GERAL'],df_final['CRESCIMENTO_FINAL'])\n",
"\n",
"df_final['CRESCIMENTO_FINAL'] = df_final['CRESCIMENTO_FINAL'].fillna(0)\n",
"\n",
"df_final['MEDIANA DO HISTÓRICO'] = df_final['MEDIANA DO HISTÓRICO'].fillna(0)\n",
"\n",
"# Corrige mediana do histórico onde for zero\n",
"df_final['MEDIANA DO HISTÓRICO'] = np.where(\n",
" df_final['MEDIANA DO HISTÓRICO'] == 0,\n",
" 0,\n",
" df_final['MEDIANA DO HISTÓRICO']\n",
")\n",
"\n",
"df_final['MEDIANA DO HISTÓRICO'] = df_final['MEDIANA DO HISTÓRICO'].fillna(0)\n",
"\n",
"\n",
"\n",
"# Cálculo do PV GINSENG\n",
"pv_crescimento = (df_final['CRESCIMENTO_FINAL']+1) * df_final['Vendas Ciclo Lançamento']\n",
"pv_mediana = (df_final['CRESCIMENTO_FINAL'] + 1) * df_final['MEDIANA DO HISTÓRICO']\n",
"\n",
"df_final['PV GINSENG'] = np.where(\n",
" pv_crescimento < df_final['MEDIANA DO HISTÓRICO'],\n",
" pv_mediana.round(0),\n",
" pv_crescimento.round(0)\n",
")\n",
"\n",
"# Se PV GINSENG for NA, substitui pela média por canal\n",
"df_final['PV GINSENG'] = df_final['PV GINSENG'].fillna(0)\n",
"\n",
"df_final['PV GINSENG'] = df_final['PV GINSENG'].round(0).astype(int)\n",
"\n",
"df_final.shape\n"
]
},
{
"cell_type": "code",
"execution_count": 101,
"id": "cfdae71d",
"metadata": {},
"outputs": [],
"source": [
"#df_final.to_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BOT\\BOT - C12\\LANÇAMENTOS\\validação.xlsx\",index=False)"
]
},
{
"cell_type": "code",
"execution_count": 102,
"id": "30c1d83d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['202409', '202410', '202411', '202412', '202413', '202414', '202415',\n",
" '202416', '202417', '202501', '202502', '202503', '202504', '202505',\n",
" '202506', '202507', 'CRESCIMENTO_GERAL'],\n",
" dtype='object')\n"
]
}
],
"source": [
"print(df_final.columns[68:85])"
]
},
{
"cell_type": "code",
"execution_count": 103,
"id": "62b7f9d1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO', 'PRODUTO SIMILAR',\n",
" 'DESCRIÇÃO SIMILAR', 'CICLO SIMILAR', 'FOCO', 'IAF', 'CATEGORIA',\n",
" 'MARCA', '% CONSUMIDOR', 'MECANICA CONSUMIDOR', '% REVENDEDOR',\n",
" 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'MATCH', 'PDV', 'CANAL',\n",
" 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR', 'STATUS',\n",
" 'SKU_x', 'curva', 'categoria', 'proj_mar', 'proj_mar+1',\n",
" 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE',\n",
" 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO', 'C202413', 'C202414',\n",
" 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n",
" 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C202509',\n",
" 'C202510', 'C202511', 'C202512', 'C202513', 'CRESCIMENTO', 'Ciclo',\n",
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'match', 'dias_ate_inicio',\n",
" 'INICIO CICLO SIMILAR', 'FIM CICLO SIMILAR', 'DURAÇÃO CICLO SIMILAR',\n",
" 'SKU_y', 'Ciclo', 'Vendas Ciclo Lançamento', 'SKU', '202408',\n",
" 'Pico Vendas Similar Ultimos 6 ciclos', 'MEDIANA DO HISTÓRICO',\n",
" 'de para pdv', 'sku', 'CRESCIMENTO_FINAL', 'PV GINSENG'],\n",
" dtype='object')"
]
},
"execution_count": 103,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import re\n",
"\n",
"# identificar colunas de ciclo puro (ex: '202407')\n",
"colunas_ciclo_puro = [col for col in df_final.columns[68:85]]\n",
"\n",
"for col in colunas_ciclo_puro:\n",
" col_hist = f'C{col}'\n",
" if col_hist in df_final.columns:\n",
" # mantém o maior valor entre a coluna histórica e a pura\n",
" df_final[col_hist] = df_final[[col_hist, col]].max(axis=1)\n",
"\n",
"# remove as colunas puras\n",
"if colunas_ciclo_puro:\n",
" df_final.drop(columns=colunas_ciclo_puro, inplace=True)\n",
"\n",
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 104,
"id": "ad10c069",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'print(df_final.columns[30:43])\\n\\ndf_final.drop(columns=df_final.columns[30:43],inplace=True)'"
]
},
"execution_count": 104,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r'''print(df_final.columns[30:43])\n",
"\n",
"df_final.drop(columns=df_final.columns[30:43],inplace=True)'''"
]
},
{
"cell_type": "code",
"execution_count": 105,
"id": "3b7f3a82",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'C202513'"
]
},
"execution_count": 105,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns[52]"
]
},
{
"cell_type": "code",
"execution_count": 106,
"id": "d63e55c4",
"metadata": {},
"outputs": [],
"source": [
"df_final['Pico Vendas Similar Ultimos 6 ciclos'] = df_final[VENDA_SIMILAR_6_MESES].max(axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 107,
"id": "15b7149f",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.rename(columns={df_final.columns[48]: \"C-4\", df_final.columns[49]: \"C-3\",df_final.columns[50]: \"C-2\",df_final.columns[51]: \"C-1\",df_final.columns[52]:'VENDAS CICLO ATUAL'})\n"
]
},
{
"cell_type": "code",
"execution_count": 108,
"id": "9333bc77",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO', 'PRODUTO SIMILAR',\n",
" 'DESCRIÇÃO SIMILAR', 'CICLO SIMILAR', 'FOCO', 'IAF', 'CATEGORIA',\n",
" 'MARCA', '% CONSUMIDOR', 'MECANICA CONSUMIDOR', '% REVENDEDOR',\n",
" 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'MATCH', 'PDV', 'CANAL',\n",
" 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR', 'STATUS',\n",
" 'SKU_X', 'CURVA', 'CATEGORIA', 'PROJ_MAR', 'PROJ_MAR+1',\n",
" 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE',\n",
" 'DDV PREVISTO', 'PREÇO', 'SKU_FINAL', 'DESCRICAO', 'C202413', 'C202414',\n",
" 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n",
" 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C-4', 'C-3',\n",
" 'C-2', 'C-1', 'VENDAS CICLO ATUAL', 'CRESCIMENTO', 'CICLO',\n",
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'MATCH', 'DIAS_ATE_INICIO',\n",
" 'INICIO CICLO SIMILAR', 'FIM CICLO SIMILAR', 'DURAÇÃO CICLO SIMILAR',\n",
" 'CICLO', 'VENDAS CICLO LANÇAMENTO', 'SKU', '202408',\n",
" 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS', 'MEDIANA DO HISTÓRICO',\n",
" 'DE PARA PDV', 'SKU', 'CRESCIMENTO_FINAL', 'PV GINSENG'],\n",
" dtype='object')"
]
},
"execution_count": 108,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns = df_final.columns.str.upper()\n",
"\n",
"df_final.drop(columns=df_final.filter(regex='_Y').columns, inplace=True)\n",
"\n",
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 109,
"id": "dceebd16",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.rename(columns={'MARCA_X':'MARCA'})"
]
},
{
"cell_type": "code",
"execution_count": 110,
"id": "62ce5c62",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1527, 73)"
]
},
"execution_count": 110,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.shape"
]
},
{
"cell_type": "code",
"execution_count": 111,
"id": "cecca116",
"metadata": {},
"outputs": [],
"source": [
"df_final[['C-4', 'C-3', 'C-2', 'C-1', 'VENDAS CICLO ATUAL']] = df_final[['C-4', 'C-3', 'C-2', 'C-1', 'VENDAS CICLO ATUAL']].fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": 112,
"id": "8ad318b0",
"metadata": {},
"outputs": [],
"source": [
"df_final = df_final.loc[:, ~df_final.columns.duplicated()]\n",
"\n",
"colunas_desejadas = [\n",
" 'SUPERVISOR',\n",
" 'ANALISTA',\n",
" 'CANAL',\n",
" 'UF',\n",
" 'PDV',\n",
" 'DESCRIÇÃO PDV',\n",
" 'PRODUTO LANÇAMENTO',\n",
" 'DESCRIÇÃO DO LANÇAMENTO',\n",
" 'MARCA',\n",
" 'CATEGORIA',\n",
" '% CONSUMIDOR',\n",
" 'MECANICA CONSUMIDOR',\n",
" '% REVENDEDOR',\n",
" 'MECANICA REVENDEDOR',\n",
" 'TIPO DE PRODUTO',\n",
" 'IAF',\n",
" 'FOCO',\n",
" 'PRODUTO SIMILAR',\n",
" 'DESCRIÇÃO SIMILAR',\n",
" 'CICLO SIMILAR',\n",
" 'VENDAS CICLO LANÇAMENTO',\n",
" 'C-4',\n",
" 'C-3',\n",
" 'C-2',\n",
" 'C-1',\n",
" 'VENDAS CICLO ATUAL',\n",
" 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS',\n",
" 'PV GINSENG'\n",
"]\n",
"\n",
"df_final = df_final.reindex(columns=colunas_desejadas)\n",
"\n",
"colunas_filtradas = [col for col in colunas_desejadas if col in df_final.columns]\n",
"df_final = df_final[colunas_filtradas]\n"
]
},
{
"cell_type": "code",
"execution_count": 113,
"id": "25cbff26",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"df_final = df_final.reindex(columns=[\\n 'SUPERVISOR',\\n 'ANALISTA',\\n 'CANAL',\\n 'UF',\\n 'PDV',\\n 'DESCRIÇÃO PDV',\\n 'PRODUTO LANÇAMENTO',\\n 'DESCRIÇÃO DO LANÇAMENTO',\\n 'MARCA',\\n 'CATEGORIA',\\n 'MECANICA CONSUMIDOR',\\n '% CONSUMIDOR',\\n 'MECANICA REVENDEDOR',\\n '% REVENDEDOR',\\n 'TIPO DE PRODUTO',\\n 'IAF',\\n 'FOCO',\\n 'PRODUTO SIMILAR',\\n 'DESCRIÇÃO SIMILAR',\\n 'CICLO SIMILAR',\\n 'VENDAS CICLO LANÇAMENTO',\\n 'C-4',\\n 'C-3',\\n 'C-2',\\n 'C-1',\\n 'VENDAS CICLO ATUAL',\\n 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS',\\n 'PV GINSENG'])\\n\""
]
},
"execution_count": 113,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"'''df_final = df_final.reindex(columns=[\n",
" 'SUPERVISOR',\n",
" 'ANALISTA',\n",
" 'CANAL',\n",
" 'UF',\n",
" 'PDV',\n",
" 'DESCRIÇÃO PDV',\n",
" 'PRODUTO LANÇAMENTO',\n",
" 'DESCRIÇÃO DO LANÇAMENTO',\n",
" 'MARCA',\n",
" 'CATEGORIA',\n",
" 'MECANICA CONSUMIDOR',\n",
" '% CONSUMIDOR',\n",
" 'MECANICA REVENDEDOR',\n",
" '% REVENDEDOR',\n",
" 'TIPO DE PRODUTO',\n",
" 'IAF',\n",
" 'FOCO',\n",
" 'PRODUTO SIMILAR',\n",
" 'DESCRIÇÃO SIMILAR',\n",
" 'CICLO SIMILAR',\n",
" 'VENDAS CICLO LANÇAMENTO',\n",
" 'C-4',\n",
" 'C-3',\n",
" 'C-2',\n",
" 'C-1',\n",
" 'VENDAS CICLO ATUAL',\n",
" 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS',\n",
" 'PV GINSENG'])\n",
"'''"
]
},
{
"cell_type": "code",
"execution_count": 114,
"id": "a3e80cb4",
"metadata": {},
"outputs": [],
"source": [
"df_final['SUGESTÃO METASELLIN'] = ''\n",
"df_final['SUGESTÃO ABASTECIMENTO'] = ''\n",
"df_final['SUGESTÃO COMERCIAL'] = ''\n"
]
},
{
"cell_type": "code",
"execution_count": 115,
"id": "cc9c6ee6",
"metadata": {},
"outputs": [],
"source": [
"df_pdv_origi['PDV'] = df_pdv_origi['PDV'].astype(str)\n",
"\n",
"df_pdv_origi['PDV'].head()\n",
"\n",
"df_pdv_origi = df_pdv_origi.rename(columns={'UF':'UF_CERTO'})"
]
},
{
"cell_type": "code",
"execution_count": 116,
"id": "df9f0130",
"metadata": {},
"outputs": [],
"source": [
"df_final= pd.merge(df_final,df_pdv_origi[['UF_CERTO','PDV']],on='PDV',how='inner')"
]
},
{
"cell_type": "code",
"execution_count": 117,
"id": "7778d82f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['SUPERVISOR', 'ANALISTA', 'CANAL', 'UF', 'PDV', 'DESCRIÇÃO PDV',\n",
" 'PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO', 'MARCA', 'CATEGORIA',\n",
" '% CONSUMIDOR', 'MECANICA CONSUMIDOR', '% REVENDEDOR',\n",
" 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'IAF', 'FOCO',\n",
" 'PRODUTO SIMILAR', 'DESCRIÇÃO SIMILAR', 'CICLO SIMILAR',\n",
" 'VENDAS CICLO LANÇAMENTO', 'C-4', 'C-3', 'C-2', 'C-1',\n",
" 'VENDAS CICLO ATUAL', 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS',\n",
" 'PV GINSENG', 'SUGESTÃO METASELLIN', 'SUGESTÃO ABASTECIMENTO',\n",
" 'SUGESTÃO COMERCIAL', 'UF_CERTO'],\n",
" dtype='object')"
]
},
"execution_count": 117,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 118,
"id": "f8cd886a",
"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>SUPERVISOR</th>\n",
" <th>ANALISTA</th>\n",
" <th>CANAL</th>\n",
" <th>UF</th>\n",
" <th>PDV</th>\n",
" <th>DESCRIÇÃO PDV</th>\n",
" <th>PRODUTO LANÇAMENTO</th>\n",
" <th>DESCRIÇÃO DO LANÇAMENTO</th>\n",
" <th>MARCA</th>\n",
" <th>CATEGORIA</th>\n",
" <th>...</th>\n",
" <th>C-4</th>\n",
" <th>C-3</th>\n",
" <th>C-2</th>\n",
" <th>C-1</th>\n",
" <th>VENDAS CICLO ATUAL</th>\n",
" <th>PICO VENDAS SIMILAR ULTIMOS 6 CICLOS</th>\n",
" <th>PV GINSENG</th>\n",
" <th>SUGESTÃO METASELLIN</th>\n",
" <th>SUGESTÃO ABASTECIMENTO</th>\n",
" <th>SUGESTÃO COMERCIAL</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Efigênia Herculano</td>\n",
" <td>LUAN</td>\n",
" <td>LJ</td>\n",
" <td>AL</td>\n",
" <td>12522</td>\n",
" <td>MACEIO SHOP EXP</td>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>LILY</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>2</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Maxwell Vieira</td>\n",
" <td>JEFFERSON</td>\n",
" <td>LJ</td>\n",
" <td>AL</td>\n",
" <td>12817</td>\n",
" <td>SHOPPING PATIO</td>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>LILY</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>...</td>\n",
" <td>8.0</td>\n",
" <td>1.0</td>\n",
" <td>24.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>24.0</td>\n",
" <td>4</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Maxwell Vieira</td>\n",
" <td>VINICIUS</td>\n",
" <td>LJ</td>\n",
" <td>AL</td>\n",
" <td>12818</td>\n",
" <td>GB SERRARIA</td>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>LILY</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>7.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>7.0</td>\n",
" <td>1</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Maxwell Vieira</td>\n",
" <td>THAYLLAN</td>\n",
" <td>LJ</td>\n",
" <td>AL</td>\n",
" <td>12820</td>\n",
" <td>ATACADÃO</td>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>LILY</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>...</td>\n",
" <td>4.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>2</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Efigênia Herculano</td>\n",
" <td>MARCYARA</td>\n",
" <td>LJ</td>\n",
" <td>AL</td>\n",
" <td>12823</td>\n",
" <td>PONTA VERDE</td>\n",
" <td>89446</td>\n",
" <td>LILY CR AC DES HID CP LEAU/LILY SOL 200g</td>\n",
" <td>LILY</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>...</td>\n",
" <td>1.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",
" <td>1</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td></td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 31 columns</p>\n",
"</div>"
],
"text/plain": [
" SUPERVISOR ANALISTA CANAL UF PDV DESCRIÇÃO PDV \\\n",
"0 Efigênia Herculano LUAN LJ AL 12522 MACEIO SHOP EXP \n",
"1 Maxwell Vieira JEFFERSON LJ AL 12817 SHOPPING PATIO \n",
"2 Maxwell Vieira VINICIUS LJ AL 12818 GB SERRARIA \n",
"3 Maxwell Vieira THAYLLAN LJ AL 12820 ATACADÃO \n",
"4 Efigênia Herculano MARCYARA LJ AL 12823 PONTA VERDE \n",
"\n",
" PRODUTO LANÇAMENTO DESCRIÇÃO DO LANÇAMENTO MARCA \\\n",
"0 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g LILY \n",
"1 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g LILY \n",
"2 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g LILY \n",
"3 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g LILY \n",
"4 89446 LILY CR AC DES HID CP LEAU/LILY SOL 200g LILY \n",
"\n",
" CATEGORIA ... C-4 C-3 C-2 C-1 VENDAS CICLO ATUAL \\\n",
"0 CUIDADOS COM A PELE ... 0.0 2.0 2.0 0.0 0.0 \n",
"1 CUIDADOS COM A PELE ... 8.0 1.0 24.0 1.0 0.0 \n",
"2 CUIDADOS COM A PELE ... 0.0 2.0 7.0 1.0 0.0 \n",
"3 CUIDADOS COM A PELE ... 4.0 1.0 1.0 1.0 0.0 \n",
"4 CUIDADOS COM A PELE ... 1.0 0.0 0.0 2.0 0.0 \n",
"\n",
" PICO VENDAS SIMILAR ULTIMOS 6 CICLOS PV GINSENG SUGESTÃO METASELLIN \\\n",
"0 2.0 2 \n",
"1 24.0 4 \n",
"2 7.0 1 \n",
"3 4.0 2 \n",
"4 2.0 1 \n",
"\n",
" SUGESTÃO ABASTECIMENTO SUGESTÃO COMERCIAL \n",
"0 \n",
"1 \n",
"2 \n",
"3 \n",
"4 \n",
"\n",
"[5 rows x 31 columns]"
]
},
"execution_count": 118,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final['UF']= df_final['UF_CERTO']\n",
"\n",
"df_final = df_final.drop(columns=['UF_CERTO'])\n",
"\n",
"df_final.head()"
]
},
{
"cell_type": "code",
"execution_count": 119,
"id": "eaf25e4b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['SUPERVISOR', 'ANALISTA', 'CANAL', 'UF', 'PDV', 'DESCRIÇÃO PDV',\n",
" 'PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO', 'MARCA', 'CATEGORIA',\n",
" '% CONSUMIDOR', 'MECANICA CONSUMIDOR', '% REVENDEDOR',\n",
" 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'IAF', 'FOCO',\n",
" 'PRODUTO SIMILAR', 'DESCRIÇÃO SIMILAR', 'CICLO SIMILAR',\n",
" 'VENDAS CICLO LANÇAMENTO', 'C-4', 'C-3', 'C-2', 'C-1',\n",
" 'VENDAS CICLO ATUAL', 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS',\n",
" 'PV GINSENG', 'SUGESTÃO METASELLIN', 'SUGESTÃO ABASTECIMENTO',\n",
" 'SUGESTÃO COMERCIAL'],\n",
" dtype='object')"
]
},
"execution_count": 119,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final.columns"
]
},
{
"cell_type": "code",
"execution_count": 120,
"id": "9b866c74",
"metadata": {},
"outputs": [],
"source": [
"\n",
"# lista de colunas numéricas\n",
"numeric_cols = [\n",
" 'VENDAS CICLO LANÇAMENTO', 'C-4', 'C-3', 'C-2', 'C-1',\n",
" 'VENDAS CICLO ATUAL', 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS',\n",
" 'PV GINSENG', 'SUGESTÃO METASELLIN', 'SUGESTÃO ABASTECIMENTO',\n",
" 'SUGESTÃO COMERCIAL'\n",
"]\n",
"\n",
"# colunas não numéricas = todas menos as numéricas\n",
"non_numeric_cols = [col for col in df_final.columns if col not in numeric_cols]\n",
"\n",
"# agrupar por todas as não numéricas, pegando o máximo das numéricas\n",
"df_final_sem_dupli = (\n",
" df_final\n",
" .groupby(non_numeric_cols, as_index=False)[numeric_cols]\n",
" .sum()\n",
")\n"
]
},
{
"cell_type": "code",
"execution_count": 121,
"id": "f491d15f",
"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>SUPERVISOR</th>\n",
" <th>ANALISTA</th>\n",
" <th>CANAL</th>\n",
" <th>UF</th>\n",
" <th>PDV</th>\n",
" <th>DESCRIÇÃO PDV</th>\n",
" <th>PRODUTO LANÇAMENTO</th>\n",
" <th>DESCRIÇÃO DO LANÇAMENTO</th>\n",
" <th>MARCA</th>\n",
" <th>CATEGORIA</th>\n",
" <th>...</th>\n",
" <th>C-4</th>\n",
" <th>C-3</th>\n",
" <th>C-2</th>\n",
" <th>C-1</th>\n",
" <th>VENDAS CICLO ATUAL</th>\n",
" <th>PICO VENDAS SIMILAR ULTIMOS 6 CICLOS</th>\n",
" <th>PV GINSENG</th>\n",
" <th>SUGESTÃO METASELLIN</th>\n",
" <th>SUGESTÃO ABASTECIMENTO</th>\n",
" <th>SUGESTÃO COMERCIAL</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>JEFFERSON</td>\n",
" <td>LJ</td>\n",
" <td>BA3</td>\n",
" <td>24253</td>\n",
" <td>Matriz Centro</td>\n",
" <td>48780</td>\n",
" <td>COFFEE DES ANTIT AER WOMAN SEDUC 75g V4</td>\n",
" <td>COFFEE</td>\n",
" <td>DESODORANTES</td>\n",
" <td>...</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>JEFFERSON</td>\n",
" <td>LJ</td>\n",
" <td>BA3</td>\n",
" <td>24253</td>\n",
" <td>Matriz Centro</td>\n",
" <td>49154</td>\n",
" <td>COFFEE DES COL UNIQ WOM FL/GOURM 100ml</td>\n",
" <td>CUIDE-SE BEM</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>...</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>28</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>JEFFERSON</td>\n",
" <td>LJ</td>\n",
" <td>BA3</td>\n",
" <td>24253</td>\n",
" <td>Matriz Centro</td>\n",
" <td>49193</td>\n",
" <td>COFFEE DES COL UNIQ MAN FOUG/OR 100ml</td>\n",
" <td>COFFEE</td>\n",
" <td>PERFUMARIA</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>28</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>JEFFERSON</td>\n",
" <td>LJ</td>\n",
" <td>BA3</td>\n",
" <td>24253</td>\n",
" <td>Matriz Centro</td>\n",
" <td>49893</td>\n",
" <td>CBEM LOC DES HID CPO ROS/ALG V3 400ml</td>\n",
" <td>FLORATTA</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>...</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>4.0</td>\n",
" <td>2</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>JEFFERSON</td>\n",
" <td>LJ</td>\n",
" <td>BA3</td>\n",
" <td>24253</td>\n",
" <td>Matriz Centro</td>\n",
" <td>49943</td>\n",
" <td>CBEM LOC DES HID CPO PESSEGURA V2 400ml</td>\n",
" <td>CUIDE-SE BEM</td>\n",
" <td>CUIDADOS COM A PELE</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td></td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 31 columns</p>\n",
"</div>"
],
"text/plain": [
" SUPERVISOR ANALISTA CANAL UF PDV DESCRIÇÃO PDV PRODUTO LANÇAMENTO \\\n",
"0 0 JEFFERSON LJ BA3 24253 Matriz Centro 48780 \n",
"1 0 JEFFERSON LJ BA3 24253 Matriz Centro 49154 \n",
"2 0 JEFFERSON LJ BA3 24253 Matriz Centro 49193 \n",
"3 0 JEFFERSON LJ BA3 24253 Matriz Centro 49893 \n",
"4 0 JEFFERSON LJ BA3 24253 Matriz Centro 49943 \n",
"\n",
" DESCRIÇÃO DO LANÇAMENTO MARCA CATEGORIA \\\n",
"0 COFFEE DES ANTIT AER WOMAN SEDUC 75g V4 COFFEE DESODORANTES \n",
"1 COFFEE DES COL UNIQ WOM FL/GOURM 100ml CUIDE-SE BEM PERFUMARIA \n",
"2 COFFEE DES COL UNIQ MAN FOUG/OR 100ml COFFEE PERFUMARIA \n",
"3 CBEM LOC DES HID CPO ROS/ALG V3 400ml FLORATTA CUIDADOS COM A PELE \n",
"4 CBEM LOC DES HID CPO PESSEGURA V2 400ml CUIDE-SE BEM CUIDADOS COM A PELE \n",
"\n",
" ... C-4 C-3 C-2 C-1 VENDAS CICLO ATUAL \\\n",
"0 ... 1.0 0.0 2.0 2.0 0.0 \n",
"1 ... 1.0 0.0 0.0 1.0 0.0 \n",
"2 ... 0.0 1.0 0.0 1.0 0.0 \n",
"3 ... 4.0 2.0 2.0 1.0 1.0 \n",
"4 ... 2.0 1.0 1.0 1.0 0.0 \n",
"\n",
" PICO VENDAS SIMILAR ULTIMOS 6 CICLOS PV GINSENG SUGESTÃO METASELLIN \\\n",
"0 2.0 0 \n",
"1 1.0 28 \n",
"2 1.0 28 \n",
"3 4.0 2 \n",
"4 2.0 0 \n",
"\n",
" SUGESTÃO ABASTECIMENTO SUGESTÃO COMERCIAL \n",
"0 \n",
"1 \n",
"2 \n",
"3 \n",
"4 \n",
"\n",
"[5 rows x 31 columns]"
]
},
"execution_count": 121,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_final_sem_dupli.head()"
]
},
{
"cell_type": "code",
"execution_count": 122,
"id": "2df3e2e9",
"metadata": {},
"outputs": [],
"source": [
"df_final_sem_dupli.to_excel(f'C:/Users/joao.herculano/Documents/Lançamento{hoje}{ciclo_lanc}!!2.xlsx',index=False)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}