5920 lines
192 KiB
Plaintext
5920 lines
192 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import numpy as np \n",
|
||
"import glob\n",
|
||
"import os \n",
|
||
"from openpyxl import load_workbook\n",
|
||
"from openpyxl.styles import PatternFill, Font\n",
|
||
"from datetime import datetime"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"hoje = datetime.today().strftime('%Y-%m-%d')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#precisa ver duplicidade de desc e vendas irece."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 203,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C14\\TABELA DE PEDIDOS\\Pedidos Semanais Especiais - BOT - 202514 (3).xlsx\")\n",
|
||
"\n",
|
||
"df_tabela = df_tabela[df_tabela['Ação revendedor'].notna() | df_tabela['Ação consumidor'].notna()]\n",
|
||
"\n",
|
||
"df_tabela = df_tabela[df_tabela['Região'] == 'NNE'] \n",
|
||
"\n",
|
||
"df_tabela = df_tabela[(df_tabela['Canal'] != 'Ecomm')]\n",
|
||
"\n",
|
||
"#df_tabela['Canal'] = np.where((df_tabela['Canal'] == \"Loja\") | (df_tabela['Canal'] == \"Todos\") | (df_tabela['Canal'] == \"Loja | VD\"),\"TODOS\",\"VD\")\n",
|
||
"\n",
|
||
"df_tabela = df_tabela[(df_tabela['Categoria'] != \"EMBALAGENS\") | (df_tabela['Categoria'] != \"SUPORTE À VENDA\")]\n",
|
||
"\n",
|
||
"#df_tabela = df_tabela[df_tabela['Tipo de pedido'] == 'Semanal']\n",
|
||
"\n",
|
||
"df_tabela = df_tabela[~df_tabela['Descrição'].str.contains('PRM')]\n",
|
||
"\n",
|
||
"df_tabela = df_tabela[df_tabela['Tipo de produto']!= 'EDICAO LIMITADA']\n",
|
||
"\n",
|
||
"df_tabela['Ação revendedor'] = np.where(df_tabela['Ação revendedor'].isna(),df_tabela['Ação consumidor'],df_tabela['Ação revendedor'])\n",
|
||
"\n",
|
||
"df_tabela['Percentual de desconto revendedor'] = np.where(df_tabela['Percentual de desconto revendedor'].isna(),df_tabela['Percentual de desconto consumidor'],df_tabela['Percentual de desconto revendedor'])\n",
|
||
"\n",
|
||
"df_tabela['MATCH'] = 1\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 205,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\2225685327.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()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 206,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"dfi['SKU2'] = dfi['SKU2'].fillna(\"-\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 207,
|
||
"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>SKU2</th>\n",
|
||
" <th>SKU_FINAL</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>20992</td>\n",
|
||
" <td>51021</td>\n",
|
||
" <td>-</td>\n",
|
||
" <td>51021</td>\n",
|
||
" <td>\"QDB BLUSH LIQ GUARANA 6</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>C202416</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>20057</td>\n",
|
||
" <td>4510</td>\n",
|
||
" <td>-</td>\n",
|
||
" <td>4510</td>\n",
|
||
" <td>REF BOTIK CR FAC FIRM AC/HIALUR 40g</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>C202417</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>20997</td>\n",
|
||
" <td>1808</td>\n",
|
||
" <td>-</td>\n",
|
||
" <td>1808</td>\n",
|
||
" <td>MAKE B BAS LIQ MATE SALICYLIC 200 30g</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>C202504</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>12823</td>\n",
|
||
" <td>56804</td>\n",
|
||
" <td>-</td>\n",
|
||
" <td>56804</td>\n",
|
||
" <td>MATCH MASC CAP SCIENCE RECONS V2 250g</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>C202511</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>20998</td>\n",
|
||
" <td>83836</td>\n",
|
||
" <td>-</td>\n",
|
||
" <td>83836</td>\n",
|
||
" <td>OUI CREM DES HID CPO MADELEINE 200g</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>C202501</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV SKU SKU2 SKU_FINAL DESCRICAO \\\n",
|
||
"0 20992 51021 - 51021 \"QDB BLUSH LIQ GUARANA 6 \n",
|
||
"1 20057 4510 - 4510 REF BOTIK CR FAC FIRM AC/HIALUR 40g \n",
|
||
"2 20997 1808 - 1808 MAKE B BAS LIQ MATE SALICYLIC 200 30g \n",
|
||
"3 12823 56804 - 56804 MATCH MASC CAP SCIENCE RECONS V2 250g \n",
|
||
"4 20998 83836 - 83836 OUI CREM DES HID CPO MADELEINE 200g \n",
|
||
"\n",
|
||
" VENDAS_CICLO Ciclo \n",
|
||
"0 8.0 C202416 \n",
|
||
"1 2.0 C202417 \n",
|
||
"2 1.0 C202504 \n",
|
||
"3 2.0 C202511 \n",
|
||
"4 8.0 C202501 "
|
||
]
|
||
},
|
||
"execution_count": 207,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"dfi = dfi[dfi['SKU2'] == \"-\"]\n",
|
||
"\n",
|
||
"dfi.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 208,
|
||
"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>C202412</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>...</th>\n",
|
||
" <th>C202503</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",
|
||
" </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>0.0</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>...</td>\n",
|
||
" <td>1.0</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>2.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>2.0</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>...</td>\n",
|
||
" <td>2.0</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",
|
||
" </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>0.0</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>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>12522</td>\n",
|
||
" <td>1302</td>\n",
|
||
" <td>PMPCK LILY DES ANTIT AER 2x75g</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>4.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>...</td>\n",
|
||
" <td>0.0</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",
|
||
" </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>2.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>...</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>1.0</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",
|
||
" <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>142986</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>89048</td>\n",
|
||
" <td>ENVELOPE M BOTI NAMORADOS/25 UNITARIO</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>26.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>142987</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>89756</td>\n",
|
||
" <td>CAIXA FLAG BOTI NAMORADOS 25 UNIT</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.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>142988</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>89840</td>\n",
|
||
" <td>CAIXA LACO M BOTI PAIS/25 UNIT</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>142989</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>89843</td>\n",
|
||
" <td>ENVELOPE M BOTI PAIS 2025 UNIT</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>142990</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>90774</td>\n",
|
||
" <td>PIN MELHOR PAI O BOTICARIO PAIS/25 UNIT</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>142991 rows × 21 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV SKU_FINAL DESCRICAO C202412 \\\n",
|
||
"0 12522 1004 FLORATTA DES COL MY BLUE 75ml 0.0 \n",
|
||
"1 12522 1080 INTENSE GLOS LAB BUBBAL TUT/FRUT 5ml 2.0 \n",
|
||
"2 12522 1296 PMPCK THE BLEND DES ANTIT AER 2x75g 0.0 \n",
|
||
"3 12522 1302 PMPCK LILY DES ANTIT AER 2x75g 1.0 \n",
|
||
"4 12522 1314 PMPCK ZAAD DES ANTIT AER 2x75g 0.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"142986 5699 89048 ENVELOPE M BOTI NAMORADOS/25 UNITARIO 0.0 \n",
|
||
"142987 5699 89756 CAIXA FLAG BOTI NAMORADOS 25 UNIT 0.0 \n",
|
||
"142988 5699 89840 CAIXA LACO M BOTI PAIS/25 UNIT 0.0 \n",
|
||
"142989 5699 89843 ENVELOPE M BOTI PAIS 2025 UNIT 0.0 \n",
|
||
"142990 5699 90774 PIN MELHOR PAI O BOTICARIO PAIS/25 UNIT 0.0 \n",
|
||
"\n",
|
||
" C202413 C202414 C202415 C202416 C202417 C202501 ... C202503 \\\n",
|
||
"0 15.0 2.0 3.0 56.0 6.0 1.0 ... 1.0 \n",
|
||
"1 0.0 4.0 0.0 10.0 2.0 2.0 ... 2.0 \n",
|
||
"2 1.0 3.0 3.0 2.0 0.0 0.0 ... 0.0 \n",
|
||
"3 4.0 3.0 5.0 6.0 0.0 0.0 ... 0.0 \n",
|
||
"4 2.0 3.0 1.0 1.0 0.0 0.0 ... 0.0 \n",
|
||
"... ... ... ... ... ... ... ... ... \n",
|
||
"142986 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n",
|
||
"142987 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n",
|
||
"142988 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n",
|
||
"142989 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n",
|
||
"142990 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n",
|
||
"\n",
|
||
" C202504 C202505 C202506 C202507 C202508 C202509 C202510 \\\n",
|
||
"0 5.0 12.0 7.0 2.0 0.0 1.0 2.0 \n",
|
||
"1 3.0 1.0 7.0 17.0 0.0 0.0 0.0 \n",
|
||
"2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"3 0.0 0.0 3.0 4.0 0.0 4.0 4.0 \n",
|
||
"4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"... ... ... ... ... ... ... ... \n",
|
||
"142986 0.0 0.0 0.0 0.0 26.0 4.0 0.0 \n",
|
||
"142987 0.0 0.0 0.0 0.0 1.0 0.0 0.0 \n",
|
||
"142988 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"142989 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"142990 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"\n",
|
||
" C202511 C202512 \n",
|
||
"0 5.0 2.0 \n",
|
||
"1 0.0 0.0 \n",
|
||
"2 0.0 0.0 \n",
|
||
"3 2.0 1.0 \n",
|
||
"4 1.0 0.0 \n",
|
||
"... ... ... \n",
|
||
"142986 0.0 0.0 \n",
|
||
"142987 0.0 0.0 \n",
|
||
"142988 11.0 1.0 \n",
|
||
"142989 10.0 8.0 \n",
|
||
"142990 3.0 0.0 \n",
|
||
"\n",
|
||
"[142991 rows x 21 columns]"
|
||
]
|
||
},
|
||
"execution_count": 208,
|
||
"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\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 209,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"\n",
|
||
"\n",
|
||
"df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n",
|
||
"\n",
|
||
"df_pdv_origi = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n",
|
||
"\n",
|
||
"df_pdv = df_pdv.rename(columns={'DESCRIÇÃO':'DESCRIÇÃO PDV'})\n",
|
||
"\n",
|
||
"df_pdv = df_pdv[df_pdv['GESTÃO']!=\"Inativa\"]\n",
|
||
"\n",
|
||
"df_pdv = df_pdv.drop(columns=['REGIÃO', 'ESTADO','CIDADE','GESTÃO', 'STATUS'])\n",
|
||
"\n",
|
||
"df_pdv = df_pdv[df_pdv['CANAL']!='MTZ']\n",
|
||
"\n",
|
||
"#df_pdv['CANAL'] = np.where((df_pdv['CANAL']=='LJ')|(df_pdv['CANAL']=='HIB')|(df_pdv['CANAL']=='CD'),'TODOS','VD')\n",
|
||
"\n",
|
||
"df_pdv['MATCH'] = 1\n",
|
||
"\n",
|
||
"df_pdv = df_pdv[(df_pdv['PDV']!=910291)&(df_pdv['PDV']!=910173)]\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 210,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_pdv = df_pdv.drop(columns=['PDV DESC'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 211,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\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": 212,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_draft = df_draft_"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 213,
|
||
"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>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>preço</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>39251</th>\n",
|
||
" <td>23711</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>CUIDADOS COM A PELE</td>\n",
|
||
" <td>87.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>511</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>9,20</td>\n",
|
||
" <td>42.54</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV SKU DESCRICAO curva \\\n",
|
||
"39251 23711 48060 LILY CREM DES HID ACET CPO 250g V8 A \n",
|
||
"\n",
|
||
" categoria proj_mar proj_mar+1 ESTOQUE ATUAL \\\n",
|
||
"39251 CUIDADOS COM A PELE 87.0 0.0 511 \n",
|
||
"\n",
|
||
" ESTOQUE EM TRANSITO PEDIDO PENDENTE DDV PREVISTO preço \n",
|
||
"39251 4 0 9,20 42.54 "
|
||
]
|
||
},
|
||
"execution_count": 213,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_draft[(df_draft['PDV']=='23711') & (df_draft['SKU']=='48060')].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 214,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(350518, 12)"
|
||
]
|
||
},
|
||
"execution_count": 214,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_draft = df_draft[~df_draft['DESCRICAO'].str.contains('OUI', na=False)]\n",
|
||
"\n",
|
||
"df_draft.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 215,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\1765304903.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['ESTOQUE ATUAL'] = df_draft['ESTOQUE ATUAL'].astype(float)\n",
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\1765304903.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 EM TRANSITO'] = df_draft['ESTOQUE EM TRANSITO'].astype(float)\n",
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\1765304903.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['PEDIDO PENDENTE'] = df_draft['PEDIDO PENDENTE'].astype(float)\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"PDV object\n",
|
||
"SKU object\n",
|
||
"DESCRICAO object\n",
|
||
"curva object\n",
|
||
"categoria object\n",
|
||
"proj_mar float64\n",
|
||
"proj_mar+1 float64\n",
|
||
"ESTOQUE ATUAL float64\n",
|
||
"ESTOQUE EM TRANSITO float64\n",
|
||
"PEDIDO PENDENTE float64\n",
|
||
"DDV PREVISTO object\n",
|
||
"preço float64\n",
|
||
"dtype: object"
|
||
]
|
||
},
|
||
"execution_count": 215,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"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.dtypes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 216,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\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_22664\\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_22664\\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": 217,
|
||
"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": 218,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_tabela = df_tabela.drop_duplicates()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 219,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_bi_preco = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C13\\preço BI\\TABELA DE PREÇOS (2).xlsx\")\n",
|
||
"\n",
|
||
"df_bi_preco = df_bi_preco.drop(columns=['Descrição','Tipo Preço','CATEGORIA','LINHA','MARCA'])\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 220,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_pivotadowawa['SKU_FINAL'] = df_pivotadowawa['SKU_FINAL'].astype('str')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 221,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_draft = pd.merge(df_draft,df_pivotadowawa,left_on=['PDV','SKU'],right_on=['PDV','SKU_FINAL'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 222,
|
||
"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>C202503</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",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>76</th>\n",
|
||
" <td>12522</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>CUIDADOS COM A PELE</td>\n",
|
||
" <td>14.0</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>42.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.68</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>14.0</td>\n",
|
||
" <td>30.0</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>38.0</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1196</th>\n",
|
||
" <td>12817</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>CUIDADOS COM A PELE</td>\n",
|
||
" <td>61.0</td>\n",
|
||
" <td>76.0</td>\n",
|
||
" <td>87.0</td>\n",
|
||
" <td>60.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>2.82</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>30.0</td>\n",
|
||
" <td>82.0</td>\n",
|
||
" <td>36.0</td>\n",
|
||
" <td>219.0</td>\n",
|
||
" <td>33.0</td>\n",
|
||
" <td>79.0</td>\n",
|
||
" <td>106.0</td>\n",
|
||
" <td>44.0</td>\n",
|
||
" <td>64.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2375</th>\n",
|
||
" <td>12818</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>CUIDADOS COM A PELE</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>12.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.44</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>20.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3362</th>\n",
|
||
" <td>12820</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>CUIDADOS COM A PELE</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>40.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.49</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>15.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>22.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>24.0</td>\n",
|
||
" <td>16.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4320</th>\n",
|
||
" <td>12823</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>CUIDADOS COM A PELE</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>12.0</td>\n",
|
||
" <td>20.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.46</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>26.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>15.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 31 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV SKU curva categoria proj_mar proj_mar+1 \\\n",
|
||
"76 12522 48060 A CUIDADOS COM A PELE 14.0 19.0 \n",
|
||
"1196 12817 48060 A CUIDADOS COM A PELE 61.0 76.0 \n",
|
||
"2375 12818 48060 A CUIDADOS COM A PELE 9.0 12.0 \n",
|
||
"3362 12820 48060 A CUIDADOS COM A PELE 11.0 13.0 \n",
|
||
"4320 12823 48060 A CUIDADOS COM A PELE 10.0 12.0 \n",
|
||
"\n",
|
||
" ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE DDV PREVISTO ... \\\n",
|
||
"76 42.0 0.0 0.0 0.68 ... \n",
|
||
"1196 87.0 60.0 0.0 2.82 ... \n",
|
||
"2375 3.0 0.0 0.0 0.44 ... \n",
|
||
"3362 40.0 0.0 0.0 0.49 ... \n",
|
||
"4320 20.0 0.0 0.0 0.46 ... \n",
|
||
"\n",
|
||
" C202503 C202504 C202505 C202506 C202507 C202508 C202509 C202510 \\\n",
|
||
"76 14.0 30.0 11.0 38.0 10.0 19.0 23.0 3.0 \n",
|
||
"1196 30.0 82.0 36.0 219.0 33.0 79.0 106.0 44.0 \n",
|
||
"2375 5.0 8.0 4.0 20.0 2.0 8.0 9.0 7.0 \n",
|
||
"3362 9.0 15.0 8.0 22.0 4.0 24.0 16.0 7.0 \n",
|
||
"4320 5.0 26.0 6.0 15.0 1.0 5.0 13.0 7.0 \n",
|
||
"\n",
|
||
" C202511 C202512 \n",
|
||
"76 19.0 10.0 \n",
|
||
"1196 64.0 9.0 \n",
|
||
"2375 9.0 0.0 \n",
|
||
"3362 2.0 2.0 \n",
|
||
"4320 9.0 0.0 \n",
|
||
"\n",
|
||
"[5 rows x 31 columns]"
|
||
]
|
||
},
|
||
"execution_count": 222,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_draft[df_draft['SKU']=='48060'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 223,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Ciclo</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>Catálogo</th>\n",
|
||
" <th>Tipo de produto</th>\n",
|
||
" <th>Ação consumidor</th>\n",
|
||
" <th>Percentual de desconto consumidor</th>\n",
|
||
" <th>Ação revendedor</th>\n",
|
||
" <th>Percentual de desconto revendedor</th>\n",
|
||
" <th>Sortimento P</th>\n",
|
||
" <th>Sortimento M</th>\n",
|
||
" <th>Sortimento G</th>\n",
|
||
" <th>MATCH</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>0 rows × 24 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
"Empty DataFrame\n",
|
||
"Columns: [Ciclo, Região, Canal, Código, Descrição, IAF, Tipo de pedido, Foco, Unidade de negócio, Marca, Categoria, Subcategoria, Quantidade por caixa, Tipo de promoção, Catálogo, Tipo de produto, Ação consumidor, Percentual de desconto consumidor, Ação revendedor, Percentual de desconto revendedor, Sortimento P, Sortimento M, Sortimento G, MATCH]\n",
|
||
"Index: []\n",
|
||
"\n",
|
||
"[0 rows x 24 columns]"
|
||
]
|
||
},
|
||
"execution_count": 223,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_tabela[df_tabela['Código']=='48060']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 224,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(47509, 31)"
|
||
]
|
||
},
|
||
"execution_count": 224,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final = pd.merge(left=df_tabela,right=df_pdv,on='MATCH',how='left')\n",
|
||
"\n",
|
||
"df_final = df_final.drop_duplicates()\n",
|
||
"\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 225,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Ciclo</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>Sortimento M</th>\n",
|
||
" <th>Sortimento G</th>\n",
|
||
" <th>MATCH</th>\n",
|
||
" <th>PDV</th>\n",
|
||
" <th>CANAL</th>\n",
|
||
" <th>DESCRIÇÃO PDV</th>\n",
|
||
" <th>UF</th>\n",
|
||
" <th>MARCA</th>\n",
|
||
" <th>ANALISTA</th>\n",
|
||
" <th>SUPERVISOR</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: [Ciclo, Região, Canal, Código, Descrição, IAF, Tipo de pedido, Foco, Unidade de negócio, Marca, Categoria, Subcategoria, Quantidade por caixa, Tipo de promoção, Catálogo, Tipo de produto, Ação consumidor, Percentual de desconto consumidor, Ação revendedor, Percentual de desconto revendedor, Sortimento P, Sortimento M, Sortimento G, MATCH, PDV, CANAL, DESCRIÇÃO PDV, UF, MARCA, ANALISTA, SUPERVISOR]\n",
|
||
"Index: []\n",
|
||
"\n",
|
||
"[0 rows x 31 columns]"
|
||
]
|
||
},
|
||
"execution_count": 225,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final[df_final['Código']=='48060'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 226,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"PDV\n",
|
||
"12522 617\n",
|
||
"12817 617\n",
|
||
"12818 617\n",
|
||
"12820 617\n",
|
||
"12823 617\n",
|
||
" ... \n",
|
||
"24257 617\n",
|
||
"24268 617\n",
|
||
"24269 617\n",
|
||
"24293 617\n",
|
||
"23813 617\n",
|
||
"Name: count, Length: 77, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 226,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['PDV'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 227,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(49398, 61)"
|
||
]
|
||
},
|
||
"execution_count": 227,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['PDV'] = df_final['PDV'].astype('str')\n",
|
||
"df_final['Código'] = df_final['Código'].astype('str')\n",
|
||
"\n",
|
||
"\n",
|
||
"df_final = pd.merge(left=df_final,right=df_draft,left_on=['PDV','Código'],right_on=['PDV','SKU'],how='left')\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 228,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Ciclo</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>C202503</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",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>17861</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>14.0</td>\n",
|
||
" <td>30.0</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>38.0</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17862</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>30.0</td>\n",
|
||
" <td>82.0</td>\n",
|
||
" <td>36.0</td>\n",
|
||
" <td>219.0</td>\n",
|
||
" <td>33.0</td>\n",
|
||
" <td>79.0</td>\n",
|
||
" <td>106.0</td>\n",
|
||
" <td>44.0</td>\n",
|
||
" <td>64.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17863</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>20.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17864</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>15.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>22.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>24.0</td>\n",
|
||
" <td>16.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17865</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>26.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>15.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 61 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo Região Canal Código Descrição IAF \\\n",
|
||
"17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... C202503 C202504 \\\n",
|
||
"17861 NaN NaN NaN BOTI ... 14.0 30.0 \n",
|
||
"17862 NaN NaN NaN BOTI ... 30.0 82.0 \n",
|
||
"17863 NaN NaN NaN BOTI ... 5.0 8.0 \n",
|
||
"17864 NaN NaN NaN BOTI ... 9.0 15.0 \n",
|
||
"17865 NaN NaN NaN BOTI ... 5.0 26.0 \n",
|
||
"\n",
|
||
" C202505 C202506 C202507 C202508 C202509 C202510 C202511 C202512 \n",
|
||
"17861 11.0 38.0 10.0 19.0 23.0 3.0 19.0 10.0 \n",
|
||
"17862 36.0 219.0 33.0 79.0 106.0 44.0 64.0 9.0 \n",
|
||
"17863 4.0 20.0 2.0 8.0 9.0 7.0 9.0 0.0 \n",
|
||
"17864 8.0 22.0 4.0 24.0 16.0 7.0 2.0 2.0 \n",
|
||
"17865 6.0 15.0 1.0 5.0 13.0 7.0 9.0 0.0 \n",
|
||
"\n",
|
||
"[5 rows x 61 columns]"
|
||
]
|
||
},
|
||
"execution_count": 228,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final[df_final['Código']=='48060'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 229,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"PDV\n",
|
||
"23711 659\n",
|
||
"21278 656\n",
|
||
"20993 656\n",
|
||
"20997 656\n",
|
||
"21375 654\n",
|
||
" ... \n",
|
||
"24257 617\n",
|
||
"24268 617\n",
|
||
"24269 617\n",
|
||
"24293 617\n",
|
||
"23813 617\n",
|
||
"Name: count, Length: 77, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 229,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['PDV'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 230,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.drop(columns=['Sortimento P', 'Sortimento M',\n",
|
||
" 'Sortimento G','MARCA','SKU'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 231,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"calendario = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\CICLO 9\\CALENDARIO_CICLO\\Ciclo_Expandido_com_Datas.xlsx\")\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 232,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Ciclo</th>\n",
|
||
" <th>INICIO CICLO</th>\n",
|
||
" <th>FIM CICLO</th>\n",
|
||
" <th>DURAÇÃO</th>\n",
|
||
" <th>Date</th>\n",
|
||
" <th>NUM_CICLO</th>\n",
|
||
" <th>ANO_CICLO</th>\n",
|
||
" <th>CICLOMAIS2</th>\n",
|
||
" <th>dias_ate_inicio</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>2367</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>C2025</td>\n",
|
||
" <td>C202516</td>\n",
|
||
" <td>31</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo INICIO CICLO FIM CICLO DURAÇÃO Date NUM_CICLO \\\n",
|
||
"2367 C202514 2025-09-22 2025-10-12 21 2025-09-22 14 \n",
|
||
"\n",
|
||
" ANO_CICLO CICLOMAIS2 dias_ate_inicio \n",
|
||
"2367 C2025 C202516 31 "
|
||
]
|
||
},
|
||
"execution_count": 232,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"calendario['Date'] = pd.to_datetime(calendario['Date'])\n",
|
||
"\n",
|
||
"# Get today (normalized to midnight)\n",
|
||
"today = pd.Timestamp(\"today\").normalize()\n",
|
||
"\n",
|
||
"calendario['NUM_CICLO'] = calendario['Ciclo'].str[-2:].astype(int)\n",
|
||
"calendario['ANO_CICLO'] = calendario['Ciclo'].str[0:5]\n",
|
||
"\n",
|
||
"\n",
|
||
"calendario = calendario[calendario['MARCA'] == \"BOTICARIO\"]\n",
|
||
"\n",
|
||
"calendario = calendario.drop(columns='MARCA')\n",
|
||
"\n",
|
||
"calendario['CICLOMAIS2'] = calendario['ANO_CICLO'].astype(str) + (calendario['NUM_CICLO'].astype(int) + 2).astype(str).str.zfill(2) # >>>>>>>>> MUDAR PRA CICLO CORRETO \n",
|
||
"\n",
|
||
"ciclo_mais2 = calendario[calendario['Date'].dt.normalize() == today]['CICLOMAIS2'].iloc[0]\n",
|
||
"\n",
|
||
"\n",
|
||
"# Filter rows where date matches today\n",
|
||
"filtered_calendario = calendario[calendario['Ciclo'] == ciclo_mais2][:1]\n",
|
||
"\n",
|
||
"\n",
|
||
"filtered_calendario['dias_ate_inicio'] = filtered_calendario['INICIO CICLO'].iloc[0] - today\n",
|
||
"\n",
|
||
"filtered_calendario['dias_ate_inicio'] = filtered_calendario['dias_ate_inicio'].dt.days.astype(int)\n",
|
||
"\n",
|
||
"filtered_calendario\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 233,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"filtered_calendario['MATCH'] = 1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 234,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 235,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_draft['PDV'] = df_draft['PDV'].astype(str)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 236,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(49398, 61)"
|
||
]
|
||
},
|
||
"execution_count": 236,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final = pd.merge(left=df_final, right=filtered_calendario[['Ciclo','INICIO CICLO','FIM CICLO','DURAÇÃO','MATCH','dias_ate_inicio']], on='MATCH',how='left')\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 237,
|
||
"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_x</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>C202508</th>\n",
|
||
" <th>C202509</th>\n",
|
||
" <th>C202510</th>\n",
|
||
" <th>C202511</th>\n",
|
||
" <th>C202512</th>\n",
|
||
" <th>Ciclo_y</th>\n",
|
||
" <th>INICIO CICLO</th>\n",
|
||
" <th>FIM CICLO</th>\n",
|
||
" <th>DURAÇÃO</th>\n",
|
||
" <th>dias_ate_inicio</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>17861</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17862</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>79.0</td>\n",
|
||
" <td>106.0</td>\n",
|
||
" <td>44.0</td>\n",
|
||
" <td>64.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17863</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17864</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>24.0</td>\n",
|
||
" <td>16.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17865</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 61 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo_x Região Canal Código Descrição IAF \\\n",
|
||
"17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... C202508 C202509 \\\n",
|
||
"17861 NaN NaN NaN BOTI ... 19.0 23.0 \n",
|
||
"17862 NaN NaN NaN BOTI ... 79.0 106.0 \n",
|
||
"17863 NaN NaN NaN BOTI ... 8.0 9.0 \n",
|
||
"17864 NaN NaN NaN BOTI ... 24.0 16.0 \n",
|
||
"17865 NaN NaN NaN BOTI ... 5.0 13.0 \n",
|
||
"\n",
|
||
" C202510 C202511 C202512 Ciclo_y INICIO CICLO FIM CICLO DURAÇÃO \\\n",
|
||
"17861 3.0 19.0 10.0 C202514 2025-09-22 2025-10-12 21 \n",
|
||
"17862 44.0 64.0 9.0 C202514 2025-09-22 2025-10-12 21 \n",
|
||
"17863 7.0 9.0 0.0 C202514 2025-09-22 2025-10-12 21 \n",
|
||
"17864 7.0 2.0 2.0 C202514 2025-09-22 2025-10-12 21 \n",
|
||
"17865 7.0 9.0 0.0 C202514 2025-09-22 2025-10-12 21 \n",
|
||
"\n",
|
||
" dias_ate_inicio \n",
|
||
"17861 31 \n",
|
||
"17862 31 \n",
|
||
"17863 31 \n",
|
||
"17864 31 \n",
|
||
"17865 31 \n",
|
||
"\n",
|
||
"[5 rows x 61 columns]"
|
||
]
|
||
},
|
||
"execution_count": 237,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final[df_final['SKU_FINAL']=='48060'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 238,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['Código'] = df_final['Código'].astype('Int64') \n",
|
||
"df_final['PDV'] = df_final['PDV'].astype('Int64') "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 239,
|
||
"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>SKU1</th>\n",
|
||
" <th>SKU2</th>\n",
|
||
" <th>UF</th>\n",
|
||
" <th>PC</th>\n",
|
||
" <th>PV</th>\n",
|
||
" <th>chave sku2</th>\n",
|
||
" <th>chave sku1</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>84918</td>\n",
|
||
" <td>84918</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>393.70</td>\n",
|
||
" <td>1300.0</td>\n",
|
||
" <td>AL84918</td>\n",
|
||
" <td>AL84918</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>84918</td>\n",
|
||
" <td>84918</td>\n",
|
||
" <td>BA</td>\n",
|
||
" <td>436.73</td>\n",
|
||
" <td>1300.0</td>\n",
|
||
" <td>BA84918</td>\n",
|
||
" <td>BA84918</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>84918</td>\n",
|
||
" <td>84918</td>\n",
|
||
" <td>SE</td>\n",
|
||
" <td>379.94</td>\n",
|
||
" <td>1300.0</td>\n",
|
||
" <td>SE84918</td>\n",
|
||
" <td>SE84918</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>54230</td>\n",
|
||
" <td>54230</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>138.54</td>\n",
|
||
" <td>499.9</td>\n",
|
||
" <td>AL54230</td>\n",
|
||
" <td>AL54230</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>54230</td>\n",
|
||
" <td>54230</td>\n",
|
||
" <td>BA</td>\n",
|
||
" <td>148.66</td>\n",
|
||
" <td>499.9</td>\n",
|
||
" <td>BA54230</td>\n",
|
||
" <td>BA54230</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" SKU1 SKU2 UF PC PV chave sku2 chave sku1\n",
|
||
"0 84918 84918 AL 393.70 1300.0 AL84918 AL84918\n",
|
||
"1 84918 84918 BA 436.73 1300.0 BA84918 BA84918\n",
|
||
"2 84918 84918 SE 379.94 1300.0 SE84918 SE84918\n",
|
||
"3 54230 54230 AL 138.54 499.9 AL54230 AL54230\n",
|
||
"4 54230 54230 BA 148.66 499.9 BA54230 BA54230"
|
||
]
|
||
},
|
||
"execution_count": 239,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype('Int64')\n",
|
||
"df_bi_preco.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 240,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(49398, 67)"
|
||
]
|
||
},
|
||
"execution_count": 240,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"\n",
|
||
"df_final = pd.merge(left=df_final,right=df_bi_preco,right_on=['UF','SKU2'],left_on=['UF','Código'],how='left')\n",
|
||
"df_final.shape "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 241,
|
||
"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_x</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>INICIO CICLO</th>\n",
|
||
" <th>FIM CICLO</th>\n",
|
||
" <th>DURAÇÃO</th>\n",
|
||
" <th>dias_ate_inicio</th>\n",
|
||
" <th>SKU1</th>\n",
|
||
" <th>SKU2</th>\n",
|
||
" <th>PC</th>\n",
|
||
" <th>PV</th>\n",
|
||
" <th>chave sku2</th>\n",
|
||
" <th>chave sku1</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>17861</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>11085</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17862</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>11085</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17863</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>11085</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17864</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>11085</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17865</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>11085</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 67 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo_x Região Canal Código Descrição IAF \\\n",
|
||
"17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... INICIO CICLO \\\n",
|
||
"17861 NaN NaN NaN BOTI ... 2025-09-22 \n",
|
||
"17862 NaN NaN NaN BOTI ... 2025-09-22 \n",
|
||
"17863 NaN NaN NaN BOTI ... 2025-09-22 \n",
|
||
"17864 NaN NaN NaN BOTI ... 2025-09-22 \n",
|
||
"17865 NaN NaN NaN BOTI ... 2025-09-22 \n",
|
||
"\n",
|
||
" FIM CICLO DURAÇÃO dias_ate_inicio SKU1 SKU2 PC PV \\\n",
|
||
"17861 2025-10-12 21 31 11085 48060 38.03 139.9 \n",
|
||
"17862 2025-10-12 21 31 11085 48060 38.03 139.9 \n",
|
||
"17863 2025-10-12 21 31 11085 48060 38.03 139.9 \n",
|
||
"17864 2025-10-12 21 31 11085 48060 38.03 139.9 \n",
|
||
"17865 2025-10-12 21 31 11085 48060 38.03 139.9 \n",
|
||
"\n",
|
||
" chave sku2 chave sku1 \n",
|
||
"17861 AL48060 AL11085 \n",
|
||
"17862 AL48060 AL11085 \n",
|
||
"17863 AL48060 AL11085 \n",
|
||
"17864 AL48060 AL11085 \n",
|
||
"17865 AL48060 AL11085 \n",
|
||
"\n",
|
||
"[5 rows x 67 columns]"
|
||
]
|
||
},
|
||
"execution_count": 241,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final[df_final['SKU_FINAL']=='48060'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 242,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_bi_preco['SKU1'] = df_bi_preco['SKU1'].fillna(0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 243,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"(49398, 71)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Conversão segura para Int64 (nullable)\n",
|
||
"df_bi_preco['SKU1'] = pd.to_numeric(df_bi_preco['SKU1'], errors='coerce').astype('Int64')\n",
|
||
"\n",
|
||
"# Realiza o merge\n",
|
||
"df_final = pd.merge(\n",
|
||
" left=df_final,\n",
|
||
" right=df_bi_preco[['SKU1', 'SKU2', 'UF', 'PC', 'PV']],\n",
|
||
" right_on=['UF', 'SKU1'],\n",
|
||
" left_on=['UF', 'Código'],\n",
|
||
" how='left'\n",
|
||
")\n",
|
||
"\n",
|
||
"# Verifica o resultado\n",
|
||
"print(df_final.shape)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 244,
|
||
"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_x</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>SKU1_x</th>\n",
|
||
" <th>SKU2_x</th>\n",
|
||
" <th>PC_x</th>\n",
|
||
" <th>PV_x</th>\n",
|
||
" <th>chave sku2</th>\n",
|
||
" <th>chave sku1</th>\n",
|
||
" <th>SKU1_y</th>\n",
|
||
" <th>SKU2_y</th>\n",
|
||
" <th>PC_y</th>\n",
|
||
" <th>PV_y</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>17861</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>11085</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17862</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>11085</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17863</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>11085</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17864</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>11085</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17865</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>11085</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 71 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo_x Região Canal Código Descrição IAF \\\n",
|
||
"17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... SKU1_x SKU2_x \\\n",
|
||
"17861 NaN NaN NaN BOTI ... 11085 48060 \n",
|
||
"17862 NaN NaN NaN BOTI ... 11085 48060 \n",
|
||
"17863 NaN NaN NaN BOTI ... 11085 48060 \n",
|
||
"17864 NaN NaN NaN BOTI ... 11085 48060 \n",
|
||
"17865 NaN NaN NaN BOTI ... 11085 48060 \n",
|
||
"\n",
|
||
" PC_x PV_x chave sku2 chave sku1 SKU1_y SKU2_y PC_y PV_y \n",
|
||
"17861 38.03 139.9 AL48060 AL11085 <NA> <NA> NaN NaN \n",
|
||
"17862 38.03 139.9 AL48060 AL11085 <NA> <NA> NaN NaN \n",
|
||
"17863 38.03 139.9 AL48060 AL11085 <NA> <NA> NaN NaN \n",
|
||
"17864 38.03 139.9 AL48060 AL11085 <NA> <NA> NaN NaN \n",
|
||
"17865 38.03 139.9 AL48060 AL11085 <NA> <NA> NaN NaN \n",
|
||
"\n",
|
||
"[5 rows x 71 columns]"
|
||
]
|
||
},
|
||
"execution_count": 244,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final[df_final['SKU_FINAL']=='48060'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 245,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['PRECO DE COMPRA'] = np.where(~df_final['PC_x'].isna(),df_final['PC_x'],df_final['PC_y'])\n",
|
||
"\n",
|
||
"df_final['PRECO DE VENDA'] = np.where(~df_final['PV_x'].isna(),df_final['PV_x'],df_final['PV_y'])\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 246,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"CANAL\n",
|
||
"TODOS 39069\n",
|
||
"VD 10329\n",
|
||
"Name: count, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 246,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['CANAL'] = np.where((df_final['CANAL'] == 'LJ') | (df_final['CANAL'] == 'HIB'), \"TODOS\" , np.where((df_final['CANAL'] == 'CD') | (df_final['CANAL'] == 'VD'), \"VD\", df_final['CANAL']))\n",
|
||
"\n",
|
||
"df_final['CANAL'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 247,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.drop_duplicates()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 248,
|
||
"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_x</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>PC_x</th>\n",
|
||
" <th>PV_x</th>\n",
|
||
" <th>chave sku2</th>\n",
|
||
" <th>chave sku1</th>\n",
|
||
" <th>SKU1_y</th>\n",
|
||
" <th>SKU2_y</th>\n",
|
||
" <th>PC_y</th>\n",
|
||
" <th>PV_y</th>\n",
|
||
" <th>PRECO DE COMPRA</th>\n",
|
||
" <th>PRECO DE VENDA</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>17861</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17862</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17863</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17864</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17865</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td><NA></td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 73 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo_x Região Canal Código Descrição IAF \\\n",
|
||
"17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... PC_x PV_x \\\n",
|
||
"17861 NaN NaN NaN BOTI ... 38.03 139.9 \n",
|
||
"17862 NaN NaN NaN BOTI ... 38.03 139.9 \n",
|
||
"17863 NaN NaN NaN BOTI ... 38.03 139.9 \n",
|
||
"17864 NaN NaN NaN BOTI ... 38.03 139.9 \n",
|
||
"17865 NaN NaN NaN BOTI ... 38.03 139.9 \n",
|
||
"\n",
|
||
" chave sku2 chave sku1 SKU1_y SKU2_y PC_y PV_y PRECO DE COMPRA \\\n",
|
||
"17861 AL48060 AL11085 <NA> <NA> NaN NaN 38.03 \n",
|
||
"17862 AL48060 AL11085 <NA> <NA> NaN NaN 38.03 \n",
|
||
"17863 AL48060 AL11085 <NA> <NA> NaN NaN 38.03 \n",
|
||
"17864 AL48060 AL11085 <NA> <NA> NaN NaN 38.03 \n",
|
||
"17865 AL48060 AL11085 <NA> <NA> NaN NaN 38.03 \n",
|
||
"\n",
|
||
" PRECO DE VENDA \n",
|
||
"17861 139.9 \n",
|
||
"17862 139.9 \n",
|
||
"17863 139.9 \n",
|
||
"17864 139.9 \n",
|
||
"17865 139.9 \n",
|
||
"\n",
|
||
"[5 rows x 73 columns]"
|
||
]
|
||
},
|
||
"execution_count": 248,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final[df_final['SKU_FINAL']=='48060'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 249,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.drop(columns=['SKU1_x','SKU1_y','SKU2_x','SKU2_y','PC_x', 'PV_x','PC_y', 'PV_y','Subcategoria',\n",
|
||
"'Quantidade por caixa'\n",
|
||
"])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 250,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['Código'].astype(str)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 251,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.rename(columns={'Compra inteligente Próximo Ciclo + 1':'Compra inteligente Próximo Ciclo','Arquivo_Origem': 'MARCA'})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 252,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"np.int64(0)"
|
||
]
|
||
},
|
||
"execution_count": 252,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final = df_final[~df_final['Marca'].isna()]\n",
|
||
"df_final['Marca'].isna().sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 253,
|
||
"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_x</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>Ciclo_y</th>\n",
|
||
" <th>INICIO CICLO</th>\n",
|
||
" <th>FIM CICLO</th>\n",
|
||
" <th>DURAÇÃO</th>\n",
|
||
" <th>dias_ate_inicio</th>\n",
|
||
" <th>chave sku2</th>\n",
|
||
" <th>chave sku1</th>\n",
|
||
" <th>PRECO DE COMPRA</th>\n",
|
||
" <th>PRECO DE VENDA</th>\n",
|
||
" <th>UFPRODUTO</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>17861</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17862</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17863</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17864</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17865</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 64 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo_x Região Canal Código Descrição IAF \\\n",
|
||
"17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... Ciclo_y \\\n",
|
||
"17861 NaN NaN NaN BOTI ... C202514 \n",
|
||
"17862 NaN NaN NaN BOTI ... C202514 \n",
|
||
"17863 NaN NaN NaN BOTI ... C202514 \n",
|
||
"17864 NaN NaN NaN BOTI ... C202514 \n",
|
||
"17865 NaN NaN NaN BOTI ... C202514 \n",
|
||
"\n",
|
||
" INICIO CICLO FIM CICLO DURAÇÃO dias_ate_inicio chave sku2 \\\n",
|
||
"17861 2025-09-22 2025-10-12 21 31 AL48060 \n",
|
||
"17862 2025-09-22 2025-10-12 21 31 AL48060 \n",
|
||
"17863 2025-09-22 2025-10-12 21 31 AL48060 \n",
|
||
"17864 2025-09-22 2025-10-12 21 31 AL48060 \n",
|
||
"17865 2025-09-22 2025-10-12 21 31 AL48060 \n",
|
||
"\n",
|
||
" chave sku1 PRECO DE COMPRA PRECO DE VENDA UFPRODUTO \n",
|
||
"17861 AL11085 38.03 139.9 AL48060 \n",
|
||
"17862 AL11085 38.03 139.9 AL48060 \n",
|
||
"17863 AL11085 38.03 139.9 AL48060 \n",
|
||
"17864 AL11085 38.03 139.9 AL48060 \n",
|
||
"17865 AL11085 38.03 139.9 AL48060 \n",
|
||
"\n",
|
||
"[5 rows x 64 columns]"
|
||
]
|
||
},
|
||
"execution_count": 253,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final[df_final['SKU_FINAL']=='48060'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 254,
|
||
"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_x</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>Ciclo_y</th>\n",
|
||
" <th>INICIO CICLO</th>\n",
|
||
" <th>FIM CICLO</th>\n",
|
||
" <th>DURAÇÃO</th>\n",
|
||
" <th>dias_ate_inicio</th>\n",
|
||
" <th>chave sku2</th>\n",
|
||
" <th>chave sku1</th>\n",
|
||
" <th>PRECO DE COMPRA</th>\n",
|
||
" <th>PRECO DE VENDA</th>\n",
|
||
" <th>UFPRODUTO</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>17861</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17862</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17863</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17864</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>17865</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48060</td>\n",
|
||
" <td>LILY CREM DES HID ACET CPO 250g V8</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>2025-09-22</td>\n",
|
||
" <td>2025-10-12</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>31</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" <td>AL11085</td>\n",
|
||
" <td>38.03</td>\n",
|
||
" <td>139.9</td>\n",
|
||
" <td>AL48060</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 64 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo_x Região Canal Código Descrição IAF \\\n",
|
||
"17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... Ciclo_y \\\n",
|
||
"17861 NaN NaN NaN BOTI ... C202514 \n",
|
||
"17862 NaN NaN NaN BOTI ... C202514 \n",
|
||
"17863 NaN NaN NaN BOTI ... C202514 \n",
|
||
"17864 NaN NaN NaN BOTI ... C202514 \n",
|
||
"17865 NaN NaN NaN BOTI ... C202514 \n",
|
||
"\n",
|
||
" INICIO CICLO FIM CICLO DURAÇÃO dias_ate_inicio chave sku2 \\\n",
|
||
"17861 2025-09-22 2025-10-12 21 31 AL48060 \n",
|
||
"17862 2025-09-22 2025-10-12 21 31 AL48060 \n",
|
||
"17863 2025-09-22 2025-10-12 21 31 AL48060 \n",
|
||
"17864 2025-09-22 2025-10-12 21 31 AL48060 \n",
|
||
"17865 2025-09-22 2025-10-12 21 31 AL48060 \n",
|
||
"\n",
|
||
" chave sku1 PRECO DE COMPRA PRECO DE VENDA UFPRODUTO \n",
|
||
"17861 AL11085 38.03 139.9 AL48060 \n",
|
||
"17862 AL11085 38.03 139.9 AL48060 \n",
|
||
"17863 AL11085 38.03 139.9 AL48060 \n",
|
||
"17864 AL11085 38.03 139.9 AL48060 \n",
|
||
"17865 AL11085 38.03 139.9 AL48060 \n",
|
||
"\n",
|
||
"[5 rows x 64 columns]"
|
||
]
|
||
},
|
||
"execution_count": 254,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final[df_final['SKU_FINAL']=='48060'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 255,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_vdc = pd.read_csv(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C10\\VENDA VITORIA 2024\\VENDA VITORIA.csv\")\n",
|
||
"\n",
|
||
"df_vdc['PRODUTO'] = df_vdc['PRODUTO'].astype('Int64')\n",
|
||
"\n",
|
||
"df_final['Código'] = df_final['Código'].astype('Int64')\n",
|
||
"\n",
|
||
"df_final =pd.merge(left=df_final,right=df_vdc,left_on= ['PDV','Código'],right_on= ['PDV GINSENG','PRODUTO'],how='left' )\n",
|
||
"\n",
|
||
"df_final[df_final.columns[-1]] = df_final[df_final.columns[-1]].fillna(0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 256,
|
||
"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 GINSENG</th>\n",
|
||
" <th>PRODUTO</th>\n",
|
||
" <th>202401</th>\n",
|
||
" <th>202402</th>\n",
|
||
" <th>202403</th>\n",
|
||
" <th>202404</th>\n",
|
||
" <th>202405</th>\n",
|
||
" <th>202406</th>\n",
|
||
" <th>202407</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",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1235</th>\n",
|
||
" <td>23701</td>\n",
|
||
" <td>74043</td>\n",
|
||
" <td>12</td>\n",
|
||
" <td>24</td>\n",
|
||
" <td>12</td>\n",
|
||
" <td>16</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>12</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>42</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>14</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3033</th>\n",
|
||
" <td>23702</td>\n",
|
||
" <td>74043</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>22</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>22</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>12</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>22</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>36</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5171</th>\n",
|
||
" <td>23703</td>\n",
|
||
" <td>74043</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>18</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>18</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>20</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>22</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>26</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>16</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV GINSENG PRODUTO 202401 202402 202403 202404 202405 202406 \\\n",
|
||
"1235 23701 74043 12 24 12 16 8 14 \n",
|
||
"3033 23702 74043 2 22 8 22 10 14 \n",
|
||
"5171 23703 74043 10 18 6 18 6 2 \n",
|
||
"\n",
|
||
" 202407 202408 202409 202410 202411 202412 202413 202414 202415 \\\n",
|
||
"1235 6 14 12 0 8 10 4 42 0 \n",
|
||
"3033 14 10 12 8 22 6 14 36 10 \n",
|
||
"5171 20 0 10 2 22 4 2 26 2 \n",
|
||
"\n",
|
||
" 202416 \n",
|
||
"1235 14 \n",
|
||
"3033 0 \n",
|
||
"5171 16 "
|
||
]
|
||
},
|
||
"execution_count": 256,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_vdc[df_vdc['PRODUTO']== 74043].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 257,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.fillna(0)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 258,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n",
|
||
" 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n",
|
||
" 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n",
|
||
" 'Percentual de desconto consumidor', 'Ação revendedor',\n",
|
||
" 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n",
|
||
" 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n",
|
||
" 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n",
|
||
" 'C202412', 'C202413', 'C202414', 'C202415', 'C202416', 'C202417',\n",
|
||
" 'C202501', 'C202502', 'C202503', 'C202504', 'C202505', 'C202506',\n",
|
||
" 'C202507', 'C202508', 'C202509', 'C202510', 'C202511', 'C202512',\n",
|
||
" 'Ciclo_y', 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio',\n",
|
||
" 'chave sku2', 'chave sku1', 'PRECO DE COMPRA', 'PRECO DE VENDA',\n",
|
||
" 'UFPRODUTO', 'PDV GINSENG', 'PRODUTO', '202401', '202402', '202403',\n",
|
||
" '202404', '202405', '202406', '202407', '202408', '202409', '202410',\n",
|
||
" '202411', '202412', '202413', '202414', '202415', '202416'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 258,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 259,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import re\n",
|
||
"\n",
|
||
"# identificar colunas de ciclo puro (ex: '202407')\n",
|
||
"colunas_ciclo_puro = [col for col in df_final.columns[-16:-1]]\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"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 260,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n",
|
||
" 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n",
|
||
" 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n",
|
||
" 'Percentual de desconto consumidor', 'Ação revendedor',\n",
|
||
" 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n",
|
||
" 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n",
|
||
" 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n",
|
||
" 'C202412', 'C202413', 'C202414', 'C202415', 'C202416', 'C202417',\n",
|
||
" 'C202501', 'C202502', 'C202503', 'C202504', 'C202505', 'C202506',\n",
|
||
" 'C202507', 'C202508', 'C202509', 'C202510', 'C202511', 'C202512',\n",
|
||
" 'Ciclo_y', 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio',\n",
|
||
" 'chave sku2', 'chave sku1', 'PRECO DE COMPRA', 'PRECO DE VENDA',\n",
|
||
" 'UFPRODUTO', 'PDV GINSENG', 'PRODUTO', '202416'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 260,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 261,
|
||
"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>DATA_VENDA</th>\n",
|
||
" <th>PDV</th>\n",
|
||
" <th>pdvs cp</th>\n",
|
||
" <th>DESC PDV</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>Quantidade</th>\n",
|
||
" <th>Faturamento</th>\n",
|
||
" <th>Ciclo</th>\n",
|
||
" <th>Date</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>2025-04-01</td>\n",
|
||
" <td>12993</td>\n",
|
||
" <td>24253</td>\n",
|
||
" <td>PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA</td>\n",
|
||
" <td>1004</td>\n",
|
||
" <td>FLORATTA DES COL MY BLUE 75ml</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>98,99</td>\n",
|
||
" <td>C202505</td>\n",
|
||
" <td>2025-04-01</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2025-04-01</td>\n",
|
||
" <td>12993</td>\n",
|
||
" <td>24253</td>\n",
|
||
" <td>PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA</td>\n",
|
||
" <td>4539</td>\n",
|
||
" <td>BOTIK CR FAC FIRMADOR AC/HIAL 40g V2</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>129,05</td>\n",
|
||
" <td>C202505</td>\n",
|
||
" <td>2025-04-01</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2025-04-01</td>\n",
|
||
" <td>12993</td>\n",
|
||
" <td>24253</td>\n",
|
||
" <td>PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA</td>\n",
|
||
" <td>29046</td>\n",
|
||
" <td>BOTICOLL CONNEX DES BDY SPR 100ml V6 PCK</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>38,9</td>\n",
|
||
" <td>C202505</td>\n",
|
||
" <td>2025-04-01</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>2025-04-01</td>\n",
|
||
" <td>12993</td>\n",
|
||
" <td>24253</td>\n",
|
||
" <td>PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA</td>\n",
|
||
" <td>47154</td>\n",
|
||
" <td>CBEM DES ROLL S/ALUM 55ml</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>21,98</td>\n",
|
||
" <td>C202505</td>\n",
|
||
" <td>2025-04-01</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>2025-04-01</td>\n",
|
||
" <td>12993</td>\n",
|
||
" <td>24253</td>\n",
|
||
" <td>PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA</td>\n",
|
||
" <td>47411</td>\n",
|
||
" <td>ARBO NECESS LONA</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>57,26</td>\n",
|
||
" <td>C202505</td>\n",
|
||
" <td>2025-04-01</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" DATA_VENDA PDV pdvs cp DESC PDV \\\n",
|
||
"0 2025-04-01 12993 24253 PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA \n",
|
||
"1 2025-04-01 12993 24253 PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA \n",
|
||
"2 2025-04-01 12993 24253 PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA \n",
|
||
"3 2025-04-01 12993 24253 PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA \n",
|
||
"4 2025-04-01 12993 24253 PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA \n",
|
||
"\n",
|
||
" Código Descrição Quantidade Faturamento \\\n",
|
||
"0 1004 FLORATTA DES COL MY BLUE 75ml 1 98,99 \n",
|
||
"1 4539 BOTIK CR FAC FIRMADOR AC/HIAL 40g V2 1 129,05 \n",
|
||
"2 29046 BOTICOLL CONNEX DES BDY SPR 100ml V6 PCK 1 38,9 \n",
|
||
"3 47154 CBEM DES ROLL S/ALUM 55ml 1 21,98 \n",
|
||
"4 47411 ARBO NECESS LONA 1 57,26 \n",
|
||
"\n",
|
||
" Ciclo Date \n",
|
||
"0 C202505 2025-04-01 \n",
|
||
"1 C202505 2025-04-01 \n",
|
||
"2 C202505 2025-04-01 \n",
|
||
"3 C202505 2025-04-01 \n",
|
||
"4 C202505 2025-04-01 "
|
||
]
|
||
},
|
||
"execution_count": 261,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_irece = pd.read_csv(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\DADOS DOURADO\\VENDA\\COMPILADO_VENDAS.csv\", sep=';')\n",
|
||
"\n",
|
||
"df_irece['DATA_VENDA'] = pd.to_datetime(df_irece['DATA_VENDA'], dayfirst=True)\n",
|
||
"\n",
|
||
"df_irece = pd.merge(df_irece,calendario[['Ciclo','Date']],how='left', left_on='DATA_VENDA',right_on='Date')\n",
|
||
"\n",
|
||
"df_irece.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 262,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_irece_agrupado = df_irece.groupby(['PDV','Código','Ciclo'])['Quantidade'].sum().reset_index()\n",
|
||
"\n",
|
||
"df_pivotado = df_irece_agrupado.pivot(index=['PDV', 'Código'], columns='Ciclo', values='Quantidade').reset_index()\n",
|
||
"\n",
|
||
"df_pivotado = df_pivotado.fillna(0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 263,
|
||
"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', 'Ciclo_y'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 263,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[37:55]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 264,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n",
|
||
" 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n",
|
||
" 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n",
|
||
" 'Percentual de desconto consumidor', 'Ação revendedor',\n",
|
||
" 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n",
|
||
" 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n",
|
||
" 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n",
|
||
" '202412', '202413', '202414', '202415', '202416', '202417', '202501',\n",
|
||
" '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n",
|
||
" '202509', '202510', '202511', '202512', 'Ciclo_y', 'INICIO CICLO',\n",
|
||
" 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'chave sku2', 'chave sku1',\n",
|
||
" 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n",
|
||
" 'PRODUTO', '202416'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 264,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"for col_c in df_final.columns[37:55]:\n",
|
||
" sufixo = col_c[1:] # Remove o 'C' do início, ex: 'C202407' -> '202407'\n",
|
||
" df_final.columns = df_final.columns.str.replace(\"C20\", \"20\", regex=True)\n",
|
||
"\n",
|
||
"\n",
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 265,
|
||
"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_x</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>C202415</th>\n",
|
||
" <th>C202416</th>\n",
|
||
" <th>C202417</th>\n",
|
||
" <th>C202501</th>\n",
|
||
" <th>C202502</th>\n",
|
||
" <th>C202503</th>\n",
|
||
" <th>C202504</th>\n",
|
||
" <th>C202505</th>\n",
|
||
" <th>C202506</th>\n",
|
||
" <th>C202507</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 91 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo_x Região Canal Código Descrição IAF \\\n",
|
||
"0 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"1 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"2 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"3 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"4 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... C202415 C202416 \\\n",
|
||
"0 0.0 0.0 0.0 BOTI ... 0.0 0.0 \n",
|
||
"1 0.0 0.0 0.0 BOTI ... 0.0 0.0 \n",
|
||
"2 0.0 0.0 0.0 BOTI ... 0.0 0.0 \n",
|
||
"3 0.0 0.0 0.0 BOTI ... 0.0 0.0 \n",
|
||
"4 0.0 0.0 0.0 BOTI ... 0.0 0.0 \n",
|
||
"\n",
|
||
" C202417 C202501 C202502 C202503 C202504 C202505 C202506 C202507 \n",
|
||
"0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"\n",
|
||
"[5 rows x 91 columns]"
|
||
]
|
||
},
|
||
"execution_count": 265,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final = pd.merge(df_final,df_pivotado,how='left',on=['PDV','Código'])\n",
|
||
"\n",
|
||
"df_final = df_final.fillna(0)\n",
|
||
"\n",
|
||
"df_final.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 266,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n",
|
||
" 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n",
|
||
" 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n",
|
||
" 'Percentual de desconto consumidor', 'Ação revendedor',\n",
|
||
" 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n",
|
||
" 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n",
|
||
" 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n",
|
||
" '202412', '202413', '202414', '202415', '202416', '202417', '202501',\n",
|
||
" '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n",
|
||
" '202509', '202510', '202511', '202512', 'Ciclo_y', 'INICIO CICLO',\n",
|
||
" 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'chave sku2', 'chave sku1',\n",
|
||
" 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n",
|
||
" 'PRODUTO', '202416', 'C202401', 'C202402', 'C202403', 'C202404',\n",
|
||
" 'C202405', 'C202406', 'C202407', 'C202408', 'C202409', 'C202410',\n",
|
||
" 'C202411', 'C202412', 'C202413', 'C202414', 'C202415', 'C202416',\n",
|
||
" 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n",
|
||
" 'C202506', 'C202507'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 266,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 267,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"\n",
|
||
"\n",
|
||
"# 1. Identificar colunas no formato 'C2024xx', 'C2025xx', etc.\n",
|
||
"colunas_ciclo_c = [col for col in df_pivotado.columns if re.fullmatch(r'C20\\d{4}', col)]\n",
|
||
"\n",
|
||
"for col_c in colunas_ciclo_c:\n",
|
||
" sufixo = col_c[1:] # Remove o 'C' do início, ex: 'C202407' -> '202407'\n",
|
||
" col_hist = col_c\n",
|
||
" \n",
|
||
" if col_hist in df_final.columns:\n",
|
||
" # Pega o maior valor entre a coluna de histórico e a de ciclo com \"C\"\n",
|
||
" df_final[col_hist] = df_final[[col_hist, col_c]].max(axis=1)\n",
|
||
"\n",
|
||
"# (Opcional) Remover as colunas 'C20xxxx' após o merge\n",
|
||
"df_final.drop(columns=colunas_ciclo_c, inplace=True)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 268,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"202401 C202401\n",
|
||
"202402 C202402\n",
|
||
"202403 C202403\n",
|
||
"202404 C202404\n",
|
||
"202405 C202405\n",
|
||
"202406 C202406\n",
|
||
"202407 C202407\n",
|
||
"202408 C202408\n",
|
||
"202409 C202409\n",
|
||
"202410 C202410\n",
|
||
"202411 C202411\n",
|
||
"202412 C202412\n",
|
||
"202413 C202413\n",
|
||
"202414 C202414\n",
|
||
"202415 C202415\n",
|
||
"202416 C202416\n",
|
||
"202417 C202417\n",
|
||
"202501 C202501\n",
|
||
"202502 C202502\n",
|
||
"202503 C202503\n",
|
||
"202504 C202504\n",
|
||
"202505 C202505\n",
|
||
"202506 C202506\n",
|
||
"202507 C202507\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"['C202401',\n",
|
||
" 'C202402',\n",
|
||
" 'C202403',\n",
|
||
" 'C202404',\n",
|
||
" 'C202405',\n",
|
||
" 'C202406',\n",
|
||
" 'C202407',\n",
|
||
" 'C202408',\n",
|
||
" 'C202409',\n",
|
||
" 'C202410',\n",
|
||
" 'C202411',\n",
|
||
" 'C202412',\n",
|
||
" 'C202413',\n",
|
||
" 'C202414',\n",
|
||
" 'C202415',\n",
|
||
" 'C202416',\n",
|
||
" 'C202417',\n",
|
||
" 'C202501',\n",
|
||
" 'C202502',\n",
|
||
" 'C202503',\n",
|
||
" 'C202504',\n",
|
||
" 'C202505',\n",
|
||
" 'C202506',\n",
|
||
" 'C202507']"
|
||
]
|
||
},
|
||
"execution_count": 268,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"colunas_ciclo_c = [col for col in df_pivotado.columns if re.fullmatch(r'C20\\d{4}', col)]\n",
|
||
"\n",
|
||
"for col_c in colunas_ciclo_c:\n",
|
||
" sufixo = col_c[1:] # Remove o 'C' do início, ex: 'C202407' -> '202407'\n",
|
||
" col_hist = col_c\n",
|
||
" print(sufixo,col_c)\n",
|
||
"colunas_ciclo_c"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 269,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.drop(columns=['Ciclo_y'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 270,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n",
|
||
" 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n",
|
||
" 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n",
|
||
" 'Percentual de desconto consumidor', 'Ação revendedor',\n",
|
||
" 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n",
|
||
" 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n",
|
||
" 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n",
|
||
" '202412', '202413', '202414', '202415', '202416', '202417', '202501',\n",
|
||
" '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n",
|
||
" '202509', '202510', '202511', '202512', 'INICIO CICLO', 'FIM CICLO',\n",
|
||
" 'DURAÇÃO', 'dias_ate_inicio', 'chave sku2', 'chave sku1',\n",
|
||
" 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n",
|
||
" 'PRODUTO', '202416'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 270,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 271,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(49398, 66)"
|
||
]
|
||
},
|
||
"execution_count": 271,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final = df_final.drop_duplicates()\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 272,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['chave'] = df_final['PDV'].astype('str') + df_final['Código'].astype('str')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 273,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.fillna(0)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 274,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202412', '202413', '202414', '202415', '202416', '202417', '202501',\n",
|
||
" '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n",
|
||
" '202509', '202510', '202511', '202512'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 274,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[36:54]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 275,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Define list of target columns\n",
|
||
"sales_2024_cols = df_final.columns[36:54]\n",
|
||
"# Create a new column with the row-wise max\n",
|
||
"df_final['PICO DE VENDAS 2024'] = df_final[sales_2024_cols].max(axis=1)\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 276,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"vendas_6_meses = df_final.columns[48:54]\n",
|
||
"\n",
|
||
"df_final['Pico Vendas Ultimos 6 ciclos'] = df_final[vendas_6_meses].max(axis=1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 277,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202413', '202414', '202415', '202416', '202417', '202501', '202502'], dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 277,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[37:44]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 278,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n",
|
||
" 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n",
|
||
" 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n",
|
||
" 'Percentual de desconto consumidor', 'Ação revendedor',\n",
|
||
" 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n",
|
||
" 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n",
|
||
" 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n",
|
||
" '202412', '202413', '202414', '202415', '202416', '202417', '202501',\n",
|
||
" '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n",
|
||
" '202509', '202510', '202511', '202512', 'INICIO CICLO', 'FIM CICLO',\n",
|
||
" 'DURAÇÃO', 'dias_ate_inicio', 'chave sku2', 'chave sku1',\n",
|
||
" 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n",
|
||
" 'PRODUTO', '202416', 'chave', 'PICO DE VENDAS 2024',\n",
|
||
" 'Pico Vendas Ultimos 6 ciclos'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 278,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 279,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n",
|
||
" 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n",
|
||
" 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n",
|
||
" 'Percentual de desconto consumidor', 'Ação revendedor',\n",
|
||
" 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n",
|
||
" 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n",
|
||
" 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n",
|
||
" '202412', '202413', '202414', '202415', '202416', '202417', '202501',\n",
|
||
" '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n",
|
||
" '202509', '202510', '202511', '202512', 'INICIO CICLO', 'FIM CICLO',\n",
|
||
" 'DURAÇÃO', 'dias_ate_inicio', 'chave sku2', 'chave sku1',\n",
|
||
" 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n",
|
||
" 'PRODUTO', '202416', 'chave', 'PICO DE VENDAS 2024',\n",
|
||
" 'Pico Vendas Ultimos 6 ciclos'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 279,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 280,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202412', '202413', '202414', '202415', '202416', '202417', '202501',\n",
|
||
" '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n",
|
||
" '202509', '202510', '202511', '202512'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 280,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[36:54]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 281,
|
||
"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_x</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>chave sku1</th>\n",
|
||
" <th>PRECO DE COMPRA</th>\n",
|
||
" <th>PRECO DE VENDA</th>\n",
|
||
" <th>UFPRODUTO</th>\n",
|
||
" <th>PDV GINSENG</th>\n",
|
||
" <th>PRODUTO</th>\n",
|
||
" <th>202416</th>\n",
|
||
" <th>chave</th>\n",
|
||
" <th>PICO DE VENDAS 2024</th>\n",
|
||
" <th>Pico Vendas Ultimos 6 ciclos</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>AL28813</td>\n",
|
||
" <td>58.17</td>\n",
|
||
" <td>224.9</td>\n",
|
||
" <td>AL48141</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1252248141</td>\n",
|
||
" <td>20.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>AL28813</td>\n",
|
||
" <td>58.17</td>\n",
|
||
" <td>224.9</td>\n",
|
||
" <td>AL48141</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1281748141</td>\n",
|
||
" <td>45.0</td>\n",
|
||
" <td>18.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>AL28813</td>\n",
|
||
" <td>58.17</td>\n",
|
||
" <td>224.9</td>\n",
|
||
" <td>AL48141</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1281848141</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>AL28813</td>\n",
|
||
" <td>58.17</td>\n",
|
||
" <td>224.9</td>\n",
|
||
" <td>AL48141</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1282048141</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>AL28813</td>\n",
|
||
" <td>58.17</td>\n",
|
||
" <td>224.9</td>\n",
|
||
" <td>AL48141</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1282348141</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 69 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo_x Região Canal Código Descrição IAF \\\n",
|
||
"0 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"1 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"2 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"3 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"4 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... chave sku1 \\\n",
|
||
"0 0.0 0.0 0.0 BOTI ... AL28813 \n",
|
||
"1 0.0 0.0 0.0 BOTI ... AL28813 \n",
|
||
"2 0.0 0.0 0.0 BOTI ... AL28813 \n",
|
||
"3 0.0 0.0 0.0 BOTI ... AL28813 \n",
|
||
"4 0.0 0.0 0.0 BOTI ... AL28813 \n",
|
||
"\n",
|
||
" PRECO DE COMPRA PRECO DE VENDA UFPRODUTO PDV GINSENG PRODUTO 202416 \\\n",
|
||
"0 58.17 224.9 AL48141 0.0 0 0.0 \n",
|
||
"1 58.17 224.9 AL48141 0.0 0 0.0 \n",
|
||
"2 58.17 224.9 AL48141 0.0 0 0.0 \n",
|
||
"3 58.17 224.9 AL48141 0.0 0 0.0 \n",
|
||
"4 58.17 224.9 AL48141 0.0 0 0.0 \n",
|
||
"\n",
|
||
" chave PICO DE VENDAS 2024 Pico Vendas Ultimos 6 ciclos \n",
|
||
"0 1252248141 20.0 7.0 \n",
|
||
"1 1281748141 45.0 18.0 \n",
|
||
"2 1281848141 11.0 3.0 \n",
|
||
"3 1282048141 8.0 3.0 \n",
|
||
"4 1282348141 11.0 2.0 \n",
|
||
"\n",
|
||
"[5 rows x 69 columns]"
|
||
]
|
||
},
|
||
"execution_count": 281,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 282,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"\"# Define as colunas mensais\\ncolunas_mensais = df_final.columns[36:54]\\n\\n# Função de cálculo por grupo\\ndef calcular_crescimento(grupo):\\n soma_mensal = grupo[colunas_mensais].sum()\\n variacao_mensal = soma_mensal.pct_change().dropna()\\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\\ncrescimento_por_pdv = (\\n df_final\\n .groupby('PDV')\\n .apply(calcular_crescimento) # retorna índice com PDV\\n .reset_index(level=0) # reseta só o nível PDV\\n)\\n\\n# Merge do resultado de volta no dataframe original\\ndf_final = df_final.merge(crescimento_por_pdv, on='PDV', how='left')\""
|
||
]
|
||
},
|
||
"execution_count": 282,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"'''# Define as colunas mensais\n",
|
||
"colunas_mensais = df_final.columns[36:54]\n",
|
||
"\n",
|
||
"# Função de cálculo por grupo\n",
|
||
"def calcular_crescimento(grupo):\n",
|
||
" soma_mensal = grupo[colunas_mensais].sum()\n",
|
||
" variacao_mensal = soma_mensal.pct_change().dropna()\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 = (\n",
|
||
" df_final\n",
|
||
" .groupby('PDV')\n",
|
||
" .apply(calcular_crescimento) # retorna índice com PDV\n",
|
||
" .reset_index(level=0) # reseta só o nível PDV\n",
|
||
")\n",
|
||
"\n",
|
||
"# Merge do resultado de volta no dataframe original\n",
|
||
"df_final = df_final.merge(crescimento_por_pdv, on='PDV', how='left')'''\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 283,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"np.float64(0.1171)"
|
||
]
|
||
},
|
||
"execution_count": 283,
|
||
"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[36:54]\n",
|
||
"\n",
|
||
"# Passo 1: Soma todas as linhas (itens) por mês → resultado: total por mês\n",
|
||
"soma_mensal = df_final[colunas_mensais].sum()\n",
|
||
"\n",
|
||
"# Passo 2: Calcula a variação percentual de um mês para o outro\n",
|
||
"variacao_mensal = soma_mensal.pct_change()\n",
|
||
"variacao_mensal = variacao_mensal.dropna()\n",
|
||
"\n",
|
||
"variacao_mensal = variacao_mensal[np.isfinite(variacao_mensal)]\n",
|
||
"\n",
|
||
"# Passo 3: Calcula a média da variação (ignorando o primeiro NaN)\n",
|
||
"media_variacao = variacao_mensal[1:].mean()\n",
|
||
"\n",
|
||
"# Calcula média e desvio padrão\n",
|
||
"media = variacao_mensal.mean()\n",
|
||
"desvio = variacao_mensal.std()\n",
|
||
"\n",
|
||
"# Define limite (ex: 2 desvios padrão)\n",
|
||
"limite_superior = media + 2 * desvio\n",
|
||
"limite_inferior = media - 2 * desvio\n",
|
||
"\n",
|
||
"# Filtra dados dentro do limite\n",
|
||
"filtro = variacao_mensal.between(limite_inferior, limite_superior)\n",
|
||
"df_filtrado = variacao_mensal[filtro]\n",
|
||
"CRESCIMENTO = round(df_filtrado.mean(),4)\n",
|
||
"\n",
|
||
"df_final['CRESCIMENTO_GERAL'] = 0.2\n",
|
||
"\n",
|
||
"CRESCIMENTO\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 284,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202412', '202413', '202414', '202415', '202416', '202417', '202501',\n",
|
||
" '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n",
|
||
" '202509', '202510', '202511', '202512'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 284,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[36:54]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 285,
|
||
"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>Código</th>\n",
|
||
" <th>med_por_canal</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1004</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1788</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>2094</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>2100</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>2150</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>6165</th>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>87925</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6166</th>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>87926</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6167</th>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>87927</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6168</th>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>87959</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6169</th>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>87960</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>6170 rows × 4 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" CANAL UF Código med_por_canal\n",
|
||
"0 TODOS AL 1004 0.0\n",
|
||
"1 TODOS AL 1788 0.0\n",
|
||
"2 TODOS AL 2094 0.0\n",
|
||
"3 TODOS AL 2100 0.0\n",
|
||
"4 TODOS AL 2150 0.0\n",
|
||
"... ... ... ... ...\n",
|
||
"6165 VD VDC 87925 0.0\n",
|
||
"6166 VD VDC 87926 0.0\n",
|
||
"6167 VD VDC 87927 0.0\n",
|
||
"6168 VD VDC 87959 0.0\n",
|
||
"6169 VD VDC 87960 0.0\n",
|
||
"\n",
|
||
"[6170 rows x 4 columns]"
|
||
]
|
||
},
|
||
"execution_count": 285,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"vendas_todos_historicos = df_final.columns[36:54]\n",
|
||
"\n",
|
||
"df_final['MEDIANA DO HISTÓRICO'] = df_final[vendas_todos_historicos].median(axis=1)\n",
|
||
"\n",
|
||
"df_final['MEDIA DO HISTÓRICO'] = df_final[vendas_todos_historicos].mean(axis=1)\n",
|
||
"\n",
|
||
"medi = df_final.groupby(['CANAL','UF','Código'])['MEDIANA DO HISTÓRICO'].max().reset_index()\n",
|
||
"medi = medi.rename(columns={'MEDIANA DO HISTÓRICO':'med_por_canal'})\n",
|
||
"\n",
|
||
"df_final = pd.merge(left=df_final, right=medi,on=['CANAL','UF','Código'],how='left')\n",
|
||
"\n",
|
||
"medi"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 286,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'202414'"
|
||
]
|
||
},
|
||
"execution_count": 286,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[38]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 287,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"mesmo_ciclo_ano_passado = df_final.columns[38]\n",
|
||
"ciclo_ano_passado = df_final.columns[38]\n",
|
||
"df_final[ciclo_ano_passado] = df_final[mesmo_ciclo_ano_passado]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 288,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['CRESCIMENTO_GERAL'] = 0.2\n",
|
||
"df_final['CRESCIMENTO'] = 0.2"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 289,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(49398, 77)"
|
||
]
|
||
},
|
||
"execution_count": 289,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['CRESCIMENTO_FINAL'] = df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'] #crescimento do pdv\n",
|
||
"\n",
|
||
"df_final['CRESCIMENTO_FINAL'] = np.where(df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO']>0.8,0.8,df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'])\n",
|
||
"\n",
|
||
"df_final['CRESCIMENTO_FINAL'] = np.where(df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO']<0,0,df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'])\n",
|
||
"\n",
|
||
"df_final['MEDIANA DO HISTÓRICO2'] = np.where(df_final['MEDIANA DO HISTÓRICO']==0,df_final['MEDIA DO HISTÓRICO'] ,df_final['MEDIANA DO HISTÓRICO'])\n",
|
||
"\n",
|
||
"# Primeiro cálculo intermediário\n",
|
||
"df_final['PV GINSENG'] = np.where(df_final['CRESCIMENTO_FINAL'] * df_final[ciclo_ano_passado] + df_final[ciclo_ano_passado] <1,\n",
|
||
" round(df_final['CRESCIMENTO_FINAL'] * df_final['MEDIANA DO HISTÓRICO2']+ df_final['MEDIANA DO HISTÓRICO2'],0), \n",
|
||
" round(df_final['CRESCIMENTO_FINAL']*df_final[ciclo_ano_passado]+df_final[ciclo_ano_passado],0))\n",
|
||
"\n",
|
||
"\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 290,
|
||
"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_x</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição</th>\n",
|
||
" <th>IAF</th>\n",
|
||
" <th>Tipo de pedido</th>\n",
|
||
" <th>Foco</th>\n",
|
||
" <th>Unidade de negócio</th>\n",
|
||
" <th>Marca</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>PICO DE VENDAS 2024</th>\n",
|
||
" <th>Pico Vendas Ultimos 6 ciclos</th>\n",
|
||
" <th>CRESCIMENTO_GERAL</th>\n",
|
||
" <th>MEDIANA DO HISTÓRICO</th>\n",
|
||
" <th>MEDIA DO HISTÓRICO</th>\n",
|
||
" <th>med_por_canal</th>\n",
|
||
" <th>CRESCIMENTO</th>\n",
|
||
" <th>CRESCIMENTO_FINAL</th>\n",
|
||
" <th>MEDIANA DO HISTÓRICO2</th>\n",
|
||
" <th>PV GINSENG</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>20.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>5.000000</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.4</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>45.0</td>\n",
|
||
" <td>18.0</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>12.789474</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.4</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>59.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.578947</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.4</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>2.421053</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>C202514</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48141</td>\n",
|
||
" <td>ACCORDES DES COL 80ml V5</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>BOTI</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>2.473684</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 77 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo_x Região Canal Código Descrição IAF \\\n",
|
||
"0 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"1 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"2 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"3 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"4 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... PICO DE VENDAS 2024 \\\n",
|
||
"0 0.0 0.0 0.0 BOTI ... 20.0 \n",
|
||
"1 0.0 0.0 0.0 BOTI ... 45.0 \n",
|
||
"2 0.0 0.0 0.0 BOTI ... 11.0 \n",
|
||
"3 0.0 0.0 0.0 BOTI ... 8.0 \n",
|
||
"4 0.0 0.0 0.0 BOTI ... 11.0 \n",
|
||
"\n",
|
||
" Pico Vendas Ultimos 6 ciclos CRESCIMENTO_GERAL MEDIANA DO HISTÓRICO \\\n",
|
||
"0 7.0 0.2 3.0 \n",
|
||
"1 18.0 0.2 8.0 \n",
|
||
"2 3.0 0.2 2.0 \n",
|
||
"3 3.0 0.2 1.0 \n",
|
||
"4 2.0 0.2 1.0 \n",
|
||
"\n",
|
||
" MEDIA DO HISTÓRICO med_por_canal CRESCIMENTO CRESCIMENTO_FINAL \\\n",
|
||
"0 5.000000 8.0 0.2 0.4 \n",
|
||
"1 12.789474 8.0 0.2 0.4 \n",
|
||
"2 2.578947 8.0 0.2 0.4 \n",
|
||
"3 2.421053 8.0 0.2 0.4 \n",
|
||
"4 2.473684 8.0 0.2 0.4 \n",
|
||
"\n",
|
||
" MEDIANA DO HISTÓRICO2 PV GINSENG \n",
|
||
"0 3.0 13.0 \n",
|
||
"1 8.0 59.0 \n",
|
||
"2 2.0 7.0 \n",
|
||
"3 1.0 8.0 \n",
|
||
"4 1.0 8.0 \n",
|
||
"\n",
|
||
"[5 rows x 77 columns]"
|
||
]
|
||
},
|
||
"execution_count": 290,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 291,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.drop(columns=['MEDIANA DO HISTÓRICO2'] )"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 292,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202414', '202415', '202416', '202417', '202501', '202502', '202503'], dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 292,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[38:45]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 293,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202508', '202509', '202510', '202511', '202512'], dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 293,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[49:54]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 294,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.rename(columns={df_final.columns[49]: \"C-4\", df_final.columns[50]: \"C-3\",df_final.columns[51]: \"C-2\",df_final.columns[52]: \"C-1\",df_final.columns[53]: \"Atual\"})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 295,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'202413'"
|
||
]
|
||
},
|
||
"execution_count": 295,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[37]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 296,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final.drop(columns=df_final.columns[39:49], inplace=True)\n",
|
||
"df_final.drop(columns=df_final.columns[37], inplace=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 297,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['COBERTURA ATUAL'] = df_final['ESTOQUE ATUAL'].astype(float) / df_final['DDV PREVISTO'].astype(float)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 298,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['COBERTURA ATUAL'] = df_final['COBERTURA ATUAL'].replace([np.inf, -np.inf], 0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 299,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"COBERTURA ATUAL\n",
|
||
"0.000000 10548\n",
|
||
"100.000000 1253\n",
|
||
"50.000000 806\n",
|
||
"33.333333 689\n",
|
||
"200.000000 605\n",
|
||
" ... \n",
|
||
"338.235294 1\n",
|
||
"622.727273 1\n",
|
||
"104.347826 1\n",
|
||
"377.777778 1\n",
|
||
"2.127660 1\n",
|
||
"Name: count, Length: 2608, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 299,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['COBERTURA ATUAL'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 300,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final[\"DDV PREVISTO\"] = df_final[\"DDV PREVISTO\"].astype(float)\n",
|
||
"\n",
|
||
"df_final[\"DDV PREVISTO\"] = df_final[\"DDV PREVISTO\"].fillna(0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 301,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"colunas_chave = [c for c in df_final.columns if c not in [\"DDV PREVISTO\", \"COBERTURA ATUAL\"]]\n",
|
||
"\n",
|
||
"\n",
|
||
"# encontrar índice da linha com maior DDV e depois maior COBERTURA\n",
|
||
"idx = (\n",
|
||
"df_final\n",
|
||
".sort_values([\"DDV PREVISTO\", \"COBERTURA ATUAL\"], ascending=[False, False])\n",
|
||
".groupby(colunas_chave, as_index=False)\n",
|
||
".head(1)\n",
|
||
")\n",
|
||
"\n",
|
||
"\n",
|
||
"# reordenar colunas como no original\n",
|
||
"df_final_dedup = idx[df_final.columns.tolist()].reset_index(drop=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 302,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"('Ação consumidor',\n",
|
||
" 'Percentual de desconto consumidor',\n",
|
||
" 'Ação revendedor',\n",
|
||
" 'Percentual de desconto revendedor',\n",
|
||
" '202408')"
|
||
]
|
||
},
|
||
"execution_count": 302,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Columns to bring up front\n",
|
||
"priority_cols = [\n",
|
||
" 'SKU',\t'Marca',\t'INICIO CICLO',\n",
|
||
" 'FIM CICLO',\t'DURAÇÃO',\t'PRECO DE COMPRA',\t'PRECO DE VENDA',\n",
|
||
" 'UFPRODUTO',\t'Item Desativado',\t'Data Prevista Regularização',\n",
|
||
" 'ANALISTA',\t'UF',\t'CANAL',\t'PDV',\t'DESCRIÇÃO PDV',\t'Classe',\n",
|
||
" 'Descrição',\t'Categoria',\n",
|
||
"\t'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\t'COBERTURA ATUAL',\n",
|
||
" 'Pedido Pendente',\t'PICO DE VENDAS 2024','Pico Vendas Ultimos 6 ciclos',\n",
|
||
" 'C-4',\t'C-3',\t'C-2',\t'C-1',\t'Histórico de Vendas do Ciclo Atual',\n",
|
||
" 'Dias sem venda'\n",
|
||
"]\n",
|
||
"\n",
|
||
"# All remaining columns\n",
|
||
"other_cols = [col for col in df_final_dedup.columns if col not in priority_cols]\n",
|
||
"\n",
|
||
"# Reorder\n",
|
||
"'Ação consumidor', 'Percentual de desconto consumidor', 'Ação revendedor', 'Percentual de desconto revendedor', '202408'\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 303,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup.drop(columns=['dias_ate_inicio','SKU_FINAL',\n",
|
||
" 'CRESCIMENTO'],inplace=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 304,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup['INICIO CICLO'] = pd.to_datetime(df_final_dedup['INICIO CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')\n",
|
||
"\n",
|
||
"df_final_dedup['FIM CICLO'] = pd.to_datetime(df_final_dedup['FIM CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 305,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup['Percentual de desconto revendedor'] = np.where((df_final_dedup['Percentual de desconto revendedor'].isna()) & (~df_final_dedup['Percentual de desconto consumidor'].isna()),df_final_dedup['Percentual de desconto consumidor'],df_final_dedup['Percentual de desconto revendedor'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 306,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_pdv_origi['PDV'] = df_pdv_origi['PDV'].astype('Int64')\n",
|
||
"df_final_dedup['PDV'] = df_final_dedup['PDV'].astype('Int64')\n",
|
||
"\n",
|
||
"\n",
|
||
"df_final_dedup = pd.merge(left=df_final_dedup,right=df_pdv_origi[['PDV','CANAL','UF']],how='left',on='PDV')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 307,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"np.int64(0)"
|
||
]
|
||
},
|
||
"execution_count": 307,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup['Código'].isna().sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 308,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_irece_agrupado = df_irece.groupby(['PDV','Código','Ciclo'])['Quantidade'].sum().reset_index()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 309,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup = df_final_dedup.rename(columns={'CANAL_x':'CANAL','UF_X':'UF','Marca':'LINHA'})\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 310,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup = df_final_dedup.rename(columns={'UF_x':'UF','DESCRICAO_y':'DESCRICAO'})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 311,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup = df_final_dedup.drop(columns={'CANAL_y', 'UF_y'})\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 312,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup['Estoque Total'] = df_final_dedup['ESTOQUE ATUAL'].astype(float) + df_final_dedup['ESTOQUE EM TRANSITO'].astype(float) + df_final_dedup['PEDIDO PENDENTE'].astype(float)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 313,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'202414'"
|
||
]
|
||
},
|
||
"execution_count": 313,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ciclo_ano_passado"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 314,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup = df_final_dedup[['DURAÇÃO','CANAL','ANALISTA','SUPERVISOR','UF','chave','PDV','DESCRIÇÃO PDV','Código','DESCRICAO','LINHA','Categoria','curva','Percentual de desconto consumidor','Ação consumidor',\n",
|
||
" 'Percentual de desconto revendedor','Ação revendedor','C-4', 'C-3', 'C-2', 'C-1','Atual','ESTOQUE ATUAL',ciclo_ano_passado ,'ESTOQUE EM TRANSITO','PEDIDO PENDENTE','Estoque Total',\n",
|
||
" 'DDV PREVISTO','COBERTURA ATUAL','proj_mar', 'proj_mar+1','MEDIA DO HISTÓRICO','PICO DE VENDAS 2024','Pico Vendas Ultimos 6 ciclos','PRECO DE COMPRA',\n",
|
||
" 'PRECO DE VENDA','PV GINSENG']]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 315,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup['Percentual de desconto revendedor'] = np.where(df_final_dedup['Percentual de desconto revendedor'] == '0,00', df_final_dedup['Percentual de desconto consumidor'],df_final_dedup['Percentual de desconto revendedor'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 316,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'202414'"
|
||
]
|
||
},
|
||
"execution_count": 316,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ciclo_ano_passado"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 317,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup = df_final_dedup.drop_duplicates()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 318,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup['Valor Sugestão'] = \"\"\n",
|
||
"\n",
|
||
"df_final_dedup['Sugestão Comercial'] = \"\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 319,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"DDV PREVISTO float64\n",
|
||
"COBERTURA ATUAL float64\n",
|
||
"dtype: object"
|
||
]
|
||
},
|
||
"execution_count": 319,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup[['DDV PREVISTO',\n",
|
||
" 'COBERTURA ATUAL',]].dtypes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 320,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup[ 'DDV PREVISTO'] = df_final_dedup['DDV PREVISTO'].fillna(0)\n",
|
||
"\n",
|
||
"df_final_dedup = df_final_dedup.drop_duplicates()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 321,
|
||
"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>DURAÇÃO</th>\n",
|
||
" <th>CANAL</th>\n",
|
||
" <th>ANALISTA</th>\n",
|
||
" <th>SUPERVISOR</th>\n",
|
||
" <th>UF</th>\n",
|
||
" <th>chave</th>\n",
|
||
" <th>PDV</th>\n",
|
||
" <th>DESCRIÇÃO PDV</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>DESCRICAO</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>proj_mar</th>\n",
|
||
" <th>proj_mar+1</th>\n",
|
||
" <th>MEDIA DO HISTÓRICO</th>\n",
|
||
" <th>PICO DE VENDAS 2024</th>\n",
|
||
" <th>Pico Vendas Ultimos 6 ciclos</th>\n",
|
||
" <th>PRECO DE COMPRA</th>\n",
|
||
" <th>PRECO DE VENDA</th>\n",
|
||
" <th>PV GINSENG</th>\n",
|
||
" <th>Valor Sugestão</th>\n",
|
||
" <th>Sugestão Comercial</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>21</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>JEFFERSON</td>\n",
|
||
" <td>Juliana Vasconcelos</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>2371184387</td>\n",
|
||
" <td>23711</td>\n",
|
||
" <td>ER VITORIA DA CONQUISTA</td>\n",
|
||
" <td>84387</td>\n",
|
||
" <td>MALBEC DES COL V6 100ml</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1505.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>545.894737</td>\n",
|
||
" <td>2734.0</td>\n",
|
||
" <td>857.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>412.0</td>\n",
|
||
" <td></td>\n",
|
||
" <td></td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1 rows × 39 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" DURAÇÃO CANAL ANALISTA SUPERVISOR UF chave PDV \\\n",
|
||
"1 21 VD JEFFERSON Juliana Vasconcelos VDC 2371184387 23711 \n",
|
||
"\n",
|
||
" DESCRIÇÃO PDV Código DESCRICAO ... proj_mar \\\n",
|
||
"1 ER VITORIA DA CONQUISTA 84387 MALBEC DES COL V6 100ml ... 1505.0 \n",
|
||
"\n",
|
||
" proj_mar+1 MEDIA DO HISTÓRICO PICO DE VENDAS 2024 \\\n",
|
||
"1 0.0 545.894737 2734.0 \n",
|
||
"\n",
|
||
" Pico Vendas Ultimos 6 ciclos PRECO DE COMPRA PRECO DE VENDA PV GINSENG \\\n",
|
||
"1 857.0 0.0 0.0 412.0 \n",
|
||
"\n",
|
||
" Valor Sugestão Sugestão Comercial \n",
|
||
"1 \n",
|
||
"\n",
|
||
"[1 rows x 39 columns]"
|
||
]
|
||
},
|
||
"execution_count": 321,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup[df_final_dedup['chave'] == '2371184387'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 322,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"1 94.98\n",
|
||
"Name: DDV PREVISTO, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 322,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup[df_final_dedup['chave'] == '2371184387']['DDV PREVISTO'].head()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 323,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Export to Excel\n",
|
||
"output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\promoção_BOTI_{ciclo_mais2}.{hoje}.xlsx'\n",
|
||
"with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n",
|
||
" df_final_dedup.to_excel(writer, index=False)\n",
|
||
"\n",
|
||
"# Apply styles\n",
|
||
"wb = load_workbook(output_file)\n",
|
||
"ws = wb['Sheet1']\n",
|
||
"\n",
|
||
"# Style header\n",
|
||
"header_fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid') # Light Blue\n",
|
||
"header_font = Font(color='FFFFFF', bold=True) # White & Bold\n",
|
||
"\n",
|
||
"for cell in ws[1]:\n",
|
||
" cell.fill = header_fill\n",
|
||
" cell.font = header_font\n",
|
||
"\n",
|
||
"# Style rows: gray/white alternating\n",
|
||
"gray_fill = PatternFill(start_color='DDDDDD', end_color='DDDDDD', fill_type='solid') # Light gray\n",
|
||
"\n",
|
||
"for i, row in enumerate(ws.iter_rows(min_row=2, max_row=ws.max_row), start=2):\n",
|
||
" if i % 2 == 0:\n",
|
||
" for cell in row:\n",
|
||
" cell.fill = gray_fill\n",
|
||
"\n",
|
||
"# Save styled workbook\n",
|
||
"wb.save(output_file)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"coisas q saem\n",
|
||
"\n",
|
||
"Lançamento\n",
|
||
"Subcategoria\n",
|
||
"Projeção Próximo Ciclo \n",
|
||
"Promoção Próximo Ciclo\n",
|
||
"Compra inteligente semanal/Sugestão de compra\n",
|
||
"Compra inteligente Próximo Ciclo\n",
|
||
"Planograma\n",
|
||
"Carteira Bloqueada Para Novos Pedidos\n",
|
||
"Quantidade por caixa\n",
|
||
"Preço Sell In\n",
|
||
"Quantidade\n",
|
||
"Item analisado\n",
|
||
"Tipo Preço\n",
|
||
"\n",
|
||
">>>>>>>>>>>>>NAO ESTÁ PEGANDO O MERGE COM O DF_ESTOQUE\n",
|
||
"\n",
|
||
"\n",
|
||
"CRIAR PROJEÇÃO DE VENDA DO CICLO ATUAL\n",
|
||
"Compra inteligente Próximo Ciclo + 1 >>>>>>> RENAME PRA NOROMAL"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.13.2"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|