{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_72404\\1229765338.py:39: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", " df0 = pd.read_sql(query, conn)\n" ] } ], "source": [ "import pyodbc\n", "import configparser\n", "import pandas as pd\n", "import numpy as np \n", "from datetime import datetime, time\n", "\n", "\n", "config = configparser.ConfigParser()\n", "config.read(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\CODIGOS\\relatório_improdutivo\\credenciais.ini\")\n", "\n", "# Conexão com o banco\n", "conn = pyodbc.connect(\n", " f\"DRIVER={{SQL Server}};\"\n", " f\"SERVER={config['banco']['host']},1433;\"\n", " f\"DATABASE=GINSENG;\"\n", " f\"UID={config['banco']['user']};\"\n", " f\"PWD={config['banco']['password']}\")\n", "\n", "#gerar query\n", "query = '''\n", "SELECT \n", " e.pdv,\n", " e.SKU,\n", " COALESCE(e.SKU_PARA, e.SKU) AS SKU_FINAL,\n", " e.[ESTOQUE ATUAL],\n", " e.[ESTOQUE EM TRANSITO],\n", " e.[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 = e.SKU\n", "'''\n", "df0 = pd.read_sql(query, conn)\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pdv\n", "20997 27525\n", "20992 26415\n", "20969 26377\n", "21007 13285\n", "20995 12194\n", " ... \n", "23156 1969\n", "24253 1334\n", "24254 1331\n", "24268 1175\n", "24258 941\n", "Name: count, Length: 80, dtype: int64" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df0['pdv'].value_counts()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_72404\\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": 4, "metadata": {}, "outputs": [], "source": [ "df=df0" ] }, { "cell_type": "code", "execution_count": 5, "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", "
PDVSKUDESCRICAOVENDAS_CICLOCiclo
02127851244QUASAR DES COL BLUE V4 100ml7.0C202512
12099349418NSPA OL DES HID CPO QUIN/AMEN 200ml V39.0C202508
22137584385MALBEC EDP SIGNATURE V3 90ml1.0C202413
31282087373CBEM SAB BARRA BEIJINHO V3 2x80g0.0C202414
41342749766UOMINI DES COL BLACK V6 100ml2.0C202412
\n", "
" ], "text/plain": [ " PDV SKU DESCRICAO VENDAS_CICLO Ciclo\n", "0 21278 51244 QUASAR DES COL BLUE V4 100ml 7.0 C202512\n", "1 20993 49418 NSPA OL DES HID CPO QUIN/AMEN 200ml V3 9.0 C202508\n", "2 21375 84385 MALBEC EDP SIGNATURE V3 90ml 1.0 C202413\n", "3 12820 87373 CBEM SAB BARRA BEIJINHO V3 2x80g 0.0 C202414\n", "4 13427 49766 UOMINI DES COL BLACK V6 100ml 2.0 C202412" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dfv0.head()" ] }, { "cell_type": "code", "execution_count": 6, "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", "
PDVSKUDESCRICAOC202411C202412C202413C202414C202415C202416C202417...C202504C202505C202506C202507C202508C202509C202510C202511C202512C202513
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
\n", "

5 rows × 23 columns

\n", "
" ], "text/plain": [ " PDV SKU DESCRICAO C202411 C202412 \\\n", "0 11201 1004 FLORATTA DES COL MY BLUE 75ml 0.0 0.0 \n", "1 11201 1005 DEM FLORATTA DES COL MY BLUE 4ml 0.0 0.0 \n", "2 11201 1078 MATCH SRUM CAP POS QUIMICA 50ml 0.0 0.0 \n", "3 11201 1296 PMPCK THE BLEND DES ANTIT AER 2x75g 0.0 0.0 \n", "4 11201 1302 PMPCK LILY DES ANTIT AER 2x75g 0.0 0.0 \n", "\n", " C202413 C202414 C202415 C202416 C202417 ... C202504 C202505 \\\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", " C202506 C202507 C202508 C202509 C202510 C202511 C202512 C202513 \n", "0 0.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 0.0 \n", "2 0.0 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 0.0 \n", "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", "[5 rows x 23 columns]" ] }, "execution_count": 6, "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.head()\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# O QUE PRECISA PRA RODAR ESSE CÓDIGO:\n", "\n", "# Arquivo Draft\n", "# Arquivo Estoque\n", "# Arquivo BI preço\n", "# Arquivo pdv\n", "# Arquivo Calendario\n", "# Arquivo tabela de compra\n", "\n", "#Atualizar o nome da marca no filtro do estoque." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Caminho onde estão as subpastas com os arquivos CSV\n", "\n", "# Set the path to the folder containing CSV files\n", "#folder_path = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C13\\DRAFT\" # arquivo dos drafts\n", "\n", "# Pattern to match all CSV files\n", "#csv_files = glob.glob(os.path.join(folder_path, '*.csv'))\n", "\n", "# Read and concat all CSVs\n", "#df_draft = pd.concat([pd.read_csv(file) for file in csv_files], ignore_index=True)\n", "\n", "\n", "#df_draft.shape\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "\n", "\n", "#Caminho onde estão as subpastas com os arquivos CSV\n", "#pasta_entrada = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C13\\estoque\"\n", "\n", "# Lista todas as subpastas dentro de \"ESTOQUE\"\n", "#subpastas = [os.path.join(pasta_entrada, d) for d in os.listdir(pasta_entrada) if os.path.isdir(os.path.join(pasta_entrada, d))]\n", "\n", "#df_list = []\n", "\n", "# Percorre todas as subpastas\n", "#for subpasta in subpastas:\n", "# arquivos = [f for f in os.listdir(subpasta) if f.endswith(\".csv\")]\n", "# nome_pasta = os.path.basename(subpasta) # Obtém o nome da pasta\n", "\n", "# for arquivo in arquivos:\n", "# caminho_arquivo = os.path.join(subpasta, arquivo)\n", "# try:\n", "# df = pd.read_csv(caminho_arquivo, encoding=\"utf-8\", low_memory=False) # Melhor para grandes volumes de dados\n", "# df[\"Arquivo_Origem\"] = arquivo # Adiciona o nome do arquivo de origem\n", "# df[\"Pasta_Origem\"] = nome_pasta # Adiciona o nome da pasta de origem\n", "# df_list.append(df)\n", "# except Exception as e:\n", "# print(f\"Erro ao ler o arquivo {arquivo}: {e}\")\n", "\n", "#if df_list:\n", "# df_estoque = pd.concat(df_list, ignore_index=True)\n", "\n", "#df_estoque['PDV'] = df_estoque['PDV'].astype(str)\n", "\n", "#df_estoque['SKU_FINAL'] = np.where(df_estoque['SKU_PARA'] == \"-\", df_estoque['SKU'], df_estoque['SKU_PARA'])\n", "\n", "#df_estoque['SKU_FINAL']=df_estoque['SKU_FINAL'].astype(str)'''\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\joao.herculano\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\openpyxl\\styles\\stylesheet.py:237: UserWarning: Workbook contains no default style, apply openpyxl's default\n", " warn(\"Workbook contains no default style, apply openpyxl's default\")\n" ] } ], "source": [ "df_bi_preco = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\EUDORA\\202511\\preço BI\\TABELA DE PREÇOS (2).xlsx\")" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['SKU1', 'SKU2', 'Descrição', 'MARCA', 'CATEGORIA', 'LINHA', 'UF',\n", " 'Tipo Preço', 'PC', 'PV'],\n", " dtype='object')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_bi_preco.columns" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n", "df_pdv = df_pdv.rename(columns={'DESCRIÇÃO':'DESCRIÇÃO PDV'})\n", "df_pdv = df_pdv.drop(columns=['REGIÃO', 'ESTADO','CIDADE','GESTÃO', 'SUPERVISOR'])\n", "df_pdv = df_pdv[~df_pdv['CANAL'].isin(['MTZ','LJ'])]\n", "df_pdv = df_pdv[df_pdv['STATUS']!= \"INATIVO\"]\n", "\n", "df_pdv = df_pdv.drop(columns=['STATUS'])\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PDV\n", "20968 1\n", "20969 1\n", "20970 1\n", "20986 1\n", "20988 1\n", "20989 1\n", "20991 1\n", "20992 1\n", "20993 1\n", "20994 1\n", "20995 1\n", "20996 1\n", "20997 1\n", "20998 1\n", "20999 1\n", "21000 1\n", "21001 1\n", "21278 1\n", "21375 1\n", "21383 1\n", "21495 1\n", "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": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_pdv['PDV'].value_counts()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "df_pdv['MATCH'] = 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**ALTERAR NOME DA COLUNA \"ARQUIVO_ORIGEM\" PARA UMA DAS OPÇÕES ABAIXO:**\n", "\n", "*BOT.csv* \n", "\n", "*EUD.csv*\n", "\n", "*QDB.csv*" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "#df_estoque = df_estoque[df_estoque['Arquivo_Origem']== \"EUD.csv\"]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "calendario = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\CICLO 9\\CALENDARIO_CICLO\\Ciclo_Expandido_com_Datas.xlsx\")" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "calendario['Date'] = pd.to_datetime(calendario['Date'])\n", "\n", "# Get today (normalized to midnight)\n", "today = pd.Timestamp(\"today\").normalize()\n", "\n", "calendario['NUM_CICLO'] = calendario['Ciclo'].str[-2:].astype(int)\n", "calendario['ANO_CICLO'] = calendario['Ciclo'].str[0:5]\n", "\n", "\n", "calendario = calendario[calendario['MARCA'] == \"EUDORA\"]\n", "\n", "calendario['CICLOMAIS2'] = calendario['ANO_CICLO'].astype(str) + (calendario['NUM_CICLO'].astype(int) + 2).astype(str).str.zfill(2)\n", "\n", "ciclo_mais2 = calendario[calendario['Date'].dt.normalize() == today]['CICLOMAIS2'].iloc[0]\n", "\n", "\n", "# Filter rows where date matches today\n", "filtered_calendario = calendario[calendario['Ciclo'] == ciclo_mais2][:1]\n", "\n", "\n", "filtered_calendario['dias_ate_inicio'] = filtered_calendario['INICIO CICLO'].iloc[0] - today\n", "\n", "filtered_calendario['dias_ate_inicio'] = filtered_calendario['dias_ate_inicio'].dt.days.astype(int)\n", "\n" ] }, { "cell_type": "code", "execution_count": 18, "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", "
CicloINICIO CICLOFIM CICLODURAÇÃOMARCADateNUM_CICLOANO_CICLOCICLOMAIS2dias_ate_inicio
2430C2025152025-10-082025-10-2821EUDORA2025-10-0815C2025C20251735
\n", "
" ], "text/plain": [ " Ciclo INICIO CICLO FIM CICLO DURAÇÃO MARCA Date NUM_CICLO \\\n", "2430 C202515 2025-10-08 2025-10-28 21 EUDORA 2025-10-08 15 \n", "\n", " ANO_CICLO CICLOMAIS2 dias_ate_inicio \n", "2430 C2025 C202517 35 " ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filtered_calendario" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "filtered_calendario['match'] = 1" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\EUDORA\\202515\\tabela promo\\Tabela-de-Promocao_C15-1755294384452.xlsx.xlsx\",skiprows=1)\n" ] }, { "cell_type": "code", "execution_count": 22, "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", "
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
0202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060...28.8729.720.20.250.280.30.320.340.35Sim
1202515Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN52107...33.9734.970.20.250.280.30.320.340.35Sim
2202515Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN50271...23.7724.470.20.250.280.30.320.340.35Sim
3202515Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN57550...27.1727.970.20.250.280.30.320.340.35Sim
4202515Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN52943...35.6736.720.20.250.280.30.320.340.35Sim
\n", "

5 rows × 47 columns

\n", "
" ], "text/plain": [ " Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n", "0 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "1 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", "2 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", "3 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", "4 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", "\n", " Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n", "0 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "1 NaN Não PERF. FEMININA NaN 52107 \n", "2 NaN Não PERF. FEMININA NaN 50271 \n", "3 NaN Não PERF. FEMININA NaN 57550 \n", "4 NaN Não PERF. FEMININA NaN 52943 \n", "\n", " ... 0.34.2 0.35.2 0.2.3 0.25.3 0.28.3 0.3.3 0.32.3 0.34.3 0.35.3 \\\n", "0 ... 28.87 29.72 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n", "1 ... 33.97 34.97 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n", "2 ... 23.77 24.47 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n", "3 ... 27.17 27.97 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n", "4 ... 35.67 36.72 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n", "\n", " BSO \n", "0 Sim \n", "1 Sim \n", "2 Sim \n", "3 Sim \n", "4 Sim \n", "\n", "[5 rows x 47 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_tabela.head()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "df_tabela = df_tabela[[ 'Ciclo', 'Veiculo',\n", " 'Tipo de Promoção', 'Estratégia de Promoção',\n", " 'Tipo_mecanica', 'Promo Período Limitado?',\n", " 'EAM', 'Categoria',\n", " 'Cód. Combo', 'Código do Item',\n", " 'Descrição do Item', 'Chamada Promocional',\n", " 'Valor do Guia', 'Preço Promocionado',\n", " '% de Desconto', 'RE compra por',\n", " 'RE Vende por', 'RE lucra (R$)']]" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "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": 25, "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", "
CicloVeiculoTipo de PromoçãoEstratégia de PromoçãoTipo_mecanicaPromo Período Limitado?EAMCategoriaCód. ComboCódigo do ItemDescrição do ItemChamada PromocionalValor do GuiaPreço Promocionado% de DescontoRE compra porRE Vende porRE lucra (R$)
0202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.9084.90.29259.4384.925.47
1202515Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN52107EUDORA DIVA FABULOSA DESODORANTE COLONIA 100MLEUDORA DIVA FABULOSA DESODORANTE COLONIA 100ML...139.9099.90.28669.9399.929.97
2202515Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN50271EUDORA DESODORANTE COLÔNIA KISS ME NOW 50ml VE...EUDORA DESODORANTE COLÔNIA KISS ME NOW 50ml VE...99.9969.90.30148.9369.920.97
3202515Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN57550EUDORA VELVET MILANO DESODORANTE COLÔNIA 100MLEUDORA VELVET MILANO DESODORANTE COLÔNIA 100ML...119.9079.90.33455.9379.923.97
4202515Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN52943Eudora Magnific Rouge Camélia Des Col 75 MLEudora Magnific Rouge Camélia Des Col 75 ML | ...134.90104.90.22273.43104.931.47
\n", "
" ], "text/plain": [ " Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n", "0 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "1 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", "2 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", "3 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", "4 202515 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", "\n", " Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n", "0 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "1 NaN Não PERF. FEMININA NaN 52107 \n", "2 NaN Não PERF. FEMININA NaN 50271 \n", "3 NaN Não PERF. FEMININA NaN 57550 \n", "4 NaN Não PERF. FEMININA NaN 52943 \n", "\n", " Descrição do Item \\\n", "0 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "1 EUDORA DIVA FABULOSA DESODORANTE COLONIA 100ML \n", "2 EUDORA DESODORANTE COLÔNIA KISS ME NOW 50ml VE... \n", "3 EUDORA VELVET MILANO DESODORANTE COLÔNIA 100ML \n", "4 Eudora Magnific Rouge Camélia Des Col 75 ML \n", "\n", " Chamada Promocional Valor do Guia \\\n", "0 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.90 \n", "1 EUDORA DIVA FABULOSA DESODORANTE COLONIA 100ML... 139.90 \n", "2 EUDORA DESODORANTE COLÔNIA KISS ME NOW 50ml VE... 99.99 \n", "3 EUDORA VELVET MILANO DESODORANTE COLÔNIA 100ML... 119.90 \n", "4 Eudora Magnific Rouge Camélia Des Col 75 ML | ... 134.90 \n", "\n", " Preço Promocionado % de Desconto RE compra por RE Vende por \\\n", "0 84.9 0.292 59.43 84.9 \n", "1 99.9 0.286 69.93 99.9 \n", "2 69.9 0.301 48.93 69.9 \n", "3 79.9 0.334 55.93 79.9 \n", "4 104.9 0.222 73.43 104.9 \n", "\n", " RE lucra (R$) \n", "0 25.47 \n", "1 29.97 \n", "2 20.97 \n", "3 23.97 \n", "4 31.47 " ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_tabela.head()" ] }, { "cell_type": "code", "execution_count": 26, "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", "
CicloVeiculoTipo de PromoçãoEstratégia de PromoçãoTipo_mecanicaPromo Período Limitado?EAMCategoriaCód. ComboCódigo do ItemDescrição do ItemChamada PromocionalValor do GuiaPreço Promocionado% de DescontoRE compra porRE Vende porRE lucra (R$)SKUSKU_FINAL
0202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.984.90.29259.4384.925.479406094060
1202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.984.90.29259.4384.925.479406094060
2202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.984.90.29259.4384.925.479406094060
3202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.984.90.29259.4384.925.479406094060
4202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.984.90.29259.4384.925.479406094060
\n", "
" ], "text/plain": [ " Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n", "0 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "1 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "2 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "3 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "4 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "\n", " Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n", "0 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "1 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "2 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "3 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "4 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "\n", " Descrição do Item \\\n", "0 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "1 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "2 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "3 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "4 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "\n", " Chamada Promocional Valor do Guia \\\n", "0 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n", "1 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n", "2 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n", "3 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n", "4 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n", "\n", " Preço Promocionado % de Desconto RE compra por RE Vende por \\\n", "0 84.9 0.292 59.43 84.9 \n", "1 84.9 0.292 59.43 84.9 \n", "2 84.9 0.292 59.43 84.9 \n", "3 84.9 0.292 59.43 84.9 \n", "4 84.9 0.292 59.43 84.9 \n", "\n", " RE lucra (R$) SKU SKU_FINAL \n", "0 25.47 94060 94060 \n", "1 25.47 94060 94060 \n", "2 25.47 94060 94060 \n", "3 25.47 94060 94060 \n", "4 25.47 94060 94060 " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_tabela = pd.merge(left=df_tabela,right=df0[['SKU','SKU_FINAL']],left_on='Código do Item',right_on='SKU',how='left')\n", "df_tabela.head()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "df_tabela['Código do Item'] = np.where(df_tabela['SKU_FINAL'].notna(),df_tabela['SKU_FINAL'],df_tabela['Código do Item'])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "df_tabela = df_tabela.drop(columns=['SKU','SKU_FINAL'])" ] }, { "cell_type": "code", "execution_count": 29, "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", "
CicloVeiculoTipo de PromoçãoEstratégia de PromoçãoTipo_mecanicaPromo Período Limitado?EAMCategoriaCód. ComboCódigo do ItemDescrição do ItemChamada PromocionalValor do GuiaPreço Promocionado% de DescontoRE compra porRE Vende porRE lucra (R$)
0202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.984.90.29259.4384.925.47
1202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.984.90.29259.4384.925.47
2202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.984.90.29259.4384.925.47
3202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.984.90.29259.4384.925.47
4202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100MLFGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ...119.984.90.29259.4384.925.47
\n", "
" ], "text/plain": [ " Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n", "0 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "1 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "2 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "3 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "4 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "\n", " Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n", "0 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "1 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "2 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "3 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "4 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "\n", " Descrição do Item \\\n", "0 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "1 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "2 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "3 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "4 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML \n", "\n", " Chamada Promocional Valor do Guia \\\n", "0 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n", "1 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n", "2 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n", "3 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n", "4 FGCF MOVIMENTO AUTO CUIDADO (13 a 25 OUTUBRO) ... 119.9 \n", "\n", " Preço Promocionado % de Desconto RE compra por RE Vende por \\\n", "0 84.9 0.292 59.43 84.9 \n", "1 84.9 0.292 59.43 84.9 \n", "2 84.9 0.292 59.43 84.9 \n", "3 84.9 0.292 59.43 84.9 \n", "4 84.9 0.292 59.43 84.9 \n", "\n", " RE lucra (R$) \n", "0 25.47 \n", "1 25.47 \n", "2 25.47 \n", "3 25.47 \n", "4 25.47 " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_tabela.head()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "df_tabela['MATCH'] = 1" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "df_tabela = pd.merge(left=df_tabela,right=df_pdv[['PDV','MATCH','UF','DESCRIÇÃO PDV','ANALISTA']],on='MATCH',how='inner')" ] }, { "cell_type": "code", "execution_count": 32, "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", "
CicloVeiculoTipo de PromoçãoEstratégia de PromoçãoTipo_mecanicaPromo Período Limitado?EAMCategoriaCód. ComboCódigo do Item...Preço Promocionado% de DescontoRE compra porRE Vende porRE lucra (R$)MATCHPDVUFDESCRIÇÃO PDVANALISTA
0202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060...84.90.29259.4384.925.47120968SEHIB ITABAIANINHAMARCYARA
1202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060...84.90.29259.4384.925.47120969ALHIB MARECHAL DEODTHAYLLAN
2202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060...84.90.29259.4384.925.47120970BAER SAO SEBASTIAODARLIN
3202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060...84.90.29259.4384.925.47120986BAHIB OLINDINALUCAS
4202515Fora GuiaPromoção CFMovimentar FlowDesconto Direto13/10 a 25/10NãoPERF. FEMININANaN94060...84.90.29259.4384.925.47120988BAHIB QUEIMADASDARLIN
\n", "

5 rows × 23 columns

\n", "
" ], "text/plain": [ " Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n", "0 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "1 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "2 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "3 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "4 202515 Fora Guia Promoção CF Movimentar Flow Desconto Direto \n", "\n", " Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n", "0 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "1 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "2 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "3 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "4 13/10 a 25/10 Não PERF. FEMININA NaN 94060 \n", "\n", " ... Preço Promocionado % de Desconto RE compra por RE Vende por \\\n", "0 ... 84.9 0.292 59.43 84.9 \n", "1 ... 84.9 0.292 59.43 84.9 \n", "2 ... 84.9 0.292 59.43 84.9 \n", "3 ... 84.9 0.292 59.43 84.9 \n", "4 ... 84.9 0.292 59.43 84.9 \n", "\n", " RE lucra (R$) MATCH PDV UF DESCRIÇÃO PDV ANALISTA \n", "0 25.47 1 20968 SE HIB ITABAIANINHA MARCYARA \n", "1 25.47 1 20969 AL HIB MARECHAL DEOD THAYLLAN \n", "2 25.47 1 20970 BA ER SAO SEBASTIAO DARLIN \n", "3 25.47 1 20986 BA HIB OLINDINA LUCAS \n", "4 25.47 1 20988 BA HIB QUEIMADAS DARLIN \n", "\n", "[5 rows x 23 columns]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_tabela.head()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "df_tabela = df_tabela.drop_duplicates()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Ciclo', 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n", " 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n", " 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n", " 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n", " '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n", " 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA'],\n", " dtype='object')" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_tabela.columns" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", " 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n", " 'nextcycleprojection', 'secondtonextcycleprojection'],\n", " dtype='object')" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": 36, "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", "
pdvSKUSKU_FINALESTOQUE ATUALESTOQUE EM TRANSITOPEDIDO PENDENTECurvaCATEGORIADiasSemVendanextcycleprojectionsecondtonextcycleprojection
02099851213512139221753BPERFUMARIA1.0258.00.0
12099883960839601050CDESODORANTES4.011.00.0
2209987529375293610BMAQUIAGEM3.00.00.0
3209987588875888300CMAQUIAGEM27.00.00.0
420998528985289834100BPERFUMARIA1.043.00.0
\n", "
" ], "text/plain": [ " pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE \\\n", "0 20998 51213 51213 92 21 753 \n", "1 20998 83960 83960 10 5 0 \n", "2 20998 75293 75293 6 1 0 \n", "3 20998 75888 75888 3 0 0 \n", "4 20998 52898 52898 341 0 0 \n", "\n", " Curva CATEGORIA DiasSemVenda nextcycleprojection \\\n", "0 B PERFUMARIA 1.0 258.0 \n", "1 C DESODORANTES 4.0 11.0 \n", "2 B MAQUIAGEM 3.0 0.0 \n", "3 C MAQUIAGEM 27.0 0.0 \n", "4 B PERFUMARIA 1.0 43.0 \n", "\n", " secondtonextcycleprojection \n", "0 0.0 \n", "1 0.0 \n", "2 0.0 \n", "3 0.0 \n", "4 0.0 " ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "df['pdv'] = df['pdv'].astype(str)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "df['SKU_FINAL'] = df['SKU_FINAL'].astype(str)\n" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "df_tabela['Código do Item'] = df_tabela['Código do Item'].astype('str')" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Ciclo', 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n", " 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n", " 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n", " 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n", " '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n", " 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA'],\n", " dtype='object')" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_tabela.columns" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "df_tabela['PDV'] = df_tabela['PDV'].astype(str)" ] }, { "cell_type": "code", "execution_count": 42, "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", "
SKU_FINALpdv
05121320998
18396020998
27529320998
37588820998
45289820998
\n", "
" ], "text/plain": [ " SKU_FINAL pdv\n", "0 51213 20998\n", "1 83960 20998\n", "2 75293 20998\n", "3 75888 20998\n", "4 52898 20998" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[['SKU_FINAL','pdv']].head()" ] }, { "cell_type": "code", "execution_count": 43, "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", "
pdvSKUSKU_FINALESTOQUE ATUALESTOQUE EM TRANSITOPEDIDO PENDENTECurvaCATEGORIADiasSemVendanextcycleprojectionsecondtonextcycleprojection
7932099193403934030124CINFANTIL5.00.00.0
1094620998934039340301524CINFANTIL5.00.00.0
35510209959340393403000CINFANTIL13.00.00.0
45664209969340393403000CINFANTIL1.00.00.0
53287212789340393403000CINFANTIL6.00.00.0
73547209699340393403000CINFANTIL62.00.00.0
77615209929340393403000CINFANTIL0.00.00.0
92374209689340393403003CINFANTIL6.00.00.0
92766214959340393403000CINFANTIL5.00.00.0
107035209979340393403000CINFANTIL1.00.00.0
109390242559340393403000CINFANTIL6.00.00.0
117431225419340393403010CINFANTIL3.00.00.0
393788210079340393403000NoneINFANTILNaNNaNNaN
\n", "
" ], "text/plain": [ " pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO \\\n", "793 20991 93403 93403 0 1 \n", "10946 20998 93403 93403 0 15 \n", "35510 20995 93403 93403 0 0 \n", "45664 20996 93403 93403 0 0 \n", "53287 21278 93403 93403 0 0 \n", "73547 20969 93403 93403 0 0 \n", "77615 20992 93403 93403 0 0 \n", "92374 20968 93403 93403 0 0 \n", "92766 21495 93403 93403 0 0 \n", "107035 20997 93403 93403 0 0 \n", "109390 24255 93403 93403 0 0 \n", "117431 22541 93403 93403 0 1 \n", "393788 21007 93403 93403 0 0 \n", "\n", " PEDIDO PENDENTE Curva CATEGORIA DiasSemVenda nextcycleprojection \\\n", "793 24 C INFANTIL 5.0 0.0 \n", "10946 24 C INFANTIL 5.0 0.0 \n", "35510 0 C INFANTIL 13.0 0.0 \n", "45664 0 C INFANTIL 1.0 0.0 \n", "53287 0 C INFANTIL 6.0 0.0 \n", "73547 0 C INFANTIL 62.0 0.0 \n", "77615 0 C INFANTIL 0.0 0.0 \n", "92374 3 C INFANTIL 6.0 0.0 \n", "92766 0 C INFANTIL 5.0 0.0 \n", "107035 0 C INFANTIL 1.0 0.0 \n", "109390 0 C INFANTIL 6.0 0.0 \n", "117431 0 C INFANTIL 3.0 0.0 \n", "393788 0 None INFANTIL NaN NaN \n", "\n", " secondtonextcycleprojection \n", "793 0.0 \n", "10946 0.0 \n", "35510 0.0 \n", "45664 0.0 \n", "53287 0.0 \n", "73547 0.0 \n", "77615 0.0 \n", "92374 0.0 \n", "92766 0.0 \n", "107035 0.0 \n", "109390 0.0 \n", "117431 0.0 \n", "393788 NaN " ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[(df['SKU_FINAL']=='93403')]" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(10375, 34)" ] }, "execution_count": 44, "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": 45, "metadata": {}, "outputs": [], "source": [ "df_final = pd.merge(left=df,right=df_tabela,right_on=['Código do Item','PDV'],left_on=['SKU','pdv'],how='right')" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", " 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n", " 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo',\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'],\n", " dtype='object')" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "df_final['pdv'] = df_final['PDV']\n", "df_final['SKU_FINAL'] = df_final['Código do Item']" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML\n", "1 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML\n", "2 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML\n", "3 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML\n", "4 EUDORA VELVET DIVINE DESODORANTE COLÔNIA 100ML\n", " ... \n", "8923 ESTOJO LA VICTORIE INTENSE NAMORADOS 2025\n", "8924 ESTOJO LA VICTORIE INTENSE NAMORADOS 2025\n", "8925 ESTOJO LA VICTORIE INTENSE NAMORADOS 2025\n", "8926 ESTOJO LA VICTORIE INTENSE NAMORADOS 2025\n", "8927 ESTOJO LA VICTORIE INTENSE NAMORADOS 2025\n", "Name: Descrição do Item, Length: 8928, dtype: object" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final['Descrição do Item']" ] }, { "cell_type": "code", "execution_count": 49, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pdvSKUSKU_FINALESTOQUE ATUALESTOQUE EM TRANSITOPEDIDO PENDENTECurvaCATEGORIADiasSemVendanextcycleprojection...Preço Promocionado% de DescontoRE compra porRE Vende porRE lucra (R$)MATCHPDVUFDESCRIÇÃO PDVANALISTA
0209689406094060500CPERFUMARIA12.00.0...84.90.29259.4384.925.47120968SEHIB ITABAIANINHAMARCYARA
1209699406094060105CPERFUMARIA11.00.0...84.90.29259.4384.925.47120969ALHIB MARECHAL DEODTHAYLLAN
22097094060940601000CPERFUMARIA3.00.0...84.90.29259.4384.925.47120970BAER SAO SEBASTIAODARLIN
32098694060940601100CPERFUMARIA0.00.0...84.90.29259.4384.925.47120986BAHIB OLINDINALUCAS
4209889406094060900CPERFUMARIA0.00.0...84.90.29259.4384.925.47120988BAHIB QUEIMADASDARLIN
52098994060940601300CPERFUMARIA0.00.0...84.90.29259.4384.925.47120989BAHIB ENTRE RIOSMARCYARA
62099194060940608030CPERFUMARIA6.00.0...84.90.29259.4384.925.47120991ALHIB CAMPO ALEGRETHAYLLAN
72099294060940601000CPERFUMARIA0.00.0...84.90.29259.4384.925.47120992BAER CONC COITEJEFFERSON
82099394060940603500CPERFUMARIA1.00.0...84.90.29259.4384.925.47120993BAER CANDEIASDARLIN
92099494060940602900CPERFUMARIA4.00.0...84.90.29259.4384.925.47120994BAER SIMOES FILHOLUCAS
10209959406094060004CPERFUMARIA32.00.0...84.90.29259.4384.925.47120995SEER LAGARTOMARCYARA
11209969406094060200CPERFUMARIA4.00.0...84.90.29259.4384.925.47120996ALER ANTARESJEFFERSON
122099794060940606011CPERFUMARIA0.00.0...84.90.29259.4384.925.47120997ALER PITANGUINHALUCAS
132099894060940600014CPERFUMARIA26.00.0...84.90.29259.4384.925.47120998ALCD SERRARIAVA
142099994060940601700CPERFUMARIA4.00.0...84.90.29259.4384.925.47120999BAHIB ESPLANADAMARCYARA
15210009406094060700CPERFUMARIA0.00.0...84.90.29259.4384.925.47121000BAHIB SANTALUZDARLIN
16210019406094060700CPERFUMARIA3.00.0...84.90.29259.4384.925.47121001BAHIB RIO REALLUCAS
17212789406094060000CPERFUMARIA28.00.0...84.90.29259.4384.925.47121278SEVD SOCORROJEFFERSON
182137594060940601500CPERFUMARIA0.00.0...84.90.29259.4384.925.47121375BAIPIRA HBDARLIN
192138394060940601300CPERFUMARIA0.00.0...84.90.29259.4384.925.47121383BACAPIM GROSSO ERDARLIN
\n", "

20 rows × 34 columns

\n", "
" ], "text/plain": [ " pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE \\\n", "0 20968 94060 94060 5 0 0 \n", "1 20969 94060 94060 1 0 5 \n", "2 20970 94060 94060 10 0 0 \n", "3 20986 94060 94060 11 0 0 \n", "4 20988 94060 94060 9 0 0 \n", "5 20989 94060 94060 13 0 0 \n", "6 20991 94060 94060 8 0 30 \n", "7 20992 94060 94060 10 0 0 \n", "8 20993 94060 94060 35 0 0 \n", "9 20994 94060 94060 29 0 0 \n", "10 20995 94060 94060 0 0 4 \n", "11 20996 94060 94060 2 0 0 \n", "12 20997 94060 94060 6 0 11 \n", "13 20998 94060 94060 0 0 14 \n", "14 20999 94060 94060 17 0 0 \n", "15 21000 94060 94060 7 0 0 \n", "16 21001 94060 94060 7 0 0 \n", "17 21278 94060 94060 0 0 0 \n", "18 21375 94060 94060 15 0 0 \n", "19 21383 94060 94060 13 0 0 \n", "\n", " Curva CATEGORIA DiasSemVenda nextcycleprojection ... \\\n", "0 C PERFUMARIA 12.0 0.0 ... \n", "1 C PERFUMARIA 11.0 0.0 ... \n", "2 C PERFUMARIA 3.0 0.0 ... \n", "3 C PERFUMARIA 0.0 0.0 ... \n", "4 C PERFUMARIA 0.0 0.0 ... \n", "5 C PERFUMARIA 0.0 0.0 ... \n", "6 C PERFUMARIA 6.0 0.0 ... \n", "7 C PERFUMARIA 0.0 0.0 ... \n", "8 C PERFUMARIA 1.0 0.0 ... \n", "9 C PERFUMARIA 4.0 0.0 ... \n", "10 C PERFUMARIA 32.0 0.0 ... \n", "11 C PERFUMARIA 4.0 0.0 ... \n", "12 C PERFUMARIA 0.0 0.0 ... \n", "13 C PERFUMARIA 26.0 0.0 ... \n", "14 C PERFUMARIA 4.0 0.0 ... \n", "15 C PERFUMARIA 0.0 0.0 ... \n", "16 C PERFUMARIA 3.0 0.0 ... \n", "17 C PERFUMARIA 28.0 0.0 ... \n", "18 C PERFUMARIA 0.0 0.0 ... \n", "19 C PERFUMARIA 0.0 0.0 ... \n", "\n", " Preço Promocionado % de Desconto RE compra por RE Vende por \\\n", "0 84.9 0.292 59.43 84.9 \n", "1 84.9 0.292 59.43 84.9 \n", "2 84.9 0.292 59.43 84.9 \n", "3 84.9 0.292 59.43 84.9 \n", "4 84.9 0.292 59.43 84.9 \n", "5 84.9 0.292 59.43 84.9 \n", "6 84.9 0.292 59.43 84.9 \n", "7 84.9 0.292 59.43 84.9 \n", "8 84.9 0.292 59.43 84.9 \n", "9 84.9 0.292 59.43 84.9 \n", "10 84.9 0.292 59.43 84.9 \n", "11 84.9 0.292 59.43 84.9 \n", "12 84.9 0.292 59.43 84.9 \n", "13 84.9 0.292 59.43 84.9 \n", "14 84.9 0.292 59.43 84.9 \n", "15 84.9 0.292 59.43 84.9 \n", "16 84.9 0.292 59.43 84.9 \n", "17 84.9 0.292 59.43 84.9 \n", "18 84.9 0.292 59.43 84.9 \n", "19 84.9 0.292 59.43 84.9 \n", "\n", " RE lucra (R$) MATCH PDV UF DESCRIÇÃO PDV ANALISTA \n", "0 25.47 1 20968 SE HIB ITABAIANINHA MARCYARA \n", "1 25.47 1 20969 AL HIB MARECHAL DEOD THAYLLAN \n", "2 25.47 1 20970 BA ER SAO SEBASTIAO DARLIN \n", "3 25.47 1 20986 BA HIB OLINDINA LUCAS \n", "4 25.47 1 20988 BA HIB QUEIMADAS DARLIN \n", "5 25.47 1 20989 BA HIB ENTRE RIOS MARCYARA \n", "6 25.47 1 20991 AL HIB CAMPO ALEGRE THAYLLAN \n", "7 25.47 1 20992 BA ER CONC COITE JEFFERSON \n", "8 25.47 1 20993 BA ER CANDEIAS DARLIN \n", "9 25.47 1 20994 BA ER SIMOES FILHO LUCAS \n", "10 25.47 1 20995 SE ER LAGARTO MARCYARA \n", "11 25.47 1 20996 AL ER ANTARES JEFFERSON \n", "12 25.47 1 20997 AL ER PITANGUINHA LUCAS \n", "13 25.47 1 20998 AL CD SERRARIA VA \n", "14 25.47 1 20999 BA HIB ESPLANADA MARCYARA \n", "15 25.47 1 21000 BA HIB SANTALUZ DARLIN \n", "16 25.47 1 21001 BA HIB RIO REAL LUCAS \n", "17 25.47 1 21278 SE VD SOCORRO JEFFERSON \n", "18 25.47 1 21375 BA IPIRA HB DARLIN \n", "19 25.47 1 21383 BA CAPIM GROSSO ER DARLIN \n", "\n", "[20 rows x 34 columns]" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.head(20)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "df_final['match'] = 1" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(8928, 40)" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final = pd.merge(left=df_final, right=filtered_calendario[['Ciclo','INICIO CICLO','FIM CICLO','DURAÇÃO','match','dias_ate_inicio']], on='match',how='inner')\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PDV\n", "20968 288\n", "20969 288\n", "20970 288\n", "20986 288\n", "20988 288\n", "20989 288\n", "20991 288\n", "20992 288\n", "20993 288\n", "20994 288\n", "20995 288\n", "20996 288\n", "20997 288\n", "20998 288\n", "20999 288\n", "21000 288\n", "21001 288\n", "21278 288\n", "21375 288\n", "21383 288\n", "21495 288\n", "22541 288\n", "23703 288\n", "23704 288\n", "23711 288\n", "23712 288\n", "24255 288\n", "24257 288\n", "24269 288\n", "24293 288\n", "23813 288\n", "Name: count, dtype: int64" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.PDV.value_counts()" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(8928, 40)" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#df_final = pd.merge(left=df_final,right=df_pdv[['PDV', 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC','UF', 'MARCA', 'ANALISTA']],on = 'PDV',how='inner')\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "#df_final['SKU'] = df_final['SKU'].astype(str) \n", "#df_final['PDV'] = df_final['PDV'].astype(str) \n", "#df_final = pd.merge(left=df_final,right=df_estoque[['SKU_FINAL', 'DDV PREVISTO', 'COBERTURA ATUAL','PDV']],right_on=['PDV','SKU_FINAL'],left_on=['PDV','SKU'],how='left')\n", "#df_final.shape" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype(str).str.replace('.0','',regex=False) \\n\\ndf_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')\\ndf_final.shape \"" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "r'''df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype(str).str.replace('.0','',regex=False) \n", "\n", "df_final = pd.merge(left=df_final,right=df_bi_preco[['SKU2', 'UF','Tipo Preço', 'PC', 'PV']],right_on=['UF','SKU2'],left_on=['UF','SKU_FINAL'],how='left')\n", "df_final.shape ''' " ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pdv\n", "20968 288\n", "20969 288\n", "20970 288\n", "20986 288\n", "20988 288\n", "20989 288\n", "20991 288\n", "20992 288\n", "20993 288\n", "20994 288\n", "20995 288\n", "20996 288\n", "20997 288\n", "20998 288\n", "20999 288\n", "21000 288\n", "21001 288\n", "21278 288\n", "21375 288\n", "21383 288\n", "21495 288\n", "22541 288\n", "23703 288\n", "23704 288\n", "23711 288\n", "23712 288\n", "24255 288\n", "24257 288\n", "24269 288\n", "24293 288\n", "23813 288\n", "Name: count, dtype: int64" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final['pdv'].value_counts()" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "#df_bi_preco['SKU1'] = df_bi_preco['SKU1'].astype(str).str.replace('.0','',regex=False) \n", "\n", "#df_final = pd.merge(left=df_final,right=df_bi_preco[['SKU1', 'SKU2', 'UF', 'PC', 'PV']],right_on=['UF','SKU1'],left_on=['UF','SKU'],how='left')\n", "#df_final.shape " ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "#df_bi_preco = df_bi_preco[df_bi_preco['MARCA']=='EUDORA']" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "#df_final['PRECO DE COMPRA'] = np.where(~df_final['PC_x'].isna(),df_final['PC_x'],df_final['PC_y'])\n", "\n", "#df_final['PRECO DE VENDA'] = np.where(~df_final['PV_x'].isna(),df_final['PV_x'],df_final['PV_y'])\n", "\n" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "#df_estoque = df_estoque.rename(columns={'SKU_FINAL':'SKU_PARA_VALIDACAO'})\n", "#df_final = pd.merge( left= df_final, right = df_estoque[['SKU_PARA_VALIDACAO','Arquivo_Origem']], left_on= 'SKU', right_on='SKU_PARA_VALIDACAO', how='left')" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['pdv', 'SKU', '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'],\n", " dtype='object')" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "#df_final = df_final.drop(columns=['Desativação','Lançamento','Promoção Próximo Ciclo','Compra inteligente semanal/Sugestão de compra','Planograma','Carteira Bloqueada Para Novos Pedidos','Preço Sell In','Quantidade','Item analisado','Promoção Próximo Ciclo + 1','SKU_PARA_VALIDACAO','Ciclo_y'])" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(8928, 42)" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final['PDV_SKU'] = df_final['PDV'].astype(str) + df_final['SKU_FINAL'].astype(str) \n", "df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['SKU_FINAL'].astype(str)\n", "\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 20968\n", "1 20969\n", "2 20970\n", "3 20986\n", "4 20988\n", " ... \n", "8923 24255\n", "8924 24257\n", "8925 24269\n", "8926 24293\n", "8927 23813\n", "Name: PDV, Length: 8928, dtype: object" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final['PDV']" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "secondtonextcycleprojection\n", "0.0 4389\n", "1.0 38\n", "3.0 30\n", "2.0 29\n", "4.0 21\n", "6.0 20\n", "5.0 18\n", "19.0 13\n", "10.0 12\n", "49.0 8\n", "27.0 8\n", "9.0 8\n", "18.0 7\n", "34.0 7\n", "32.0 5\n", "37.0 5\n", "8.0 5\n", "30.0 5\n", "7.0 5\n", "17.0 5\n", "94.0 4\n", "69.0 4\n", "11.0 4\n", "52.0 4\n", "53.0 4\n", "98.0 4\n", "14.0 3\n", "56.0 2\n", "15.0 2\n", "13.0 2\n", "20.0 2\n", "44.0 1\n", "24.0 1\n", "67.0 1\n", "23.0 1\n", "51.0 1\n", "28.0 1\n", "41.0 1\n", "54.0 1\n", "29.0 1\n", "16.0 1\n", "36.0 1\n", "31.0 1\n", "12.0 1\n", "33.0 1\n", "55.0 1\n", "Name: count, dtype: int64" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final['nextcycleprojection'].value_counts()\n", "\n", "df_final['secondtonextcycleprojection'].value_counts()" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "#df_final['PROJEÇÃO DO CICLO PROMOCIONADO'] =df_final['Projeção Próximo Ciclo + 1'] - df_final['Projeção Próximo Ciclo'] # projeção do ciclo em estudo" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "#df_final['PROJEÇÃO DO CICLO PROMOCIONADO'].value_counts()" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "#df_final['Data Prevista Regularização'] = df_final['Data Prevista Regularização'].astype(str).replace('0','REGULAR')" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "df_final = df_final.rename(columns={'Arquivo_Origem': 'MARCA'})" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "#df_final = df_final[~df_final['MARCA'].isna()]\n", "#df_final['MARCA'].isna().sum()" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(8928, 42)" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final = df_final.drop_duplicates()\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['pdv', 'SKU', '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', 'PDV_SKU',\n", " 'UFPRODUTO'],\n", " dtype='object')" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": 73, "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', 'C202512', 'C202513'],\n", " dtype='object')" ] }, "execution_count": 73, "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": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(8928, 42)" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.shape" ] }, { "cell_type": "code", "execution_count": 75, "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", "
PDVSKUDESCRICAOC202411C202412C202413C202414C202415C202416C202417...C202504C202505C202506C202507C202508C202509C202510C202511C202512C202513
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
\n", "

5 rows × 23 columns

\n", "
" ], "text/plain": [ " PDV SKU DESCRICAO C202411 C202412 \\\n", "0 11201 1004 FLORATTA DES COL MY BLUE 75ml 0.0 0.0 \n", "1 11201 1005 DEM FLORATTA DES COL MY BLUE 4ml 0.0 0.0 \n", "2 11201 1078 MATCH SRUM CAP POS QUIMICA 50ml 0.0 0.0 \n", "3 11201 1296 PMPCK THE BLEND DES ANTIT AER 2x75g 0.0 0.0 \n", "4 11201 1302 PMPCK LILY DES ANTIT AER 2x75g 0.0 0.0 \n", "\n", " C202413 C202414 C202415 C202416 C202417 ... C202504 C202505 \\\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", " C202506 C202507 C202508 C202509 C202510 C202511 C202512 C202513 \n", "0 0.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 0.0 \n", "2 0.0 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 0.0 \n", "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", "[5 rows x 23 columns]" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_vendas.head()" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "df_final = pd.merge(df_final,df_vendas,left_on=['PDV','SKU'],right_on=['PDV','SKU'],how='left')" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['pdv', 'SKU', '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', 'PDV_SKU',\n", " 'UFPRODUTO', 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414',\n", " 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n", " 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C202509',\n", " 'C202510', 'C202511', 'C202512', 'C202513'],\n", " dtype='object')" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "df_final.iloc[:, -18:-1] = df_final.iloc[:, -18:-1].fillna(0)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [], "source": [ "# Define list of target columns\n", "sales_2024_cols = df_final.columns[-18:-1]\n", "# Create a new column with the row-wise max\n", "df_final['PICO DE VENDAS 17CICLOS'] = df_final[sales_2024_cols].max(axis=1)\n", "\n" ] }, { "cell_type": "code", "execution_count": 80, "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", "
pdvSKUSKU_FINALESTOQUE ATUALESTOQUE EM TRANSITOPEDIDO PENDENTECurvaCATEGORIADiasSemVendanextcycleprojection...C202505C202506C202507C202508C202509C202510C202511C202512C202513PICO DE VENDAS 17CICLOS
0209689406094060500CPERFUMARIA12.00.0...8.00.00.00.00.00.08.02.00.011.0
1209699406094060105CPERFUMARIA11.00.0...5.03.00.00.00.00.01.03.00.043.0
22097094060940601000CPERFUMARIA3.00.0...0.00.00.00.00.00.00.02.00.02.0
32098694060940601100CPERFUMARIA0.00.0...0.00.00.00.00.00.00.00.00.00.0
4209889406094060900CPERFUMARIA0.00.0...0.00.00.00.00.00.00.00.00.00.0
\n", "

5 rows × 64 columns

\n", "
" ], "text/plain": [ " pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE \\\n", "0 20968 94060 94060 5 0 0 \n", "1 20969 94060 94060 1 0 5 \n", "2 20970 94060 94060 10 0 0 \n", "3 20986 94060 94060 11 0 0 \n", "4 20988 94060 94060 9 0 0 \n", "\n", " Curva CATEGORIA DiasSemVenda nextcycleprojection ... C202505 C202506 \\\n", "0 C PERFUMARIA 12.0 0.0 ... 8.0 0.0 \n", "1 C PERFUMARIA 11.0 0.0 ... 5.0 3.0 \n", "2 C PERFUMARIA 3.0 0.0 ... 0.0 0.0 \n", "3 C PERFUMARIA 0.0 0.0 ... 0.0 0.0 \n", "4 C PERFUMARIA 0.0 0.0 ... 0.0 0.0 \n", "\n", " C202507 C202508 C202509 C202510 C202511 C202512 C202513 \\\n", "0 0.0 0.0 0.0 0.0 8.0 2.0 0.0 \n", "1 0.0 0.0 0.0 0.0 1.0 3.0 0.0 \n", "2 0.0 0.0 0.0 0.0 0.0 2.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", " PICO DE VENDAS 17CICLOS \n", "0 11.0 \n", "1 43.0 \n", "2 2.0 \n", "3 0.0 \n", "4 0.0 \n", "\n", "[5 rows x 64 columns]" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.head()" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PDV\n", "20968 292\n", "20969 292\n", "20995 292\n", "20996 292\n", "20997 292\n", "20998 292\n", "21278 292\n", "22541 292\n", "21495 291\n", "20991 291\n", "20989 288\n", "20994 288\n", "20988 288\n", "20986 288\n", "20970 288\n", "20999 288\n", "20992 288\n", "20993 288\n", "21000 288\n", "21375 288\n", "21001 288\n", "21383 288\n", "23703 288\n", "23704 288\n", "23711 288\n", "23712 288\n", "24255 288\n", "24257 288\n", "24269 288\n", "24293 288\n", "23813 288\n", "Name: count, dtype: int64" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.PDV.value_counts()" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['C202413', 'C202414', 'C202415', 'C202416', 'C202417', 'C202501',\n", " 'C202502', 'C202503', 'C202504', 'C202505', 'C202506', 'C202507',\n", " 'C202508', 'C202509', 'C202510', 'C202511', 'C202512'],\n", " dtype='object')" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sales_2024_cols" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [], "source": [ "vendas_6_meses = df_final.columns[-8:-2]\n", "\n", "df_final['Pico Vendas Ultimos 6 ciclos'] = df_final[vendas_6_meses].max(axis=1)" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'C202414'" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.columns[-19]" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.7716087836785548\n" ] } ], "source": [ "CRESCIMENTO = (df_final[df_final.columns[-18]].sum() - df_final[df_final.columns[-3]].sum())/df_final[df_final.columns[-18]].sum() \n", "print(CRESCIMENTO)\n", "\n", "df_final['CRESCIMENTO'] = .2" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "mesmo_ciclo_ano_passado = df_final.columns[-19]\n", "ciclo_ano_passado = df_final.columns[-19:-18].str.split(\" \")[0][-1]\n", "df_final[ciclo_ano_passado] = df_final[mesmo_ciclo_ano_passado]" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'C202415'" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.columns[-19:-18].str.split(\" \")[0][-1]" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['C202413', 'C202414', 'C202415', 'C202416', 'C202417', 'C202501',\n", " 'C202502', 'C202503', 'C202504', 'C202505', 'C202506', 'C202507',\n", " 'C202508', 'C202509', 'C202510', 'C202511', 'C202512', 'C202513'],\n", " dtype='object')" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.columns[-21:-3]" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [], "source": [ "vendas_todos_historicos = df_final.columns[-21:-3]\n", "\n", "df_final['MEDIANA DO HISTÓRICO'] = df_final[vendas_todos_historicos].median(axis=1)\n", "\n", "df_final['MEDIA DO HISTÓRICO'] = df_final[vendas_todos_historicos].mean(axis=1)\n", "\n", "df_final['MEDIANA DO HISTÓRICO'] = np.where(df_final['MEDIANA DO HISTÓRICO'] <1,df_final['MEDIA DO HISTÓRICO'],df_final['MEDIANA DO HISTÓRICO'])\n" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(0.7716087836785548)" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "CRESCIMENTO" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [], "source": [ "df_final['PV GINSENG'] = np.where(df_final['CRESCIMENTO'] * df_final[ciclo_ano_passado] + df_final[ciclo_ano_passado] < df_final['MEDIANA DO HISTÓRICO'],\n", " np.ceil(df_final['CRESCIMENTO'] * df_final['MEDIANA DO HISTÓRICO']+ df_final['MEDIANA DO HISTÓRICO']), \n", " np.ceil(df_final['CRESCIMENTO']*df_final[ciclo_ano_passado]+df_final[ciclo_ano_passado]))" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "#df_final['PV GINSENG'] = np.where(df_final['PV GINSENG']<1, df_final['Projeção Próximo Ciclo + 1'],df_final['PV GINSENG'])" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [], "source": [ "#df_final = df_final.rename(columns={df_final.columns[18]: \"C-4\", df_final.columns[19]: \"C-3\",df_final.columns[20]: \"C-2\",df_final.columns[21]: \"C-1\"})" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['pdv', 'SKU', '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', 'PDV_SKU',\n", " 'UFPRODUTO', 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414',\n", " 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n", " 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C202509',\n", " 'C202510', 'C202511', 'C202512', 'C202513', 'PICO DE VENDAS 17CICLOS',\n", " 'Pico Vendas Ultimos 6 ciclos', 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO',\n", " 'MEDIA DO HISTÓRICO', 'PV GINSENG'],\n", " dtype='object')" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": 95, "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": 96, "metadata": {}, "outputs": [], "source": [ "# List all columns except the two\n", "cols_to_group_by = df_final.columns.difference(['DDV PREVISTO', 'COBERTURA ATUAL'])\n", "\n", "# Group and aggregate\n", "df_final_dedup = df_final\n", " " ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [], "source": [ "#df_final['Compra inteligente Próximo Ciclo']\n" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [], "source": [ "#df_final['DDV PREVISTO'] = df_final['DDV PREVISTO'].fillna(0.01)\n" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup['DDV PREVISTO'] = np.where(\n", "# df_final_dedup['DDV PREVISTO'] == 0,\n", "# 0.01,\n", "# df_final_dedup['DDV PREVISTO']\n", "#)\n" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup['DDV PREVISTO'].value_counts()" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup['EST PROJE FINAL CICLO ATUAL'] = (df_final_dedup['Estoque Atual'] + df_final_dedup['Estoque em Transito']) - round(df_final_dedup['dias_ate_inicio'] * df_final_dedup['DDV PREVISTO'],0)" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup['EST PROJE FINAL CICLO ATUAL'] = np.where(df_final_dedup['EST PROJE FINAL CICLO ATUAL']<0,0,df_final_dedup['EST PROJE FINAL CICLO ATUAL'])" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup.columns" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup['VENDAS R$ PV GINSENG'] = df_final_dedup['PRECO DE VENDA'] * df_final_dedup['PV GINSENG']" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup = df_final_dedup.rename(columns={'Ciclo_x':'Ciclo'})" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [], "source": [ "df_final_dedup['SUGESTÃO ABTASTECIMENTO\t'] = ''\n", "df_final_dedup['VENDAS R$ ABASTECIMENTO'] = ''\n" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup['RBV 202406'] = df_final_dedup['PRECO DE VENDA'] * df_final_dedup[ciclo_ano_passado] " ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup['COB PROJETADA'] = np.where(\n", "# df_final_dedup['DDV PREVISTO'] != 0,\n", "# (df_final_dedup['EST PROJE FINAL CICLO ATUAL'] + df_final_dedup['PV GINSENG']) / df_final_dedup['DDV PREVISTO'],\n", "# 999)\n" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup.drop(columns=['dias_ate_inicio','SKU_FINAL','Projeção Próximo Ciclo + 1',\n", "# 'CRESCIMENTO'],inplace=True)" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup['MARCA'] = df_final_dedup['MARCA'].str.replace('.csv','',regex=False)" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup['COB PROJETADA'] = df_final_dedup['COB PROJETADA'].fillna(999)" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [], "source": [ "#df_final_dedup.columns" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [], "source": [ "#marca_promo = df_estoque['Arquivo_Origem'].iloc[0].replace('.csv','')\n", "#marca_promo" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['pdv', 'SKU', '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', 'PDV_SKU',\n", " 'UFPRODUTO', 'DESCRICAO', 'C202411', 'C202412', 'C202415', 'C202510',\n", " 'C202511', 'C202512', 'C202513', 'PICO DE VENDAS 17CICLOS',\n", " 'Pico Vendas Ultimos 6 ciclos', 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO',\n", " 'MEDIA DO HISTÓRICO', 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t',\n", " 'VENDAS R$ ABASTECIMENTO'],\n", " dtype='object')" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "# Passo 1: ordenar\n", "df_sorted = df_final.sort_values(by='% de Desconto', ascending=False)\n", "\n", "# Passo 2: obter até 3 chamadas promocionais por grupo\n", "promo_grouped = (\n", " df_sorted.groupby(['SKU_FINAL', 'PDV'])['Chamada Promocional']\n", " .apply(lambda x: x.dropna().unique()[:3])\n", " .apply(pd.Series)\n", " .rename(columns={0: 'MECÂNICA 1', 1: 'MECÂNICA 2', 2: 'MECÂNICA 3'})\n", " .reset_index()\n", ")\n", "\n", "# Passo 3: base com maior % de desconto\n", "df_base = df_sorted.drop_duplicates(subset=['SKU_FINAL', 'PDV'], keep='first').reset_index(drop=True)\n", "\n", "# Passo 4: merge com chamadas pivotadas\n", "df_merged = df_base.merge(promo_grouped, on=['SKU_FINAL', 'PDV'], how='left')\n", "\n", "# Corrigir dicionário: agrupar e pegar o primeiro valor válido por (SKU_FINAL, PDV)\n", "# Passo 1: dicionário com Cód. Combo único por SKU_FINAL+PDV\n", "cod_combo_map = (\n", " df_final\n", " .dropna(subset=['Cód. Combo'])\n", " .groupby(['SKU_FINAL', 'PDV'])['Cód. Combo']\n", " .first()\n", " .to_dict()\n", ")\n", "\n", "# Passo 2: gerar Series com os valores mapeados\n", "cod_combo_series = df_merged.set_index(['SKU_FINAL', 'pdv']).index.map(cod_combo_map)\n", "\n", "# Passo 3: substituir os valores diretamente\n", "df_merged['Cód. Combo'] = cod_combo_series.where(cod_combo_series.notna(), df_merged['Cód. Combo'])\n", "\n" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PDV\n", "20986 196\n", "20991 196\n", "23712 196\n", "23711 196\n", "23704 196\n", "23703 196\n", "22541 196\n", "21495 196\n", "21383 196\n", "21375 196\n", "21278 196\n", "21001 196\n", "24269 196\n", "23813 196\n", "24255 196\n", "24257 196\n", "24293 196\n", "20970 196\n", "20969 196\n", "20968 196\n", "20999 196\n", "21000 196\n", "20996 196\n", "20995 196\n", "20997 196\n", "20998 196\n", "20989 196\n", "20994 196\n", "20992 196\n", "20993 196\n", "20988 196\n", "Name: count, dtype: int64" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_merged.PDV.value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Columns to bring up front\n", "priority_cols = [\n", " 'PDV_SKU',\t'SKU',\t'MARCA','INICIO CICLO',\n", " 'FIM CICLO',\t'DURAÇÃO','dias_ate_inicio',\t\n", " 'UFPRODUTO',\t'Item Desativado',\t'Data Prevista Regularização',\n", " 'ANALISTA',\t'UF',\t'PDV',\t'DESCRIÇÃO PDV',\t'Classe',\n", " 'Descrição','MECÂNICA 1',\n", " 'MECÂNICA 2', 'MECÂNICA 3','Estoque Atual',\t'COBERTURA ATUAL',\n", " 'Estoque em Transito',\t'Pedido Pendente',\t'PICO DE VENDAS 2024','Pico Vendas Ultimos 6 ciclos',\n", " 'C-4',\t'C-3',\t'C-2',\t'C-1',\t'Histórico de Vendas do Ciclo Atual',\n", " 'Dias sem venda'\n", "]\n", "\n", "# All remaining columns\n", "other_cols = [col for col in df_merged.columns if col not in priority_cols]\n", "\n", "# Reorder\n", "df_merged = df_merged[priority_cols + other_cols]\n" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "df_merged['INICIO CICLO'] = pd.to_datetime(df_merged['INICIO CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')\n", "\n", "df_merged['FIM CICLO'] = pd.to_datetime(df_merged['FIM CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['pdv', 'SKU', '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', 'PDV_SKU',\n", " 'UFPRODUTO', 'DESCRICAO', 'C202411', 'C202412', 'C202415', 'C202510',\n", " 'C202511', 'C202512', 'C202513', 'PICO DE VENDAS 17CICLOS',\n", " 'Pico Vendas Ultimos 6 ciclos', 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO',\n", " 'MEDIA DO HISTÓRICO', 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t',\n", " 'VENDAS R$ ABASTECIMENTO', 'MECÂNICA 1', 'MECÂNICA 2', 'MECÂNICA 3'],\n", " dtype='object')" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_merged.columns" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [], "source": [ "df_merged = df_merged.loc[:, ~df_merged.columns.str.endswith('_y')]\n" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [], "source": [ "df_merged.columns = df_merged.columns.str.replace('_x$', '', regex=True)\n" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [], "source": [ "df_merged['DESCRICAO'] = df_merged['Descrição do Item']" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [], "source": [ "df_merged['SKU'] = np.where(df_merged['SKU'].isna(),df_merged['SKU_FINAL'],df_merged['SKU'])" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [], "source": [ "df_merged = df_merged.drop(columns=['Veiculo',\t'Tipo de Promoção',\t'Estratégia de Promoção','Tipo_mecanica'\n", " ,'Chamada Promocional','MATCH','match','Descrição do Item','CRESCIMENTO',\n", " 'Cód. Combo'])" ] }, { "cell_type": "code", "execution_count": 124, "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','Ciclo','CATEGORIA','ANALISTA','dias_ate_inicio','PDV_SKU','UFPRODUTO',\n", " 'VENDAS R$ ABASTECIMENTO','DURAÇÃO','MEDIANA DO HISTÓRICO','DURAÇÃO'])" ] }, { "cell_type": "code", "execution_count": 125, "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": 126, "metadata": {}, "outputs": [], "source": [ "df_merged.columns = df_merged.columns.str.upper()" ] }, { "cell_type": "code", "execution_count": 127, "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": 128, "metadata": {}, "outputs": [], "source": [ "df_merged['MEDIA DO HISTÓRICO'] = round(df_merged['MEDIA DO HISTÓRICO'],0)" ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [], "source": [ "df_merged[df_merged.columns[19:26]] = df_merged[df_merged.columns[19:26]].fillna(0)" ] }, { "cell_type": "code", "execution_count": 130, "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'\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": 131, "metadata": {}, "outputs": [], "source": [ "df_merged = df_merged.drop_duplicates()" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2025-09-03'" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hoje=datetime.today().strftime('%Y-%m-%d')\n", "hoje" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [], "source": [ "\n", "from openpyxl import load_workbook\n", "from openpyxl.styles import PatternFill, Font\n", "\n", "\n", "# Export to Excel\n", "output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\EUD_promoção_{ciclo_mais2}_{hoje}.xlsx'\n", "with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n", " df_merged.to_excel(writer, index=False, sheet_name='Sheet1')\n", "\n", "# Apply styles\n", "wb = load_workbook(output_file)\n", "ws = wb['Sheet1']\n", "\n", "# Style header\n", "header_fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid') # Light Blue\n", "header_font = Font(color='FFFFFF', bold=True) # White & Bold\n", "\n", "for cell in ws[1]:\n", " cell.fill = header_fill\n", " cell.font = header_font\n", "\n", "# Style rows: gray/white alternating\n", "gray_fill = PatternFill(start_color='DDDDDD', end_color='DDDDDD', fill_type='solid') # Light gray\n", "\n", "for i, row in enumerate(ws.iter_rows(min_row=2, max_row=ws.max_row), start=2):\n", " if i % 2 == 0:\n", " for cell in row:\n", " cell.fill = gray_fill\n", "\n", "# Save styled workbook\n", "wb.save(output_file)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "coisas q saem\n", "\n", "Lançamento\n", "Subcategoria\n", "Projeção Próximo Ciclo \n", "Promoção Próximo Ciclo\n", "Compra inteligente semanal/Sugestão de compra\n", "Compra inteligente Próximo Ciclo\n", "Planograma\n", "Carteira Bloqueada Para Novos Pedidos\n", "Quantidade por caixa\n", "Preço Sell In\n", "Quantidade\n", "Item analisado\n", "Tipo Preço\n", "\n", ">>>>>>>>>>>>>NAO ESTÁ PEGANDO O MERGE COM O DF_ESTOQUE\n", "\n", "\n", "CRIAR PROJEÇÃO DE VENDA DO CICLO ATUAL\n", "Compra inteligente Próximo Ciclo + 1 >>>>>>> RENAME PRA NOROMAL" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.2" } }, "nbformat": 4, "nbformat_minor": 2 }