{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np \n", "import glob\n", "import os \n", "from openpyxl import load_workbook\n", "from openpyxl.styles import PatternFill, Font\n", "from datetime import datetime" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "hoje = datetime.today().strftime('%Y-%m-%d')" ] }, { "cell_type": "code", "execution_count": 3, "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": 4, "metadata": {}, "outputs": [], "source": [ "df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C10\\TABELA DE PEDIDOS\\Pedidos Semanais Especiais - BOT - 202510.xlsx\")\n", "\n", "df_tabela = df_tabela[df_tabela['Ação revendedor'].notna() | df_tabela['Ação consumidor'].notna()]\n", "\n", "df_tabela = df_tabela[df_tabela['Região'] == 'NNE'] \n", "\n", "df_tabela = df_tabela[(df_tabela['Canal'] != 'Ecomm')]\n", "\n", "#df_tabela['Canal'] = np.where((df_tabela['Canal'] == \"Loja\") | (df_tabela['Canal'] == \"Todos\") | (df_tabela['Canal'] == \"Loja | VD\"),\"TODOS\",\"VD\")\n", "\n", "df_tabela = df_tabela[(df_tabela['Categoria'] != \"EMBALAGENS\") | (df_tabela['Categoria'] != \"SUPORTE À VENDA\")]\n", "\n", "df_tabela = df_tabela[df_tabela['Tipo de pedido'] == 'Semanal']\n", "\n", "df_tabela = df_tabela[~df_tabela['Descrição'].str.contains('PRM')]\n", "\n", "df_tabela = df_tabela[df_tabela['Tipo de produto']!= 'EDICAO LIMITADA']\n", "\n", "df_tabela['Ação revendedor'] = np.where(df_tabela['Ação revendedor'].isna(),df_tabela['Ação consumidor'],df_tabela['Ação revendedor'])\n", "\n", "df_tabela['Percentual de desconto revendedor'] = np.where(df_tabela['Percentual de desconto revendedor'].isna(),df_tabela['Percentual de desconto consumidor'],df_tabela['Percentual de desconto revendedor'])\n", "\n", "df_tabela['MATCH'] = 1\n", "\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Ciclo', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n", " 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n", " 'Subcategoria', 'Quantidade por caixa', 'Tipo de promoção', 'Catálogo',\n", " 'Tipo de produto', 'Ação consumidor',\n", " 'Percentual de desconto consumidor', 'Ação revendedor',\n", " 'Percentual de desconto revendedor', 'Sortimento P', 'Sortimento M',\n", " 'Sortimento G', 'MATCH'],\n", " dtype='object')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_tabela.columns" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(702, 24)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_tabela.shape" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C09\\arquivos pra gerar\\pdvs\\PDV_ATT.xlsx\")\n", "\n", "df_pdv_origi = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C09\\arquivos pra gerar\\pdvs\\PDV_ATT.xlsx\")\n", "\n", "df_pdv = df_pdv.rename(columns={'DESCRIÇÃO':'DESCRIÇÃO PDV'})\n", "\n", "df_pdv = df_pdv[df_pdv['STATUS']!=\"INATIVO\"]\n", "\n", "df_pdv = df_pdv.drop(columns=['REGIÃO', 'ESTADO','CIDADE','GESTÃO', 'STATUS'])\n", "\n", "df_pdv['PDV'] = df_pdv['PDV DESC'].str.split(\"-\").str[0].str.strip()\n", "\n", "df_pdv = df_pdv[df_pdv['CANAL']!='MTZ']\n", "\n", "#df_pdv['CANAL'] = np.where((df_pdv['CANAL']=='LJ')|(df_pdv['CANAL']=='HIB')|(df_pdv['CANAL']=='CD'),'TODOS','VD')\n", "\n", "df_pdv['MATCH'] = 1\n", "\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "df_pdv = df_pdv.drop(columns=['pdv como texto','PDV DESC'])" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_54556\\4129764549.py:10: DtypeWarning: Columns (7) have mixed types. Specify dtype option on import or set low_memory=False.\n", " df_draft = pd.concat([pd.read_csv(file) for file in csv_files], ignore_index=True)\n" ] }, { "data": { "text/plain": [ "(114430, 46)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "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\\BOT\\BOT - C11\\atualização\\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", "df_draft.shape\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "df_draft = df_draft.drop(columns=['Descrição','Compra inteligente semanal/Sugestão de compra',\n", " 'Compra inteligente Próximo Ciclo',\n", " 'Compra inteligente Próximo Ciclo + 1','Planograma', 'Quantidade por caixa', 'Preço Sell In', 'Quantidade',\n", " 'Item analisado', 'Subcategoria',\n", " 'Lançamento', 'Desativação',\n", " 'Promoção Próximo Ciclo', 'Categoria'])" ] }, { "cell_type": "code", "execution_count": 11, "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\\BOT\\BOT - C11\\atualização\\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": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Ciclo', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n", " 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n", " 'Subcategoria', 'Quantidade por caixa', 'Tipo de promoção', 'Catálogo',\n", " 'Tipo de produto', 'Ação consumidor',\n", " 'Percentual de desconto consumidor', 'Ação revendedor',\n", " 'Percentual de desconto revendedor', 'Sortimento P', 'Sortimento M',\n", " 'Sortimento G', 'MATCH'],\n", " dtype='object')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_tabela.columns" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "df_tabela = pd.merge(left=df_tabela,right=df_estoque[['SKU','SKU_FINAL']],left_on='Código',right_on='SKU',how='inner')\n", "\n", "df_tabela['Código'] = df_tabela['SKU_FINAL']\n", "\n", "df_tabela = df_tabela.drop(columns=['SKU','SKU_FINAL'])\n", "\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "df_estoque = df_estoque.drop(columns=['DESCRICAO', 'CATEGORIA', 'CLASSE', 'FASES PRODUTO',\n", " 'LANCAMENTO', 'DESATIVACAO','COBERTURA ALVO',\n", " 'ESTOQUE DE SEGURANCA','COBERTURA PROJETADA', \n", " 'Pasta_Origem'])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | SKU | \n", "SKU_PARA | \n", "PDV | \n", "ESTOQUE ATUAL | \n", "ESTOQUE EM TRANSITO | \n", "PEDIDO PENDENTE | \n", "DDV PREVISTO | \n", "COBERTURA ATUAL | \n", "COBERTURA ATUAL + TRANSITO | \n", "Arquivo_Origem | \n", "SKU_FINAL | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "90495 | \n", "- | \n", "20005 | \n", "100.0 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "BOT.csv | \n", "90495 | \n", "
| 1 | \n", "90246 | \n", "- | \n", "4560 | \n", "0.0 | \n", "NaN | \n", "0.0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "BOT.csv | \n", "90246 | \n", "
| 2 | \n", "90246 | \n", "- | \n", "5699 | \n", "0.0 | \n", "NaN | \n", "0.0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "BOT.csv | \n", "90246 | \n", "
| 3 | \n", "90246 | \n", "- | \n", "12522 | \n", "0.0 | \n", "NaN | \n", "0.0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "BOT.csv | \n", "90246 | \n", "
| 4 | \n", "90246 | \n", "- | \n", "12817 | \n", "0.0 | \n", "NaN | \n", "0.0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "BOT.csv | \n", "90246 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 441216 | \n", "1594 | \n", "- | \n", "20995 | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "QDB.csv | \n", "1594 | \n", "
| 441217 | \n", "1594 | \n", "- | \n", "20998 | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "QDB.csv | \n", "1594 | \n", "
| 441218 | \n", "1594 | \n", "- | \n", "21001 | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "QDB.csv | \n", "1594 | \n", "
| 441219 | \n", "1594 | \n", "- | \n", "21278 | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "QDB.csv | \n", "1594 | \n", "
| 441220 | \n", "1594 | \n", "- | \n", "21383 | \n", "0.0 | \n", "0.0 | \n", "0.0 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "QDB.csv | \n", "1594 | \n", "
441221 rows × 11 columns
\n", "| \n", " | Ciclo | \n", "INICIO CICLO | \n", "FIM CICLO | \n", "DURAÇÃO | \n", "Date | \n", "NUM_CICLO | \n", "ANO_CICLO | \n", "CICLOMAIS2 | \n", "dias_ate_inicio | \n", "
|---|---|---|---|---|---|---|---|---|---|
| 2199 | \n", "C202510 | \n", "2025-06-30 | \n", "2025-07-20 | \n", "21 | \n", "2025-06-30 | \n", "10 | \n", "C2025 | \n", "C202512 | \n", "26 | \n", "