3110 lines
98 KiB
Plaintext
3110 lines
98 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_6076\\879577847.py:48: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n",
|
||
" df0 = pd.read_sql(query, conn)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import pyodbc\n",
|
||
"import configparser\n",
|
||
"import pandas as pd\n",
|
||
"import numpy as np \n",
|
||
"from datetime import datetime, time\n",
|
||
"\n",
|
||
"\n",
|
||
"config = configparser.ConfigParser()\n",
|
||
"config.read(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\CODIGOS\\relatório_improdutivo\\credenciais.ini\")\n",
|
||
"\n",
|
||
"# Conexão com o banco\n",
|
||
"conn = pyodbc.connect(\n",
|
||
" f\"DRIVER={{SQL Server}};\"\n",
|
||
" f\"SERVER={config['banco']['host']},1433;\"\n",
|
||
" f\"DATABASE=GINSENG;\"\n",
|
||
" f\"UID={config['banco']['user']};\"\n",
|
||
" f\"PWD={config['banco']['password']}\")\n",
|
||
"\n",
|
||
"#gerar query\n",
|
||
"query = '''\n",
|
||
"SELECT \n",
|
||
" e.pdv,\n",
|
||
" COALESCE(e.SKU_PARA, e.SKU) AS SKU_FINAL,\n",
|
||
" MAX(e.[ESTOQUE ATUAL]) AS [ESTOQUE ATUAL],\n",
|
||
" MAX(e.[ESTOQUE EM TRANSITO]) AS [ESTOQUE EM TRANSITO],\n",
|
||
" MAX(e.[PEDIDO PENDENTE]) AS [PEDIDO PENDENTE],\n",
|
||
" d.salescurve AS Curva,\n",
|
||
" e.CATEGORIA,\n",
|
||
" d.dayswithoutsales AS DiasSemVenda,\n",
|
||
" d.nextcycleprojection,\n",
|
||
" d.secondtonextcycleprojection\n",
|
||
"FROM \n",
|
||
" estoque_mar e \n",
|
||
"LEFT JOIN draft d \n",
|
||
" ON d.loja_id = e.PDV \n",
|
||
" AND d.code = COALESCE(e.SKU_PARA, e.SKU)\n",
|
||
"WHERE \n",
|
||
" d.businessunit = 'EUD'\n",
|
||
"GROUP BY \n",
|
||
" e.pdv,\n",
|
||
" COALESCE(e.SKU_PARA, e.SKU),\n",
|
||
" d.salescurve,\n",
|
||
" e.CATEGORIA,\n",
|
||
" d.dayswithoutsales,\n",
|
||
" d.nextcycleprojection,\n",
|
||
" d.secondtonextcycleprojection\n",
|
||
"'''\n",
|
||
"df0 = pd.read_sql(query, conn)\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_6076\\1692316838.py:25: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n",
|
||
" dfv0 = pd.read_sql(query_vendas, conn)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"query_vendas = '''\n",
|
||
"SELECT \n",
|
||
"\tB.PDV, \n",
|
||
"\tB.SKU,\n",
|
||
"\tB.DESCRICAO,\n",
|
||
"\tSUM(CAST(b.VENDAS AS DECIMAL(18,2))) AS VENDAS_CICLO,\n",
|
||
"\tC.Ciclo\n",
|
||
"FROM base_vendas_bi b\n",
|
||
"INNER JOIN ciclos_data_2025 c \n",
|
||
" ON CAST(b.[DATA] AS DATE) = CONVERT(DATE, c.[Date], 103) AND C.MARCA = 'BOT'\n",
|
||
"LEFT JOIN (\n",
|
||
" SELECT SKU, MAX(ORIGEM) AS ORIGEM\n",
|
||
" FROM estoque_mar\n",
|
||
" GROUP BY SKU\n",
|
||
") e ON b.SKU = e.SKU\n",
|
||
"WHERE b.[DATA] > '2024-07-28'\n",
|
||
"GROUP BY\n",
|
||
"B.PDV, \n",
|
||
"\tB.SKU,\n",
|
||
"\tB.DESCRICAO,\n",
|
||
"\tC.Ciclo,\n",
|
||
"\tE.ORIGEM \n",
|
||
"'''\n",
|
||
"\n",
|
||
"dfv0 = pd.read_sql(query_vendas, conn)\n",
|
||
"\n",
|
||
"conn.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df=df0"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>PDV</th>\n",
|
||
" <th>SKU</th>\n",
|
||
" <th>DESCRICAO</th>\n",
|
||
" <th>C202411</th>\n",
|
||
" <th>C202412</th>\n",
|
||
" <th>C202413</th>\n",
|
||
" <th>C202414</th>\n",
|
||
" <th>C202415</th>\n",
|
||
" <th>C202416</th>\n",
|
||
" <th>C202417</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>C202502</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",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>11201</td>\n",
|
||
" <td>1004</td>\n",
|
||
" <td>FLORATTA DES COL MY BLUE 75ml</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>11201</td>\n",
|
||
" <td>1005</td>\n",
|
||
" <td>DEM FLORATTA DES COL MY BLUE 4ml</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>11201</td>\n",
|
||
" <td>1078</td>\n",
|
||
" <td>MATCH SRUM CAP POS QUIMICA 50ml</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>11201</td>\n",
|
||
" <td>1296</td>\n",
|
||
" <td>PMPCK THE BLEND DES ANTIT AER 2x75g</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>11201</td>\n",
|
||
" <td>1302</td>\n",
|
||
" <td>PMPCK LILY DES ANTIT AER 2x75g</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <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>188531</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>90770</td>\n",
|
||
" <td>PIN BALAO O BOTICARIO PAIS/25 UNIT</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>188532</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>90772</td>\n",
|
||
" <td>PIN AMOR O BOTICARIO PAIS/25 UNIT</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>188533</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>90774</td>\n",
|
||
" <td>PIN MELHOR PAI O BOTICARIO PAIS/25 UNIT</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>188534</th>\n",
|
||
" <td>5699</td>\n",
|
||
" <td>90776</td>\n",
|
||
" <td>SACOLA TOP M O BOTICARIO PAIS 2025 UNIT</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>188535</th>\n",
|
||
" <td>8074</td>\n",
|
||
" <td>43151</td>\n",
|
||
" <td>MATERIAL POS CONSUMO</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>188536 rows × 21 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" PDV SKU DESCRICAO C202411 \\\n",
|
||
"0 11201 1004 FLORATTA DES COL MY BLUE 75ml 0.0 \n",
|
||
"1 11201 1005 DEM FLORATTA DES COL MY BLUE 4ml 0.0 \n",
|
||
"2 11201 1078 MATCH SRUM CAP POS QUIMICA 50ml 0.0 \n",
|
||
"3 11201 1296 PMPCK THE BLEND DES ANTIT AER 2x75g 0.0 \n",
|
||
"4 11201 1302 PMPCK LILY DES ANTIT AER 2x75g 0.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"188531 5699 90770 PIN BALAO O BOTICARIO PAIS/25 UNIT 0.0 \n",
|
||
"188532 5699 90772 PIN AMOR O BOTICARIO PAIS/25 UNIT 0.0 \n",
|
||
"188533 5699 90774 PIN MELHOR PAI O BOTICARIO PAIS/25 UNIT 0.0 \n",
|
||
"188534 5699 90776 SACOLA TOP M O BOTICARIO PAIS 2025 UNIT 0.0 \n",
|
||
"188535 8074 43151 MATERIAL POS CONSUMO 0.0 \n",
|
||
"\n",
|
||
" C202412 C202413 C202414 C202415 C202416 C202417 ... C202502 \\\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",
|
||
"188531 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n",
|
||
"188532 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n",
|
||
"188533 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n",
|
||
"188534 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n",
|
||
"188535 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n",
|
||
"\n",
|
||
" C202503 C202504 C202505 C202506 C202507 C202508 C202509 \\\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",
|
||
"188531 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"188532 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"188533 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"188534 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"188535 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"\n",
|
||
" C202510 C202511 \n",
|
||
"0 0.0 0.0 \n",
|
||
"1 0.0 0.0 \n",
|
||
"2 0.0 0.0 \n",
|
||
"3 0.0 0.0 \n",
|
||
"4 0.0 0.0 \n",
|
||
"... ... ... \n",
|
||
"188531 0.0 0.0 \n",
|
||
"188532 0.0 0.0 \n",
|
||
"188533 0.0 0.0 \n",
|
||
"188534 0.0 0.0 \n",
|
||
"188535 0.0 0.0 \n",
|
||
"\n",
|
||
"[188536 rows x 21 columns]"
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"# 1. Agrupamento\n",
|
||
"df_agrupado = dfv0.groupby(['PDV', 'SKU', 'DESCRICAO', 'Ciclo'], as_index=False)['VENDAS_CICLO'].sum()\n",
|
||
"\n",
|
||
"# 2. Pivotar o DataFrame\n",
|
||
"df_pivotado = df_agrupado.pivot_table(\n",
|
||
" index=['PDV', 'SKU', 'DESCRICAO'],\n",
|
||
" columns='Ciclo',\n",
|
||
" values='VENDAS_CICLO',\n",
|
||
" fill_value=0 # Substitui NaN por 0\n",
|
||
")\n",
|
||
"\n",
|
||
"# 3. Resetar o índice para deixar como DataFrame normal (opcional)\n",
|
||
"df_vendas = df_pivotado.reset_index()\n",
|
||
"\n",
|
||
"# 4. (Opcional) Renomear colunas com prefixo \"Ciclo_\"\n",
|
||
"df_vendas.columns.name = None\n",
|
||
"df_vendas = df_vendas.rename(columns=lambda x: f'Ciclo_{x}' if isinstance(x, (int, str)) and str(x).isdigit() else x)\n",
|
||
"\n",
|
||
"# Resultado final\n",
|
||
"df_vendas\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# O QUE PRECISA PRA RODAR ESSE CÓDIGO:\n",
|
||
"\n",
|
||
"# Arquivo Draft\n",
|
||
"# Arquivo Estoque\n",
|
||
"# Arquivo BI preço\n",
|
||
"# Arquivo pdv\n",
|
||
"# Arquivo Calendario\n",
|
||
"# Arquivo tabela de compra\n",
|
||
"\n",
|
||
"#Atualizar o nome da marca no filtro do estoque."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Caminho onde estão as subpastas com os arquivos CSV\n",
|
||
"\n",
|
||
"# Set the path to the folder containing CSV files\n",
|
||
"#folder_path = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C13\\DRAFT\" # arquivo dos drafts\n",
|
||
"\n",
|
||
"# Pattern to match all CSV files\n",
|
||
"#csv_files = glob.glob(os.path.join(folder_path, '*.csv'))\n",
|
||
"\n",
|
||
"# Read and concat all CSVs\n",
|
||
"#df_draft = pd.concat([pd.read_csv(file) for file in csv_files], ignore_index=True)\n",
|
||
"\n",
|
||
"\n",
|
||
"#df_draft.shape\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"\n",
|
||
"\n",
|
||
"#Caminho onde estão as subpastas com os arquivos CSV\n",
|
||
"#pasta_entrada = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C13\\estoque\"\n",
|
||
"\n",
|
||
"# Lista todas as subpastas dentro de \"ESTOQUE\"\n",
|
||
"#subpastas = [os.path.join(pasta_entrada, d) for d in os.listdir(pasta_entrada) if os.path.isdir(os.path.join(pasta_entrada, d))]\n",
|
||
"\n",
|
||
"#df_list = []\n",
|
||
"\n",
|
||
"# Percorre todas as subpastas\n",
|
||
"#for subpasta in subpastas:\n",
|
||
"# arquivos = [f for f in os.listdir(subpasta) if f.endswith(\".csv\")]\n",
|
||
"# nome_pasta = os.path.basename(subpasta) # Obtém o nome da pasta\n",
|
||
"\n",
|
||
"# for arquivo in arquivos:\n",
|
||
"# caminho_arquivo = os.path.join(subpasta, arquivo)\n",
|
||
"# try:\n",
|
||
"# df = pd.read_csv(caminho_arquivo, encoding=\"utf-8\", low_memory=False) # Melhor para grandes volumes de dados\n",
|
||
"# df[\"Arquivo_Origem\"] = arquivo # Adiciona o nome do arquivo de origem\n",
|
||
"# df[\"Pasta_Origem\"] = nome_pasta # Adiciona o nome da pasta de origem\n",
|
||
"# df_list.append(df)\n",
|
||
"# except Exception as e:\n",
|
||
"# print(f\"Erro ao ler o arquivo {arquivo}: {e}\")\n",
|
||
"\n",
|
||
"#if df_list:\n",
|
||
"# df_estoque = pd.concat(df_list, ignore_index=True)\n",
|
||
"\n",
|
||
"#df_estoque['PDV'] = df_estoque['PDV'].astype(str)\n",
|
||
"\n",
|
||
"#df_estoque['SKU_FINAL'] = np.where(df_estoque['SKU_PARA'] == \"-\", df_estoque['SKU'], df_estoque['SKU_PARA'])\n",
|
||
"\n",
|
||
"#df_estoque['SKU_FINAL']=df_estoque['SKU_FINAL'].astype(str)'''\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"c:\\Users\\joao.herculano\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\openpyxl\\styles\\stylesheet.py:237: UserWarning: Workbook contains no default style, apply openpyxl's default\n",
|
||
" warn(\"Workbook contains no default style, apply openpyxl's default\")\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"df_bi_preco = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\EUDORA\\202511\\preço BI\\TABELA DE PREÇOS (2).xlsx\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['SKU1', 'SKU2', 'Descrição', 'MARCA', 'CATEGORIA', 'LINHA', 'UF',\n",
|
||
" 'Tipo Preço', 'PC', 'PV'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_bi_preco.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n",
|
||
"df_pdv = df_pdv.rename(columns={'DESCRIÇÃO':'DESCRIÇÃO PDV'})\n",
|
||
"df_pdv = df_pdv.drop(columns=['REGIÃO', 'ESTADO','CIDADE','GESTÃO', 'SUPERVISOR', 'STATUS'])\n",
|
||
"df_pdv = df_pdv[~df_pdv['CANAL'].isin(['MTZ','LJ'])]\n",
|
||
"\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"PDV\n",
|
||
"20968 1\n",
|
||
"20969 1\n",
|
||
"20970 1\n",
|
||
"20986 1\n",
|
||
"20988 1\n",
|
||
"20989 1\n",
|
||
"20991 1\n",
|
||
"20992 1\n",
|
||
"20993 1\n",
|
||
"20994 1\n",
|
||
"20995 1\n",
|
||
"20996 1\n",
|
||
"20997 1\n",
|
||
"20998 1\n",
|
||
"20999 1\n",
|
||
"21000 1\n",
|
||
"21001 1\n",
|
||
"21278 1\n",
|
||
"21375 1\n",
|
||
"21383 1\n",
|
||
"21495 1\n",
|
||
"22448 1\n",
|
||
"22541 1\n",
|
||
"23703 1\n",
|
||
"23704 1\n",
|
||
"23711 1\n",
|
||
"23712 1\n",
|
||
"24255 1\n",
|
||
"24257 1\n",
|
||
"24269 1\n",
|
||
"24293 1\n",
|
||
"23813 1\n",
|
||
"Name: count, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_pdv['PDV'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_pdv['MATCH'] = 1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**ALTERAR NOME DA COLUNA \"ARQUIVO_ORIGEM\" PARA UMA DAS OPÇÕES ABAIXO:**\n",
|
||
"\n",
|
||
"*BOT.csv* \n",
|
||
"\n",
|
||
"*EUD.csv*\n",
|
||
"\n",
|
||
"*QDB.csv*"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_estoque = df_estoque[df_estoque['Arquivo_Origem']== \"EUD.csv\"]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"calendario = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\CICLO 9\\CALENDARIO_CICLO\\Ciclo_Expandido_com_Datas.xlsx\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"calendario['Date'] = pd.to_datetime(calendario['Date'])\n",
|
||
"\n",
|
||
"# Get today (normalized to midnight)\n",
|
||
"today = pd.Timestamp(\"today\").normalize()\n",
|
||
"\n",
|
||
"calendario['NUM_CICLO'] = calendario['Ciclo'].str[-2:].astype(int)\n",
|
||
"calendario['ANO_CICLO'] = calendario['Ciclo'].str[0:5]\n",
|
||
"\n",
|
||
"\n",
|
||
"calendario = calendario[calendario['MARCA'] == \"EUDORA\"]\n",
|
||
"\n",
|
||
"calendario['CICLOMAIS2'] = calendario['ANO_CICLO'].astype(str) + (calendario['NUM_CICLO'].astype(int) + 2).astype(str).str.zfill(2)\n",
|
||
"\n",
|
||
"ciclo_mais2 = calendario[calendario['Date'].dt.normalize() == today]['CICLOMAIS2'].iloc[0]\n",
|
||
"\n",
|
||
"\n",
|
||
"# Filter rows where date matches today\n",
|
||
"filtered_calendario = calendario[calendario['Ciclo'] == ciclo_mais2][:1]\n",
|
||
"\n",
|
||
"\n",
|
||
"filtered_calendario['dias_ate_inicio'] = filtered_calendario['INICIO CICLO'].iloc[0] - today\n",
|
||
"\n",
|
||
"filtered_calendario['dias_ate_inicio'] = filtered_calendario['dias_ate_inicio'].dt.days.astype(int)\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Ciclo</th>\n",
|
||
" <th>INICIO CICLO</th>\n",
|
||
" <th>FIM CICLO</th>\n",
|
||
" <th>DURAÇÃO</th>\n",
|
||
" <th>MARCA</th>\n",
|
||
" <th>Date</th>\n",
|
||
" <th>NUM_CICLO</th>\n",
|
||
" <th>ANO_CICLO</th>\n",
|
||
" <th>CICLOMAIS2</th>\n",
|
||
" <th>dias_ate_inicio</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>2346</th>\n",
|
||
" <td>C202513</td>\n",
|
||
" <td>2025-08-27</td>\n",
|
||
" <td>2025-09-16</td>\n",
|
||
" <td>21</td>\n",
|
||
" <td>EUDORA</td>\n",
|
||
" <td>2025-08-27</td>\n",
|
||
" <td>13</td>\n",
|
||
" <td>C2025</td>\n",
|
||
" <td>C202515</td>\n",
|
||
" <td>29</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo INICIO CICLO FIM CICLO DURAÇÃO MARCA Date NUM_CICLO \\\n",
|
||
"2346 C202513 2025-08-27 2025-09-16 21 EUDORA 2025-08-27 13 \n",
|
||
"\n",
|
||
" ANO_CICLO CICLOMAIS2 dias_ate_inicio \n",
|
||
"2346 C2025 C202515 29 "
|
||
]
|
||
},
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"filtered_calendario"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"filtered_calendario['match'] = 1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\EUDORA\\202513\\tabela promo\\TABELA-DE-PROMOS_C13-(1)-1752011522504.xlsx.xlsx\",skiprows=1)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Ciclo</th>\n",
|
||
" <th>Veiculo</th>\n",
|
||
" <th>Tipo de Promoção</th>\n",
|
||
" <th>Estratégia de Promoção</th>\n",
|
||
" <th>Tipo_mecanica</th>\n",
|
||
" <th>Promo Período Limitado?</th>\n",
|
||
" <th>EAM</th>\n",
|
||
" <th>Categoria</th>\n",
|
||
" <th>Cód. Combo</th>\n",
|
||
" <th>Código do Item</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>0.34.2</th>\n",
|
||
" <th>0.35.2</th>\n",
|
||
" <th>0.2.3</th>\n",
|
||
" <th>0.25.3</th>\n",
|
||
" <th>0.28.3</th>\n",
|
||
" <th>0.3.3</th>\n",
|
||
" <th>0.32.3</th>\n",
|
||
" <th>0.34.3</th>\n",
|
||
" <th>0.35.3</th>\n",
|
||
" <th>BSO</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>202513</td>\n",
|
||
" <td>Guia CF</td>\n",
|
||
" <td>Promoção CF</td>\n",
|
||
" <td>Movimentar Flow</td>\n",
|
||
" <td>Desconto Direto</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>PERF. FEMININA</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>85268</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>59.47</td>\n",
|
||
" <td>61.22</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.25</td>\n",
|
||
" <td>0.28</td>\n",
|
||
" <td>0.3</td>\n",
|
||
" <td>0.32</td>\n",
|
||
" <td>0.34</td>\n",
|
||
" <td>0.35</td>\n",
|
||
" <td>Sim</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>202513</td>\n",
|
||
" <td>Guia CF</td>\n",
|
||
" <td>Promoção CF</td>\n",
|
||
" <td>Movimentar Flow</td>\n",
|
||
" <td>Desconto Direto</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>PERF. FEMININA</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>93541</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>30.57</td>\n",
|
||
" <td>31.47</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.25</td>\n",
|
||
" <td>0.28</td>\n",
|
||
" <td>0.3</td>\n",
|
||
" <td>0.32</td>\n",
|
||
" <td>0.34</td>\n",
|
||
" <td>0.35</td>\n",
|
||
" <td>Sim</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>202513</td>\n",
|
||
" <td>Guia CF</td>\n",
|
||
" <td>Promoção CF</td>\n",
|
||
" <td>Movimentar Flow</td>\n",
|
||
" <td>Desconto Direto</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>PERF. FEMININA</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>53138</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>35.67</td>\n",
|
||
" <td>36.72</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.25</td>\n",
|
||
" <td>0.28</td>\n",
|
||
" <td>0.3</td>\n",
|
||
" <td>0.32</td>\n",
|
||
" <td>0.34</td>\n",
|
||
" <td>0.35</td>\n",
|
||
" <td>Sim</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>202513</td>\n",
|
||
" <td>Guia CF</td>\n",
|
||
" <td>Promoção CF</td>\n",
|
||
" <td>Movimentar Flow</td>\n",
|
||
" <td>Desconto Direto</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>PERF. FEMININA</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>50762</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>23.43</td>\n",
|
||
" <td>24.12</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.25</td>\n",
|
||
" <td>0.28</td>\n",
|
||
" <td>0.3</td>\n",
|
||
" <td>0.32</td>\n",
|
||
" <td>0.34</td>\n",
|
||
" <td>0.35</td>\n",
|
||
" <td>Sim</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>202513</td>\n",
|
||
" <td>Guia CF</td>\n",
|
||
" <td>Promoção CF</td>\n",
|
||
" <td>Movimentar Flow</td>\n",
|
||
" <td>Desconto Direto</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>PERF. FEMININA</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>49803</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>28.53</td>\n",
|
||
" <td>29.37</td>\n",
|
||
" <td>0.2</td>\n",
|
||
" <td>0.25</td>\n",
|
||
" <td>0.28</td>\n",
|
||
" <td>0.3</td>\n",
|
||
" <td>0.32</td>\n",
|
||
" <td>0.34</td>\n",
|
||
" <td>0.35</td>\n",
|
||
" <td>Sim</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</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>345</th>\n",
|
||
" <td>202513</td>\n",
|
||
" <td>Fora Guia</td>\n",
|
||
" <td>Promoção RE</td>\n",
|
||
" <td>Movimentar Flow</td>\n",
|
||
" <td>Desconto Direto</td>\n",
|
||
" <td>Ciclo todo</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>CABELOS</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>53094</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.00</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>Sim</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>346</th>\n",
|
||
" <td>202513</td>\n",
|
||
" <td>Fora Guia</td>\n",
|
||
" <td>Promoção RE</td>\n",
|
||
" <td>Movimentar Flow</td>\n",
|
||
" <td>Desconto Direto</td>\n",
|
||
" <td>Ciclo todo</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>CABELOS</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>55803</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.00</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>Sim</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>347</th>\n",
|
||
" <td>202513</td>\n",
|
||
" <td>Fora Guia</td>\n",
|
||
" <td>Promoção RE</td>\n",
|
||
" <td>Movimentar Flow</td>\n",
|
||
" <td>Desconto Direto</td>\n",
|
||
" <td>Ciclo todo</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>CABELOS</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>93106</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.00</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>Sim</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>348</th>\n",
|
||
" <td>202513</td>\n",
|
||
" <td>Fora Guia</td>\n",
|
||
" <td>Promoção RE</td>\n",
|
||
" <td>Movimentar Flow</td>\n",
|
||
" <td>Desconto Direto</td>\n",
|
||
" <td>Ciclo todo</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>CABELOS</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>93105</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.00</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>Sim</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>349</th>\n",
|
||
" <td>202513</td>\n",
|
||
" <td>Fora Guia</td>\n",
|
||
" <td>Promoção RE</td>\n",
|
||
" <td>Movimentar Flow</td>\n",
|
||
" <td>Desconto Direto</td>\n",
|
||
" <td>Ciclo todo</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>CABELOS</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>55805</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.00</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>Sim</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>350 rows × 47 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Ciclo Veiculo Tipo de Promoção Estratégia de Promoção \\\n",
|
||
"0 202513 Guia CF Promoção CF Movimentar Flow \n",
|
||
"1 202513 Guia CF Promoção CF Movimentar Flow \n",
|
||
"2 202513 Guia CF Promoção CF Movimentar Flow \n",
|
||
"3 202513 Guia CF Promoção CF Movimentar Flow \n",
|
||
"4 202513 Guia CF Promoção CF Movimentar Flow \n",
|
||
".. ... ... ... ... \n",
|
||
"345 202513 Fora Guia Promoção RE Movimentar Flow \n",
|
||
"346 202513 Fora Guia Promoção RE Movimentar Flow \n",
|
||
"347 202513 Fora Guia Promoção RE Movimentar Flow \n",
|
||
"348 202513 Fora Guia Promoção RE Movimentar Flow \n",
|
||
"349 202513 Fora Guia Promoção RE Movimentar Flow \n",
|
||
"\n",
|
||
" Tipo_mecanica Promo Período Limitado? EAM Categoria Cód. Combo \\\n",
|
||
"0 Desconto Direto NaN Não PERF. FEMININA NaN \n",
|
||
"1 Desconto Direto NaN Não PERF. FEMININA NaN \n",
|
||
"2 Desconto Direto NaN Não PERF. FEMININA NaN \n",
|
||
"3 Desconto Direto NaN Não PERF. FEMININA NaN \n",
|
||
"4 Desconto Direto NaN Não PERF. FEMININA NaN \n",
|
||
".. ... ... ... ... ... \n",
|
||
"345 Desconto Direto Ciclo todo Não CABELOS NaN \n",
|
||
"346 Desconto Direto Ciclo todo Não CABELOS NaN \n",
|
||
"347 Desconto Direto Ciclo todo Não CABELOS NaN \n",
|
||
"348 Desconto Direto Ciclo todo Não CABELOS NaN \n",
|
||
"349 Desconto Direto Ciclo todo Não CABELOS NaN \n",
|
||
"\n",
|
||
" Código do Item ... 0.34.2 0.35.2 0.2.3 0.25.3 0.28.3 0.3.3 0.32.3 \\\n",
|
||
"0 85268 ... 59.47 61.22 0.2 0.25 0.28 0.3 0.32 \n",
|
||
"1 93541 ... 30.57 31.47 0.2 0.25 0.28 0.3 0.32 \n",
|
||
"2 53138 ... 35.67 36.72 0.2 0.25 0.28 0.3 0.32 \n",
|
||
"3 50762 ... 23.43 24.12 0.2 0.25 0.28 0.3 0.32 \n",
|
||
"4 49803 ... 28.53 29.37 0.2 0.25 0.28 0.3 0.32 \n",
|
||
".. ... ... ... ... ... ... ... ... ... \n",
|
||
"345 53094 ... 0.00 0.00 NaN NaN NaN NaN NaN \n",
|
||
"346 55803 ... 0.00 0.00 NaN NaN NaN NaN NaN \n",
|
||
"347 93106 ... 0.00 0.00 NaN NaN NaN NaN NaN \n",
|
||
"348 93105 ... 0.00 0.00 NaN NaN NaN NaN NaN \n",
|
||
"349 55805 ... 0.00 0.00 NaN NaN NaN NaN NaN \n",
|
||
"\n",
|
||
" 0.34.3 0.35.3 BSO \n",
|
||
"0 0.34 0.35 Sim \n",
|
||
"1 0.34 0.35 Sim \n",
|
||
"2 0.34 0.35 Sim \n",
|
||
"3 0.34 0.35 Sim \n",
|
||
"4 0.34 0.35 Sim \n",
|
||
".. ... ... ... \n",
|
||
"345 NaN NaN Sim \n",
|
||
"346 NaN NaN Sim \n",
|
||
"347 NaN NaN Sim \n",
|
||
"348 NaN NaN Sim \n",
|
||
"349 NaN NaN Sim \n",
|
||
"\n",
|
||
"[350 rows x 47 columns]"
|
||
]
|
||
},
|
||
"execution_count": 23,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_tabela"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_tabela = df_tabela[[ 'Ciclo', 'Veiculo',\n",
|
||
" 'Tipo de Promoção', 'Estratégia de Promoção',\n",
|
||
" 'Tipo_mecanica', 'Promo Período Limitado?',\n",
|
||
" 'EAM', 'Categoria',\n",
|
||
" 'Cód. Combo', 'Código do Item',\n",
|
||
" 'Descrição do Item', 'Chamada Promocional',\n",
|
||
" 'Valor do Guia', 'Preço Promocionado',\n",
|
||
" '% de Desconto', 'RE compra por',\n",
|
||
" 'RE Vende por', 'RE lucra (R$)']]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_6076\\2370731253.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_tabela['Código do Item'] = df_tabela['Código do Item'].astype(str).str.replace(\".0\",\"\",regex=False)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"df_tabela['Código do Item'] = df_tabela['Código do Item'].astype(str).str.replace(\".0\",\"\",regex=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_6076\\1166075419.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_tabela['MATCH'] = 1\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"df_tabela['MATCH'] = 1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 27,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_tabela = pd.merge(left=df_tabela,right=df_pdv[['PDV','MATCH','UF','DESCRIÇÃO PDV','ANALISTA']],on='MATCH',how='inner')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 28,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_tabela = df_tabela.drop_duplicates()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 29,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Ciclo', 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
|
||
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
|
||
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
|
||
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
|
||
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
|
||
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 29,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_tabela.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
|
||
" 'nextcycleprojection', 'secondtonextcycleprojection'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df['pdv'] = df['pdv'].astype(str)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df['SKU_FINAL'] = df['SKU_FINAL'].astype(str)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_tabela['Código do Item'] = df_tabela['Código do Item'].astype('str')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 34,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_tabela['PDV'] = df_tabela['PDV'].astype(str)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(10656, 33)"
|
||
]
|
||
},
|
||
"execution_count": 35,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final = pd.merge(left=df,right=df_tabela,right_on=['Código do Item','PDV'],left_on=['SKU_FINAL','pdv'],how='right')\n",
|
||
"df_final.shape "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['match'] = 1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(10656, 39)"
|
||
]
|
||
},
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final = pd.merge(left=df_final, right=filtered_calendario[['Ciclo','INICIO CICLO','FIM CICLO','DURAÇÃO','match','dias_ate_inicio']], on='match',how='inner')\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(10656, 39)"
|
||
]
|
||
},
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"#df_final = pd.merge(left=df_final,right=df_pdv[['PDV', 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC','UF', 'MARCA', 'ANALISTA']],on = 'PDV',how='inner')\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 39,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final['SKU'] = df_final['SKU'].astype(str) \n",
|
||
"#df_final['PDV'] = df_final['PDV'].astype(str) \n",
|
||
"#df_final = pd.merge(left=df_final,right=df_estoque[['SKU_FINAL', 'DDV PREVISTO', 'COBERTURA ATUAL','PDV']],right_on=['PDV','SKU_FINAL'],left_on=['PDV','SKU'],how='left')\n",
|
||
"#df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 40,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(10656, 43)"
|
||
]
|
||
},
|
||
"execution_count": 40,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype(str).str.replace('.0','',regex=False) \n",
|
||
"\n",
|
||
"df_final = pd.merge(left=df_final,right=df_bi_preco[['SKU2', 'UF','Tipo Preço', 'PC', 'PV']],right_on=['UF','SKU2'],left_on=['UF','SKU_FINAL'],how='left')\n",
|
||
"df_final.shape "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 41,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_bi_preco['SKU1'] = df_bi_preco['SKU1'].astype(str).str.replace('.0','',regex=False) \n",
|
||
"\n",
|
||
"#df_final = pd.merge(left=df_final,right=df_bi_preco[['SKU1', 'SKU2', 'UF', 'PC', 'PV']],right_on=['UF','SKU1'],left_on=['UF','SKU'],how='left')\n",
|
||
"#df_final.shape "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 42,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_bi_preco = df_bi_preco[df_bi_preco['MARCA']=='EUDORA']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"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": 44,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_estoque = df_estoque.rename(columns={'SKU_FINAL':'SKU_PARA_VALIDACAO'})\n",
|
||
"#df_final = pd.merge( left= df_final, right = df_estoque[['SKU_PARA_VALIDACAO','Arquivo_Origem']], left_on= 'SKU', right_on='SKU_PARA_VALIDACAO', how='left')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 45,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
|
||
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
|
||
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
|
||
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
|
||
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
|
||
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
|
||
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
|
||
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n",
|
||
" 'Tipo Preço', 'PC', 'PV'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 45,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 46,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final = df_final.drop(columns=['Desativação','Lançamento','Promoção Próximo Ciclo','Compra inteligente semanal/Sugestão de compra','Planograma','Carteira Bloqueada Para Novos Pedidos','Preço Sell In','Quantidade','Item analisado','Promoção Próximo Ciclo + 1','SKU_PARA_VALIDACAO','Ciclo_y'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 47,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(10656, 45)"
|
||
]
|
||
},
|
||
"execution_count": 47,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['PDV_SKU'] = df_final['PDV'].astype(str) + df_final['SKU_FINAL'].astype(str) \n",
|
||
"df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['SKU_FINAL'].astype(str)\n",
|
||
"\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 48,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"secondtonextcycleprojection\n",
|
||
"0.0 5042\n",
|
||
"1.0 237\n",
|
||
"3.0 210\n",
|
||
"2.0 162\n",
|
||
"4.0 104\n",
|
||
" ... \n",
|
||
"366.0 1\n",
|
||
"95.0 1\n",
|
||
"177.0 1\n",
|
||
"110.0 1\n",
|
||
"109.0 1\n",
|
||
"Name: count, Length: 126, dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 48,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final['nextcycleprojection'].value_counts()\n",
|
||
"\n",
|
||
"df_final['secondtonextcycleprojection'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 49,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final['PROJEÇÃO DO CICLO PROMOCIONADO'] =df_final['Projeção Próximo Ciclo + 1'] - df_final['Projeção Próximo Ciclo'] # projeção do ciclo em estudo"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final['PROJEÇÃO DO CICLO PROMOCIONADO'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 51,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final['Data Prevista Regularização'] = df_final['Data Prevista Regularização'].astype(str).replace('0','REGULAR')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 52,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = df_final.rename(columns={'Arquivo_Origem': 'MARCA'})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 53,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final = df_final[~df_final['MARCA'].isna()]\n",
|
||
"#df_final['MARCA'].isna().sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 54,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(10656, 45)"
|
||
]
|
||
},
|
||
"execution_count": 54,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final = df_final.drop_duplicates()\n",
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 55,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
|
||
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
|
||
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
|
||
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
|
||
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
|
||
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
|
||
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
|
||
" 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n",
|
||
" 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 55,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 56,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['PDV', 'SKU', 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414',\n",
|
||
" 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n",
|
||
" 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C202509',\n",
|
||
" 'C202510', 'C202511'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 56,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_vendas['PDV'] = df_vendas['PDV'].astype(str)\n",
|
||
"df_vendas['SKU'] = df_vendas['SKU'].astype(str)\n",
|
||
"\n",
|
||
"df_vendas.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 57,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(10656, 45)"
|
||
]
|
||
},
|
||
"execution_count": 57,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 59,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final = pd.merge(df_final,df_vendas,left_on=['pdv','SKU_FINAL'],right_on=['PDV','SKU'],how='inner')"
|
||
]
|
||
},
|
||
{
|
||
"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</th>\n",
|
||
" <th>SKU_FINAL</th>\n",
|
||
" <th>ESTOQUE ATUAL</th>\n",
|
||
" <th>ESTOQUE EM TRANSITO</th>\n",
|
||
" <th>PEDIDO PENDENTE</th>\n",
|
||
" <th>Curva</th>\n",
|
||
" <th>CATEGORIA</th>\n",
|
||
" <th>DiasSemVenda</th>\n",
|
||
" <th>nextcycleprojection</th>\n",
|
||
" <th>secondtonextcycleprojection</th>\n",
|
||
" <th>...</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",
|
||
" <th>C202508</th>\n",
|
||
" <th>C202509</th>\n",
|
||
" <th>C202510</th>\n",
|
||
" <th>C202511</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>20968</td>\n",
|
||
" <td>93541</td>\n",
|
||
" <td>23</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>B</td>\n",
|
||
" <td>PERFUMARIA</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>21.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>20969</td>\n",
|
||
" <td>93541</td>\n",
|
||
" <td>27</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>B</td>\n",
|
||
" <td>PERFUMARIA</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>18.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>20991</td>\n",
|
||
" <td>93541</td>\n",
|
||
" <td>20</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>B</td>\n",
|
||
" <td>PERFUMARIA</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>12.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>14.0</td>\n",
|
||
" <td>16.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>26.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>20992</td>\n",
|
||
" <td>93541</td>\n",
|
||
" <td>178</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>PERFUMARIA</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>121.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>20995</td>\n",
|
||
" <td>93541</td>\n",
|
||
" <td>67</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>B</td>\n",
|
||
" <td>PERFUMARIA</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>14.0</td>\n",
|
||
" <td>53.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>12.0</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>43.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>27.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3207</th>\n",
|
||
" <td>20998</td>\n",
|
||
" <td>53094</td>\n",
|
||
" <td>275</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>CABELOS</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>190.0</td>\n",
|
||
" <td>208.0</td>\n",
|
||
" <td>48.0</td>\n",
|
||
" <td>47.0</td>\n",
|
||
" <td>179.0</td>\n",
|
||
" <td>31.0</td>\n",
|
||
" <td>44.0</td>\n",
|
||
" <td>18.0</td>\n",
|
||
" <td>180.0</td>\n",
|
||
" <td>69.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3208</th>\n",
|
||
" <td>21278</td>\n",
|
||
" <td>53094</td>\n",
|
||
" <td>38</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>CABELOS</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>27.0</td>\n",
|
||
" <td>15.0</td>\n",
|
||
" <td>24.0</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>71.0</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>20.0</td>\n",
|
||
" <td>30.0</td>\n",
|
||
" <td>21.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3209</th>\n",
|
||
" <td>21495</td>\n",
|
||
" <td>53094</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>CABELOS</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3210</th>\n",
|
||
" <td>22541</td>\n",
|
||
" <td>53094</td>\n",
|
||
" <td>46</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>CABELOS</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>24.0</td>\n",
|
||
" <td>42.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3211</th>\n",
|
||
" <td>24255</td>\n",
|
||
" <td>53094</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>56</td>\n",
|
||
" <td>25</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>CABELOS</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>3212 rows × 66 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" pdv SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE Curva \\\n",
|
||
"0 20968 93541 23 0 0 B \n",
|
||
"1 20969 93541 27 0 0 B \n",
|
||
"2 20991 93541 20 0 0 B \n",
|
||
"3 20992 93541 178 0 0 E \n",
|
||
"4 20995 93541 67 0 0 B \n",
|
||
"... ... ... ... ... ... ... \n",
|
||
"3207 20998 53094 275 0 0 A \n",
|
||
"3208 21278 53094 38 0 0 A \n",
|
||
"3209 21495 53094 4 0 0 A \n",
|
||
"3210 22541 53094 46 0 0 A \n",
|
||
"3211 24255 53094 4 56 25 E \n",
|
||
"\n",
|
||
" CATEGORIA DiasSemVenda nextcycleprojection \\\n",
|
||
"0 PERFUMARIA 13.0 0.0 \n",
|
||
"1 PERFUMARIA 3.0 0.0 \n",
|
||
"2 PERFUMARIA 5.0 0.0 \n",
|
||
"3 PERFUMARIA 0.0 0.0 \n",
|
||
"4 PERFUMARIA 3.0 14.0 \n",
|
||
"... ... ... ... \n",
|
||
"3207 CABELOS 0.0 0.0 \n",
|
||
"3208 CABELOS 0.0 0.0 \n",
|
||
"3209 CABELOS 2.0 0.0 \n",
|
||
"3210 CABELOS 2.0 0.0 \n",
|
||
"3211 CABELOS 0.0 0.0 \n",
|
||
"\n",
|
||
" secondtonextcycleprojection ... C202502 C202503 C202504 C202505 \\\n",
|
||
"0 0.0 ... 9.0 3.0 1.0 1.0 \n",
|
||
"1 0.0 ... 18.0 3.0 8.0 9.0 \n",
|
||
"2 0.0 ... 12.0 1.0 9.0 14.0 \n",
|
||
"3 121.0 ... 0.0 0.0 0.0 0.0 \n",
|
||
"4 53.0 ... 12.0 13.0 4.0 10.0 \n",
|
||
"... ... ... ... ... ... ... \n",
|
||
"3207 0.0 ... 190.0 208.0 48.0 47.0 \n",
|
||
"3208 0.0 ... 27.0 15.0 24.0 13.0 \n",
|
||
"3209 0.0 ... 9.0 0.0 0.0 5.0 \n",
|
||
"3210 0.0 ... 9.0 6.0 4.0 10.0 \n",
|
||
"3211 0.0 ... 0.0 0.0 0.0 0.0 \n",
|
||
"\n",
|
||
" C202506 C202507 C202508 C202509 C202510 C202511 \n",
|
||
"0 21.0 3.0 1.0 13.0 1.0 1.0 \n",
|
||
"1 23.0 4.0 9.0 2.0 11.0 1.0 \n",
|
||
"2 16.0 6.0 8.0 26.0 9.0 1.0 \n",
|
||
"3 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"4 43.0 8.0 6.0 27.0 1.0 2.0 \n",
|
||
"... ... ... ... ... ... ... \n",
|
||
"3207 179.0 31.0 44.0 18.0 180.0 69.0 \n",
|
||
"3208 71.0 13.0 8.0 20.0 30.0 21.0 \n",
|
||
"3209 5.0 3.0 2.0 5.0 6.0 1.0 \n",
|
||
"3210 24.0 42.0 4.0 3.0 9.0 8.0 \n",
|
||
"3211 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
||
"\n",
|
||
"[3212 rows x 66 columns]"
|
||
]
|
||
},
|
||
"execution_count": 60,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 61,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
|
||
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
|
||
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
|
||
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
|
||
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
|
||
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
|
||
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
|
||
" 'MATCH', 'PDV_x', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n",
|
||
" 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO', 'PDV_y', 'SKU',\n",
|
||
" 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414', 'C202415',\n",
|
||
" 'C202416', 'C202417', 'C202501', 'C202502', 'C202503', 'C202504',\n",
|
||
" 'C202505', 'C202506', 'C202507', 'C202508', 'C202509', 'C202510',\n",
|
||
" 'C202511'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 61,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 62,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Define list of target columns\n",
|
||
"sales_2024_cols = df_final.columns[-18:-1]\n",
|
||
"# Create a new column with the row-wise max\n",
|
||
"df_final['PICO DE VENDAS 17CICLOS'] = df_final[sales_2024_cols].max(axis=1)\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 63,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['C202411', 'C202412', 'C202413', 'C202414', 'C202415', 'C202416',\n",
|
||
" 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n",
|
||
" 'C202506', 'C202507', 'C202508', 'C202509', 'C202510'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 63,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"sales_2024_cols"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 64,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"vendas_6_meses = df_final.columns[-8:-2]\n",
|
||
"\n",
|
||
"df_final['Pico Vendas Ultimos 6 ciclos'] = df_final[vendas_6_meses].max(axis=1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 65,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'C202412'"
|
||
]
|
||
},
|
||
"execution_count": 65,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[-19]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 66,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.3740666443775772\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"CRESCIMENTO = (df_final[df_final.columns[-18]].sum() - df_final[df_final.columns[-3]].sum())/df_final[df_final.columns[-18]].sum() \n",
|
||
"print(CRESCIMENTO)\n",
|
||
"\n",
|
||
"df_final['CRESCIMENTO'] = .2"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 67,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"mesmo_ciclo_ano_passado = df_final.columns[-19]\n",
|
||
"ciclo_ano_passado = df_final.columns[-19:-18].str.split(\" \")[0][-1]\n",
|
||
"df_final[ciclo_ano_passado] = df_final[mesmo_ciclo_ano_passado]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 68,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"'C202413'"
|
||
]
|
||
},
|
||
"execution_count": 68,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[-19:-18].str.split(\" \")[0][-1]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 69,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['C202411', 'C202412', 'C202413', 'C202414', 'C202415', 'C202416',\n",
|
||
" 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n",
|
||
" 'C202506', 'C202507', 'C202508', 'C202509', 'C202510', 'C202511'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 69,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns[-21:-3]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 70,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"vendas_todos_historicos = df_final.columns[-21:-3]\n",
|
||
"\n",
|
||
"df_final['MEDIANA DO HISTÓRICO'] = df_final[vendas_todos_historicos].median(axis=1)\n",
|
||
"\n",
|
||
"df_final['MEDIA DO HISTÓRICO'] = df_final[vendas_todos_historicos].mean(axis=1)\n",
|
||
"\n",
|
||
"df_final['MEDIANA DO HISTÓRICO'] = np.where(df_final['MEDIANA DO HISTÓRICO'] <1,df_final['MEDIA DO HISTÓRICO'],df_final['MEDIANA DO HISTÓRICO'])\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 71,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"np.float64(0.3740666443775772)"
|
||
]
|
||
},
|
||
"execution_count": 71,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"CRESCIMENTO"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 72,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
|
||
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
|
||
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
|
||
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
|
||
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
|
||
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
|
||
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
|
||
" 'MATCH', 'PDV_x', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n",
|
||
" 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO', 'PDV_y', 'SKU',\n",
|
||
" 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414', 'C202415',\n",
|
||
" 'C202416', 'C202417', 'C202501', 'C202502', 'C202503', 'C202504',\n",
|
||
" 'C202505', 'C202506', 'C202507', 'C202508', 'C202509', 'C202510',\n",
|
||
" 'C202511', 'PICO DE VENDAS 17CICLOS', 'Pico Vendas Ultimos 6 ciclos',\n",
|
||
" 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 72,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 73,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final['PV GINSENG'] = np.where(df_final['CRESCIMENTO'] * df_final[ciclo_ano_passado] + df_final[ciclo_ano_passado] < df_final['MEDIANA DO HISTÓRICO'],\n",
|
||
" np.ceil(df_final['CRESCIMENTO'] * df_final['MEDIANA DO HISTÓRICO']+ df_final['MEDIANA DO HISTÓRICO']), \n",
|
||
" np.ceil(df_final['CRESCIMENTO']*df_final[ciclo_ano_passado]+df_final[ciclo_ano_passado]))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 74,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final['PV GINSENG'] = np.where(df_final['PV GINSENG']<1, df_final['Projeção Próximo Ciclo + 1'],df_final['PV GINSENG'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 75,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final = df_final.rename(columns={df_final.columns[18]: \"C-4\", df_final.columns[19]: \"C-3\",df_final.columns[20]: \"C-2\",df_final.columns[21]: \"C-1\"})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 76,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
|
||
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
|
||
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
|
||
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
|
||
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
|
||
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
|
||
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
|
||
" 'MATCH', 'PDV_x', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n",
|
||
" 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO', 'PDV_y', 'SKU',\n",
|
||
" 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414', 'C202415',\n",
|
||
" 'C202416', 'C202417', 'C202501', 'C202502', 'C202503', 'C202504',\n",
|
||
" 'C202505', 'C202506', 'C202507', 'C202508', 'C202509', 'C202510',\n",
|
||
" 'C202511', 'PICO DE VENDAS 17CICLOS', 'Pico Vendas Ultimos 6 ciclos',\n",
|
||
" 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO',\n",
|
||
" 'PV GINSENG'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 76,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 77,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final.drop(columns=df_final.columns[-21:-10], inplace=True)\n",
|
||
"\n",
|
||
"df_final.drop(columns=df_final.columns[-13:-11], inplace=True)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 78,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# List all columns except the two\n",
|
||
"cols_to_group_by = df_final.columns.difference(['DDV PREVISTO', 'COBERTURA ATUAL'])\n",
|
||
"\n",
|
||
"# Group and aggregate\n",
|
||
"df_final_dedup = df_final\n",
|
||
" "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 79,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final['Compra inteligente Próximo Ciclo']\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 80,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final['DDV PREVISTO'] = df_final['DDV PREVISTO'].fillna(0.01)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 81,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup['DDV PREVISTO'] = np.where(\n",
|
||
"# df_final_dedup['DDV PREVISTO'] == 0,\n",
|
||
"# 0.01,\n",
|
||
"# df_final_dedup['DDV PREVISTO']\n",
|
||
"#)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 82,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup['DDV PREVISTO'].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 83,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup['EST PROJE FINAL CICLO ATUAL'] = (df_final_dedup['Estoque Atual'] + df_final_dedup['Estoque em Transito']) - round(df_final_dedup['dias_ate_inicio'] * df_final_dedup['DDV PREVISTO'],0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 84,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup['EST PROJE FINAL CICLO ATUAL'] = np.where(df_final_dedup['EST PROJE FINAL CICLO ATUAL']<0,0,df_final_dedup['EST PROJE FINAL CICLO ATUAL'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 85,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 86,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup['VENDAS R$ PV GINSENG'] = df_final_dedup['PRECO DE VENDA'] * df_final_dedup['PV GINSENG']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 87,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup = df_final_dedup.rename(columns={'Ciclo_x':'Ciclo'})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 88,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_final_dedup['SUGESTÃO ABTASTECIMENTO\t'] = ''\n",
|
||
"df_final_dedup['VENDAS R$ ABASTECIMENTO'] = ''\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 89,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup['RBV 202406'] = df_final_dedup['PRECO DE VENDA'] * df_final_dedup[ciclo_ano_passado] "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 90,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup['COB PROJETADA'] = np.where(\n",
|
||
"# df_final_dedup['DDV PREVISTO'] != 0,\n",
|
||
"# (df_final_dedup['EST PROJE FINAL CICLO ATUAL'] + df_final_dedup['PV GINSENG']) / df_final_dedup['DDV PREVISTO'],\n",
|
||
"# 999)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 91,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup.drop(columns=['dias_ate_inicio','SKU_FINAL','Projeção Próximo Ciclo + 1',\n",
|
||
"# 'CRESCIMENTO'],inplace=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 92,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup['MARCA'] = df_final_dedup['MARCA'].str.replace('.csv','',regex=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 93,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup['COB PROJETADA'] = df_final_dedup['COB PROJETADA'].fillna(999)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 94,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_final_dedup.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 95,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#marca_promo = df_estoque['Arquivo_Origem'].iloc[0].replace('.csv','')\n",
|
||
"#marca_promo"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 96,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
|
||
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
|
||
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
|
||
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
|
||
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
|
||
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
|
||
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
|
||
" 'MATCH', 'PDV_x', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n",
|
||
" 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO', 'PDV_y', 'SKU',\n",
|
||
" 'DESCRICAO', 'C202413', 'C202508', 'C202509', 'C202510', 'C202511',\n",
|
||
" 'PICO DE VENDAS 17CICLOS', 'Pico Vendas Ultimos 6 ciclos',\n",
|
||
" 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO',\n",
|
||
" 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t', 'VENDAS R$ ABASTECIMENTO'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 96,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_final.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 98,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Passo 1: ordenar\n",
|
||
"df_sorted = df_final.sort_values(by='% de Desconto', ascending=False)\n",
|
||
"\n",
|
||
"# Passo 2: obter até 3 chamadas promocionais por grupo\n",
|
||
"promo_grouped = (\n",
|
||
" df_sorted.groupby(['SKU_FINAL', 'pdv'])['Chamada Promocional']\n",
|
||
" .apply(lambda x: x.dropna().unique()[:3])\n",
|
||
" .apply(pd.Series)\n",
|
||
" .rename(columns={0: 'MECÂNICA 1', 1: 'MECÂNICA 2', 2: 'MECÂNICA 3'})\n",
|
||
" .reset_index()\n",
|
||
")\n",
|
||
"\n",
|
||
"# Passo 3: base com maior % de desconto\n",
|
||
"df_base = df_sorted.drop_duplicates(subset=['SKU_FINAL', 'pdv'], keep='first').reset_index(drop=True)\n",
|
||
"\n",
|
||
"# Passo 4: merge com chamadas pivotadas\n",
|
||
"df_merged = df_base.merge(promo_grouped, on=['SKU_FINAL', 'pdv'], how='left')\n",
|
||
"\n",
|
||
"# Corrigir dicionário: agrupar e pegar o primeiro valor válido por (SKU_FINAL, pdv)\n",
|
||
"# Passo 1: dicionário com Cód. Combo único por SKU_FINAL+pdv\n",
|
||
"cod_combo_map = (\n",
|
||
" df_final\n",
|
||
" .dropna(subset=['Cód. Combo'])\n",
|
||
" .groupby(['SKU_FINAL', 'pdv'])['Cód. Combo']\n",
|
||
" .first()\n",
|
||
" .to_dict()\n",
|
||
")\n",
|
||
"\n",
|
||
"# Passo 2: gerar Series com os valores mapeados\n",
|
||
"cod_combo_series = df_merged.set_index(['SKU_FINAL', 'pdv']).index.map(cod_combo_map)\n",
|
||
"\n",
|
||
"# Passo 3: substituir os valores diretamente\n",
|
||
"df_merged['Cód. Combo'] = cod_combo_series.where(cod_combo_series.notna(), df_merged['Cód. Combo'])\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Columns to bring up front\n",
|
||
"priority_cols = [\n",
|
||
" 'PDV_SKU',\t'SKU',\t'MARCA','INICIO CICLO',\n",
|
||
" 'FIM CICLO',\t'DURAÇÃO','dias_ate_inicio',\t\n",
|
||
" 'UFPRODUTO',\t'Item Desativado',\t'Data Prevista Regularização',\n",
|
||
" 'ANALISTA',\t'UF',\t'PDV',\t'DESCRIÇÃO PDV',\t'Classe',\n",
|
||
" 'Descrição','MECÂNICA 1',\n",
|
||
" 'MECÂNICA 2', 'MECÂNICA 3','Estoque Atual',\t'COBERTURA ATUAL',\n",
|
||
" 'Estoque em Transito',\t'Pedido Pendente',\t'PICO DE VENDAS 2024','Pico Vendas Ultimos 6 ciclos',\n",
|
||
" 'C-4',\t'C-3',\t'C-2',\t'C-1',\t'Histórico de Vendas do Ciclo Atual',\n",
|
||
" 'Dias sem venda'\n",
|
||
"]\n",
|
||
"\n",
|
||
"# All remaining columns\n",
|
||
"other_cols = [col for col in df_merged.columns if col not in priority_cols]\n",
|
||
"\n",
|
||
"# Reorder\n",
|
||
"df_merged = df_merged[priority_cols + other_cols]\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 99,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_merged['INICIO CICLO'] = pd.to_datetime(df_merged['INICIO CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')\n",
|
||
"\n",
|
||
"df_merged['FIM CICLO'] = pd.to_datetime(df_merged['FIM CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 100,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n",
|
||
" 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n",
|
||
" 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n",
|
||
" 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n",
|
||
" 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n",
|
||
" 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n",
|
||
" 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n",
|
||
" '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n",
|
||
" 'MATCH', 'PDV_x', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n",
|
||
" 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n",
|
||
" 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO', 'PDV_y', 'SKU',\n",
|
||
" 'DESCRICAO', 'C202413', 'C202508', 'C202509', 'C202510', 'C202511',\n",
|
||
" 'PICO DE VENDAS 17CICLOS', 'Pico Vendas Ultimos 6 ciclos',\n",
|
||
" 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO',\n",
|
||
" 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t', 'VENDAS R$ ABASTECIMENTO',\n",
|
||
" 'MECÂNICA 1', 'MECÂNICA 2', 'MECÂNICA 3'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 100,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_merged.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 101,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_merged = df_merged.loc[:, ~df_merged.columns.str.endswith('_y')]\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 102,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_merged.columns = df_merged.columns.str.replace('_x$', '', regex=True)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 103,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_merged = df_merged.drop(columns=['Veiculo',\t'Tipo de Promoção',\t'Estratégia de Promoção','Tipo_mecanica'\n",
|
||
" ,'Chamada Promocional','MATCH','match', 'SKU_FINAL','Descrição do Item','CRESCIMENTO',\n",
|
||
" 'Cód. Combo'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 104,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_merged['SUGESTÃO ANALISTA'] = \"\"\n",
|
||
"\n",
|
||
"df_merged['SUGESTÃO COMERCIAL'] = \"\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 106,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_merged = df_merged.drop(columns=['Código do Item','PDV','RE compra por',\t'RE Vende por',\t'RE lucra (R$)','INICIO CICLO',\n",
|
||
" 'FIM CICLO','SKU2','Tipo Preço','Ciclo','CATEGORIA','ANALISTA','dias_ate_inicio','PDV_SKU','UFPRODUTO',\n",
|
||
" 'VENDAS R$ ABASTECIMENTO','DURAÇÃO','MEDIANA DO HISTÓRICO','DURAÇÃO','PC','PV'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 107,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_merged = df_merged.rename(columns={'nextcycleprojection':'PROJEÇÃO PROX CICLO'\t,'secondtonextcycleprojection':'PROJEÇÃO PROX CICLO +1'})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 108,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_merged.columns = df_merged.columns.str.upper()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 109,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df_merged = df_merged[['UF','PDV','DESCRIÇÃO PDV','SKU','DESCRICAO','EAM','CATEGORIA','CURVA','ESTOQUE ATUAL','ESTOQUE EM TRANSITO','PEDIDO PENDENTE','DIASSEMVENDA','PROJEÇÃO PROX CICLO','PROJEÇÃO PROX CICLO +1','PROMO PERÍODO LIMITADO?','VALOR DO GUIA','PREÇO PROMOCIONADO','% DE DESCONTO','PICO DE VENDAS 17CICLOS','PICO VENDAS ULTIMOS 6 CICLOS','MEDIA DO HISTÓRICO']]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 110,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_merged['MEDIA DO HISTÓRICO'] = round(df_merged['MEDIA DO HISTÓRICO'],0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 111,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['PDV', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE',\n",
|
||
" 'CURVA', 'DIASSEMVENDA', 'PROJEÇÃO PROX CICLO',\n",
|
||
" 'PROJEÇÃO PROX CICLO +1', 'PROMO PERÍODO LIMITADO?', 'EAM', 'CATEGORIA',\n",
|
||
" 'VALOR DO GUIA', 'PREÇO PROMOCIONADO', '% DE DESCONTO', 'UF',\n",
|
||
" 'DESCRIÇÃO PDV', 'SKU', 'DESCRICAO', 'C202413', 'C202508', 'C202509',\n",
|
||
" 'C202510', 'C202511', 'PICO DE VENDAS 17CICLOS',\n",
|
||
" 'PICO VENDAS ULTIMOS 6 CICLOS', 'MEDIA DO HISTÓRICO', 'PV GINSENG',\n",
|
||
" 'SUGESTÃO ABTASTECIMENTO\\t', 'MECÂNICA 1', 'MECÂNICA 2', 'MECÂNICA 3',\n",
|
||
" 'SUGESTÃO ANALISTA', 'SUGESTÃO COMERCIAL'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 111,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_merged.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 112,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Colunas que devem estar na frente\n",
|
||
"colunas_inicio = [\n",
|
||
" 'UF', 'PDV', 'DESCRIÇÃO PDV', 'SKU', 'DESCRICAO', 'EAM', 'CATEGORIA', 'CURVA',\n",
|
||
" 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE', 'DIASSEMVENDA',\n",
|
||
" 'PROJEÇÃO PROX CICLO', 'PROJEÇÃO PROX CICLO +1', 'PROMO PERÍODO LIMITADO?',\n",
|
||
" 'VALOR DO GUIA', 'PREÇO PROMOCIONADO', '% DE DESCONTO',\n",
|
||
" 'PICO DE VENDAS 17CICLOS', 'PICO VENDAS ULTIMOS 6 CICLOS', 'MEDIA DO HISTÓRICO'\n",
|
||
"]\n",
|
||
"\n",
|
||
"# Colunas que devem estar no fim\n",
|
||
"colunas_fim = [\n",
|
||
" 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t', 'SUGESTÃO ANALISTA', 'SUGESTÃO COMERCIAL'\n",
|
||
"]\n",
|
||
"\n",
|
||
"# Todas as outras colunas (não estão nem no início nem no fim)\n",
|
||
"colunas_meio = [col for col in df_merged.columns if col not in colunas_inicio + colunas_fim]\n",
|
||
"\n",
|
||
"# Reordena o DataFrame\n",
|
||
"df_merged = df_merged[colunas_inicio + colunas_meio + colunas_fim]\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 113,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_merged = df_merged.drop_duplicates()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"\n",
|
||
"from openpyxl import load_workbook\n",
|
||
"from openpyxl.styles import PatternFill, Font\n",
|
||
"\n",
|
||
"\n",
|
||
"# Export to Excel\n",
|
||
"output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\EUD_promoção_{ciclo_mais2}_04.06.xlsx'\n",
|
||
"with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n",
|
||
" df_merged.to_excel(writer, index=False, sheet_name='Sheet1')\n",
|
||
"\n",
|
||
"# Apply styles\n",
|
||
"wb = load_workbook(output_file)\n",
|
||
"ws = wb['Sheet1']\n",
|
||
"\n",
|
||
"# Style header\n",
|
||
"header_fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid') # Light Blue\n",
|
||
"header_font = Font(color='FFFFFF', bold=True) # White & Bold\n",
|
||
"\n",
|
||
"for cell in ws[1]:\n",
|
||
" cell.fill = header_fill\n",
|
||
" cell.font = header_font\n",
|
||
"\n",
|
||
"# Style rows: gray/white alternating\n",
|
||
"gray_fill = PatternFill(start_color='DDDDDD', end_color='DDDDDD', fill_type='solid') # Light gray\n",
|
||
"\n",
|
||
"for i, row in enumerate(ws.iter_rows(min_row=2, max_row=ws.max_row), start=2):\n",
|
||
" if i % 2 == 0:\n",
|
||
" for cell in row:\n",
|
||
" cell.fill = gray_fill\n",
|
||
"\n",
|
||
"# Save styled workbook\n",
|
||
"wb.save(output_file)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"coisas q saem\n",
|
||
"\n",
|
||
"Lançamento\n",
|
||
"Subcategoria\n",
|
||
"Projeção Próximo Ciclo \n",
|
||
"Promoção Próximo Ciclo\n",
|
||
"Compra inteligente semanal/Sugestão de compra\n",
|
||
"Compra inteligente Próximo Ciclo\n",
|
||
"Planograma\n",
|
||
"Carteira Bloqueada Para Novos Pedidos\n",
|
||
"Quantidade por caixa\n",
|
||
"Preço Sell In\n",
|
||
"Quantidade\n",
|
||
"Item analisado\n",
|
||
"Tipo Preço\n",
|
||
"\n",
|
||
">>>>>>>>>>>>>NAO ESTÁ PEGANDO O MERGE COM O DF_ESTOQUE\n",
|
||
"\n",
|
||
"\n",
|
||
"CRIAR PROJEÇÃO DE VENDA DO CICLO ATUAL\n",
|
||
"Compra inteligente Próximo Ciclo + 1 >>>>>>> RENAME PRA NOROMAL"
|
||
]
|
||
}
|
||
],
|
||
"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
|
||
}
|