diff --git a/promoção/promoção_EUD_ciclo07.ipynb b/promoção/promoção_EUD_ciclo07.ipynb
index 434a7ce..a6ba58a 100644
--- a/promoção/promoção_EUD_ciclo07.ipynb
+++ b/promoção/promoção_EUD_ciclo07.ipynb
@@ -2,19 +2,530 @@
"cells": [
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"metadata": {},
- "outputs": [],
+ "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",
- "import glob\n",
- "import os "
+ "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": null,
+ "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": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " PDV | \n",
+ " SKU | \n",
+ " DESCRICAO | \n",
+ " C202411 | \n",
+ " C202412 | \n",
+ " C202413 | \n",
+ " C202414 | \n",
+ " C202415 | \n",
+ " C202416 | \n",
+ " C202417 | \n",
+ " ... | \n",
+ " C202502 | \n",
+ " C202503 | \n",
+ " C202504 | \n",
+ " C202505 | \n",
+ " C202506 | \n",
+ " C202507 | \n",
+ " C202508 | \n",
+ " C202509 | \n",
+ " C202510 | \n",
+ " C202511 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 11201 | \n",
+ " 1004 | \n",
+ " FLORATTA DES COL MY BLUE 75ml | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 11201 | \n",
+ " 1005 | \n",
+ " DEM FLORATTA DES COL MY BLUE 4ml | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 11201 | \n",
+ " 1078 | \n",
+ " MATCH SRUM CAP POS QUIMICA 50ml | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 11201 | \n",
+ " 1296 | \n",
+ " PMPCK THE BLEND DES ANTIT AER 2x75g | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 11201 | \n",
+ " 1302 | \n",
+ " PMPCK LILY DES ANTIT AER 2x75g | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 188531 | \n",
+ " 5699 | \n",
+ " 90770 | \n",
+ " PIN BALAO O BOTICARIO PAIS/25 UNIT | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 188532 | \n",
+ " 5699 | \n",
+ " 90772 | \n",
+ " PIN AMOR O BOTICARIO PAIS/25 UNIT | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 188533 | \n",
+ " 5699 | \n",
+ " 90774 | \n",
+ " PIN MELHOR PAI O BOTICARIO PAIS/25 UNIT | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 188534 | \n",
+ " 5699 | \n",
+ " 90776 | \n",
+ " SACOLA TOP M O BOTICARIO PAIS 2025 UNIT | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 188535 | \n",
+ " 8074 | \n",
+ " 43151 | \n",
+ " MATERIAL POS CONSUMO | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
188536 rows × 21 columns
\n",
+ "
"
+ ],
+ "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": [
@@ -32,118 +543,176 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "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\\DB_PROMOÇÕES\\EUDORA\\202511\\DRAFT_PDVS_SEM_\" # arquivo dos drafts\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",
+ "#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",
+ "#df_draft = pd.concat([pd.read_csv(file) for file in csv_files], ignore_index=True)\n",
"\n",
"\n",
- "df_draft.shape\n"
+ "#df_draft.shape\n"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "df_draft['match'] = 1 \n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
+ "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\\DB_PROMOÇÕES\\EUDORA\\202511\\estoque\"\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",
+ "#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",
+ "#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",
+ "#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",
+ "# 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",
+ "#if df_list:\n",
+ "# df_estoque = pd.concat(df_list, ignore_index=True)\n",
"\n",
- "df_estoque['PDV'] = df_estoque['PDV'].astype(str)\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",
+ "#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"
+ "#df_estoque['SKU_FINAL']=df_estoque['SKU_FINAL'].astype(str)'''\n"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 11,
"metadata": {},
- "outputs": [],
+ "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": null,
+ "execution_count": 12,
"metadata": {},
- "outputs": [],
+ "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": null,
+ "execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
- "df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\EUDORA\\202509\\arquivos pra gerar\\pdvs\\PDV_ATT.xlsx\")\n",
+ "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['PDV'] = df_pdv['PDV DESC'].str.split(\"-\").str[0].str.strip()\n"
+ "df_pdv = df_pdv[~df_pdv['CANAL'].isin(['MTZ','LJ'])]\n",
+ "\n",
+ "\n"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 14,
"metadata": {},
- "outputs": [],
+ "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": [
- "#ignorando a PDV que ainda não está online\n",
- "df_pdv = df_pdv[df_pdv['DESCRIÇÃO PDV'] != '23813-COMERCIO-HIB VALENTE']"
+ "df_pdv['PDV'].value_counts()"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
@@ -165,16 +734,16 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
- "df_estoque = df_estoque[df_estoque['Arquivo_Origem']== \"EUD.csv\"]"
+ "#df_estoque = df_estoque[df_estoque['Arquivo_Origem']== \"EUD.csv\"]"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
@@ -183,7 +752,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
@@ -215,16 +784,80 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 19,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Ciclo | \n",
+ " INICIO CICLO | \n",
+ " FIM CICLO | \n",
+ " DURAÇÃO | \n",
+ " MARCA | \n",
+ " Date | \n",
+ " NUM_CICLO | \n",
+ " ANO_CICLO | \n",
+ " CICLOMAIS2 | \n",
+ " dias_ate_inicio | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2346 | \n",
+ " C202513 | \n",
+ " 2025-08-27 | \n",
+ " 2025-09-16 | \n",
+ " 21 | \n",
+ " EUDORA | \n",
+ " 2025-08-27 | \n",
+ " 13 | \n",
+ " C2025 | \n",
+ " C202515 | \n",
+ " 29 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "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": null,
+ "execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
@@ -233,7 +866,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
@@ -242,16 +875,400 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "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\\202511\\tabela promo\\Tabela-de-Promocoes_C11-(1)-1747747476284.xlsx.xlsx\")\n"
+ "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": null,
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Ciclo | \n",
+ " Veiculo | \n",
+ " Tipo de Promoção | \n",
+ " Estratégia de Promoção | \n",
+ " Tipo_mecanica | \n",
+ " Promo Período Limitado? | \n",
+ " EAM | \n",
+ " Categoria | \n",
+ " Cód. Combo | \n",
+ " Código do Item | \n",
+ " ... | \n",
+ " 0.34.2 | \n",
+ " 0.35.2 | \n",
+ " 0.2.3 | \n",
+ " 0.25.3 | \n",
+ " 0.28.3 | \n",
+ " 0.3.3 | \n",
+ " 0.32.3 | \n",
+ " 0.34.3 | \n",
+ " 0.35.3 | \n",
+ " BSO | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 202513 | \n",
+ " Guia CF | \n",
+ " Promoção CF | \n",
+ " Movimentar Flow | \n",
+ " Desconto Direto | \n",
+ " NaN | \n",
+ " Não | \n",
+ " PERF. FEMININA | \n",
+ " NaN | \n",
+ " 85268 | \n",
+ " ... | \n",
+ " 59.47 | \n",
+ " 61.22 | \n",
+ " 0.2 | \n",
+ " 0.25 | \n",
+ " 0.28 | \n",
+ " 0.3 | \n",
+ " 0.32 | \n",
+ " 0.34 | \n",
+ " 0.35 | \n",
+ " Sim | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 202513 | \n",
+ " Guia CF | \n",
+ " Promoção CF | \n",
+ " Movimentar Flow | \n",
+ " Desconto Direto | \n",
+ " NaN | \n",
+ " Não | \n",
+ " PERF. FEMININA | \n",
+ " NaN | \n",
+ " 93541 | \n",
+ " ... | \n",
+ " 30.57 | \n",
+ " 31.47 | \n",
+ " 0.2 | \n",
+ " 0.25 | \n",
+ " 0.28 | \n",
+ " 0.3 | \n",
+ " 0.32 | \n",
+ " 0.34 | \n",
+ " 0.35 | \n",
+ " Sim | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 202513 | \n",
+ " Guia CF | \n",
+ " Promoção CF | \n",
+ " Movimentar Flow | \n",
+ " Desconto Direto | \n",
+ " NaN | \n",
+ " Não | \n",
+ " PERF. FEMININA | \n",
+ " NaN | \n",
+ " 53138 | \n",
+ " ... | \n",
+ " 35.67 | \n",
+ " 36.72 | \n",
+ " 0.2 | \n",
+ " 0.25 | \n",
+ " 0.28 | \n",
+ " 0.3 | \n",
+ " 0.32 | \n",
+ " 0.34 | \n",
+ " 0.35 | \n",
+ " Sim | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 202513 | \n",
+ " Guia CF | \n",
+ " Promoção CF | \n",
+ " Movimentar Flow | \n",
+ " Desconto Direto | \n",
+ " NaN | \n",
+ " Não | \n",
+ " PERF. FEMININA | \n",
+ " NaN | \n",
+ " 50762 | \n",
+ " ... | \n",
+ " 23.43 | \n",
+ " 24.12 | \n",
+ " 0.2 | \n",
+ " 0.25 | \n",
+ " 0.28 | \n",
+ " 0.3 | \n",
+ " 0.32 | \n",
+ " 0.34 | \n",
+ " 0.35 | \n",
+ " Sim | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 202513 | \n",
+ " Guia CF | \n",
+ " Promoção CF | \n",
+ " Movimentar Flow | \n",
+ " Desconto Direto | \n",
+ " NaN | \n",
+ " Não | \n",
+ " PERF. FEMININA | \n",
+ " NaN | \n",
+ " 49803 | \n",
+ " ... | \n",
+ " 28.53 | \n",
+ " 29.37 | \n",
+ " 0.2 | \n",
+ " 0.25 | \n",
+ " 0.28 | \n",
+ " 0.3 | \n",
+ " 0.32 | \n",
+ " 0.34 | \n",
+ " 0.35 | \n",
+ " Sim | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 345 | \n",
+ " 202513 | \n",
+ " Fora Guia | \n",
+ " Promoção RE | \n",
+ " Movimentar Flow | \n",
+ " Desconto Direto | \n",
+ " Ciclo todo | \n",
+ " Não | \n",
+ " CABELOS | \n",
+ " NaN | \n",
+ " 53094 | \n",
+ " ... | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Sim | \n",
+ "
\n",
+ " \n",
+ " | 346 | \n",
+ " 202513 | \n",
+ " Fora Guia | \n",
+ " Promoção RE | \n",
+ " Movimentar Flow | \n",
+ " Desconto Direto | \n",
+ " Ciclo todo | \n",
+ " Não | \n",
+ " CABELOS | \n",
+ " NaN | \n",
+ " 55803 | \n",
+ " ... | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Sim | \n",
+ "
\n",
+ " \n",
+ " | 347 | \n",
+ " 202513 | \n",
+ " Fora Guia | \n",
+ " Promoção RE | \n",
+ " Movimentar Flow | \n",
+ " Desconto Direto | \n",
+ " Ciclo todo | \n",
+ " Não | \n",
+ " CABELOS | \n",
+ " NaN | \n",
+ " 93106 | \n",
+ " ... | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Sim | \n",
+ "
\n",
+ " \n",
+ " | 348 | \n",
+ " 202513 | \n",
+ " Fora Guia | \n",
+ " Promoção RE | \n",
+ " Movimentar Flow | \n",
+ " Desconto Direto | \n",
+ " Ciclo todo | \n",
+ " Não | \n",
+ " CABELOS | \n",
+ " NaN | \n",
+ " 93105 | \n",
+ " ... | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Sim | \n",
+ "
\n",
+ " \n",
+ " | 349 | \n",
+ " 202513 | \n",
+ " Fora Guia | \n",
+ " Promoção RE | \n",
+ " Movimentar Flow | \n",
+ " Desconto Direto | \n",
+ " Ciclo todo | \n",
+ " Não | \n",
+ " CABELOS | \n",
+ " NaN | \n",
+ " 55805 | \n",
+ " ... | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Sim | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
350 rows × 47 columns
\n",
+ "
"
+ ],
+ "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": [
@@ -268,25 +1285,51 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 25,
"metadata": {},
- "outputs": [],
+ "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": null,
+ "execution_count": 26,
"metadata": {},
- "outputs": [],
+ "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": null,
+ "execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
@@ -295,7 +1338,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
@@ -304,34 +1347,74 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 29,
"metadata": {},
- "outputs": [],
+ "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": null,
+ "execution_count": 30,
"metadata": {},
- "outputs": [],
+ "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_draft['PDV'] = df_draft['PDV'].astype(str)"
+ "df.columns"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
- "df_draft['SKU'] = df_draft['SKU'].astype(str)\n"
+ "df['pdv'] = df['pdv'].astype(str)"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df['SKU_FINAL'] = df['SKU_FINAL'].astype(str)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
@@ -340,19 +1423,59 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
- "df_final = pd.merge(left=df_draft,right=df_tabela,right_on=['Código do Item','PDV'],left_on=['SKU','PDV'],how='right')\n",
+ "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": null,
+ "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"
@@ -360,9 +1483,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 38,
"metadata": {},
- "outputs": [],
+ "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"
@@ -370,44 +1504,55 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "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"
+ "#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": null,
+ "execution_count": 40,
"metadata": {},
- "outputs": [],
+ "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[['SKU1', 'SKU2', 'UF','Tipo Preço', 'PC', 'PV']],right_on=['UF','SKU2'],left_on=['UF','SKU'],how='left')\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": null,
+ "execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
- "df_bi_preco['SKU1'] = df_bi_preco['SKU1'].astype(str).str.replace('.0','',regex=False) \n",
+ "#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 "
+ "#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": null,
+ "execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
@@ -416,106 +1561,153 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "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",
+ "#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",
+ "#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": null,
+ "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')"
+ "#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": null,
+ "execution_count": 45,
"metadata": {},
- "outputs": [],
+ "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": null,
+ "execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
- "df_final = df_final.drop(columns=['Desativação','Lançamento',\n",
- "'Promoção Próximo Ciclo',\n",
- "'Compra inteligente semanal/Sugestão de compra',\n",
- "'Planograma',\n",
- "'Carteira Bloqueada Para Novos Pedidos',\n",
- "'Preço Sell In',\n",
- "'Quantidade',\n",
- "'Item analisado',\n",
- "'Promoção Próximo Ciclo + 1',\n",
- "'SKU_PARA_VALIDACAO',\n",
- "'Ciclo_y'\n",
- "])"
+ "#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": null,
+ "execution_count": 47,
"metadata": {},
- "outputs": [],
+ "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'].astype(str) \n",
- "df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['SKU'].astype(str)\n",
+ "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": null,
+ "execution_count": 48,
"metadata": {},
- "outputs": [],
+ "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['Projeção Próximo Ciclo + 1'].value_counts()"
+ "df_final['nextcycleprojection'].value_counts()\n",
+ "\n",
+ "df_final['secondtonextcycleprojection'].value_counts()"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "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"
+ "#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": null,
+ "execution_count": 50,
"metadata": {},
"outputs": [],
"source": [
- "df_final['PROJEÇÃO DO CICLO PROMOCIONADO'].value_counts()"
+ "#df_final['PROJEÇÃO DO CICLO PROMOCIONADO'].value_counts()"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 51,
"metadata": {},
"outputs": [],
"source": [
- "df_final['Data Prevista Regularização'] = df_final['Data Prevista Regularização'].astype(str).replace('0','REGULAR')"
+ "#df_final['Data Prevista Regularização'] = df_final['Data Prevista Regularização'].astype(str).replace('0','REGULAR')"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 52,
"metadata": {},
"outputs": [],
"source": [
@@ -524,19 +1716,30 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 53,
"metadata": {},
"outputs": [],
"source": [
- "df_final = df_final[~df_final['MARCA'].isna()]\n",
- "df_final['MARCA'].isna().sum()"
+ "#df_final = df_final[~df_final['MARCA'].isna()]\n",
+ "#df_final['MARCA'].isna().sum()"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 54,
"metadata": {},
- "outputs": [],
+ "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"
@@ -544,53 +1747,592 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 55,
"metadata": {},
- "outputs": [],
+ "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": null,
+ "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": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " pdv | \n",
+ " SKU_FINAL | \n",
+ " ESTOQUE ATUAL | \n",
+ " ESTOQUE EM TRANSITO | \n",
+ " PEDIDO PENDENTE | \n",
+ " Curva | \n",
+ " CATEGORIA | \n",
+ " DiasSemVenda | \n",
+ " nextcycleprojection | \n",
+ " secondtonextcycleprojection | \n",
+ " ... | \n",
+ " C202502 | \n",
+ " C202503 | \n",
+ " C202504 | \n",
+ " C202505 | \n",
+ " C202506 | \n",
+ " C202507 | \n",
+ " C202508 | \n",
+ " C202509 | \n",
+ " C202510 | \n",
+ " C202511 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 20968 | \n",
+ " 93541 | \n",
+ " 23 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " B | \n",
+ " PERFUMARIA | \n",
+ " 13.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 9.0 | \n",
+ " 3.0 | \n",
+ " 1.0 | \n",
+ " 1.0 | \n",
+ " 21.0 | \n",
+ " 3.0 | \n",
+ " 1.0 | \n",
+ " 13.0 | \n",
+ " 1.0 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 20969 | \n",
+ " 93541 | \n",
+ " 27 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " B | \n",
+ " PERFUMARIA | \n",
+ " 3.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 18.0 | \n",
+ " 3.0 | \n",
+ " 8.0 | \n",
+ " 9.0 | \n",
+ " 23.0 | \n",
+ " 4.0 | \n",
+ " 9.0 | \n",
+ " 2.0 | \n",
+ " 11.0 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 20991 | \n",
+ " 93541 | \n",
+ " 20 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " B | \n",
+ " PERFUMARIA | \n",
+ " 5.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 12.0 | \n",
+ " 1.0 | \n",
+ " 9.0 | \n",
+ " 14.0 | \n",
+ " 16.0 | \n",
+ " 6.0 | \n",
+ " 8.0 | \n",
+ " 26.0 | \n",
+ " 9.0 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 20992 | \n",
+ " 93541 | \n",
+ " 178 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " E | \n",
+ " PERFUMARIA | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 121.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 20995 | \n",
+ " 93541 | \n",
+ " 67 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " B | \n",
+ " PERFUMARIA | \n",
+ " 3.0 | \n",
+ " 14.0 | \n",
+ " 53.0 | \n",
+ " ... | \n",
+ " 12.0 | \n",
+ " 13.0 | \n",
+ " 4.0 | \n",
+ " 10.0 | \n",
+ " 43.0 | \n",
+ " 8.0 | \n",
+ " 6.0 | \n",
+ " 27.0 | \n",
+ " 1.0 | \n",
+ " 2.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 3207 | \n",
+ " 20998 | \n",
+ " 53094 | \n",
+ " 275 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " A | \n",
+ " CABELOS | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 190.0 | \n",
+ " 208.0 | \n",
+ " 48.0 | \n",
+ " 47.0 | \n",
+ " 179.0 | \n",
+ " 31.0 | \n",
+ " 44.0 | \n",
+ " 18.0 | \n",
+ " 180.0 | \n",
+ " 69.0 | \n",
+ "
\n",
+ " \n",
+ " | 3208 | \n",
+ " 21278 | \n",
+ " 53094 | \n",
+ " 38 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " A | \n",
+ " CABELOS | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 27.0 | \n",
+ " 15.0 | \n",
+ " 24.0 | \n",
+ " 13.0 | \n",
+ " 71.0 | \n",
+ " 13.0 | \n",
+ " 8.0 | \n",
+ " 20.0 | \n",
+ " 30.0 | \n",
+ " 21.0 | \n",
+ "
\n",
+ " \n",
+ " | 3209 | \n",
+ " 21495 | \n",
+ " 53094 | \n",
+ " 4 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " A | \n",
+ " CABELOS | \n",
+ " 2.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 9.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 5.0 | \n",
+ " 5.0 | \n",
+ " 3.0 | \n",
+ " 2.0 | \n",
+ " 5.0 | \n",
+ " 6.0 | \n",
+ " 1.0 | \n",
+ "
\n",
+ " \n",
+ " | 3210 | \n",
+ " 22541 | \n",
+ " 53094 | \n",
+ " 46 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " A | \n",
+ " CABELOS | \n",
+ " 2.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 9.0 | \n",
+ " 6.0 | \n",
+ " 4.0 | \n",
+ " 10.0 | \n",
+ " 24.0 | \n",
+ " 42.0 | \n",
+ " 4.0 | \n",
+ " 3.0 | \n",
+ " 9.0 | \n",
+ " 8.0 | \n",
+ "
\n",
+ " \n",
+ " | 3211 | \n",
+ " 24255 | \n",
+ " 53094 | \n",
+ " 4 | \n",
+ " 56 | \n",
+ " 25 | \n",
+ " E | \n",
+ " CABELOS | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
3212 rows × 66 columns
\n",
+ "
"
+ ],
+ "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[6:24]\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 2024'] = df_final[sales_2024_cols].max(axis=1)\n",
+ "df_final['PICO DE VENDAS 17CICLOS'] = df_final[sales_2024_cols].max(axis=1)\n",
"\n"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "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[17:23]\n",
+ "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": null,
+ "execution_count": 65,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'C202412'"
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "df_final.columns[6:23]"
+ "df_final.columns[-19]"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 66,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.3740666443775772\n"
+ ]
+ }
+ ],
"source": [
- "CRESCIMENTO = (df_final[df_final.columns[6]].sum() - df_final[df_final.columns[22]].sum())/df_final[df_final.columns[6]].sum() \n",
+ "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"
@@ -598,31 +2340,65 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 67,
"metadata": {},
"outputs": [],
"source": [
- "mesmo_ciclo_ano_passado = df_final.columns[8:9]\n",
- "ciclo_ano_passado = df_final.columns[8:9].str.split(\" \")[0][-1]\n",
+ "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": null,
+ "execution_count": 68,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'C202413'"
+ ]
+ },
+ "execution_count": 68,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "df_final.columns[8:9].str.split(\" \")[0][-1]"
+ "df_final.columns[-19:-18].str.split(\" \")[0][-1]"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "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[6:23]\n",
+ "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",
@@ -633,25 +2409,63 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 71,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "np.float64(0.3740666443775772)"
+ ]
+ },
+ "execution_count": 71,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"CRESCIMENTO"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 72,
"metadata": {},
- "outputs": [],
+ "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": null,
+ "execution_count": 73,
"metadata": {},
"outputs": [],
"source": [
@@ -662,34 +2476,73 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "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'])"
+ "#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": null,
+ "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\"})"
+ "#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": null,
+ "execution_count": 76,
"metadata": {},
- "outputs": [],
+ "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.drop(columns=df_final.columns[6:18], inplace=True)\n"
+ "df_final.columns"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "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": [
@@ -697,102 +2550,98 @@
"cols_to_group_by = df_final.columns.difference(['DDV PREVISTO', 'COBERTURA ATUAL'])\n",
"\n",
"# Group and aggregate\n",
- "df_final_dedup = (\n",
- " df_final\n",
- " .groupby(list(cols_to_group_by), dropna=False)[['DDV PREVISTO', 'COBERTURA ATUAL']]\n",
- " .max()\n",
- " .reset_index()\n",
- ")\n"
+ "df_final_dedup = df_final\n",
+ " "
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 79,
"metadata": {},
"outputs": [],
"source": [
- "df_final['Compra inteligente Próximo Ciclo']\n"
+ "#df_final['Compra inteligente Próximo Ciclo']\n"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 80,
"metadata": {},
"outputs": [],
"source": [
- "df_final_dedup['DDV PREVISTO'] = df_final_dedup['DDV PREVISTO'].fillna(0.01)\n"
+ "#df_final['DDV PREVISTO'] = df_final['DDV PREVISTO'].fillna(0.01)\n"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "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"
+ "#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": null,
+ "execution_count": 82,
"metadata": {},
"outputs": [],
"source": [
- "df_final_dedup['DDV PREVISTO'].value_counts()"
+ "#df_final_dedup['DDV PREVISTO'].value_counts()"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "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)"
+ "#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": null,
+ "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'])"
+ "#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": null,
+ "execution_count": 85,
"metadata": {},
"outputs": [],
"source": [
- "df_final_dedup.columns"
+ "#df_final_dedup.columns"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 86,
"metadata": {},
"outputs": [],
"source": [
- "df_final_dedup['VENDAS R$ PV GINSENG'] = df_final_dedup['PRECO DE VENDA'] * df_final_dedup['PV GINSENG']"
+ "#df_final_dedup['VENDAS R$ PV GINSENG'] = df_final_dedup['PRECO DE VENDA'] * df_final_dedup['PV GINSENG']"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 87,
"metadata": {},
"outputs": [],
"source": [
- "df_final_dedup = df_final_dedup.rename(columns={'Ciclo_x':'Ciclo'})"
+ "#df_final_dedup = df_final_dedup.rename(columns={'Ciclo_x':'Ciclo'})"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 88,
"metadata": {},
"outputs": [],
"source": [
@@ -802,84 +2651,110 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 89,
"metadata": {},
"outputs": [],
"source": [
- "df_final_dedup['RBV 202406'] = df_final_dedup['PRECO DE VENDA'] * df_final_dedup[ciclo_ano_passado] "
+ "#df_final_dedup['RBV 202406'] = df_final_dedup['PRECO DE VENDA'] * df_final_dedup[ciclo_ano_passado] "
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "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"
+ "#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": null,
+ "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)"
+ "#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": null,
+ "execution_count": 92,
"metadata": {},
"outputs": [],
"source": [
- "df_final_dedup['MARCA'] = df_final_dedup['MARCA'].str.replace('.csv','',regex=False)"
+ "#df_final_dedup['MARCA'] = df_final_dedup['MARCA'].str.replace('.csv','',regex=False)"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 93,
"metadata": {},
"outputs": [],
"source": [
- "df_final_dedup['COB PROJETADA'] = df_final_dedup['COB PROJETADA'].fillna(999)"
+ "#df_final_dedup['COB PROJETADA'] = df_final_dedup['COB PROJETADA'].fillna(999)"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 94,
"metadata": {},
"outputs": [],
"source": [
- "df_final_dedup.columns"
+ "#df_final_dedup.columns"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 95,
"metadata": {},
"outputs": [],
"source": [
- "marca_promo = df_estoque['Arquivo_Origem'].iloc[0].replace('.csv','')\n",
- "marca_promo"
+ "#marca_promo = df_estoque['Arquivo_Origem'].iloc[0].replace('.csv','')\n",
+ "#marca_promo"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 96,
"metadata": {},
- "outputs": [],
+ "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": null,
+ "execution_count": 98,
"metadata": {},
"outputs": [],
"source": [
@@ -888,7 +2763,7 @@
"\n",
"# Passo 2: obter até 3 chamadas promocionais por grupo\n",
"promo_grouped = (\n",
- " df_sorted.groupby(['SKU', 'PDV'])['Chamada Promocional']\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",
@@ -896,23 +2771,23 @@
")\n",
"\n",
"# Passo 3: base com maior % de desconto\n",
- "df_base = df_sorted.drop_duplicates(subset=['SKU', 'PDV'], keep='first').reset_index(drop=True)\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', 'PDV'], how='left')\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, PDV)\n",
- "# Passo 1: dicionário com Cód. Combo único por SKU+PDV\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', 'PDV'])['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', 'PDV']).index.map(cod_combo_map)\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",
@@ -920,10 +2795,8 @@
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
"# Columns to bring up front\n",
"priority_cols = [\n",
@@ -947,7 +2820,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 99,
"metadata": {},
"outputs": [],
"source": [
@@ -958,16 +2831,43 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 100,
"metadata": {},
- "outputs": [],
+ "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": null,
+ "execution_count": 101,
"metadata": {},
"outputs": [],
"source": [
@@ -976,7 +2876,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 102,
"metadata": {},
"outputs": [],
"source": [
@@ -985,7 +2885,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 103,
"metadata": {},
"outputs": [],
"source": [
@@ -996,7 +2896,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 104,
"metadata": {},
"outputs": [],
"source": [
@@ -1005,6 +2905,118 @@
"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,
@@ -1017,7 +3029,7 @@
"\n",
"\n",
"# Export to Excel\n",
- "output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\promoção_{marca_promo}_{ciclo_mais2}_04.06.xlsx'\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",