Ruptura_Projetada/promoção/promoção_EUD_ciclo07.ipynb
2025-07-29 14:33:40 -03:00

3110 lines
98 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 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
}