{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "4dda0350", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np \n", "import glob\n", "import os " ] }, { "cell_type": "code", "execution_count": null, "id": "4d6a9919", "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\\C10\\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['match'] = 1 \n", "\n", "df_draft.shape\n" ] }, { "cell_type": "code", "execution_count": null, "id": "aa56ee52", "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\\C10\\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", "\n", "df_estoque = df_estoque[df_estoque['Arquivo_Origem']== \"EUD.csv\"]\n" ] }, { "cell_type": "code", "execution_count": null, "id": "db3b7495", "metadata": {}, "outputs": [], "source": [ "df_bi_vendas = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C10\\data (1).xlsx\")\n", "\n", "df_bi_vendas['Ciclo_ultimos2'] = df_bi_vendas['Ciclo'].str.rsplit('.', n=1).str[-1]\n", "\n", "df_bi_vendas['Ciclo_ano'] = df_bi_vendas['Ciclo'].str.rsplit('.', n=1).str[0]\n", "\n", "df_bi_vendas['Ciclo_ano'] = df_bi_vendas['Ciclo_ano'].str.replace(\"C\",\"\")\n", "\n", "df_bi_vendas['CICLO_FINAL'] = 'C20' + df_bi_vendas['Ciclo_ano'].astype(str) + df_bi_vendas['Ciclo_ultimos2'].astype(str)\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "dbd61b6a", "metadata": {}, "outputs": [], "source": [ "df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\EUDORA\\PDV\\DB_PDV.xlsx\",sheet_name='Export')" ] }, { "cell_type": "code", "execution_count": null, "id": "29504e7c", "metadata": {}, "outputs": [], "source": [ "df_pdv = df_pdv.rename(columns={'DESCRIÇÃO':'DESCRIÇÃO PDV'})\n", "\n", "df_pdv = df_pdv.drop(columns=['REGIÃO', 'ESTADO','CIDADE','GESTÃO'])\n", "\n", "df_pdv['PDV'] = df_pdv['PDV DESC'].str.split(\"-\").str[0].str.strip()\n", "\n", "df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])\n", "\n", "#ignorando a PDV que ainda não está online\n", "df_pdv = df_pdv[df_pdv['DESCRIÇÃO PDV'] != '23813-COMERCIO-HIB VALENTE']\n", "df_pdv = df_pdv[df_pdv['STATUS'] == 'ATIVO']\n" ] }, { "cell_type": "code", "execution_count": null, "id": "ae39bc1e", "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\\EUDORA\\CALENDARIO_CICLO\\Ciclo_Expandido_com_Datas.xlsx\")\n", "\n", "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", "\n", "calendario['ANO_CICLO'] = calendario['Ciclo'].str[0:5]\n", "\n", "calendario = calendario[calendario['MARCA'] == \"EUDORA\"]\n", "\n", "calendario['CICLOMAIS2'] = calendario['ANO_CICLO'].astype(str) + (calendario['NUM_CICLO'].astype(int) + 3).astype(str).str.zfill(2) #<<< MUDAR O \"4\" (CICLO ATUAL + 4 PARA ACHAR O CICLO DA SUGESTÃO) EX: C202505 -> C202509\n", "ciclo_mais2 = calendario[calendario['Date'].dt.normalize() == today]['CICLOMAIS2'].iloc[0]\n", "\n", "# Filter rows where date matches today\n", "filtered_calendario = calendario[calendario['Ciclo'] == ciclo_mais2][:1]\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", "filtered_calendario['match'] = 1\n" ] }, { "cell_type": "code", "execution_count": null, "id": "5ac3914a", "metadata": {}, "outputs": [], "source": [ "#df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\EUDORA\\TABELA_PEDIDO\\Pedidos Semanais Especiais - GKD - 202509.xlsx\")\n", "\n", "#df_tabela = df_tabela[df_tabela['Região'] == 'NNE'] \n", "\n", "#df_tabela = df_tabela[(df_tabela['Canal'] != 'Ecomm') | (df_tabela['Canal'] != 'Ecomm | VD') | (df_tabela['Canal'] != 'Ecomm | Loja')] #perguntar se isso aqui é vdd\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['Tipo de promoção'].str.contains('Lançamentos', na=False)]#" ] }, { "cell_type": "code", "execution_count": null, "id": "f8ea9d1a", "metadata": {}, "outputs": [], "source": [ "df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C10\\Tabela-de-Promos_C10-1746728296536.xlsx (1).xlsx\")\n", "\n", "df_tabela = df_tabela[['Código do Item','Descrição do Item','Chamada Promocional','Valor do Guia','Preço Promocionado','% de Desconto']]" ] }, { "cell_type": "code", "execution_count": null, "id": "1a338b98", "metadata": {}, "outputs": [], "source": [ "df_similares = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C10\\PRODUTOS SIMILARES.xlsx\")" ] }, { "cell_type": "code", "execution_count": null, "id": "39ddc830", "metadata": {}, "outputs": [], "source": [ "df_similares = pd.merge(left=df_similares,right=calendario[['Ciclo','INICIO CICLO','FIM CICLO','DURAÇÃO']], how= 'left', left_on = 'CICLO SIMILAR',right_on = 'Ciclo' )\n", "\n", "df_similares = df_similares.drop(columns=['INICIO DO CICLO SIMILAR','FIM DO CICLO SIMILAR', 'DURAÇÃO DO CICLO DO SIMILAR','Ciclo','DESCRIÇÃO SIMILAR'])\n", "\n", "df_similares = df_similares.rename(columns={'INICIO CICLO':'INICIO CICLO SIMILAR','FIM CICLO':'FIM CICLO SIMILAR','DURAÇÃO':'DURAÇÃO CICLO SIMILAR'})\n", "df_similares.drop_duplicates(inplace=True)" ] }, { "cell_type": "code", "execution_count": null, "id": "c2eb0975", "metadata": {}, "outputs": [], "source": [ "df_draft = df_draft.rename(columns={'Descrição':'DESCRIÇÃO SIMILAR'})\n", "\n", "df_draft = df_draft.drop(columns=['Categoria','Subcategoria', 'Lançamento', 'Desativação',\n", " 'Dias sem venda','Projeção Próximo Ciclo', 'Projeção Próximo Ciclo + 1',\n", " 'Promoção Próximo Ciclo', 'Promoção Próximo Ciclo + 1','Compra inteligente semanal/Sugestão de compra',\n", " 'Compra inteligente Próximo Ciclo',\n", " 'Compra inteligente Próximo Ciclo + 1', 'Item Desativado',\n", " 'Data Prevista Regularização', 'Carteira Bloqueada Para Novos Pedidos',\n", " 'Planograma', 'Quantidade por caixa', 'Preço Sell In','Item analisado', 'Histórico de Vendas do Ciclo 202505'])\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "c6d00ef5", "metadata": {}, "outputs": [], "source": [ "caminho_pasta = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C10\\venda_pratico\"\n", "\n", "# Lista todos os arquivos Excel na pasta\n", "arquivos_excel = [\n", " f for f in os.listdir(caminho_pasta)\n", " if f.lower().endswith(('.xlsx', '.xls'))\n", "]\n", "caminho_arquivo = os.path.join(caminho_pasta, arquivos_excel[0])\n", "\n", "df_venda_diaria = pd.read_excel(caminho_arquivo)\n", "\n", "df_venda_diaria.shape" ] }, { "cell_type": "code", "execution_count": null, "id": "a82629ba", "metadata": {}, "outputs": [], "source": [ "df_venda_diaria['PDV'] = df_venda_diaria['Unidade de Negócio'].str.split(\"-\").str[0].str.strip()\n", "\n", "df_venda_diaria['Dia'] = pd.to_datetime(df_venda_diaria['Dia'], format='%d/%m/%Y')\n", "\n", "df_venda_diaria = pd.merge(left=df_venda_diaria,right=calendario[['Ciclo','Date']],left_on='Dia',right_on='Date',how='inner')\n", "\n", "df_venda_diaria = df_venda_diaria.drop(columns='Date')\n", "\n", "df_venda_diaria.shape" ] }, { "cell_type": "code", "execution_count": null, "id": "4cd37229", "metadata": {}, "outputs": [], "source": [ "df_venda_diaria = df_venda_diaria.drop_duplicates()\n", "\n", "df_venda_diaria.shape" ] }, { "cell_type": "code", "execution_count": null, "id": "15773282", "metadata": {}, "outputs": [], "source": [ "df_venda_agrupado = df_venda_diaria.groupby(['PDV', 'Código do Produto','Ciclo'])['Quantidade'].sum().reset_index()\n", "df_venda_agrupado['Quantidade'].value_counts()" ] }, { "cell_type": "code", "execution_count": null, "id": "11a29a22", "metadata": {}, "outputs": [], "source": [ "df_pdv['match'] = 1\n", "\n", "df_similares['match'] = 1" ] }, { "cell_type": "code", "execution_count": null, "id": "7f9ff38f", "metadata": {}, "outputs": [], "source": [ "df_final = pd.merge(left=df_similares,right=df_pdv, on='match',how='inner')\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": null, "id": "63c52601", "metadata": {}, "outputs": [], "source": [ "df_draft['PDV'] = df_draft['PDV'].astype(str)\n", "df_final = pd.merge(left=df_final,right=df_draft,right_on=['SKU','PDV'],left_on=['PRODUTO SIMILAR','PDV'],how='left')\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": null, "id": "6dcc2058", "metadata": {}, "outputs": [], "source": [ "df_similares['MATCH'] = 1 \n", "df_pdv['MATCH'] = 1\n", "\n", "df_temp = pd.merge(right=df_similares[['PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO','MATCH']],left=df_pdv, on= 'MATCH',how='inner')\n", "df_temp = df_temp.drop_duplicates()\n", "\n", "df_temp" ] }, { "cell_type": "code", "execution_count": null, "id": "90a54c84", "metadata": {}, "outputs": [], "source": [ "df_final['match'] = 1\n", "df_final['match'] = df_final['match'].astype(int)\n", "df_final = pd.merge(left=df_final, right=filtered_calendario[['Ciclo','INICIO CICLO','FIM CICLO','DURAÇÃO','match','dias_ate_inicio']], right_on='match',left_on='match',how='inner')\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": null, "id": "15b16b69", "metadata": {}, "outputs": [], "source": [ "#df_final['PDV'] = df_final['PDV'].astype(str)\n", "\n", "#df_final = pd.merge(left=df_final,right=df_pdv[['PDV', 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC','UF','ANALISTA','SUPERVISOR']],on = 'PDV',how='inner')\n", "df_final.shape" ] }, { "cell_type": "code", "execution_count": null, "id": "6a453dc4", "metadata": {}, "outputs": [], "source": [ "df_bi_vendas = df_bi_vendas.rename(columns={'Quantidade':'Vendas Ciclo Lançamento'})" ] }, { "cell_type": "code", "execution_count": null, "id": "a2a92cc7", "metadata": {}, "outputs": [], "source": [ "df_bi_vendas['PDV'] = df_bi_vendas['PDV'].astype(str) \n", "df_bi_vendas['SKU2'] = df_bi_vendas['SKU2'].astype(str) \n", "\n", "df_final['PRODUTO SIMILAR'] = df_final['PRODUTO SIMILAR'].astype(str)\n", "\n", "df_final['SKU'] = df_final['SKU'].astype(str)\n", "\n", "df_final = pd.merge(left=df_final,right=df_bi_vendas,right_on=['PDV','SKU2','CICLO_FINAL'],left_on=['PDV','PRODUTO SIMILAR','CICLO SIMILAR'],how='left')\n", "df_final.shape " ] }, { "cell_type": "code", "execution_count": null, "id": "b8cf0aa0", "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop(columns='Quantidade') " ] }, { "cell_type": "code", "execution_count": null, "id": "085cde87", "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop(columns=['SKU','match',\n", " 'Ciclo_y',\n", " 'SKU1', 'SKU2', 'Campanha','TOTAL PV',\n", " 'Ciclo_ultimos2', 'Ciclo_ano', 'CICLO_FINAL'])" ] }, { "cell_type": "code", "execution_count": null, "id": "57d4871f", "metadata": {}, "outputs": [], "source": [ "df_final['CANAL'] = np.where((df_final['CANAL'] == 'LJ') | (df_final['CANAL'] == 'HIB'), \"TODOS\" , np.where((df_final['CANAL'] == 'CD') | (df_final['CANAL'] == 'VD'), \"VD\", df_final['CANAL']))\n", "\n", "df_final['CANAL'].value_counts()" ] }, { "cell_type": "code", "execution_count": null, "id": "e4e5868e", "metadata": {}, "outputs": [], "source": [ "df_tabela['Código do Item'] = df_tabela['Código do Item'].astype(str).str.replace('.0','',regex=False)\n", "df_final['PRODUTO LANÇAMENTO'] = df_final['PRODUTO LANÇAMENTO'].astype(str)\n", "\n", "df_final = pd.merge(left=df_final,right=df_tabela,right_on=['Código do Item'],left_on=['PRODUTO LANÇAMENTO'],how='left')\n", "df_final.shape " ] }, { "cell_type": "code", "execution_count": null, "id": "d6b65a39", "metadata": {}, "outputs": [], "source": [ "df_estoque = df_estoque.rename(columns={'SKU_FINAL':'SKU_PARA_VALIDACAO'})" ] }, { "cell_type": "code", "execution_count": null, "id": "aaa90522", "metadata": {}, "outputs": [], "source": [ "df_final = pd.merge( left= df_final, right = df_estoque[['SKU_PARA_VALIDACAO','Arquivo_Origem','PDV']], left_on= ['PRODUTO SIMILAR','PDV'], right_on=['SKU_PARA_VALIDACAO','PDV'], how='left')" ] }, { "cell_type": "code", "execution_count": null, "id": "94f1a76f", "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop(columns=[\n", "'SKU_PARA_VALIDACAO'\n", "])" ] }, { "cell_type": "code", "execution_count": null, "id": "efa6b757", "metadata": {}, "outputs": [], "source": [ "df_final['PDV_SKU'] = df_final['PDV'].astype(str) + df_final['PRODUTO SIMILAR'].astype(str) \n", "\n", "df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['PRODUTO SIMILAR'].astype(str)\n", "\n", "\n", "VENDA_SIMILAR_6_MESES= df_final.columns[22:28]\n", "\n", "df_final['Pico Vendas Similar Ultimos 6 ciclos'] = df_final[VENDA_SIMILAR_6_MESES].max(axis=1)\n", "\n", "df_final = df_final.drop_duplicates()\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "f10b3982", "metadata": {}, "outputs": [], "source": [ "df_venda_agrupado['Código do Produto'] = df_venda_agrupado['Código do Produto'].astype(str)\n", "\n", "df_final = pd.merge(left=df_final,right=df_venda_agrupado,right_on=['PDV','Código do Produto','Ciclo'],left_on=['PDV','PRODUTO SIMILAR','CICLO SIMILAR'],how='left')" ] }, { "cell_type": "code", "execution_count": null, "id": "8f96e45b", "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop(columns=['Ciclo','Código do Produto','Vendas Ciclo Lançamento'])\n", "\n", "df_final = df_final.rename(columns={'Quantidade':'Vendas Ciclo Lançamento'})" ] }, { "cell_type": "code", "execution_count": null, "id": "596cd352", "metadata": {}, "outputs": [], "source": [ "df_final.columns[24:41]" ] }, { "cell_type": "code", "execution_count": null, "id": "41c64323", "metadata": {}, "outputs": [], "source": [ "# Suponha que os meses estão nas colunas 10 a 26 (17 colunas = 17 meses)\n", "colunas_mensais = df_final.columns[24:41]\n", "\n", "# Passo 1: Soma todas as linhas (itens) por mês → resultado: total por mês\n", "soma_mensal = df_final[colunas_mensais].sum()\n", "\n", "# Passo 2: Calcula a variação percentual de um mês para o outro\n", "variacao_mensal = soma_mensal.pct_change()\n", "\n", "# Passo 3: Calcula a média da variação (ignorando o primeiro NaN)\n", "media_variacao = variacao_mensal[1:].mean()\n", "\n", "# Calcula média e desvio padrão\n", "media = variacao_mensal.mean()\n", "desvio = variacao_mensal.std()\n", "\n", "# Define limite (ex: 2 desvios padrão)\n", "limite_superior = media + 2 * desvio\n", "limite_inferior = media - 2 * desvio\n", "\n", "# Filtra dados dentro do limite\n", "filtro = variacao_mensal.between(limite_inferior, limite_superior)\n", "df_filtrado = variacao_mensal[filtro]\n", "CRESCIMENTO = round(df_filtrado.mean(),4)\n", "\n", "df_final['CRESCIMENTO'] = CRESCIMENTO\n", "\n", "CRESCIMENTO\n" ] }, { "cell_type": "code", "execution_count": null, "id": "f32d8326", "metadata": {}, "outputs": [], "source": [ "df_final.columns[28:29]" ] }, { "cell_type": "code", "execution_count": null, "id": "3c027cfc", "metadata": {}, "outputs": [], "source": [ "venda_similar_mesmo_ciclo_ano_passado = df_final.columns[28:29] #<<<<<<< CICLO ATUAL É [10:11]\n", "ciclo_ano_passado = df_final.columns[18:19].str.split(\" \")[0][-1]\n", "df_final[ciclo_ano_passado] = df_final[venda_similar_mesmo_ciclo_ano_passado]" ] }, { "cell_type": "code", "execution_count": null, "id": "28f74b58", "metadata": {}, "outputs": [], "source": [ "df_final['Vendas Ciclo Lançamento'] = df_final['Vendas Ciclo Lançamento'].fillna(0)" ] }, { "cell_type": "code", "execution_count": null, "id": "58642d77", "metadata": {}, "outputs": [], "source": [ "vendas_todos_historicos = df_final.columns[24:40]\n", "\n", "df_final['MEDIANA DO HISTÓRICO'] = df_final[vendas_todos_historicos].median(axis=1)\n", "\n", "df_final['MEDIANA DO HISTÓRICO'] = np.where((df_final['MEDIANA DO HISTÓRICO']<1) & (df_final['MEDIANA DO HISTÓRICO'] >0),1,df_final['MEDIANA DO HISTÓRICO'] )#validar se foi\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "69473155", "metadata": {}, "outputs": [], "source": [ "crescimento = df_final['CRESCIMENTO']\n", "vendas_lanc = df_final['Vendas Ciclo Lançamento']\n", "pico_similar = df_final['Pico Vendas Similar Ultimos 6 ciclos']\n", "mediana_hist = df_final['MEDIANA DO HISTÓRICO']\n", "\n", "# Primeiro cálculo intermediário\n", "calc_lanc = crescimento * vendas_lanc + vendas_lanc\n", "calc_pico = crescimento * pico_similar + pico_similar\n", "\n", "df_final['PV GINSENG'] = np.where(\n", " calc_lanc != 0,\n", " round(calc_lanc, 0),\n", " np.where(\n", " mediana_hist > 0,\n", " round(crescimento * mediana_hist + mediana_hist,0),\n", " round(calc_pico/2, 0)\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "ea512a48", "metadata": {}, "outputs": [], "source": [ "df_final.columns[39]" ] }, { "cell_type": "code", "execution_count": null, "id": "3cf3efe7", "metadata": {}, "outputs": [], "source": [ "df_final = df_final.rename(columns={df_final.columns[36]: \"C-4\", df_final.columns[37]: \"C-3\",df_final.columns[38]: \"C-2\",df_final.columns[39]: \"C-1\"})\n", "\n", "df_final.drop(columns=df_final.columns[28:35], inplace=True)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "2b8b3551", "metadata": {}, "outputs": [], "source": [ "\n", "marca_promo = df_estoque['Arquivo_Origem'].iloc[0].replace('.csv','')\n", "\n", "df_final['INICIO CICLO'] = pd.to_datetime(df_final['INICIO CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')\n", "\n", "df_final['FIM CICLO'] = pd.to_datetime(df_final['FIM CICLO'], dayfirst=True).dt.strftime('%d/%m/%Y')\n", "\n", "df_final['INICIO CICLO SIMILAR'] = pd.to_datetime(df_final['INICIO CICLO SIMILAR'], dayfirst=True).dt.strftime('%d/%m/%Y')\n", "\n", "df_final['FIM CICLO SIMILAR'] = pd.to_datetime(df_final['FIM CICLO SIMILAR'], dayfirst=True).dt.strftime('%d/%m/%Y')\n", "\n", "\n", "\n", "df_final = df_final.rename(columns={'Ciclo_x': 'Ciclo'})" ] }, { "cell_type": "code", "execution_count": null, "id": "93b589d9", "metadata": {}, "outputs": [], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": null, "id": "43f96709", "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop(columns=['CRESCIMENTO','dias_ate_inicio','UFPRODUTO','Arquivo_Origem','UFPRODUTO','Código do Item','PDV_SKU',\n", " 'FIM DO CICLO','INICIO DO CICLO','DURAÇÃO CICLO'])" ] }, { "cell_type": "code", "execution_count": null, "id": "edd78734", "metadata": {}, "outputs": [], "source": [ "df_final = pd.merge(left=df_final,right=df_pdv[['PDV','CANAL','UF']],how='inner',on='PDV')" ] }, { "cell_type": "code", "execution_count": null, "id": "7ac9e24c", "metadata": {}, "outputs": [], "source": [ "df_final.columns" ] }, { "cell_type": "code", "execution_count": null, "id": "9c4cbae7", "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop(columns=['CANAL_x'])\n", "\n", "df_final = df_final.rename(columns={'CANAL_y':'CANAL', 'UF_y':'UF'})" ] }, { "cell_type": "code", "execution_count": null, "id": "7d904672", "metadata": {}, "outputs": [], "source": [ "# Columns to bring up front\n", "priority_cols = [\n", " 'Ciclo','INICIO CICLO','FIM CICLO','ANALISTA','SUPERVISOR','UF','CANAL','PDV', 'DESCRIÇÃO PDV','DURAÇÃO',\t\n", " 'PRODUTO LANÇAMENTO','DESCRIÇÃO DO LANÇAMENTO',\n", " 'PRODUTO SIMILAR','DESCRIÇÃO SIMILAR','CICLO SIMILAR','INICIO CICLO SIMILAR','FIM CICLO SIMILAR','Estoque Atual',\n", " 'Estoque em Transito',\t'Pedido Pendente',\n", "\t'C-4',\t'C-3',\t'C-2',\t'C-1'\n", "]\n", "\n", "# All remaining columns\n", "other_cols = [col for col in df_final.columns if col not in priority_cols]\n", "\n", "# Reorder\n", "df_final = df_final[priority_cols + other_cols]\n", "\n", "df_final['SUGESTÃO ABTASTECIMENTO'] = ''\n", "\n", "df_final['VENDAS R$ ABASTECIMENTO'] = ''\n" ] }, { "cell_type": "code", "execution_count": null, "id": "9d817ecd", "metadata": {}, "outputs": [], "source": [ "colunas_usadas = ['PDV', 'PRODUTO LANÇAMENTO', '% de Desconto', 'Chamada Promocional']\n", "df_temp = df_final[[col for col in colunas_usadas if col in df_final.columns]].copy()\n", "\n", "# Agrupa por PDV e PRODUTO LANÇAMENTO\n", "agrupado = df_temp.groupby(['PDV', 'PRODUTO LANÇAMENTO'], dropna=False).agg({\n", " '% de Desconto': lambda x: list(pd.unique(x.dropna())),\n", " 'Chamada Promocional': lambda x: list(pd.unique(x.dropna())),\n", "}).reset_index()\n", "\n", "# Expande para colunas fixas com nomes novos e valores em branco se vazio\n", "for i in range(4):\n", " agrupado[f'% de desconto_{i+1}'] = agrupado['% de Desconto'].apply(lambda x: x[i] if len(x) > i else '')\n", " agrupado[f'Mecanica de desconto_{i+1}'] = agrupado['Chamada Promocional'].apply(lambda x: x[i] if len(x) > i else '')\n", "\n", "# Remove as colunas de lista original\n", "agrupado = agrupado.drop(columns=['% de Desconto', 'Chamada Promocional'])\n", "\n", "# Junta ao df_final\n", "colunas_merge = ['PDV', 'PRODUTO LANÇAMENTO']\n", "df_final = df_final.merge(agrupado, on=colunas_merge, how='left')\n" ] }, { "cell_type": "code", "execution_count": null, "id": "446d0d5b", "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop(columns=['Chamada Promocional','Preço Promocionado','% de Desconto','Descrição do Item','TIPO PRODUTO'])" ] }, { "cell_type": "code", "execution_count": null, "id": "922d2af3", "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop_duplicates()" ] }, { "cell_type": "code", "execution_count": null, "id": "92d051d8", "metadata": {}, "outputs": [], "source": [ "df_final.shape" ] }, { "cell_type": "code", "execution_count": null, "id": "08faefd9", "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\\\\Lançamento_{marca_promo}_{ciclo_mais2}COMPLEMENTO.xlsx'\n", "with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n", " df_final.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" ] } ], "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": 5 }