5867 lines
188 KiB
Plaintext
5867 lines
188 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": 4,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C15\\TABELA DE PEDIDOS\\Pedidos Semanais Especiais - BOT - 202515 (1).xlsx\")\n",
|
||
"\n",
|
||
"df_tabela = df_tabela[df_tabela['Ação revendedor'].notna() | df_tabela['Ação consumidor'].notna()]\n",
|
||
"\n",
|
||
"df_tabela = df_tabela[df_tabela['Região'] == 'NNE'] \n",
|
||
"\n",
|
||
"df_tabela = df_tabela[(df_tabela['Canal'] != 'Ecomm')]\n",
|
||
"\n",
|
||
"#df_tabela['Canal'] = np.where((df_tabela['Canal'] == \"Loja\") | (df_tabela['Canal'] == \"Todos\") | (df_tabela['Canal'] == \"Loja | VD\"),\"TODOS\",\"VD\")\n",
|
||
"\n",
|
||
"df_tabela = df_tabela[(df_tabela['Categoria'] != \"EMBALAGENS\") | (df_tabela['Categoria'] != \"SUPORTE À VENDA\")]\n",
|
||
"\n",
|
||
"#df_tabela = df_tabela[df_tabela['Tipo de pedido'] == 'Semanal']\n",
|
||
"\n",
|
||
"df_tabela = df_tabela[~df_tabela['Descrição'].str.contains('PRM')]\n",
|
||
"\n",
|
||
"df_tabela = df_tabela[df_tabela['Tipo de produto']!= 'EDICAO LIMITADA']\n",
|
||
"\n",
|
||
"df_tabela['Ação revendedor'] = np.where(df_tabela['Ação revendedor'].isna(),df_tabela['Ação consumidor'],df_tabela['Ação revendedor'])\n",
|
||
"\n",
|
||
"df_tabela['Percentual de desconto revendedor'] = np.where(df_tabela['Percentual de desconto revendedor'].isna(),df_tabela['Percentual de desconto consumidor'],df_tabela['Percentual de desconto revendedor'])\n",
|
||
"\n",
|
||
"df_tabela['MATCH'] = 1\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_2580\\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": 6,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"dfi['SKU2'] = dfi['SKU2'].fillna(\"-\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>PDV</th>\n",
|
||
" <th>SKU</th>\n",
|
||
" <th>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>20998</td>\n",
|
||
" <td>79437</td>\n",
|
||
" <td>-</td>\n",
|
||
" <td>79437</td>\n",
|
||
" <td>QDB GLIT SLT P/OLHO ROSELITTER 1g RPCK</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>C202413</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>4560</td>\n",
|
||
" <td>51226</td>\n",
|
||
" <td>-</td>\n",
|
||
" <td>51226</td>\n",
|
||
" <td>CBEM SAB BARRA NUVEM V5 2x80g</td>\n",
|
||
" <td>30.0</td>\n",
|
||
" <td>C202413</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>21277</td>\n",
|
||
" <td>48290</td>\n",
|
||
" <td>-</td>\n",
|
||
" <td>48290</td>\n",
|
||
" <td>NSPA DES COL BDY SPLSH AMEI 200ml V2</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>C202414</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>23701</td>\n",
|
||
" <td>56810</td>\n",
|
||
" <td>-</td>\n",
|
||
" <td>56810</td>\n",
|
||
" <td>MATCH COND SCIENCE CRESCIMENTO V2 280ml</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>C202505</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>56027</td>\n",
|
||
" <td>-</td>\n",
|
||
" <td>56027</td>\n",
|
||
" <td>MEN SAB BARRA 2x90g</td>\n",
|
||
" <td>37.0</td>\n",
|
||
" <td>C202506</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV SKU SKU2 SKU_FINAL DESCRICAO \\\n",
|
||
"0 20998 79437 - 79437 QDB GLIT SLT P/OLHO ROSELITTER 1g RPCK \n",
|
||
"1 4560 51226 - 51226 CBEM SAB BARRA NUVEM V5 2x80g \n",
|
||
"2 21277 48290 - 48290 NSPA DES COL BDY SPLSH AMEI 200ml V2 \n",
|
||
"3 23701 56810 - 56810 MATCH COND SCIENCE CRESCIMENTO V2 280ml \n",
|
||
"4 5699 56027 - 56027 MEN SAB BARRA 2x90g \n",
|
||
"\n",
|
||
" VENDAS_CICLO Ciclo \n",
|
||
"0 1.0 C202413 \n",
|
||
"1 30.0 C202413 \n",
|
||
"2 3.0 C202414 \n",
|
||
"3 2.0 C202505 \n",
|
||
"4 37.0 C202506 "
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"dfi = dfi[dfi['SKU2'] == \"-\"]\n",
|
||
"\n",
|
||
"dfi.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"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>0.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>1.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 21 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV SKU_FINAL DESCRICAO C202412 C202413 \\\n",
|
||
"0 12522 1004 FLORATTA DES COL MY BLUE 75ml 0.0 15.0 \n",
|
||
"1 12522 1080 INTENSE GLOS LAB BUBBAL TUT/FRUT 5ml 0.0 0.0 \n",
|
||
"2 12522 1296 PMPCK THE BLEND DES ANTIT AER 2x75g 0.0 1.0 \n",
|
||
"3 12522 1302 PMPCK LILY DES ANTIT AER 2x75g 1.0 4.0 \n",
|
||
"4 12522 1314 PMPCK ZAAD DES ANTIT AER 2x75g 0.0 2.0 \n",
|
||
"\n",
|
||
" C202414 C202415 C202416 C202417 C202501 ... C202503 C202504 \\\n",
|
||
"0 2.0 3.0 56.0 6.0 1.0 ... 1.0 5.0 \n",
|
||
"1 4.0 0.0 10.0 2.0 2.0 ... 2.0 3.0 \n",
|
||
"2 3.0 3.0 2.0 0.0 0.0 ... 0.0 0.0 \n",
|
||
"3 3.0 5.0 6.0 0.0 0.0 ... 0.0 0.0 \n",
|
||
"4 3.0 1.0 1.0 0.0 0.0 ... 0.0 0.0 \n",
|
||
"\n",
|
||
" C202505 C202506 C202507 C202508 C202509 C202510 C202511 C202512 \n",
|
||
"0 12.0 7.0 2.0 0.0 1.0 2.0 5.0 2.0 \n",
|
||
"1 1.0 7.0 17.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 3.0 4.0 0.0 4.0 4.0 2.0 1.0 \n",
|
||
"4 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 \n",
|
||
"\n",
|
||
"[5 rows x 21 columns]"
|
||
]
|
||
},
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"# 1. Agrupamento\n",
|
||
"df_agrupado = dfi.groupby(['PDV', 'SKU_FINAL', 'DESCRICAO', 'Ciclo'], as_index=False)['VENDAS_CICLO'].sum()\n",
|
||
"\n",
|
||
"# 2. Pivotar o DataFrame\n",
|
||
"df_pivotado = df_agrupado.pivot_table(\n",
|
||
" index=['PDV', 'SKU_FINAL', 'DESCRICAO'],\n",
|
||
" columns='Ciclo',\n",
|
||
" values='VENDAS_CICLO',\n",
|
||
" fill_value=0 # Substitui NaN por 0\n",
|
||
")\n",
|
||
"\n",
|
||
"# 3. Resetar o índice para deixar como DataFrame normal (opcional)\n",
|
||
"df_pivotadowawa = df_pivotado.reset_index()\n",
|
||
"\n",
|
||
"# 4. (Opcional) Renomear colunas com prefixo \"Ciclo_\"\n",
|
||
"df_pivotadowawa.columns.name = None\n",
|
||
"df_pivotadowawa = df_pivotadowawa.rename(columns=lambda x: f'Ciclo_{x}' if isinstance(x, (int, str)) and str(x).isdigit() else x)\n",
|
||
"\n",
|
||
"# Resultado final\n",
|
||
"df_pivotadowawa.head()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"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",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>0 rows × 21 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
"Empty DataFrame\n",
|
||
"Columns: [PDV, SKU_FINAL, DESCRICAO, C202412, C202413, C202414, C202415, C202416, C202417, C202501, C202502, C202503, C202504, C202505, C202506, C202507, C202508, C202509, C202510, C202511, C202512]\n",
|
||
"Index: []\n",
|
||
"\n",
|
||
"[0 rows x 21 columns]"
|
||
]
|
||
},
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_pivotadowawa[(df_pivotadowawa['SKU_FINAL'] == '1634') & (df_pivotadowawa['PDV'] == '20998')]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"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": 11,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>PDV</th>\n",
|
||
" <th>CANAL</th>\n",
|
||
" <th>DESCRIÇÃO PDV</th>\n",
|
||
" <th>PDV DESC</th>\n",
|
||
" <th>UF</th>\n",
|
||
" <th>MARCA</th>\n",
|
||
" <th>ANALISTA</th>\n",
|
||
" <th>SUPERVISOR</th>\n",
|
||
" <th>MATCH</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>43</th>\n",
|
||
" <td>21007</td>\n",
|
||
" <td>LJ</td>\n",
|
||
" <td>MOREIRA 2</td>\n",
|
||
" <td>21007-MOREIRA 2</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>O BOTICARIO</td>\n",
|
||
" <td>LUAN</td>\n",
|
||
" <td>Maxwell Vieira</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV CANAL DESCRIÇÃO PDV PDV DESC UF MARCA ANALISTA \\\n",
|
||
"43 21007 LJ MOREIRA 2 21007-MOREIRA 2 AL O BOTICARIO LUAN \n",
|
||
"\n",
|
||
" SUPERVISOR MATCH \n",
|
||
"43 Maxwell Vieira 1 "
|
||
]
|
||
},
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_pdv[df_pdv['PDV']==21007]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_pdv = df_pdv.drop(columns=['PDV DESC'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_2580\\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": 14,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_draft = df_draft_"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"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>128590</th>\n",
|
||
" <td>24293</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>128840</th>\n",
|
||
" <td>21278</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>128956</th>\n",
|
||
" <td>12826</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>129361</th>\n",
|
||
" <td>4560</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>129451</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0,05</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>337558</th>\n",
|
||
" <td>21647</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>345348</th>\n",
|
||
" <td>20009</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>349112</th>\n",
|
||
" <td>20968</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>358656</th>\n",
|
||
" <td>12830</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>359288</th>\n",
|
||
" <td>20997</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>73 rows × 12 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV SKU DESCRICAO curva categoria \\\n",
|
||
"128590 24293 1634 NSPA GEL ESF CPO MORANGO RUBY 175G None None \n",
|
||
"128840 21278 1634 NSPA GEL ESF CPO MORANGO RUBY 175G None None \n",
|
||
"128956 12826 1634 NSPA GEL ESF CPO MORANGO RUBY 175G None None \n",
|
||
"129361 4560 1634 NSPA GEL ESF CPO MORANGO RUBY 175G None None \n",
|
||
"129451 5699 1634 NSPA GEL ESF CPO MORANGO RUBY 175G None None \n",
|
||
"... ... ... ... ... ... \n",
|
||
"337558 21647 1634 NSPA GEL ESF CPO MORANGO RUBY 175G None None \n",
|
||
"345348 20009 1634 NSPA GEL ESF CPO MORANGO RUBY 175G None None \n",
|
||
"349112 20968 1634 NSPA GEL ESF CPO MORANGO RUBY 175G None None \n",
|
||
"358656 12830 1634 NSPA GEL ESF CPO MORANGO RUBY 175G None None \n",
|
||
"359288 20997 1634 NSPA GEL ESF CPO MORANGO RUBY 175G None None \n",
|
||
"\n",
|
||
" proj_mar proj_mar+1 ESTOQUE ATUAL ESTOQUE EM TRANSITO \\\n",
|
||
"128590 NaN NaN 3 0 \n",
|
||
"128840 NaN NaN 2 0 \n",
|
||
"128956 NaN NaN 3 0 \n",
|
||
"129361 NaN NaN 5 0 \n",
|
||
"129451 NaN NaN 4 0 \n",
|
||
"... ... ... ... ... \n",
|
||
"337558 NaN NaN 4 0 \n",
|
||
"345348 NaN NaN 10 0 \n",
|
||
"349112 NaN NaN 8 0 \n",
|
||
"358656 NaN NaN 5 0 \n",
|
||
"359288 NaN NaN 3 0 \n",
|
||
"\n",
|
||
" PEDIDO PENDENTE DDV PREVISTO preço \n",
|
||
"128590 0 0 NaN \n",
|
||
"128840 0 0 NaN \n",
|
||
"128956 0 0 NaN \n",
|
||
"129361 0 0 NaN \n",
|
||
"129451 0 0,05 NaN \n",
|
||
"... ... ... ... \n",
|
||
"337558 0 0 NaN \n",
|
||
"345348 0 0 NaN \n",
|
||
"349112 0 0 NaN \n",
|
||
"358656 0 0 NaN \n",
|
||
"359288 0 0 NaN \n",
|
||
"\n",
|
||
"[73 rows x 12 columns]"
|
||
]
|
||
},
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_draft[df_draft['SKU']=='1634']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(350945, 12)"
|
||
]
|
||
},
|
||
"execution_count": 16,
|
||
"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": 17,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_2580\\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_2580\\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_2580\\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": 17,
|
||
"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": 18,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_2580\\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_2580\\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_2580\\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": 19,
|
||
"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": 20,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_tabela = df_tabela.drop_duplicates()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"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=['Tipo Preço','CATEGORIA','LINHA','MARCA'])\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_pivotadowawa['SKU_FINAL'] = df_pivotadowawa['SKU_FINAL'].astype('str')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0 1004\n",
|
||
"1 1080\n",
|
||
"2 1296\n",
|
||
"3 1302\n",
|
||
"4 1314\n",
|
||
"Name: SKU_FINAL, dtype: object"
|
||
]
|
||
},
|
||
"execution_count": 23,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_pivotadowawa['SKU_FINAL'] = df_pivotadowawa['SKU_FINAL'].astype(str)\n",
|
||
"\n",
|
||
"df_pivotadowawa['SKU_FINAL'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"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>preço</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
"Empty DataFrame\n",
|
||
"Columns: [PDV, SKU, curva, categoria, proj_mar, proj_mar+1, ESTOQUE ATUAL, ESTOQUE EM TRANSITO, PEDIDO PENDENTE, DDV PREVISTO, preço]\n",
|
||
"Index: []"
|
||
]
|
||
},
|
||
"execution_count": 24,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_draft[df_draft['SKU']=='1634']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_draft = pd.merge(df_draft,df_pivotadowawa,left_on=['PDV','SKU'],right_on=['PDV','SKU_FINAL'],how='inner')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>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",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>0 rows × 31 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
"Empty DataFrame\n",
|
||
"Columns: [PDV, SKU, curva, categoria, proj_mar, proj_mar+1, ESTOQUE ATUAL, ESTOQUE EM TRANSITO, PEDIDO PENDENTE, DDV PREVISTO, preço, SKU_FINAL, DESCRICAO, C202412, C202413, C202414, C202415, C202416, C202417, C202501, C202502, C202503, C202504, C202505, C202506, C202507, C202508, C202509, C202510, C202511, C202512]\n",
|
||
"Index: []\n",
|
||
"\n",
|
||
"[0 rows x 31 columns]"
|
||
]
|
||
},
|
||
"execution_count": 26,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_draft[df_draft['SKU']=='1634']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 27,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(34265, 31)"
|
||
]
|
||
},
|
||
"execution_count": 27,
|
||
"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": 28,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"PDV\n",
|
||
"12522 445\n",
|
||
"12817 445\n",
|
||
"12818 445\n",
|
||
"12820 445\n",
|
||
"12823 445\n",
|
||
" ... \n",
|
||
"24257 445\n",
|
||
"24268 445\n",
|
||
"24269 445\n",
|
||
"24293 445\n",
|
||
"23813 445\n",
|
||
"Name: count, Length: 77, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 28,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['PDV'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 29,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>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>74681</th>\n",
|
||
" <td>3546</td>\n",
|
||
" <td>52627</td>\n",
|
||
" <td>B</td>\n",
|
||
" <td>CUIDADOS FACIAIS</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.09</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5.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>74682</th>\n",
|
||
" <td>3546</td>\n",
|
||
" <td>52627</td>\n",
|
||
" <td>B</td>\n",
|
||
" <td>CUIDADOS FACIAIS</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.09</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>2 rows × 31 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV SKU curva categoria proj_mar proj_mar+1 \\\n",
|
||
"74681 3546 52627 B CUIDADOS FACIAIS 2.0 2.0 \n",
|
||
"74682 3546 52627 B CUIDADOS FACIAIS 2.0 2.0 \n",
|
||
"\n",
|
||
" ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE DDV PREVISTO ... \\\n",
|
||
"74681 0.0 2.0 0.0 0.09 ... \n",
|
||
"74682 0.0 2.0 0.0 0.09 ... \n",
|
||
"\n",
|
||
" C202503 C202504 C202505 C202506 C202507 C202508 C202509 C202510 \\\n",
|
||
"74681 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"74682 0.0 0.0 4.0 3.0 0.0 3.0 4.0 1.0 \n",
|
||
"\n",
|
||
" C202511 C202512 \n",
|
||
"74681 0.0 0.0 \n",
|
||
"74682 3.0 3.0 \n",
|
||
"\n",
|
||
"[2 rows x 31 columns]"
|
||
]
|
||
},
|
||
"execution_count": 29,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_draft[(df_draft['SKU'] == '52627') & (df_draft['PDV'] == '3546') ].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['PDV', 'SKU', 'curva', 'categoria', 'proj_mar', 'proj_mar+1',\n",
|
||
" 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE',\n",
|
||
" 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'C202412', 'C202413', 'C202414',\n",
|
||
" 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n",
|
||
" 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C202509',\n",
|
||
" 'C202510', 'C202511', 'C202512'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_draft = df_draft.drop(columns='DESCRICAO')\n",
|
||
"\n",
|
||
"df_draft.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"PDV\n",
|
||
"20998 1209\n",
|
||
"23711 1190\n",
|
||
"20997 1182\n",
|
||
"20993 1172\n",
|
||
"20996 1161\n",
|
||
" ... \n",
|
||
"24269 490\n",
|
||
"24253 472\n",
|
||
"24268 452\n",
|
||
"24254 439\n",
|
||
"24258 336\n",
|
||
"Name: count, Length: 75, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 31,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"numericos = df_draft.columns[-18:]\n",
|
||
"\n",
|
||
"chaves = [col for col in df_draft.columns if col not in numericos]\n",
|
||
"\n",
|
||
"# 2. Fazer o groupby\n",
|
||
"df_draft_agg = (\n",
|
||
" df_draft\n",
|
||
" .groupby(chaves, as_index=False)[numericos]\n",
|
||
" .max()\n",
|
||
")\n",
|
||
"\n",
|
||
"df_draft_agg['PDV'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>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",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>0 rows × 30 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
"Empty DataFrame\n",
|
||
"Columns: [PDV, SKU, curva, categoria, proj_mar, proj_mar+1, ESTOQUE ATUAL, ESTOQUE EM TRANSITO, PEDIDO PENDENTE, DDV PREVISTO, preço, SKU_FINAL, C202412, C202413, C202414, C202415, C202416, C202417, C202501, C202502, C202503, C202504, C202505, C202506, C202507, C202508, C202509, C202510, C202511, C202512]\n",
|
||
"Index: []\n",
|
||
"\n",
|
||
"[0 rows x 30 columns]"
|
||
]
|
||
},
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_draft[df_draft['SKU']==1634]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_draft1 = df_draft_agg"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 34,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['PDV', 'SKU', 'curva', 'categoria', 'proj_mar', 'proj_mar+1',\n",
|
||
" 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE',\n",
|
||
" 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'C202412', 'C202413', 'C202414',\n",
|
||
" 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n",
|
||
" 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C202509',\n",
|
||
" 'C202510', 'C202511', 'C202512'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 34,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_draft1.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_draft1.to_clipboard()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(34265, 60)"
|
||
]
|
||
},
|
||
"execution_count": 36,
|
||
"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_draft1,left_on=['PDV','Código'],right_on=['PDV','SKU'],how='left')\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"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>12936</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Especial</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>NATIVA SPA</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12937</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Especial</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>NATIVA SPA</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12938</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Especial</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>NATIVA SPA</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12939</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Especial</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>NATIVA SPA</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12940</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>NSPA GEL ESF CPO MORANGO RUBY 175G</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Especial</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>NATIVA SPA</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 60 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo Região Canal Código Descrição IAF \\\n",
|
||
"12936 202515 NNE Loja 1634 NSPA GEL ESF CPO MORANGO RUBY 175G Não \n",
|
||
"12937 202515 NNE Loja 1634 NSPA GEL ESF CPO MORANGO RUBY 175G Não \n",
|
||
"12938 202515 NNE Loja 1634 NSPA GEL ESF CPO MORANGO RUBY 175G Não \n",
|
||
"12939 202515 NNE Loja 1634 NSPA GEL ESF CPO MORANGO RUBY 175G Não \n",
|
||
"12940 202515 NNE Loja 1634 NSPA GEL ESF CPO MORANGO RUBY 175G Não \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... C202503 C202504 \\\n",
|
||
"12936 Especial Não BOT NATIVA SPA ... NaN NaN \n",
|
||
"12937 Especial Não BOT NATIVA SPA ... NaN NaN \n",
|
||
"12938 Especial Não BOT NATIVA SPA ... NaN NaN \n",
|
||
"12939 Especial Não BOT NATIVA SPA ... NaN NaN \n",
|
||
"12940 Especial Não BOT NATIVA SPA ... NaN NaN \n",
|
||
"\n",
|
||
" C202505 C202506 C202507 C202508 C202509 C202510 C202511 C202512 \n",
|
||
"12936 NaN NaN NaN NaN NaN NaN NaN NaN \n",
|
||
"12937 NaN NaN NaN NaN NaN NaN NaN NaN \n",
|
||
"12938 NaN NaN NaN NaN NaN NaN NaN NaN \n",
|
||
"12939 NaN NaN NaN NaN NaN NaN NaN NaN \n",
|
||
"12940 NaN NaN NaN NaN NaN NaN NaN NaN \n",
|
||
"\n",
|
||
"[5 rows x 60 columns]"
|
||
]
|
||
},
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final[df_final['Código']=='1634'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"PDV\n",
|
||
"12522 445\n",
|
||
"12817 445\n",
|
||
"12818 445\n",
|
||
"12820 445\n",
|
||
"12823 445\n",
|
||
" ... \n",
|
||
"24257 445\n",
|
||
"24268 445\n",
|
||
"24269 445\n",
|
||
"24293 445\n",
|
||
"23813 445\n",
|
||
"Name: count, Length: 77, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['PDV'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 39,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.drop(columns=['Sortimento P', 'Sortimento M',\n",
|
||
" 'Sortimento G','MARCA'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 40,
|
||
"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": 41,
|
||
"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>25</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 25 "
|
||
]
|
||
},
|
||
"execution_count": 41,
|
||
"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": 42,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"filtered_calendario['MATCH'] = 1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 44,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_draft['PDV'] = df_draft['PDV'].astype(str)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 45,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(34265, 61)"
|
||
]
|
||
},
|
||
"execution_count": 45,
|
||
"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": 46,
|
||
"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": 47,
|
||
"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>Descrição</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>ESTJ BOTI CALENDARIO ADVENTO NAT/24</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>ESTJ BOTI CALENDARIO ADVENTO NAT/24</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>ESTJ BOTI CALENDARIO ADVENTO NAT/24</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>MALBEC DES COL 20 ANOS 100ml</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>MALBEC DES COL 20 ANOS 100ml</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 Descrição UF PC PV \\\n",
|
||
"0 84918 84918 ESTJ BOTI CALENDARIO ADVENTO NAT/24 AL 393.70 1300.0 \n",
|
||
"1 84918 84918 ESTJ BOTI CALENDARIO ADVENTO NAT/24 BA 436.73 1300.0 \n",
|
||
"2 84918 84918 ESTJ BOTI CALENDARIO ADVENTO NAT/24 SE 379.94 1300.0 \n",
|
||
"3 54230 54230 MALBEC DES COL 20 ANOS 100ml AL 138.54 499.9 \n",
|
||
"4 54230 54230 MALBEC DES COL 20 ANOS 100ml BA 148.66 499.9 \n",
|
||
"\n",
|
||
" chave sku2 chave sku1 \n",
|
||
"0 AL84918 AL84918 \n",
|
||
"1 BA84918 BA84918 \n",
|
||
"2 SE84918 SE84918 \n",
|
||
"3 AL54230 AL54230 \n",
|
||
"4 BA54230 BA54230 "
|
||
]
|
||
},
|
||
"execution_count": 47,
|
||
"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": 48,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(34265, 68)"
|
||
]
|
||
},
|
||
"execution_count": 48,
|
||
"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": 49,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_bi_preco['SKU1'] = df_bi_preco['SKU1'].fillna(0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"(34265, 72)\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": 51,
|
||
"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": 52,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"CANAL\n",
|
||
"TODOS 27145\n",
|
||
"VD 7120\n",
|
||
"Name: count, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 52,
|
||
"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": 53,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.drop_duplicates()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 54,
|
||
"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": 55,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['Código'].astype(str)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 56,
|
||
"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": 57,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"np.int64(0)"
|
||
]
|
||
},
|
||
"execution_count": 57,
|
||
"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": 58,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', 'C202412', 'C202413', 'C202414', 'C202415', 'C202416',\n",
|
||
" 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n",
|
||
" 'C202506', 'C202507', 'C202508', 'C202509', 'C202510', 'C202511',\n",
|
||
" 'C202512', 'Ciclo_y', 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO',\n",
|
||
" 'dias_ate_inicio', 'Descrição_y', 'chave sku2', 'chave sku1',\n",
|
||
" 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 58,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 59,
|
||
"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": 60,
|
||
"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": 60,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_vdc[df_vdc['PRODUTO']== 74043].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 61,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.fillna(0)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 62,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', 'C202412', 'C202413', 'C202414', 'C202415', 'C202416',\n",
|
||
" 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n",
|
||
" 'C202506', 'C202507', 'C202508', 'C202509', 'C202510', 'C202511',\n",
|
||
" 'C202512', 'Ciclo_y', 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO',\n",
|
||
" 'dias_ate_inicio', 'Descrição_y', 'chave sku2', 'chave sku1',\n",
|
||
" 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n",
|
||
" 'PRODUTO', '202401', '202402', '202403', '202404', '202405', '202406',\n",
|
||
" '202407', '202408', '202409', '202410', '202411', '202412', '202413',\n",
|
||
" '202414', '202415', '202416'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 62,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 63,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202401', '202402', '202403', '202404', '202405', '202406', '202407',\n",
|
||
" '202408', '202409', '202410', '202411', '202412', '202413', '202414',\n",
|
||
" '202415', '202416'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 63,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[-16:]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 64,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final.to_clipboard()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 65,
|
||
"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:]]\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": 66,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', 'C202412', 'C202413', 'C202414', 'C202415', 'C202416',\n",
|
||
" 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n",
|
||
" 'C202506', 'C202507', 'C202508', 'C202509', 'C202510', 'C202511',\n",
|
||
" 'C202512', 'Ciclo_y', 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO',\n",
|
||
" 'dias_ate_inicio', 'Descrição_y', 'chave sku2', 'chave sku1',\n",
|
||
" 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n",
|
||
" 'PRODUTO'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 66,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 67,
|
||
"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": 67,
|
||
"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": 68,
|
||
"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": 69,
|
||
"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": 69,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[37:55]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 70,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', '202412', '202413', '202414', '202415', '202416', '202417',\n",
|
||
" '202501', '202502', '202503', '202504', '202505', '202506', '202507',\n",
|
||
" '202508', '202509', '202510', '202511', '202512', 'Ciclo_y',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio',\n",
|
||
" 'Descrição_y', 'chave sku2', 'chave sku1', 'PRECO DE COMPRA',\n",
|
||
" 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG', 'PRODUTO'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 70,
|
||
"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": 71,
|
||
"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_x</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>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>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>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>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>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>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>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>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>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>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_x IAF \\\n",
|
||
"0 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"1 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"2 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"3 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"4 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... C202415 C202416 C202417 \\\n",
|
||
"0 Semanal Não BOT ARBO ... 0.0 0.0 0.0 \n",
|
||
"1 Semanal Não BOT ARBO ... 0.0 0.0 0.0 \n",
|
||
"2 Semanal Não BOT ARBO ... 0.0 0.0 0.0 \n",
|
||
"3 Semanal Não BOT ARBO ... 0.0 0.0 0.0 \n",
|
||
"4 Semanal Não BOT ARBO ... 0.0 0.0 0.0 \n",
|
||
"\n",
|
||
" C202501 C202502 C202503 C202504 C202505 C202506 C202507 \n",
|
||
"0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"\n",
|
||
"[5 rows x 91 columns]"
|
||
]
|
||
},
|
||
"execution_count": 71,
|
||
"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": 72,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', '202412', '202413', '202414', '202415', '202416', '202417',\n",
|
||
" '202501', '202502', '202503', '202504', '202505', '202506', '202507',\n",
|
||
" '202508', '202509', '202510', '202511', '202512', 'Ciclo_y',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio',\n",
|
||
" 'Descrição_y', 'chave sku2', 'chave sku1', 'PRECO DE COMPRA',\n",
|
||
" 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG', 'PRODUTO', 'C202401',\n",
|
||
" 'C202402', 'C202403', 'C202404', 'C202405', 'C202406', 'C202407',\n",
|
||
" 'C202408', 'C202409', 'C202410', 'C202411', 'C202412', 'C202413',\n",
|
||
" 'C202414', 'C202415', 'C202416', 'C202417', 'C202501', 'C202502',\n",
|
||
" 'C202503', 'C202504', 'C202505', 'C202506', 'C202507'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 72,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 73,
|
||
"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": 74,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', '202412', '202413', '202414', '202415', '202416', '202417',\n",
|
||
" '202501', '202502', '202503', '202504', '202505', '202506', '202507',\n",
|
||
" '202508', '202509', '202510', '202511', '202512', 'Ciclo_y',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio',\n",
|
||
" 'Descrição_y', 'chave sku2', 'chave sku1', 'PRECO DE COMPRA',\n",
|
||
" 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG', 'PRODUTO'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 74,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 75,
|
||
"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"
|
||
]
|
||
}
|
||
],
|
||
"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"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 76,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.drop(columns=['Ciclo_y'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 77,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', '202412', '202413', '202414', '202415', '202416', '202417',\n",
|
||
" '202501', '202502', '202503', '202504', '202505', '202506', '202507',\n",
|
||
" '202508', '202509', '202510', '202511', '202512', 'INICIO CICLO',\n",
|
||
" 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'Descrição_y', 'chave sku2',\n",
|
||
" 'chave sku1', 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO',\n",
|
||
" 'PDV GINSENG', 'PRODUTO'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 77,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 78,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(34265, 66)"
|
||
]
|
||
},
|
||
"execution_count": 78,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final = df_final.drop_duplicates()\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 79,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['chave'] = df_final['PDV'].astype('str') + df_final['Código'].astype('str')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 80,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.fillna(0)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 81,
|
||
"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": 81,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[36:54]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 82,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', '202412', '202413', '202414', '202415', '202416', '202417',\n",
|
||
" '202501', '202502', '202503', '202504', '202505', '202506', '202507',\n",
|
||
" '202508', '202509', '202510', '202511', '202512', 'INICIO CICLO',\n",
|
||
" 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'Descrição_y', 'chave sku2',\n",
|
||
" 'chave sku1', 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO',\n",
|
||
" 'PDV GINSENG', 'PRODUTO', 'chave'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 82,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 83,
|
||
"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": 84,
|
||
"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": 85,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202413', '202414', '202415', '202416', '202417', '202501', '202502'], dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 85,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[37:44]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 86,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', '202412', '202413', '202414', '202415', '202416', '202417',\n",
|
||
" '202501', '202502', '202503', '202504', '202505', '202506', '202507',\n",
|
||
" '202508', '202509', '202510', '202511', '202512', 'INICIO CICLO',\n",
|
||
" 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'Descrição_y', 'chave sku2',\n",
|
||
" 'chave sku1', 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO',\n",
|
||
" 'PDV GINSENG', 'PRODUTO', 'chave', 'PICO DE VENDAS 2024',\n",
|
||
" 'Pico Vendas Ultimos 6 ciclos'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 86,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 87,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', '202412', '202413', '202414', '202415', '202416', '202417',\n",
|
||
" '202501', '202502', '202503', '202504', '202505', '202506', '202507',\n",
|
||
" '202508', '202509', '202510', '202511', '202512', 'INICIO CICLO',\n",
|
||
" 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'Descrição_y', 'chave sku2',\n",
|
||
" 'chave sku1', 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO',\n",
|
||
" 'PDV GINSENG', 'PRODUTO', 'chave', 'PICO DE VENDAS 2024',\n",
|
||
" 'Pico Vendas Ultimos 6 ciclos'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 87,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 88,
|
||
"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": 88,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[36:54]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 89,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Ciclo_x</th>\n",
|
||
" <th>Região</th>\n",
|
||
" <th>Canal</th>\n",
|
||
" <th>Código</th>\n",
|
||
" <th>Descrição_x</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 sku2</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>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>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>37.9</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1252250052</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>37.9</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1281750052</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>37.9</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1281850052</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>37.9</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1282050052</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>37.9</td>\n",
|
||
" <td>AL50052</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1282350052</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.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_x IAF \\\n",
|
||
"0 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"1 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"2 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"3 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"4 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... chave sku2 chave sku1 \\\n",
|
||
"0 Semanal Não BOT ARBO ... AL50052 AL50052 \n",
|
||
"1 Semanal Não BOT ARBO ... AL50052 AL50052 \n",
|
||
"2 Semanal Não BOT ARBO ... AL50052 AL50052 \n",
|
||
"3 Semanal Não BOT ARBO ... AL50052 AL50052 \n",
|
||
"4 Semanal Não BOT ARBO ... AL50052 AL50052 \n",
|
||
"\n",
|
||
" PRECO DE COMPRA PRECO DE VENDA UFPRODUTO PDV GINSENG PRODUTO chave \\\n",
|
||
"0 11.72 37.9 AL50052 0.0 0 1252250052 \n",
|
||
"1 11.72 37.9 AL50052 0.0 0 1281750052 \n",
|
||
"2 11.72 37.9 AL50052 0.0 0 1281850052 \n",
|
||
"3 11.72 37.9 AL50052 0.0 0 1282050052 \n",
|
||
"4 11.72 37.9 AL50052 0.0 0 1282350052 \n",
|
||
"\n",
|
||
" PICO DE VENDAS 2024 Pico Vendas Ultimos 6 ciclos \n",
|
||
"0 2.0 0.0 \n",
|
||
"1 5.0 0.0 \n",
|
||
"2 1.0 1.0 \n",
|
||
"3 1.0 0.0 \n",
|
||
"4 1.0 0.0 \n",
|
||
"\n",
|
||
"[5 rows x 69 columns]"
|
||
]
|
||
},
|
||
"execution_count": 89,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 90,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_2580\\3082173574.py:27: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
|
||
" .apply(calcular_crescimento) # retorna índice com PDV\n"
|
||
]
|
||
}
|
||
],
|
||
"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": 91,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"np.float64(0.0857)"
|
||
]
|
||
},
|
||
"execution_count": 91,
|
||
"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": 92,
|
||
"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": 92,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[36:54]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 93,
|
||
"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>1428</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1634</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1640</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1650</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1806</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>4445</th>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>88471</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4446</th>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>88563</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4447</th>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>88730</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4448</th>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>89421</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4449</th>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>VDC</td>\n",
|
||
" <td>89495</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>4450 rows × 4 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" CANAL UF Código med_por_canal\n",
|
||
"0 TODOS AL 1428 0.0\n",
|
||
"1 TODOS AL 1634 0.0\n",
|
||
"2 TODOS AL 1640 0.0\n",
|
||
"3 TODOS AL 1650 0.0\n",
|
||
"4 TODOS AL 1806 0.0\n",
|
||
"... ... ... ... ...\n",
|
||
"4445 VD VDC 88471 0.0\n",
|
||
"4446 VD VDC 88563 0.0\n",
|
||
"4447 VD VDC 88730 0.0\n",
|
||
"4448 VD VDC 89421 0.0\n",
|
||
"4449 VD VDC 89495 0.0\n",
|
||
"\n",
|
||
"[4450 rows x 4 columns]"
|
||
]
|
||
},
|
||
"execution_count": 93,
|
||
"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": 94,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'202415'"
|
||
]
|
||
},
|
||
"execution_count": 94,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[39]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 95,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"mesmo_ciclo_ano_passado = df_final.columns[39]\n",
|
||
"ciclo_ano_passado = df_final.columns[39]\n",
|
||
"df_final[ciclo_ano_passado] = df_final[mesmo_ciclo_ano_passado]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 96,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"\"df_final['CRESCIMENTO_GERAL'] = 0.2\\ndf_final['CRESCIMENTO'] = 0.2\""
|
||
]
|
||
},
|
||
"execution_count": 96,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"'''df_final['CRESCIMENTO_GERAL'] = 0.2\n",
|
||
"df_final['CRESCIMENTO'] = 0.2'''"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 97,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(34265, 77)"
|
||
]
|
||
},
|
||
"execution_count": 97,
|
||
"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": 98,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"PDV\n",
|
||
"12522 445\n",
|
||
"12817 445\n",
|
||
"12818 445\n",
|
||
"12820 445\n",
|
||
"12823 445\n",
|
||
" ... \n",
|
||
"24257 445\n",
|
||
"24268 445\n",
|
||
"24269 445\n",
|
||
"24293 445\n",
|
||
"23813 445\n",
|
||
"Name: count, Length: 77, dtype: Int64"
|
||
]
|
||
},
|
||
"execution_count": 98,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['PDV'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 99,
|
||
"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_x</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</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_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>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0762</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.111111</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.2762</td>\n",
|
||
" <td>0.111111</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0867</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.555556</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.2867</td>\n",
|
||
" <td>0.555556</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.1065</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.055556</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.3065</td>\n",
|
||
" <td>0.055556</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0882</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.055556</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.2882</td>\n",
|
||
" <td>0.055556</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0745</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.111111</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.2745</td>\n",
|
||
" <td>0.111111</td>\n",
|
||
" <td>0.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_x IAF \\\n",
|
||
"0 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"1 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"2 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"3 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"4 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... PICO DE VENDAS 2024 \\\n",
|
||
"0 Semanal Não BOT ARBO ... 2.0 \n",
|
||
"1 Semanal Não BOT ARBO ... 5.0 \n",
|
||
"2 Semanal Não BOT ARBO ... 1.0 \n",
|
||
"3 Semanal Não BOT ARBO ... 1.0 \n",
|
||
"4 Semanal Não BOT ARBO ... 1.0 \n",
|
||
"\n",
|
||
" Pico Vendas Ultimos 6 ciclos CRESCIMENTO CRESCIMENTO_GERAL \\\n",
|
||
"0 0.0 0.0762 0.2 \n",
|
||
"1 0.0 0.0867 0.2 \n",
|
||
"2 1.0 0.1065 0.2 \n",
|
||
"3 0.0 0.0882 0.2 \n",
|
||
"4 0.0 0.0745 0.2 \n",
|
||
"\n",
|
||
" MEDIANA DO HISTÓRICO MEDIA DO HISTÓRICO med_por_canal CRESCIMENTO_FINAL \\\n",
|
||
"0 0.0 0.111111 0.0 0.2762 \n",
|
||
"1 0.0 0.555556 0.0 0.2867 \n",
|
||
"2 0.0 0.055556 0.0 0.3065 \n",
|
||
"3 0.0 0.055556 0.0 0.2882 \n",
|
||
"4 0.0 0.111111 0.0 0.2745 \n",
|
||
"\n",
|
||
" MEDIANA DO HISTÓRICO2 PV GINSENG \n",
|
||
"0 0.111111 0.0 \n",
|
||
"1 0.555556 1.0 \n",
|
||
"2 0.055556 0.0 \n",
|
||
"3 0.055556 0.0 \n",
|
||
"4 0.111111 0.0 \n",
|
||
"\n",
|
||
"[5 rows x 77 columns]"
|
||
]
|
||
},
|
||
"execution_count": 99,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 100,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.drop(columns=['MEDIANA DO HISTÓRICO2'] )"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 101,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202414', '202415', '202416', '202417', '202501', '202502', '202503'], dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 101,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[38:45]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 102,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202508', '202509', '202510', '202511', '202512'], dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 102,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[49:54]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 103,
|
||
"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": 104,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['202416', '202417', '202501', '202502', '202503', '202504', '202505',\n",
|
||
" '202506', '202507'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 104,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[40:49]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 105,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final.drop(columns=df_final.columns[40:49], inplace=True)\n",
|
||
"df_final.drop(columns=df_final.columns[37:39], inplace=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 106,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['COBERTURA ATUAL'] = df_final['ESTOQUE ATUAL'].astype(float) / df_final['DDV PREVISTO'].astype(float)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 107,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['COBERTURA ATUAL'] = df_final['COBERTURA ATUAL'].replace([np.inf, -np.inf], 0)\n",
|
||
"\n",
|
||
"df_final['COBERTURA ATUAL'] = round(df_final['COBERTURA ATUAL'],0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 108,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"COBERTURA ATUAL\n",
|
||
"0.0 6787\n",
|
||
"100.0 699\n",
|
||
"50.0 447\n",
|
||
"40.0 375\n",
|
||
"20.0 342\n",
|
||
" ... \n",
|
||
"245.0 1\n",
|
||
"778.0 1\n",
|
||
"811.0 1\n",
|
||
"1967.0 1\n",
|
||
"644.0 1\n",
|
||
"Name: count, Length: 641, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 108,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['COBERTURA ATUAL'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 109,
|
||
"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": 110,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"PDV\n",
|
||
"12522 445\n",
|
||
"12817 445\n",
|
||
"12818 445\n",
|
||
"12820 445\n",
|
||
"12823 445\n",
|
||
" ... \n",
|
||
"24257 445\n",
|
||
"24268 445\n",
|
||
"24269 445\n",
|
||
"24293 445\n",
|
||
"23813 445\n",
|
||
"Name: count, Length: 77, dtype: Int64"
|
||
]
|
||
},
|
||
"execution_count": 110,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['PDV'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 111,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"r'''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)'''\n",
|
||
"\n",
|
||
"df_final_dedup = df_final"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 112,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" 'SKU_FINAL', '202412', '202415', 'C-4', 'C-3', 'C-2', 'C-1', 'Atual',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio',\n",
|
||
" 'Descrição_y', 'chave sku2', 'chave sku1', 'PRECO DE COMPRA',\n",
|
||
" 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG', 'PRODUTO', 'chave',\n",
|
||
" 'PICO DE VENDAS 2024', 'Pico Vendas Ultimos 6 ciclos', 'CRESCIMENTO',\n",
|
||
" 'CRESCIMENTO_GERAL', 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO',\n",
|
||
" 'med_por_canal', 'CRESCIMENTO_FINAL', 'PV GINSENG', 'COBERTURA ATUAL'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 112,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 113,
|
||
"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": 113,
|
||
"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": 114,
|
||
"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_x</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</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_FINAL</th>\n",
|
||
" <th>PV GINSENG</th>\n",
|
||
" <th>COBERTURA ATUAL</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>39</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Loja</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>116</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Todos</td>\n",
|
||
" <td>57640</td>\n",
|
||
" <td>ARBO NECESSAIRE PES</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ARBO</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>193</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Todos</td>\n",
|
||
" <td>51803</td>\n",
|
||
" <td>BOTI BABY COND V2 400ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>BOTI BABY</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>270</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Todos</td>\n",
|
||
" <td>52023</td>\n",
|
||
" <td>BOTI BABY LOC HID CPO 400ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>BOTI BABY</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>347</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>Todos</td>\n",
|
||
" <td>52025</td>\n",
|
||
" <td>BOTI BABY SAB LIQ GLIC V2 400ml</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>BOTI BABY</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>33919</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>36826</td>\n",
|
||
" <td>REF MAKE B PO COMP FAC HYAL 70 8g</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>MAKE B.</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>33996</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>46568</td>\n",
|
||
" <td>SOPHIE BOLSA NYLON</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>SOPHIE</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>34073</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>47949</td>\n",
|
||
" <td>THE BLEND EDP 100ml V2</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>THE BLEND</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>34150</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>49038</td>\n",
|
||
" <td>ZAAD BALM POS BARB 110g V4</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ZAAD</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>34227</th>\n",
|
||
" <td>202515</td>\n",
|
||
" <td>NNE</td>\n",
|
||
" <td>VD</td>\n",
|
||
" <td>48368</td>\n",
|
||
" <td>ZAAD ESPUM P/ BARB 200ml V4</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Semanal</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>BOT</td>\n",
|
||
" <td>ZAAD</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>445 rows × 66 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo_x Região Canal Código Descrição_x IAF \\\n",
|
||
"39 202515 NNE Loja 50052 ARBO LOC DES HID CPO 75ml Não \n",
|
||
"116 202515 NNE Todos 57640 ARBO NECESSAIRE PES Não \n",
|
||
"193 202515 NNE Todos 51803 BOTI BABY COND V2 400ml Não \n",
|
||
"270 202515 NNE Todos 52023 BOTI BABY LOC HID CPO 400ml Não \n",
|
||
"347 202515 NNE Todos 52025 BOTI BABY SAB LIQ GLIC V2 400ml Não \n",
|
||
"... ... ... ... ... ... ... \n",
|
||
"33919 202515 NNE VD 36826 REF MAKE B PO COMP FAC HYAL 70 8g Não \n",
|
||
"33996 202515 NNE VD 46568 SOPHIE BOLSA NYLON Não \n",
|
||
"34073 202515 NNE VD 47949 THE BLEND EDP 100ml V2 Não \n",
|
||
"34150 202515 NNE VD 49038 ZAAD BALM POS BARB 110g V4 Não \n",
|
||
"34227 202515 NNE VD 48368 ZAAD ESPUM P/ BARB 200ml V4 Não \n",
|
||
"\n",
|
||
" Tipo de pedido Foco Unidade de negócio Marca ... \\\n",
|
||
"39 Semanal Não BOT ARBO ... \n",
|
||
"116 Semanal Não BOT ARBO ... \n",
|
||
"193 Semanal Não BOT BOTI BABY ... \n",
|
||
"270 Semanal Não BOT BOTI BABY ... \n",
|
||
"347 Semanal Não BOT BOTI BABY ... \n",
|
||
"... ... ... ... ... ... \n",
|
||
"33919 Semanal Não BOT MAKE B. ... \n",
|
||
"33996 Semanal Não BOT SOPHIE ... \n",
|
||
"34073 Semanal Não BOT THE BLEND ... \n",
|
||
"34150 Semanal Não BOT ZAAD ... \n",
|
||
"34227 Semanal Não BOT ZAAD ... \n",
|
||
"\n",
|
||
" PICO DE VENDAS 2024 Pico Vendas Ultimos 6 ciclos CRESCIMENTO \\\n",
|
||
"39 0.0 0.0 NaN \n",
|
||
"116 0.0 0.0 NaN \n",
|
||
"193 0.0 0.0 NaN \n",
|
||
"270 0.0 0.0 NaN \n",
|
||
"347 0.0 0.0 NaN \n",
|
||
"... ... ... ... \n",
|
||
"33919 0.0 0.0 NaN \n",
|
||
"33996 0.0 0.0 NaN \n",
|
||
"34073 0.0 0.0 NaN \n",
|
||
"34150 0.0 0.0 NaN \n",
|
||
"34227 0.0 0.0 NaN \n",
|
||
"\n",
|
||
" CRESCIMENTO_GERAL MEDIANA DO HISTÓRICO MEDIA DO HISTÓRICO med_por_canal \\\n",
|
||
"39 0.2 0.0 0.0 0.0 \n",
|
||
"116 0.2 0.0 0.0 0.0 \n",
|
||
"193 0.2 0.0 0.0 3.0 \n",
|
||
"270 0.2 0.0 0.0 3.0 \n",
|
||
"347 0.2 0.0 0.0 8.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"33919 0.2 0.0 0.0 0.0 \n",
|
||
"33996 0.2 0.0 0.0 1.0 \n",
|
||
"34073 0.2 0.0 0.0 17.0 \n",
|
||
"34150 0.2 0.0 0.0 0.0 \n",
|
||
"34227 0.2 0.0 0.0 1.0 \n",
|
||
"\n",
|
||
" CRESCIMENTO_FINAL PV GINSENG COBERTURA ATUAL \n",
|
||
"39 NaN NaN NaN \n",
|
||
"116 NaN NaN NaN \n",
|
||
"193 NaN NaN NaN \n",
|
||
"270 NaN NaN NaN \n",
|
||
"347 NaN NaN NaN \n",
|
||
"... ... ... ... \n",
|
||
"33919 NaN NaN NaN \n",
|
||
"33996 NaN NaN NaN \n",
|
||
"34073 NaN NaN NaN \n",
|
||
"34150 NaN NaN NaN \n",
|
||
"34227 NaN NaN NaN \n",
|
||
"\n",
|
||
"[445 rows x 66 columns]"
|
||
]
|
||
},
|
||
"execution_count": 114,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup[df_final_dedup['PDV'] == 21007]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 115,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup.drop(columns=['dias_ate_inicio','SKU_FINAL',\n",
|
||
" 'CRESCIMENTO'],inplace=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 116,
|
||
"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": 117,
|
||
"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": 118,
|
||
"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": 119,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"np.int64(0)"
|
||
]
|
||
},
|
||
"execution_count": 119,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup['Código'].isna().sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 120,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_irece_agrupado = df_irece.groupby(['PDV','Código','Ciclo'])['Quantidade'].sum().reset_index()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 121,
|
||
"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": 122,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"PDV\n",
|
||
"12522 445\n",
|
||
"12817 445\n",
|
||
"12818 445\n",
|
||
"12820 445\n",
|
||
"12823 445\n",
|
||
" ... \n",
|
||
"24257 445\n",
|
||
"24268 445\n",
|
||
"24269 445\n",
|
||
"24293 445\n",
|
||
"23813 445\n",
|
||
"Name: count, Length: 77, dtype: Int64"
|
||
]
|
||
},
|
||
"execution_count": 122,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup['PDV'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 123,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup = df_final_dedup.rename(columns={'UF_x':'UF','DESCRICAO_y':'DESCRICAO'})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 124,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup = df_final_dedup.drop(columns={'CANAL_y', 'UF_y'})\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 125,
|
||
"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": 126,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'202415'"
|
||
]
|
||
},
|
||
"execution_count": 126,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ciclo_ano_passado"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 127,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição_x', 'IAF',\n",
|
||
" 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'LINHA', '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', 'SKU', 'curva',\n",
|
||
" 'categoria', 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL',\n",
|
||
" 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço',\n",
|
||
" '202412', '202415', 'C-4', 'C-3', 'C-2', 'C-1', 'Atual', 'INICIO CICLO',\n",
|
||
" 'FIM CICLO', 'DURAÇÃO', 'Descrição_y', 'chave sku2', 'chave sku1',\n",
|
||
" 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n",
|
||
" 'PRODUTO', 'chave', 'PICO DE VENDAS 2024',\n",
|
||
" 'Pico Vendas Ultimos 6 ciclos', 'CRESCIMENTO_GERAL',\n",
|
||
" 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO', 'med_por_canal',\n",
|
||
" 'CRESCIMENTO_FINAL', 'PV GINSENG', 'COBERTURA ATUAL', 'Estoque Total'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 127,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 128,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup = df_final_dedup.drop(columns='Descrição_y')\n",
|
||
"\n",
|
||
"df_final_dedup = df_final_dedup.rename(columns={'Descrição_x':'Descrição'})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 129,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup = df_final_dedup[['DURAÇÃO','CANAL','ANALISTA','SUPERVISOR','UF','chave','PDV','DESCRIÇÃO PDV','Código','Descrição','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',ciclo_ano_passado ,'ESTOQUE ATUAL','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": 130,
|
||
"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": 131,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'202415'"
|
||
]
|
||
},
|
||
"execution_count": 131,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"ciclo_ano_passado"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 132,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup = df_final_dedup.drop_duplicates()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 133,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup['Valor Sugestão'] = \"\"\n",
|
||
"\n",
|
||
"df_final_dedup['Sugestão Abastecimento'] = \"\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 134,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"DDV PREVISTO float64\n",
|
||
"COBERTURA ATUAL float64\n",
|
||
"dtype: object"
|
||
]
|
||
},
|
||
"execution_count": 134,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup[['DDV PREVISTO',\n",
|
||
" 'COBERTURA ATUAL',]].dtypes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 135,
|
||
"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": 136,
|
||
"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>Descrição</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 Abastecimento</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>32171</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>242.0</td>\n",
|
||
" <td>612.388889</td>\n",
|
||
" <td>2734.0</td>\n",
|
||
" <td>857.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>12.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",
|
||
"32171 21 VD JEFFERSON Juliana Vasconcelos VDC 2371184387 23711 \n",
|
||
"\n",
|
||
" DESCRIÇÃO PDV Código Descrição ... proj_mar \\\n",
|
||
"32171 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",
|
||
"32171 242.0 612.388889 2734.0 \n",
|
||
"\n",
|
||
" Pico Vendas Ultimos 6 ciclos PRECO DE COMPRA PRECO DE VENDA PV GINSENG \\\n",
|
||
"32171 857.0 0.0 0.0 12.0 \n",
|
||
"\n",
|
||
" Valor Sugestão Sugestão Abastecimento \n",
|
||
"32171 \n",
|
||
"\n",
|
||
"[1 rows x 39 columns]"
|
||
]
|
||
},
|
||
"execution_count": 136,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup[df_final_dedup['chave'] == '2371184387'].head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 137,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"32171 88.7\n",
|
||
"Name: DDV PREVISTO, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 137,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup[df_final_dedup['chave'] == '2371184387']['DDV PREVISTO'].head()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 138,
|
||
"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>Descrição</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 Abastecimento</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>21</td>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>LUAN</td>\n",
|
||
" <td>Efigênia Herculano</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1252250052</td>\n",
|
||
" <td>12522</td>\n",
|
||
" <td>MACEIO SHOP EXP</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.111111</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>37.9</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td></td>\n",
|
||
" <td></td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>21</td>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>JEFFERSON</td>\n",
|
||
" <td>Maxwell Vieira</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1281750052</td>\n",
|
||
" <td>12817</td>\n",
|
||
" <td>SHOPPING PATIO</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.555556</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>37.9</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td></td>\n",
|
||
" <td></td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>21</td>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>PEDRO</td>\n",
|
||
" <td>Maxwell Vieira</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1281850052</td>\n",
|
||
" <td>12818</td>\n",
|
||
" <td>GB SERRARIA</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.055556</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>37.9</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td></td>\n",
|
||
" <td></td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>21</td>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>THAYLLAN</td>\n",
|
||
" <td>Maxwell Vieira</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1282050052</td>\n",
|
||
" <td>12820</td>\n",
|
||
" <td>ATACADÃO</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.055556</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>37.9</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td></td>\n",
|
||
" <td></td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>21</td>\n",
|
||
" <td>TODOS</td>\n",
|
||
" <td>MARCYARA</td>\n",
|
||
" <td>Efigênia Herculano</td>\n",
|
||
" <td>AL</td>\n",
|
||
" <td>1282350052</td>\n",
|
||
" <td>12823</td>\n",
|
||
" <td>PONTA VERDE</td>\n",
|
||
" <td>50052</td>\n",
|
||
" <td>ARBO LOC DES HID CPO 75ml</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.111111</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>11.72</td>\n",
|
||
" <td>37.9</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td></td>\n",
|
||
" <td></td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 39 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" DURAÇÃO CANAL ANALISTA SUPERVISOR UF chave PDV \\\n",
|
||
"0 21 TODOS LUAN Efigênia Herculano AL 1252250052 12522 \n",
|
||
"1 21 TODOS JEFFERSON Maxwell Vieira AL 1281750052 12817 \n",
|
||
"2 21 TODOS PEDRO Maxwell Vieira AL 1281850052 12818 \n",
|
||
"3 21 TODOS THAYLLAN Maxwell Vieira AL 1282050052 12820 \n",
|
||
"4 21 TODOS MARCYARA Efigênia Herculano AL 1282350052 12823 \n",
|
||
"\n",
|
||
" DESCRIÇÃO PDV Código Descrição ... proj_mar \\\n",
|
||
"0 MACEIO SHOP EXP 50052 ARBO LOC DES HID CPO 75ml ... 1.0 \n",
|
||
"1 SHOPPING PATIO 50052 ARBO LOC DES HID CPO 75ml ... 1.0 \n",
|
||
"2 GB SERRARIA 50052 ARBO LOC DES HID CPO 75ml ... 0.0 \n",
|
||
"3 ATACADÃO 50052 ARBO LOC DES HID CPO 75ml ... 0.0 \n",
|
||
"4 PONTA VERDE 50052 ARBO LOC DES HID CPO 75ml ... 0.0 \n",
|
||
"\n",
|
||
" proj_mar+1 MEDIA DO HISTÓRICO PICO DE VENDAS 2024 \\\n",
|
||
"0 0.0 0.111111 2.0 \n",
|
||
"1 0.0 0.555556 5.0 \n",
|
||
"2 0.0 0.055556 1.0 \n",
|
||
"3 0.0 0.055556 1.0 \n",
|
||
"4 0.0 0.111111 1.0 \n",
|
||
"\n",
|
||
" Pico Vendas Ultimos 6 ciclos PRECO DE COMPRA PRECO DE VENDA PV GINSENG \\\n",
|
||
"0 0.0 11.72 37.9 0.0 \n",
|
||
"1 0.0 11.72 37.9 1.0 \n",
|
||
"2 1.0 11.72 37.9 0.0 \n",
|
||
"3 0.0 11.72 37.9 0.0 \n",
|
||
"4 0.0 11.72 37.9 0.0 \n",
|
||
"\n",
|
||
" Valor Sugestão Sugestão Abastecimento \n",
|
||
"0 \n",
|
||
"1 \n",
|
||
"2 \n",
|
||
"3 \n",
|
||
"4 \n",
|
||
"\n",
|
||
"[5 rows x 39 columns]"
|
||
]
|
||
},
|
||
"execution_count": 138,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final_dedup.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 139,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['DURAÇÃO', 'CANAL', 'ANALISTA', 'SUPERVISOR', 'UF', 'chave', 'PDV',\n",
|
||
" 'DESCRIÇÃO PDV', 'Código', 'Descrição', 'LINHA', 'Categoria', 'curva',\n",
|
||
" 'Percentual de desconto consumidor', 'Ação consumidor',\n",
|
||
" 'Percentual de desconto revendedor', 'Ação revendedor', 'C-4', 'C-3',\n",
|
||
" 'C-2', 'C-1', 'Atual', '202415', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'Estoque Total', 'DDV PREVISTO', 'COBERTURA ATUAL',\n",
|
||
" 'proj_mar', 'proj_mar+1', 'MEDIA DO HISTÓRICO', 'PICO DE VENDAS 2024',\n",
|
||
" 'Pico Vendas Ultimos 6 ciclos', 'PRECO DE COMPRA', 'PRECO DE VENDA',\n",
|
||
" 'PV GINSENG', 'Valor Sugestão', 'Sugestão Abastecimento',\n",
|
||
" 'CANAL_CERTO'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 139,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_pdv_origi['PDV'] = df_pdv_origi['PDV'].astype('Int64')\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"df_pdv_origi = df_pdv_origi.rename(columns={'CANAL':'CANAL_CERTO'})\n",
|
||
"\n",
|
||
"df_final_dedup= pd.merge(df_final_dedup,df_pdv_origi[['PDV','CANAL_CERTO']],on='PDV',how='inner')\n",
|
||
"\n",
|
||
"df_final_dedup['CANAL']= df_final_dedup['CANAL_CERTO']\n",
|
||
"\n",
|
||
"\n",
|
||
"df_final_dedup.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 140,
|
||
"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
|
||
}
|