From 0dc3604b19ce8f478b4e642f468188466c5adbb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Herculano?= Date: Tue, 29 Jul 2025 14:33:40 -0300 Subject: [PATCH] =?UTF-8?q?mudan=C3=A7a=20na=20promo=C3=A7=C3=A3o=20pro=20?= =?UTF-8?q?banco=20de=20dados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- promoção/promoção_EUD_ciclo07.ipynb | 2490 ++++++++++++++++++++++++--- 1 file changed, 2251 insertions(+), 239 deletions(-) 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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDVSKUDESCRICAOC202411C202412C202413C202414C202415C202416C202417...C202502C202503C202504C202505C202506C202507C202508C202509C202510C202511
0112011004FLORATTA DES COL MY BLUE 75ml0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
1112011005DEM FLORATTA DES COL MY BLUE 4ml0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2112011078MATCH SRUM CAP POS QUIMICA 50ml0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
3112011296PMPCK THE BLEND DES ANTIT AER 2x75g0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
4112011302PMPCK LILY DES ANTIT AER 2x75g0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
..................................................................
188531569990770PIN BALAO O BOTICARIO PAIS/25 UNIT0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
188532569990772PIN AMOR O BOTICARIO PAIS/25 UNIT0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
188533569990774PIN MELHOR PAI O BOTICARIO PAIS/25 UNIT0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
188534569990776SACOLA TOP M O BOTICARIO PAIS 2025 UNIT0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
188535807443151MATERIAL POS CONSUMO0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
\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", + " \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", + "
CicloINICIO CICLOFIM CICLODURAÇÃOMARCADateNUM_CICLOANO_CICLOCICLOMAIS2dias_ate_inicio
2346C2025132025-08-272025-09-1621EUDORA2025-08-2713C2025C20251529
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CicloVeiculoTipo de PromoçãoEstratégia de PromoçãoTipo_mecanicaPromo Período Limitado?EAMCategoriaCód. ComboCódigo do Item...0.34.20.35.20.2.30.25.30.28.30.3.30.32.30.34.30.35.3BSO
0202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN85268...59.4761.220.20.250.280.30.320.340.35Sim
1202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN93541...30.5731.470.20.250.280.30.320.340.35Sim
2202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN53138...35.6736.720.20.250.280.30.320.340.35Sim
3202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN50762...23.4324.120.20.250.280.30.320.340.35Sim
4202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN49803...28.5329.370.20.250.280.30.320.340.35Sim
..................................................................
345202513Fora GuiaPromoção REMovimentar FlowDesconto DiretoCiclo todoNãoCABELOSNaN53094...0.000.00NaNNaNNaNNaNNaNNaNNaNSim
346202513Fora GuiaPromoção REMovimentar FlowDesconto DiretoCiclo todoNãoCABELOSNaN55803...0.000.00NaNNaNNaNNaNNaNNaNNaNSim
347202513Fora GuiaPromoção REMovimentar FlowDesconto DiretoCiclo todoNãoCABELOSNaN93106...0.000.00NaNNaNNaNNaNNaNNaNNaNSim
348202513Fora GuiaPromoção REMovimentar FlowDesconto DiretoCiclo todoNãoCABELOSNaN93105...0.000.00NaNNaNNaNNaNNaNNaNNaNSim
349202513Fora GuiaPromoção REMovimentar FlowDesconto DiretoCiclo todoNãoCABELOSNaN55805...0.000.00NaNNaNNaNNaNNaNNaNNaNSim
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pdvSKU_FINALESTOQUE ATUALESTOQUE EM TRANSITOPEDIDO PENDENTECurvaCATEGORIADiasSemVendanextcycleprojectionsecondtonextcycleprojection...C202502C202503C202504C202505C202506C202507C202508C202509C202510C202511
020968935412300BPERFUMARIA13.00.00.0...9.03.01.01.021.03.01.013.01.01.0
120969935412700BPERFUMARIA3.00.00.0...18.03.08.09.023.04.09.02.011.01.0
220991935412000BPERFUMARIA5.00.00.0...12.01.09.014.016.06.08.026.09.01.0
3209929354117800EPERFUMARIA0.00.0121.0...0.00.00.00.00.00.00.00.00.00.0
420995935416700BPERFUMARIA3.014.053.0...12.013.04.010.043.08.06.027.01.02.0
..................................................................
3207209985309427500ACABELOS0.00.00.0...190.0208.048.047.0179.031.044.018.0180.069.0
320821278530943800ACABELOS0.00.00.0...27.015.024.013.071.013.08.020.030.021.0
32092149553094400ACABELOS2.00.00.0...9.00.00.05.05.03.02.05.06.01.0
321022541530944600ACABELOS2.00.00.0...9.06.04.010.024.042.04.03.09.08.0
3211242555309445625ECABELOS0.00.00.0...0.00.00.00.00.00.00.00.00.00.0
\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",