diff --git a/Lançamentos/COMPILADOR DE ARQUIVOS EM XLSX.ipynb b/Lançamentos/COMPILADOR DE ARQUIVOS EM XLSX.ipynb new file mode 100644 index 0000000..88f0adf --- /dev/null +++ b/Lançamentos/COMPILADOR DE ARQUIVOS EM XLSX.ipynb @@ -0,0 +1,231 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "e9ac37de", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total de linhas: 875\n" + ] + }, + { + "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", + "
UNPDVCIDADELOCAL DO PDVRECEITA PERÍODO ANTERIORRECEITA PERÍODO ATUALMETA PEFGAP ACORDADO (R$)GAP ACORDADO (%)REALIZADOarquivo_base
0Quem Disse Berenice910173MaceioShopping173913.810167464.53-167464.53-10C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistên...
1O Boticário21381Capim GrossoRua120594.400155346.60-155346.60-10C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistên...
2O Boticário23707Vitoria Da ConquistaRua131055.700159139.40-159139.40-10C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistên...
3O Boticário21068Simoes FilhoCash & Carry146448.380144695.45-144695.45-10C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistên...
4O Boticário20441LagartoRua225341.320311878.51-311878.51-10C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistên...
\n", + "
" + ], + "text/plain": [ + " UN PDV CIDADE LOCAL DO PDV \\\n", + "0 Quem Disse Berenice 910173 Maceio Shopping \n", + "1 O Boticário 21381 Capim Grosso Rua \n", + "2 O Boticário 23707 Vitoria Da Conquista Rua \n", + "3 O Boticário 21068 Simoes Filho Cash & Carry \n", + "4 O Boticário 20441 Lagarto Rua \n", + "\n", + " RECEITA PERÍODO ANTERIOR RECEITA PERÍODO ATUAL META PEF \\\n", + "0 173913.81 0 167464.53 \n", + "1 120594.40 0 155346.60 \n", + "2 131055.70 0 159139.40 \n", + "3 146448.38 0 144695.45 \n", + "4 225341.32 0 311878.51 \n", + "\n", + " GAP ACORDADO (R$) GAP ACORDADO (%) REALIZADO \\\n", + "0 -167464.53 -1 0 \n", + "1 -155346.60 -1 0 \n", + "2 -159139.40 -1 0 \n", + "3 -144695.45 -1 0 \n", + "4 -311878.51 -1 0 \n", + "\n", + " arquivo_base \n", + "0 C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistên... \n", + "1 C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistên... \n", + "2 C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistên... \n", + "3 C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistên... \n", + "4 C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistên... " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os\n", + "import pandas as pd\n", + "import glob\n", + "\n", + "# Caminho da pasta onde estão os arquivos\n", + "pasta = r'C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_ORÇAMENTO FIANCEIRO\\meta pef baixada hj'\n", + "\n", + "# Lista todos os arquivos .xlsx no diretório\n", + "arquivos_xlsx = glob.glob(os.path.join(pasta, '*.xlsx'))\n", + "\n", + "# Lista para armazenar os DataFrames\n", + "dfs = []\n", + "\n", + "# Loop pelos arquivos encontrados\n", + "for arquivo in arquivos_xlsx:\n", + " try:\n", + " df = pd.read_excel(arquivo, sheet_name='PERFORMANCE POR PDV', skiprows=2)\n", + " df['arquivo_base'] = arquivo\n", + " dfs.append(df)\n", + " except Exception as e:\n", + " print(f\"Erro ao ler {arquivo}: {e}\")\n", + "\n", + "# Concatena todos os DataFrames\n", + "compilado_pef = pd.concat(dfs, ignore_index=True)\n", + "\n", + "# Exibe informações do DataFrame final\n", + "print(f\"Total de linhas: {len(compilado_pef)}\")\n", + "compilado_pef.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "40a4ace1", + "metadata": {}, + "outputs": [], + "source": [ + "compilado_pef.to_excel(r'C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_ORÇAMENTO FIANCEIRO\\PEF_ATUALIZADA.xlsx',index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "949b7fdc", + "metadata": {}, + "outputs": [], + "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": 5 +} diff --git a/Lançamentos/EUD_script_lançamentos.ipynb b/Lançamentos/EUD_script_lançamentos.ipynb new file mode 100644 index 0000000..774e4f4 --- /dev/null +++ b/Lançamentos/EUD_script_lançamentos.ipynb @@ -0,0 +1,901 @@ +{ + "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 +} diff --git a/Lançamentos/Script_lançamento_EUD_v2.ipynb b/Lançamentos/Script_lançamento_EUD_v2.ipynb index f52654e..0b0c3e1 100644 --- a/Lançamentos/Script_lançamento_EUD_v2.ipynb +++ b/Lançamentos/Script_lançamento_EUD_v2.ipynb @@ -88,17 +88,17 @@ " \n", " \n", " \n", - " 2304\n", - " C202512\n", - " 2025-08-06\n", - " 2025-08-26\n", + " 2430\n", + " C202515\n", + " 2025-10-08\n", + " 2025-10-28\n", " 21\n", " EUDORA\n", - " 2025-08-06\n", - " 12\n", + " 2025-10-08\n", + " 15\n", " C2025\n", - " C202515\n", - " 62\n", + " C202518\n", + " 50\n", " 1\n", " \n", " \n", @@ -107,10 +107,10 @@ ], "text/plain": [ " Ciclo INICIO CICLO FIM CICLO DURAÇÃO MARCA Date NUM_CICLO \\\n", - "2304 C202512 2025-08-06 2025-08-26 21 EUDORA 2025-08-06 12 \n", + "2430 C202515 2025-10-08 2025-10-28 21 EUDORA 2025-10-08 15 \n", "\n", " ANO_CICLO CICLOMAIS2 dias_ate_inicio match \n", - "2304 C2025 C202515 62 1 " + "2430 C2025 C202518 50 1 " ] }, "execution_count": 3, @@ -129,7 +129,7 @@ "metadata": {}, "outputs": [], "source": [ - "df_similares = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C11\\arquivos usados na sugestão\\SIMILARES\\PRODUTOS SIMILARES - EUD.xlsx\")\n", + "df_similares = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C15\\SIMILARES\\PRODUTOS SIMILARES - EUD.xlsx\")\n", "\n", "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", @@ -156,7 +156,7 @@ "Index(['PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO', 'PRODUTO SIMILAR',\n", " 'DESCRIÇÃO SIMILAR', 'CICLO SIMILAR', 'FOCO', 'IAF', 'CATEGORIA',\n", " 'MARCA', '% CONSUMIDOR', 'MECANICA CONSUMIDOR', '% REVENDEDOR',\n", - " 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'MATCH'],\n", + " 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'CAMPANHA', 'MATCH'],\n", " dtype='object')" ] }, @@ -176,7 +176,7 @@ "metadata": {}, "outputs": [], "source": [ - "df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C11\\arquivos usados na sugestão\\TABELA DE PEDIDO\\Pedidos Semanais Especiais - GKD - 202511.xlsx\")\n", + "df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C15\\tabela de pedido\\Pedidos Semanais Especiais - GKD - 202515.xlsx\")\n", "\n", "df_tabela = df_tabela[df_tabela['Região'] == 'NNE'] \n", "\n", @@ -194,26 +194,19 @@ "metadata": {}, "outputs": [], "source": [ - "df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C11\\arquivos usados na sugestão\\PDVS EUD\\PDV_ATT.xlsx\")\n", + "df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n", "\n", - "df_pdv_origi = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C11\\arquivos usados na sugestão\\PDVS EUD\\PDV_ATT.xlsx\")\n", + "df_pdv_origi = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n", "\n", "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','MARCA'])\n", "\n", - "df_pdv['PDV'] = df_pdv['PDV DESC'].str.split(\"-\").str[0].str.strip()\n", + "df_pdv = df_pdv[df_pdv['CANAL'].isin(['HIB','VD', 'CD'])]\n", "\n", - "df_pdv['UF'] = np.where(df_pdv['UF'] == 'VDC','BA',df_pdv['UF'])\n", + "df_pdv = df_pdv[df_pdv['STATUS'] == 'ATIVO']\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", - "\n", - "df_pdv = df_pdv[df_pdv['status'] != \"INATIVO\"]\n", - "\n", - "df_pdv = df_pdv[df_pdv['status'] != \"MATRIZ\"]\n", - "\n", - "df_pdv = df_pdv[df_pdv['SUPERVISOR'] != 'Inativa']\n", + "df_pdv['PDV DESC'] = df_pdv['DESCRIÇÃO PDV']\n", "\n", "df_pdv['MATCH'] = 1" ] @@ -221,6 +214,78 @@ { "cell_type": "code", "execution_count": 8, + "id": "737ade5c", + "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", + "
PDVCANALDESCRIÇÃO PDVPDV DESCUFANALISTASUPERVISORSTATUSMATCH
7724255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO1
\n", + "
" + ], + "text/plain": [ + " PDV CANAL DESCRIÇÃO PDV PDV DESC UF ANALISTA \\\n", + "77 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "\n", + " SUPERVISOR STATUS MATCH \n", + "77 Arianne Sodré [Provisório] ATIVO 1 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_pdv[df_pdv['PDV']==24255]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "id": "849d5297", "metadata": {}, "outputs": [ @@ -228,11 +293,11 @@ "data": { "text/plain": [ "Index(['PDV', 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA',\n", - " 'SUPERVISOR', 'status', 'MATCH'],\n", + " 'SUPERVISOR', 'STATUS', 'MATCH'],\n", " dtype='object')" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -243,7 +308,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "df04a501", "metadata": {}, "outputs": [], @@ -255,25 +320,415 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, + "id": "a7d04631", + "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", + "
PRODUTO LANÇAMENTODESCRIÇÃO DO LANÇAMENTOPRODUTO SIMILARDESCRIÇÃO SIMILARCICLO SIMILARFOCOIAFCATEGORIAMARCA% CONSUMIDOR...CAMPANHAMATCHPDVCANALDESCRIÇÃO PDVPDV DESCUFANALISTASUPERVISORSTATUS
2686312DIVA CREM HID MAOS 50g93924DIVA CREM HID MAOS ESPLENDIDA 50g]C202202NãoNãoCUIDADOS COM A PELEDIVA0,00...Lançamentos124255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO
5784959EUD MAKE BAS LIQ CONTR SK/PERF 100F 30ml50634GLAM BASE LIQ SK/CONTR COR 00 30mlC202305NãoNãoMAQUIAGEMEUDORA MAKE0,00...Lançamentos124255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO
8884960EUD MAKE BAS LIQ CONTR SK/PERF 120N 30ml50630GLAM BASE LIQ SK/CONTR COR 05 30mlC202305NãoNãoMAQUIAGEMEUDORA MAKE0,00...Lançamentos124255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO
11984962EUD MAKE BAS LIQ CONTR SK/PERF 140Q 30ml50629GLAM BASE LIQ SK/CONTR COR 10 30mlC202305NãoNãoMAQUIAGEMEUDORA MAKE0,00...Lançamentos124255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO
15084963EUD MAKE BAS LIQ CONTR SK/PERF 170Q 30ml50628GLAM BASE LIQ SK/CONTR COR 15 30mlC202305NãoNãoMAQUIAGEMEUDORA MAKE0,00...Lançamentos124255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO
..................................................................
24751904719047 COMBO TRIO BÁSICO 3000000000...0124255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO
250652168NEO DERMO GEL LIMP FAC PURIFIC 150g52168NEO DERMO GEL LIMP FAC PURIFIC 150gC202311NãoNãoCUIDADOS FACIAISNEO DERMO19,34 | 25,14 | 7,00...Promoções124255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO
253752038NEO DERMO CR ANTIS FAC 30 PRO AGE 50g52038NEO DERMO CR ANTIS FAC 30 PRO AGE 50gC202308NãoNãoCUIDADOS FACIAISNEO DERMO20,09 | 25,14 | 7,00...Promoções124255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO
256819048COMBO TRIO BASICO 4500000000...0124255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO
259952033NEO DERMO CR ANTIS FAC 45 PRO AGE 50g52038NEO DERMO CR ANTIS FAC 30 PRO AGE 50gC202308NãoNãoCUIDADOS FACIAISNEO DERMO20,09 | 25,14 | 7,00...Promoções124255VDVD IrecêVD IrecêBA3LAISArianne Sodré [Provisório]ATIVO
\n", + "

84 rows × 24 columns

\n", + "
" + ], + "text/plain": [ + " PRODUTO LANÇAMENTO DESCRIÇÃO DO LANÇAMENTO \\\n", + "26 86312 DIVA CREM HID MAOS 50g \n", + "57 84959 EUD MAKE BAS LIQ CONTR SK/PERF 100F 30ml \n", + "88 84960 EUD MAKE BAS LIQ CONTR SK/PERF 120N 30ml \n", + "119 84962 EUD MAKE BAS LIQ CONTR SK/PERF 140Q 30ml \n", + "150 84963 EUD MAKE BAS LIQ CONTR SK/PERF 170Q 30ml \n", + "... ... ... \n", + "2475 19047 19047 COMBO TRIO BÁSICO 30 \n", + "2506 52168 NEO DERMO GEL LIMP FAC PURIFIC 150g \n", + "2537 52038 NEO DERMO CR ANTIS FAC 30 PRO AGE 50g \n", + "2568 19048 COMBO TRIO BASICO 45 \n", + "2599 52033 NEO DERMO CR ANTIS FAC 45 PRO AGE 50g \n", + "\n", + " PRODUTO SIMILAR DESCRIÇÃO SIMILAR CICLO SIMILAR \\\n", + "26 93924 DIVA CREM HID MAOS ESPLENDIDA 50g] C202202 \n", + "57 50634 GLAM BASE LIQ SK/CONTR COR 00 30ml C202305 \n", + "88 50630 GLAM BASE LIQ SK/CONTR COR 05 30ml C202305 \n", + "119 50629 GLAM BASE LIQ SK/CONTR COR 10 30ml C202305 \n", + "150 50628 GLAM BASE LIQ SK/CONTR COR 15 30ml C202305 \n", + "... ... ... ... \n", + "2475 0 0 0 \n", + "2506 52168 NEO DERMO GEL LIMP FAC PURIFIC 150g C202311 \n", + "2537 52038 NEO DERMO CR ANTIS FAC 30 PRO AGE 50g C202308 \n", + "2568 0 0 0 \n", + "2599 52038 NEO DERMO CR ANTIS FAC 30 PRO AGE 50g C202308 \n", + "\n", + " FOCO IAF CATEGORIA MARCA % CONSUMIDOR ... \\\n", + "26 Não Não CUIDADOS COM A PELE DIVA 0,00 ... \n", + "57 Não Não MAQUIAGEM EUDORA MAKE 0,00 ... \n", + "88 Não Não MAQUIAGEM EUDORA MAKE 0,00 ... \n", + "119 Não Não MAQUIAGEM EUDORA MAKE 0,00 ... \n", + "150 Não Não MAQUIAGEM EUDORA MAKE 0,00 ... \n", + "... ... ... ... ... ... ... \n", + "2475 0 0 0 0 0 ... \n", + "2506 Não Não CUIDADOS FACIAIS NEO DERMO 19,34 | 25,14 | 7,00 ... \n", + "2537 Não Não CUIDADOS FACIAIS NEO DERMO 20,09 | 25,14 | 7,00 ... \n", + "2568 0 0 0 0 0 ... \n", + "2599 Não Não CUIDADOS FACIAIS NEO DERMO 20,09 | 25,14 | 7,00 ... \n", + "\n", + " CAMPANHA MATCH PDV CANAL DESCRIÇÃO PDV PDV DESC UF ANALISTA \\\n", + "26 Lançamentos 1 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "57 Lançamentos 1 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "88 Lançamentos 1 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "119 Lançamentos 1 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "150 Lançamentos 1 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "... ... ... ... ... ... ... ... ... \n", + "2475 0 1 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "2506 Promoções 1 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "2537 Promoções 1 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "2568 0 1 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "2599 Promoções 1 24255 VD VD Irecê VD Irecê BA3 LAIS \n", + "\n", + " SUPERVISOR STATUS \n", + "26 Arianne Sodré [Provisório] ATIVO \n", + "57 Arianne Sodré [Provisório] ATIVO \n", + "88 Arianne Sodré [Provisório] ATIVO \n", + "119 Arianne Sodré [Provisório] ATIVO \n", + "150 Arianne Sodré [Provisório] ATIVO \n", + "... ... ... \n", + "2475 Arianne Sodré [Provisório] ATIVO \n", + "2506 Arianne Sodré [Provisório] ATIVO \n", + "2537 Arianne Sodré [Provisório] ATIVO \n", + "2568 Arianne Sodré [Provisório] ATIVO \n", + "2599 Arianne Sodré [Provisório] ATIVO \n", + "\n", + "[84 rows x 24 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_similares[df_similares['PDV'] == 24255]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, "id": "0da911af", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_27244\\3284054138.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": [ - "(111818, 47)" + "(84064, 46)" ] }, - "execution_count": 10, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -282,7 +737,7 @@ "# 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\\C11\\arquivos usados na sugestão\\DRAFT\" # arquivo dos drafts\n", + "folder_path = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BOT\\BOT - C15\\arquivos para geração da sugestã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", @@ -297,7 +752,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "id": "0c8c7493", "metadata": {}, "outputs": [], @@ -307,19 +762,14 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "id": "91298cde", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['Histórico de Vendas do Ciclo 202407',\n", - " 'Histórico de Vendas do Ciclo 202408',\n", - " 'Histórico de Vendas do Ciclo 202409',\n", - " 'Histórico de Vendas do Ciclo 202410',\n", - " 'Histórico de Vendas do Ciclo 202411',\n", - " 'Histórico de Vendas do Ciclo 202412',\n", + "Index(['Histórico de Vendas do Ciclo 202412',\n", " 'Histórico de Vendas do Ciclo 202413',\n", " 'Histórico de Vendas do Ciclo 202414',\n", " 'Histórico de Vendas do Ciclo 202415',\n", @@ -331,11 +781,16 @@ " 'Histórico de Vendas do Ciclo 202504',\n", " 'Histórico de Vendas do Ciclo 202505',\n", " 'Histórico de Vendas do Ciclo 202506',\n", + " 'Histórico de Vendas do Ciclo 202507',\n", + " 'Histórico de Vendas do Ciclo 202508',\n", + " 'Histórico de Vendas do Ciclo 202509',\n", + " 'Histórico de Vendas do Ciclo 202510',\n", + " 'Histórico de Vendas do Ciclo 202511',\n", " 'Histórico de Vendas do Ciclo Atual'],\n", " dtype='object')" ] }, - "execution_count": 12, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -346,7 +801,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "id": "34e179cb", "metadata": {}, "outputs": [ @@ -354,7 +809,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_27244\\1463083786.py:24: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_33884\\1463083786.py:24: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", " crescimento_por_pdv = df_draft.groupby('PDV').apply(calcular_crescimento)\n" ] } @@ -391,7 +846,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "id": "4bc8c2b4", "metadata": {}, "outputs": [], @@ -403,44 +858,395 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "c1451562", + "execution_count": 17, + "id": "867eef0d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_33884\\330515216.py:29: 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", + " dfi = pd.read_sql(query, conn)\n" + ] + } + ], + "source": [ + "import pyodbc\n", + "import configparser\n", + "\n", + "\n", + "config = configparser.ConfigParser()\n", + "config.read(r\"C:\\Users\\joao.herculano\\Documents\\Enviador de email\\credenciais.ini\")\n", + "\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", + "\n", + "query = '''\n", + "SELECT \n", + " b.[DATA] AS Dia,\n", + " b.pdv AS PDV,\n", + " b.sku as 'Código do Produto',\n", + " b.VENDAS AS Quantidade\n", + "FROM base_vendas_bi b\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", + "'''\n", + "dfi = pd.read_sql(query, conn)\n", + "conn.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "297526e2", "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", + "
DiaPDVCódigo do ProdutoQuantidade
02025-06-0220998821130
12025-06-1020998821131
22025-06-0520998852992
32025-06-0620998852990
42025-06-0420998852992
\n", + "
" + ], "text/plain": [ - "(2455, 14)" + " Dia PDV Código do Produto Quantidade\n", + "0 2025-06-02 20998 82113 0\n", + "1 2025-06-10 20998 82113 1\n", + "2 2025-06-05 20998 85299 2\n", + "3 2025-06-06 20998 85299 0\n", + "4 2025-06-04 20998 85299 2" ] }, - "execution_count": 15, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_venda_diaria = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C11\\arquivos usados na sugestão\\VENDAS_DIARIAS\\FormFiltroConsultaVendaSintetica_23_05_2025_09_22_15.xls\")\n", - "\n", - "df_venda_diaria.shape" + "dfi.head()" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, + "id": "80021c11", + "metadata": {}, + "outputs": [], + "source": [ + "df_venda_diaria = dfi " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "46accb64", + "metadata": {}, + "outputs": [], + "source": [ + "df_venda_diaria['Dia'] = pd.to_datetime(df_venda_diaria['Dia'], errors='coerce').dt.strftime('%d/%m/%Y')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "c1451562", + "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", + "
DiaPDVCódigo do ProdutoQuantidade
002/06/202520998821130
110/06/202520998821131
205/06/202520998852992
306/06/202520998852990
404/06/202520998852992
\n", + "
" + ], + "text/plain": [ + " Dia PDV Código do Produto Quantidade\n", + "0 02/06/2025 20998 82113 0\n", + "1 10/06/2025 20998 82113 1\n", + "2 05/06/2025 20998 85299 2\n", + "3 06/06/2025 20998 85299 0\n", + "4 04/06/2025 20998 85299 2" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#df_venda_diaria = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\EUDORA\\C13\\venda diaria\\FormFiltroConsultaVendaSintetica_10_07_2025_15_27_42.xls\")\n", + "\n", + "df_venda_diaria.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "7ec747bc", + "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", + "
DiaPDVCódigo do ProdutoQuantidade
002/06/202520998821130
110/06/202520998821131
205/06/202520998852992
306/06/202520998852990
404/06/202520998852992
\n", + "
" + ], + "text/plain": [ + " Dia PDV Código do Produto Quantidade\n", + "0 02/06/2025 20998 82113 0\n", + "1 10/06/2025 20998 82113 1\n", + "2 05/06/2025 20998 85299 2\n", + "3 06/06/2025 20998 85299 0\n", + "4 04/06/2025 20998 85299 2" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_venda_diaria.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "05c77fd8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dia object\n", + "PDV object\n", + "Código do Produto int64\n", + "Quantidade object\n", + "dtype: object" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_venda_diaria.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "eb8e3a26", + "metadata": {}, + "outputs": [], + "source": [ + "df_venda_diaria['Quantidade'] = df_venda_diaria['Quantidade'].astype('float')" + ] + }, + { + "cell_type": "code", + "execution_count": 25, "id": "882e68aa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['Unidade de Negócio', 'Ano', 'Mês', 'Dia', 'Código do Produto',\n", - " 'Descrição do Produto', 'Quantidade', 'Valor Bruto', 'Valor Desconto',\n", - " 'Valor Líquido', 'Valor Vale Troca', 'Líquido - Troca', 'Estoque Atual',\n", - " 'Estoque Mínimo'],\n", - " dtype='object')" + "Index(['Dia', 'PDV', 'Código do Produto', 'Quantidade'], dtype='object')" ] }, - "execution_count": 16, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -451,23 +1257,23 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 26, "id": "c7ddaf20", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(2455, 16)" + "(6931145, 5)" ] }, - "execution_count": 17, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_venda_diaria['PDV'] = df_venda_diaria['Unidade de Negócio'].str.split(\"-\").str[0].str.strip()\n", + "#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", @@ -480,17 +1286,17 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 27, "id": "7119556a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(2455, 17)" + "(6931145, 6)" ] }, - "execution_count": 18, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -500,12 +1306,12 @@ "# ou apenas usamos 'Dia' como referência de data\n", "\n", "# Ordena o DataFrame para garantir que a cumulativa funcione corretamente\n", - "df_venda_diaria = df_venda_diaria.sort_values(by=['Unidade de Negócio', 'Código do Produto', 'Dia'])\n", + "df_venda_diaria = df_venda_diaria.sort_values(by=['PDV', 'Código do Produto', 'Dia'])\n", "\n", "# Calcula a quantidade acumulada até o dia para cada grupo\n", "df_venda_diaria['Quantidade Acumulada'] = (\n", " df_venda_diaria\n", - " .groupby(['Unidade de Negócio', 'Código do Produto'])['Quantidade']\n", + " .groupby(['PDV', 'Código do Produto'])['Quantidade']\n", " .cumsum()\n", ") # acumulado por grupo até a data da linha\n", "\n", @@ -514,7 +1320,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 28, "id": "c707a1b6", "metadata": {}, "outputs": [ @@ -548,38 +1354,38 @@ " \n", " \n", " 0\n", - " 20968\n", - " 50112\n", - " C202310\n", - " 44\n", + " 11111\n", + " 48130\n", + " C202309\n", + " 0.0\n", " \n", " \n", " 1\n", - " 20968\n", - " 50112\n", - " C202311\n", - " 60\n", + " 11201\n", + " 1004\n", + " C202509\n", + " 0.0\n", " \n", " \n", " 2\n", - " 20968\n", - " 50112\n", - " C202313\n", - " 70\n", + " 11201\n", + " 1005\n", + " C202509\n", + " 0.0\n", " \n", " \n", " 3\n", - " 20968\n", - " 50112\n", - " C202314\n", - " 73\n", + " 11201\n", + " 1078\n", + " C202509\n", + " 0.0\n", " \n", " \n", " 4\n", - " 20968\n", - " 50112\n", - " C202315\n", - " 75\n", + " 11201\n", + " 1296\n", + " C202509\n", + " 0.0\n", " \n", " \n", " ...\n", @@ -589,63 +1395,63 @@ " ...\n", " \n", " \n", - " 528\n", - " 22541\n", - " 52699\n", - " C202409\n", - " 10\n", + " 2339197\n", + " 5699\n", + " 90772\n", + " C202511\n", + " 0.0\n", " \n", " \n", - " 529\n", - " 22541\n", - " 52699\n", - " C202410\n", - " 11\n", + " 2339198\n", + " 5699\n", + " 90774\n", + " C202511\n", + " 0.0\n", " \n", " \n", - " 530\n", - " 22541\n", - " 52699\n", - " C202411\n", - " 13\n", + " 2339199\n", + " 5699\n", + " 90774\n", + " C202512\n", + " 3.0\n", " \n", " \n", - " 531\n", - " 22541\n", - " 56572\n", - " C202411\n", - " 38\n", + " 2339200\n", + " 5699\n", + " 90776\n", + " C202511\n", + " 0.0\n", " \n", " \n", - " 532\n", - " 22541\n", - " 57390\n", - " C202411\n", - " 22\n", + " 2339201\n", + " 8074\n", + " 43151\n", + " C202505\n", + " 0.0\n", " \n", " \n", "\n", - "

533 rows × 4 columns

\n", + "

2339202 rows × 4 columns

\n", "" ], "text/plain": [ - " PDV Código do Produto Ciclo Quantidade Acumulada\n", - "0 20968 50112 C202310 44\n", - "1 20968 50112 C202311 60\n", - "2 20968 50112 C202313 70\n", - "3 20968 50112 C202314 73\n", - "4 20968 50112 C202315 75\n", - ".. ... ... ... ...\n", - "528 22541 52699 C202409 10\n", - "529 22541 52699 C202410 11\n", - "530 22541 52699 C202411 13\n", - "531 22541 56572 C202411 38\n", - "532 22541 57390 C202411 22\n", + " PDV Código do Produto Ciclo Quantidade Acumulada\n", + "0 11111 48130 C202309 0.0\n", + "1 11201 1004 C202509 0.0\n", + "2 11201 1005 C202509 0.0\n", + "3 11201 1078 C202509 0.0\n", + "4 11201 1296 C202509 0.0\n", + "... ... ... ... ...\n", + "2339197 5699 90772 C202511 0.0\n", + "2339198 5699 90774 C202511 0.0\n", + "2339199 5699 90774 C202512 3.0\n", + "2339200 5699 90776 C202511 0.0\n", + "2339201 8074 43151 C202505 0.0\n", "\n", - "[533 rows x 4 columns]" + "[2339202 rows x 4 columns]" ] }, - "execution_count": 19, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -659,17 +1465,38 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 29, + "id": "e2ae413b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(211020534.731)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_venda_agrupado['Quantidade Acumulada'].sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, "id": "dc452c72", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(170, 75)" + "(2604, 75)" ] }, - "execution_count": 20, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -681,7 +1508,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 31, "id": "c260e0e3", "metadata": {}, "outputs": [], @@ -691,7 +1518,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 32, "id": "8a05450c", "metadata": {}, "outputs": [], @@ -704,7 +1531,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 33, "id": "cc65edab", "metadata": {}, "outputs": [], @@ -715,7 +1542,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 34, "id": "c5cd5f42", "metadata": {}, "outputs": [], @@ -731,17 +1558,17 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 35, "id": "69c88d20", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "np.int64(17)" + "np.int64(84)" ] }, - "execution_count": 25, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -752,19 +1579,14 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 36, "id": "f5206f50", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['Histórico de Vendas do Ciclo 202407',\n", - " 'Histórico de Vendas do Ciclo 202408',\n", - " 'Histórico de Vendas do Ciclo 202409',\n", - " 'Histórico de Vendas do Ciclo 202410',\n", - " 'Histórico de Vendas do Ciclo 202411',\n", - " 'Histórico de Vendas do Ciclo 202412',\n", + "Index(['Histórico de Vendas do Ciclo 202412',\n", " 'Histórico de Vendas do Ciclo 202413',\n", " 'Histórico de Vendas do Ciclo 202414',\n", " 'Histórico de Vendas do Ciclo 202415',\n", @@ -775,39 +1597,56 @@ " 'Histórico de Vendas do Ciclo 202503',\n", " 'Histórico de Vendas do Ciclo 202504',\n", " 'Histórico de Vendas do Ciclo 202505',\n", - " 'Histórico de Vendas do Ciclo 202506'],\n", + " 'Histórico de Vendas do Ciclo 202506',\n", + " 'Histórico de Vendas do Ciclo 202507',\n", + " 'Histórico de Vendas do Ciclo 202508',\n", + " 'Histórico de Vendas do Ciclo 202509',\n", + " 'Histórico de Vendas do Ciclo 202510',\n", + " 'Histórico de Vendas do Ciclo 202511'],\n", " dtype='object')" ] }, - "execution_count": 26, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final.columns[29:46]" + "df_final.columns[30:47]" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 37, + "id": "2a049809", + "metadata": {}, + "outputs": [], + "source": [ + "colunas = df_final.columns[30:47]\n", + "\n", + "df_final[colunas] = df_final[colunas].fillna(0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, "id": "0a1bb832", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "np.float64(0.2176)" + "np.float64(0.0812)" ] }, - "execution_count": 27, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Suponha que os meses estão nas colunas 10 a 26 (17 colunas = 17 meses)\n", - "colunas_mensais = df_final.columns[29:46]\n", + "colunas_mensais = df_final.columns[30:47]\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", @@ -841,7 +1680,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 39, "id": "a9647c32", "metadata": {}, "outputs": [], @@ -854,35 +1693,7 @@ }, { "cell_type": "code", - "execution_count": 29, - "id": "b107e519", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['Histórico de Vendas do Ciclo 202501',\n", - " 'Histórico de Vendas do Ciclo 202502',\n", - " 'Histórico de Vendas do Ciclo 202503',\n", - " 'Histórico de Vendas do Ciclo 202504',\n", - " 'Histórico de Vendas do Ciclo 202505',\n", - " 'Histórico de Vendas do Ciclo 202506',\n", - " 'Histórico de Vendas do Ciclo Atual'],\n", - " dtype='object')" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final.columns[40:47]" - ] - }, - { - "cell_type": "code", - "execution_count": 30, + "execution_count": 40, "id": "8290853c", "metadata": {}, "outputs": [], @@ -894,118 +1705,94 @@ "\n", "df_final['MEDIANA DO HISTÓRICO'] = df_final[colunas_mensais].dropna().median(axis=1)\n", "\n", + "df_final['MEDIA DO HISTÓRICO'] = df_final[colunas_mensais].dropna().mean(axis=1)\n", + "\n", "df_final['Vendas Ciclo Lançamento'] = df_final['Vendas Ciclo Lançamento'].fillna(0)" ] }, { "cell_type": "code", - "execution_count": 31, - "id": "07f043f2", + "execution_count": 41, + "id": "d3228386", + "metadata": {}, + "outputs": [], + "source": [ + "df_final['MEDIANA DO HISTÓRICO USADA'] = np.where(df_final['MEDIA DO HISTÓRICO']\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
CANALmed_por_canal
0CD17.0
1HIB1.0
2VD12.0
\n", - "" - ], "text/plain": [ - " CANAL med_por_canal\n", - "0 CD 17.0\n", - "1 HIB 1.0\n", - "2 VD 12.0" + "0 23713\n", + "1 23713\n", + "2 23713\n", + "3 23713\n", + "4 23713\n", + "Name: PDVDEPARA.Practico, dtype: object" ] }, - "execution_count": 31, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "medi = df_final.groupby(['CANAL'])['MEDIANA DO HISTÓRICO'].max().reset_index()\n", - "medi = medi.rename(columns={'MEDIANA DO HISTÓRICO':'med_por_canal'})\n", - "medi" + "df_vdc['PDVDEPARA.Practico'] = df_vdc['PDVDEPARA.Practico'].astype(str).str.replace(r'\\.0$', '', regex=True)\n", + "\n", + "df_vdc['PDVDEPARA.Practico'].head()" ] }, { "cell_type": "code", - "execution_count": 32, - "id": "94abddce", - "metadata": {}, - "outputs": [], - "source": [ - "df_final = pd.merge(left=df_final, right=medi,on='CANAL',how='inner')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "09cc2f82", - "metadata": {}, - "outputs": [], - "source": [ - "df_vdc = pd.read_csv(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BOT\\BOT - C11\\arquivos para geração da sugestão\\VENDAS VDC\\vendas_vdc22.02.csv\")\n", - "\n", - "\n", - "\n", - "df_vdc['DATA VENDA'] = pd.to_datetime(df_vdc['DATA VENDA'])\n", - "\n", - "# 'Dia' já está em formato datetime, então renomeamos para 'Data' diretamente\n", - "# ou apenas usamos 'Dia' como referência de data\n", - "\n", - "# Ordena o DataFrame para garantir que a cumulativa funcione corretamente\n", - "df_venda_diaria = df_venda_diaria.sort_values(by=['Unidade de Negócio', 'Código do Produto', 'Dia'])\n", - "\n", - "# Calcula a quantidade acumulada até o dia para cada grupo\n", - "df_vdc['Quantidade Acumulada vdc'] = (\n", - " df_vdc\n", - " .groupby(['PDVDEPARA.Practico', 'Código'])['Soma de Quantidade']\n", - " .cumsum()\n", - ") # acumulado por grupo até a data da linha" - ] - }, - { - "cell_type": "code", - "execution_count": 34, + "execution_count": 44, "id": "5a827c08", "metadata": {}, "outputs": [ @@ -1040,52 +1827,52 @@ " \n", " 0\n", " 23701\n", - " 48617\n", + " 1004\n", " C202301\n", - " 24\n", + " 164.0\n", " \n", " \n", " 1\n", " 23701\n", - " 50165\n", - " C202312\n", - " 12\n", + " 1004\n", + " C202302\n", + " 167.0\n", " \n", " \n", " 2\n", " 23701\n", - " 50165\n", - " C202411\n", - " 14\n", + " 1004\n", + " C202303\n", + " 170.0\n", " \n", " \n", " 3\n", " 23701\n", - " 50165\n", - " C202413\n", - " 16\n", + " 1004\n", + " C202304\n", + " 173.0\n", " \n", " \n", " 4\n", " 23701\n", - " 50224\n", - " C202403\n", - " 2\n", + " 1004\n", + " C202305\n", + " 180.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " PDVDEPARA.Practico Código Ciclo vdc Quantidade Acumulada vdc\n", - "0 23701 48617 C202301 24\n", - "1 23701 50165 C202312 12\n", - "2 23701 50165 C202411 14\n", - "3 23701 50165 C202413 16\n", - "4 23701 50224 C202403 2" + " PDVDEPARA.Practico Código Ciclo vdc Quantidade Acumulada vdc\n", + "0 23701 1004 C202301 164.0\n", + "1 23701 1004 C202302 167.0\n", + "2 23701 1004 C202303 170.0\n", + "3 23701 1004 C202304 173.0\n", + "4 23701 1004 C202305 180.0" ] }, - "execution_count": 34, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1097,13 +1884,34 @@ "\n", "df_vdc_agrupado = df_vdc_agrupado.rename(columns={'Ciclo':'Ciclo vdc'})\n", "\n", + "df_vdc_agrupado['PDVDEPARA.Practico'] = df_vdc_agrupado['PDVDEPARA.Practico'].fillna(0)\n", "\n", "df_vdc_agrupado.head()" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 45, + "id": "e01b2f8d", + "metadata": {}, + "outputs": [], + "source": [ + "df_vdc_agrupado = df_vdc_agrupado[df_vdc_agrupado['PDVDEPARA.Practico'] != 'nan']" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "4861b401", + "metadata": {}, + "outputs": [], + "source": [ + "df_vdc_agrupado['PDVDEPARA.Practico'] = df_vdc_agrupado['PDVDEPARA.Practico'].astype('Int64')" + ] + }, + { + "cell_type": "code", + "execution_count": 47, "id": "8ec14143", "metadata": {}, "outputs": [], @@ -1124,23 +1932,192 @@ }, { "cell_type": "code", - "execution_count": 36, - "id": "27906593", + "execution_count": 48, + "id": "b107e519", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Histórico de Vendas do Ciclo 202505',\n", + " 'Histórico de Vendas do Ciclo 202506',\n", + " 'Histórico de Vendas do Ciclo 202507',\n", + " 'Histórico de Vendas do Ciclo 202508',\n", + " 'Histórico de Vendas do Ciclo 202509',\n", + " 'Histórico de Vendas do Ciclo 202510',\n", + " 'Histórico de Vendas do Ciclo 202511'],\n", + " dtype='object')" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "df_final['CRESCIMENTO_FINAL'] = df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'] #crescimento do pdv\n", - "\n", - "df_final['CRESCIMENTO_FINAL'] = np.where(df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO']>0.8,0.8,df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'])\n", - "\n", - "df_final['CRESCIMENTO_FINAL'] = np.where(df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO']<0,0,df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'])\n", - "\n", - "df_final['MEDIANA DO HISTÓRICO'] = np.where(df_final['MEDIANA DO HISTÓRICO']==0, df_final['med_por_canal'],df_final['MEDIANA DO HISTÓRICO'])\n" + "df_final.columns[40:47]" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 49, + "id": "07f043f2", + "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", + "
CANALUFmed_por_canal
0CDAL60.176471
1HIBAL15.117647
2HIBBA0.941176
3HIBBA30.470588
4HIBSE6.941176
5HIBVDC0.411765
6VDAL42.705882
7VDBA1.588235
8VDBA30.823529
9VDSE26.352941
10VDVDC2.647059
\n", + "
" + ], + "text/plain": [ + " CANAL UF med_por_canal\n", + "0 CD AL 60.176471\n", + "1 HIB AL 15.117647\n", + "2 HIB BA 0.941176\n", + "3 HIB BA3 0.470588\n", + "4 HIB SE 6.941176\n", + "5 HIB VDC 0.411765\n", + "6 VD AL 42.705882\n", + "7 VD BA 1.588235\n", + "8 VD BA3 0.823529\n", + "9 VD SE 26.352941\n", + "10 VD VDC 2.647059" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "medi = df_final.groupby(['CANAL','UF'])['MEDIANA DO HISTÓRICO USADA'].max().reset_index()\n", + "medi = medi.rename(columns={'MEDIANA DO HISTÓRICO USADA':'med_por_canal'})\n", + "medi" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "94abddce", + "metadata": {}, + "outputs": [], + "source": [ + "df_final = pd.merge(left=df_final, right=medi,on=['CANAL','UF'],how='inner')\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "27906593", + "metadata": {}, + "outputs": [], + "source": [ + "df_final['CRESCIMENTO_FINAL'] = df_final['CRESCIMENTO_GERAL'] + CRESCIMENTO #crescimento do pdv\n", + "\n", + "df_final['CRESCIMENTO_FINAL'] = np.where(df_final['CRESCIMENTO_GERAL'] + CRESCIMENTO>0.8,0.8,df_final['CRESCIMENTO_GERAL'] + CRESCIMENTO)\n", + "\n", + "df_final['CRESCIMENTO_FINAL'] = np.where(df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO']<0,0,df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'])\n", + "\n", + "#df_final['MEDIANA DO HISTÓRICO USADA'] = np.where(df_final['MEDIANA DO HISTÓRICO']==0, df_final['med_por_canal'],df_final['MEDIANA DO HISTÓRICO'])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 52, "id": "5ba0586e", "metadata": {}, "outputs": [ @@ -1150,7 +2127,7 @@ "np.int64(0)" ] }, - "execution_count": 37, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -1161,17 +2138,17 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 53, "id": "1a625e69", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(170, 89)" + "(2604, 91)" ] }, - "execution_count": 38, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" } @@ -1179,8 +2156,8 @@ "source": [ "\n", "# Primeiro cálculo intermediário\n", - "df_final['PV GINSENG'] = np.where(df_final['CRESCIMENTO_FINAL'] * df_final['Vendas Ciclo Lançamento'] + df_final['Vendas Ciclo Lançamento'] < df_final['MEDIANA DO HISTÓRICO'],\n", - " round(df_final['CRESCIMENTO_FINAL'] * df_final['MEDIANA DO HISTÓRICO']+ df_final['MEDIANA DO HISTÓRICO'],0), \n", + "df_final['PV GINSENG'] = np.where(df_final['CRESCIMENTO_FINAL'] * df_final['Vendas Ciclo Lançamento'] + df_final['Vendas Ciclo Lançamento'] < df_final['MEDIANA DO HISTÓRICO USADA'],\n", + " round(df_final['CRESCIMENTO_FINAL'] * df_final['MEDIANA DO HISTÓRICO USADA']+ df_final['MEDIANA DO HISTÓRICO USADA'],0), \n", " round(df_final['CRESCIMENTO_FINAL']*df_final['Vendas Ciclo Lançamento']+df_final['Vendas Ciclo Lançamento'],0))\n", "\n", "df_final['PV GINSENG'] = np.where(df_final['PV GINSENG'].isna(),df_final['med_por_canal'] ,df_final['PV GINSENG'])\n", @@ -1190,7 +2167,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 54, "id": "ad10c069", "metadata": {}, "outputs": [], @@ -1200,7 +2177,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 55, "id": "f9bddbb1", "metadata": {}, "outputs": [ @@ -1210,13 +2187,14 @@ "Index(['PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO', 'PRODUTO SIMILAR',\n", " 'DESCRIÇÃO SIMILAR', 'CICLO SIMILAR', 'FOCO', 'IAF', 'CATEGORIA',\n", " 'MARCA', '% CONSUMIDOR', 'MECANICA CONSUMIDOR', '% REVENDEDOR',\n", - " 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'MATCH', 'PDV', 'CANAL',\n", - " 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR', 'status',\n", - " 'Classe', 'SKU', 'Descrição', 'Subcategoria', 'Lançamento',\n", - " 'Desativação', 'Histórico de Vendas do Ciclo 202503',\n", - " 'Histórico de Vendas do Ciclo 202504',\n", - " 'Histórico de Vendas do Ciclo 202505',\n", - " 'Histórico de Vendas do Ciclo 202506',\n", + " 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'CAMPANHA', 'MATCH', 'PDV',\n", + " 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR',\n", + " 'STATUS', 'Classe', 'SKU', 'Descrição', 'Subcategoria', 'Lançamento',\n", + " 'Histórico de Vendas do Ciclo 202507',\n", + " 'Histórico de Vendas do Ciclo 202508',\n", + " 'Histórico de Vendas do Ciclo 202509',\n", + " 'Histórico de Vendas do Ciclo 202510',\n", + " 'Histórico de Vendas do Ciclo 202511',\n", " 'Histórico de Vendas do Ciclo Atual', 'Dias sem venda',\n", " 'Projeção Próximo Ciclo', 'Projeção Próximo Ciclo + 1',\n", " 'Promoção Próximo Ciclo', 'Promoção Próximo Ciclo + 1', 'Estoque Atual',\n", @@ -1226,18 +2204,18 @@ " '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', 'Quantidade',\n", - " 'Item analisado', 'Histórico de Vendas do Ciclo 202507', 'match_x',\n", - " 'CRESCIMENTO', 'Ciclo', 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO',\n", - " 'match_y', 'dias_ate_inicio', 'INICIO CICLO SIMILAR',\n", - " 'FIM CICLO SIMILAR', 'DURAÇÃO CICLO SIMILAR', 'Código do Produto',\n", - " 'Ciclo', 'Vendas Ciclo Lançamento', 'CRESCIMENTO_GERAL',\n", - " 'Pico Vendas Similar Ultimos 6 ciclos', 'MEDIANA DO HISTÓRICO',\n", - " 'med_por_canal', 'PDVDEPARA.Practico', 'Código', 'CRESCIMENTO_FINAL',\n", - " 'PV GINSENG'],\n", + " 'Item analisado', 'match_x', 'CRESCIMENTO', 'Ciclo', 'INICIO CICLO',\n", + " 'FIM CICLO', 'DURAÇÃO', 'match_y', 'dias_ate_inicio',\n", + " 'INICIO CICLO SIMILAR', 'FIM CICLO SIMILAR', 'DURAÇÃO CICLO SIMILAR',\n", + " 'Código do Produto', 'Ciclo', 'Vendas Ciclo Lançamento',\n", + " 'CRESCIMENTO_GERAL', 'Pico Vendas Similar Ultimos 6 ciclos',\n", + " 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO',\n", + " 'MEDIANA DO HISTÓRICO USADA', 'PDVDEPARA.Practico', 'Código',\n", + " 'med_por_canal', 'CRESCIMENTO_FINAL', 'PV GINSENG'],\n", " dtype='object')" ] }, - "execution_count": 40, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -1248,7 +2226,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 56, "id": "fe73c93e", "metadata": {}, "outputs": [ @@ -1258,28 +2236,30 @@ "Index(['PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO', 'PRODUTO SIMILAR',\n", " 'DESCRIÇÃO SIMILAR', 'CICLO SIMILAR', 'FOCO', 'IAF', 'CATEGORIA',\n", " 'MARCA', '% CONSUMIDOR', 'MECANICA CONSUMIDOR', '% REVENDEDOR',\n", - " 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'MATCH', 'PDV', 'CANAL',\n", - " 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR',\n", - " 'Descrição', 'Histórico de Vendas do Ciclo 202503',\n", - " 'Histórico de Vendas do Ciclo 202504',\n", - " 'Histórico de Vendas do Ciclo 202505',\n", - " 'Histórico de Vendas do Ciclo 202506',\n", + " 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'CAMPANHA', 'MATCH', 'PDV',\n", + " 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR',\n", + " 'Descrição', 'Histórico de Vendas do Ciclo 202507',\n", + " 'Histórico de Vendas do Ciclo 202508',\n", + " 'Histórico de Vendas do Ciclo 202509',\n", + " 'Histórico de Vendas do Ciclo 202510',\n", + " 'Histórico de Vendas do Ciclo 202511',\n", " 'Histórico de Vendas do Ciclo Atual', 'Projeção Próximo Ciclo',\n", - " 'Projeção Próximo Ciclo + 1', 'Histórico de Vendas do Ciclo 202507',\n", - " 'Vendas Ciclo Lançamento', 'Pico Vendas Similar Ultimos 6 ciclos',\n", - " 'MEDIANA DO HISTÓRICO', 'PDVDEPARA.Practico', 'Código', 'PV GINSENG'],\n", + " 'Projeção Próximo Ciclo + 1', 'CRESCIMENTO', 'Vendas Ciclo Lançamento',\n", + " 'Pico Vendas Similar Ultimos 6 ciclos', 'MEDIANA DO HISTÓRICO',\n", + " 'MEDIA DO HISTÓRICO', 'MEDIANA DO HISTÓRICO USADA',\n", + " 'PDVDEPARA.Practico', 'Código', 'PV GINSENG'],\n", " dtype='object')" ] }, - "execution_count": 41, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", - "df_final.drop(columns=['status', 'Classe', 'SKU', 'Subcategoria', 'Lançamento',\n", - " 'Desativação','Dias sem venda',\n", + "df_final.drop(columns=['STATUS', 'Classe', 'SKU', 'Subcategoria', 'Lançamento',\n", + " 'Dias sem venda',\n", " #'Projeção Próximo Ciclo', 'Projeção Próximo Ciclo + 1',\n", " 'Promoção Próximo Ciclo', 'Promoção Próximo Ciclo + 1', 'Estoque Atual',\n", " 'Estoque em Transito', 'Pedido Pendente',\n", @@ -1289,7 +2269,7 @@ " 'Data Prevista Regularização', 'Carteira Bloqueada Para Novos Pedidos',\n", " 'Planograma', 'Quantidade por caixa', 'Preço Sell In', 'Quantidade',\n", " 'Item analisado', 'match_x',\n", - " 'CRESCIMENTO', 'Ciclo', 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO',\n", + " 'Ciclo', 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO',\n", " 'match_y', 'dias_ate_inicio', 'INICIO CICLO SIMILAR','med_por_canal', 'CRESCIMENTO_FINAL',\n", " 'FIM CICLO SIMILAR', 'DURAÇÃO CICLO SIMILAR', 'Código do Produto','CRESCIMENTO_GERAL'],inplace=True)\n", "df_final.columns" @@ -1297,43 +2277,43 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 57, "id": "66772a9a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['Histórico de Vendas do Ciclo 202503',\n", - " 'Histórico de Vendas do Ciclo 202504',\n", - " 'Histórico de Vendas do Ciclo 202505',\n", - " 'Histórico de Vendas do Ciclo 202506',\n", + "Index(['Histórico de Vendas do Ciclo 202508',\n", + " 'Histórico de Vendas do Ciclo 202509',\n", + " 'Histórico de Vendas do Ciclo 202510',\n", + " 'Histórico de Vendas do Ciclo 202511',\n", " 'Histórico de Vendas do Ciclo Atual'],\n", " dtype='object')" ] }, - "execution_count": 42, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final.columns[23:28]" + "df_final.columns[25:30]" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 58, "id": "15b7149f", "metadata": {}, "outputs": [], "source": [ - "df_final = df_final.rename(columns={df_final.columns[23]: \"C-4\", df_final.columns[24]: \"C-3\",df_final.columns[25]: \"C-2\",df_final.columns[26]: \"C-1\",df_final.columns[27]:'VENDAS CICLO ATUAL'})\n" + "df_final = df_final.rename(columns={df_final.columns[25]: \"C-4\", df_final.columns[26]: \"C-3\",df_final.columns[27]: \"C-2\",df_final.columns[28]: \"C-1\",df_final.columns[29]:'VENDAS CICLO ATUAL'})\n" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 59, "id": "9333bc77", "metadata": {}, "outputs": [ @@ -1343,16 +2323,18 @@ "Index(['PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO', 'PRODUTO SIMILAR',\n", " 'DESCRIÇÃO SIMILAR', 'CICLO SIMILAR', 'FOCO', 'IAF', 'CATEGORIA',\n", " 'MARCA', '% CONSUMIDOR', 'MECANICA CONSUMIDOR', '% REVENDEDOR',\n", - " 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'MATCH', 'PDV', 'CANAL',\n", - " 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR',\n", + " 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'CAMPANHA', 'MATCH', 'PDV',\n", + " 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR',\n", " 'DESCRIÇÃO', 'C-4', 'C-3', 'C-2', 'C-1', 'VENDAS CICLO ATUAL',\n", - " 'PROJEÇÃO PRÓXIMO CICLO', 'PROJEÇÃO PRÓXIMO CICLO + 1',\n", + " 'PROJEÇÃO PRÓXIMO CICLO', 'PROJEÇÃO PRÓXIMO CICLO + 1', 'CRESCIMENTO',\n", " 'VENDAS CICLO LANÇAMENTO', 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS',\n", - " 'MEDIANA DO HISTÓRICO', 'PDVDEPARA.PRACTICO', 'CÓDIGO', 'PV GINSENG'],\n", + " 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO',\n", + " 'MEDIANA DO HISTÓRICO USADA', 'PDVDEPARA.PRACTICO', 'CÓDIGO',\n", + " 'PV GINSENG'],\n", " dtype='object')" ] }, - "execution_count": 44, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } @@ -1367,7 +2349,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 60, "id": "5abd4bae", "metadata": {}, "outputs": [], @@ -1377,17 +2359,17 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 61, "id": "62ce5c62", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(170, 34)" + "(2604, 38)" ] }, - "execution_count": 46, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } @@ -1398,7 +2380,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 62, "id": "10975651", "metadata": {}, "outputs": [ @@ -1408,16 +2390,17 @@ "Index(['PRODUTO LANÇAMENTO', 'DESCRIÇÃO DO LANÇAMENTO', 'PRODUTO SIMILAR',\n", " 'DESCRIÇÃO SIMILAR', 'CICLO SIMILAR', 'FOCO', 'IAF', 'CATEGORIA',\n", " 'MARCA', '% CONSUMIDOR', 'MECANICA CONSUMIDOR', '% REVENDEDOR',\n", - " 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'MATCH', 'PDV', 'CANAL',\n", - " 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR', 'C-4',\n", - " 'C-3', 'C-2', 'C-1', 'VENDAS CICLO ATUAL', 'PROJEÇÃO PRÓXIMO CICLO',\n", - " 'PROJEÇÃO PRÓXIMO CICLO + 1', 'VENDAS CICLO LANÇAMENTO',\n", - " 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS', 'PDVDEPARA.PRACTICO', 'CÓDIGO',\n", - " 'PV GINSENG'],\n", + " 'MECANICA REVENDEDOR', 'TIPO DE PRODUTO', 'CAMPANHA', 'MATCH', 'PDV',\n", + " 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC', 'UF', 'ANALISTA', 'SUPERVISOR',\n", + " 'C-4', 'C-3', 'C-2', 'C-1', 'VENDAS CICLO ATUAL',\n", + " 'PROJEÇÃO PRÓXIMO CICLO', 'PROJEÇÃO PRÓXIMO CICLO + 1', 'CRESCIMENTO',\n", + " 'VENDAS CICLO LANÇAMENTO', 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS',\n", + " 'MEDIA DO HISTÓRICO', 'MEDIANA DO HISTÓRICO USADA',\n", + " 'PDVDEPARA.PRACTICO', 'CÓDIGO', 'PV GINSENG'],\n", " dtype='object')" ] }, - "execution_count": 47, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } @@ -1428,14 +2411,34 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 63, + "id": "6109c1ea", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(0.0812)" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "CRESCIMENTO" + ] + }, + { + "cell_type": "code", + "execution_count": 64, "id": "25cbff26", "metadata": {}, "outputs": [], "source": [ "df_final = df_final.reindex(columns=[\n", " 'SUPERVISOR',\n", - " 'ANALISTA',\n", " 'CANAL',\n", " 'UF',\n", " 'PDV',\n", @@ -1451,7 +2454,6 @@ " 'TIPO DE PRODUTO',\n", " 'IAF',\n", " 'FOCO',\n", - " 'SKU',\n", " 'PRODUTO SIMILAR',\n", " 'DESCRIÇÃO SIMILAR',\n", " 'CICLO SIMILAR',\n", @@ -1464,12 +2466,13 @@ " 'PICO VENDAS SIMILAR ULTIMOS 6 CICLOS',\n", " 'PV GINSENG',\n", " 'PROJEÇÃO PRÓXIMO CICLO',\n", - " 'PROJEÇÃO PRÓXIMO CICLO + 1'])\n" + " 'PROJEÇÃO PRÓXIMO CICLO + 1',\n", + " ])\n" ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 65, "id": "a3e80cb4", "metadata": {}, "outputs": [], @@ -1481,26 +2484,28 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 66, + "id": "aa11b320", + "metadata": {}, + "outputs": [], + "source": [ + "df_final['PV GINSENG'] = np.ceil(df_final['PV GINSENG'])" + ] + }, + { + "cell_type": "code", + "execution_count": 67, "id": "2df3e2e9", "metadata": {}, "outputs": [], "source": [ - "df_final.to_excel(r'C:\\Users\\joao.herculano\\Documents\\sugestEUD.xlsx',index=False)" + "df_final.to_excel(r'C:\\Users\\joao.herculano\\Documents\\lançamentosugestEUD2.xlsx',index=False)" ] }, { "cell_type": "code", "execution_count": null, - "id": "7d781cb5", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a40ff37f", + "id": "391a0e3c", "metadata": {}, "outputs": [], "source": [] diff --git a/Lançamentos/boti_script_lançamentos.ipynb b/Lançamentos/boti_script_lançamentos.ipynb new file mode 100644 index 0000000..56a3a73 --- /dev/null +++ b/Lançamentos/boti_script_lançamentos.ipynb @@ -0,0 +1,949 @@ +{ + "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\\BASE DE DADOS LANÇAMENTO\\BOT\\DRAFT_HISTÓRICO DE VENDAS_MAR\" # 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": "9fdbd4df", + "metadata": {}, + "outputs": [], + "source": [ + "df_draft.columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e72bee99", + "metadata": {}, + "outputs": [], + "source": [ + "#df_draft = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\DRAFT_HISTÓRICO DE VENDAS_MAR\\pegou em excel\\DRAFT_PDVS_SEM_23701-20992_20250423090756.xlsx\",sheet_name='BOTICARIO')\n", + "\n", + "\n", + "#df_draft['match'] = 1 \n", + "\n", + "#df_draft.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d0f7992", + "metadata": {}, + "outputs": [], + "source": [ + "df_draft = df_draft.drop(columns='Quantidade')\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\\BASE DE DADOS LANÇAMENTO\\BOT\\ESTOQUE_ATUAL\"\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']== \"BOT.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\\BASE DE DADOS LANÇAMENTO\\BOT\\VENDAS BI\\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": "113a3032", + "metadata": {}, + "outputs": [], + "source": [ + "df_bi_vendas.columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29504e7c", + "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\\BOT\\PDV\\PDV_ATT.xlsx\")\n", + "\n", + "df_pdv_origi = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\PDV\\PDV_ATT.xlsx\")\n", + "\n", + "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', 'status'])\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", + "\n", + "df_pdv = df_pdv[df_pdv['SUPERVISOR'] != \"Inativa\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c7c8be1", + "metadata": {}, + "outputs": [], + "source": [ + "df_pdv['PDV'] = df_pdv['PDV'].fillna(0).astype('int64')" + ] + }, + { + "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\\BOT\\CICLO 9\\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'] == \"BOTICARIO\"]\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": "5589e67c", + "metadata": {}, + "outputs": [], + "source": [ + "filtered_calendario" + ] + }, + { + "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\\BOT\\TABELA_PEDIDO\\Pedidos Semanais Especiais - BOT - 202510 (2).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": "af3d5a5c", + "metadata": {}, + "outputs": [], + "source": [ + "df_tabela['Tipo de promoção'].value_counts()" + ] + }, + { + "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\\BASE DE DADOS LANÇAMENTO\\BOT\\PRODUTO_SIMILAR\\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=['Subcategoria', 'Lançamento', 'Desativação',\n", + " 'Dias sem venda',\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": "2390c5b2", + "metadata": {}, + "outputs": [], + "source": [ + "df_draft['PROJEÇÃO DE VENDAS CICLO'] = df_draft['Projeção Próximo Ciclo + 1'] - df_draft['Projeção Próximo Ciclo']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6d00ef5", + "metadata": {}, + "outputs": [], + "source": [ + "df_venda_diaria = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BASE DE DADOS LANÇAMENTO\\BOT\\VENDAS_PRATICO\\VENDAS SIMI C10 - FormFiltroConsultaVendaSintetica_09_05_2025_11_30_54.xls\")\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" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6dad6151", + "metadata": {}, + "outputs": [], + "source": [ + "df_pdv['MATCH'] = 1\n", + "\n", + "df_similares['MATCH'] = 1\n", + "\n", + "df_similares = pd.merge(left=df_similares,right=df_pdv,right_on=['MATCH'],left_on=['MATCH'],how='inner')\n", + "\n", + "df_similares = df_similares.drop_duplicates()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2b33a11", + "metadata": {}, + "outputs": [], + "source": [ + "df_similares.columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63c52601", + "metadata": {}, + "outputs": [], + "source": [ + "df_final = pd.merge(left=df_similares,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": "90a54c84", + "metadata": {}, + "outputs": [], + "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='left')\n", + "df_final.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15b16b69", + "metadata": {}, + "outputs": [], + "source": [ + "\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": [ + "\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_bi_vendas['PDV'] = df_bi_vendas['PDV'].astype('Int64') \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": "2f11abcb", + "metadata": {}, + "outputs": [], + "source": [ + "df_final.columns" + ] + }, + { + "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'] = df_tabela['Código'].astype(str)\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[['Canal', 'Código','Ação consumidor','IAF','Foco','Marca','Categoria',\n", + " 'Percentual de desconto consumidor', 'Ação revendedor',\n", + " 'Percentual de desconto revendedor','Tipo de promoção']],right_on=['Código'],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_estoque['PDV'] = df_estoque['PDV'].astype('int64')\n", + "\n", + "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'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c3395775", + "metadata": {}, + "outputs": [], + "source": [ + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5f7cefc", + "metadata": {}, + "outputs": [], + "source": [ + "df_final.columns[35:41]" + ] + }, + { + "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[35:41]\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['PDV'] = df_venda_agrupado['PDV'].astype('int64')\n", + "\n", + "df_final['CICLO SIMILAR'] = df_final['CICLO SIMILAR'].astype(str)\n", + "\n", + "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": "5801d05b", + "metadata": {}, + "outputs": [], + "source": [ + "df_final.columns[25: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[25: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", + "variacao_mensal = variacao_mensal.dropna()\n", + "\n", + "variacao_mensal = variacao_mensal[np.isfinite(variacao_mensal)]\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": "02565655", + "metadata": {}, + "outputs": [], + "source": [ + "variacao_mensal.info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "137f5531", + "metadata": {}, + "outputs": [], + "source": [ + "df_final.columns[27:28]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c027cfc", + "metadata": {}, + "outputs": [], + "source": [ + "venda_similar_mesmo_ciclo_ano_passado = df_final.columns[27:28] #<<<<<<< CICLO ATUAL É [37:38]\n", + "ciclo_ano_passado = df_final.columns[27:28].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[25:41]\n", + "\n", + "df_final['MEDIANA DO HISTÓRICO'] = df_final[vendas_todos_historicos].dropna().median(axis=1)\n", + "\n", + "df_final['MEDIA DO HISTÓRICO'] = df_final[vendas_todos_historicos].dropna().mean(axis=1)\n", + "\n", + "df_final['MEDIANA DO HISTÓRICO'] = np.where(df_final['MEDIANA DO HISTÓRICO'] > 0, df_final['MEDIANA DO HISTÓRICO'], df_final['MEDIA DO HISTÓRICO'] )#validar se foi\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", + "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", + " round(df_final['CRESCIMENTO'] * df_final['MEDIANA DO HISTÓRICO']+ df_final['MEDIANA DO HISTÓRICO'],0), \n", + " round(df_final['CRESCIMENTO']*df_final[ciclo_ano_passado]+df_final[ciclo_ano_passado],0))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d29a3365", + "metadata": {}, + "outputs": [], + "source": [ + "df_final.columns[25:38]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3cf3efe7", + "metadata": {}, + "outputs": [], + "source": [ + "df_final = df_final.rename(columns={df_final.columns[38]: \"C-4\", df_final.columns[39]: \"C-3\",df_final.columns[40]: \"C-2\",df_final.columns[41]: \"C-1\"})\n", + "\n", + "df_final.drop(columns=df_final.columns[25:38], inplace=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "303291c9", + "metadata": {}, + "outputs": [], + "source": [ + "df_final.columns" + ] + }, + { + "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": "3900ec24", + "metadata": {}, + "outputs": [], + "source": [ + "df_final = pd.merge(left=df_final,right=df_pdv_origi[['PDV','CANAL','UF']],how='inner',on='PDV')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8ba376a", + "metadata": {}, + "outputs": [], + "source": [ + "df_final = df_final.drop(columns=['CANAL_x','UF_x','Categoria_y'])\n", + "\n", + "df_final = df_final.rename(columns={'CANAL_y':'CANAL', 'UF_y':'UF','MARCA_x':'MARCA','Categoria_x':'Categoria'})" + ] + }, + { + "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", + " 'Classe','PRODUTO LANÇAMENTO','DESCRIÇÃO DO LANÇAMENTO','MARCA','Foco',\n", + " 'PRODUTO SIMILAR','DESCRIÇÃO SIMILAR','CICLO SIMILAR','INICIO CICLO SIMILAR','FIM CICLO SIMILAR','DURAÇÃO CICLO SIMILAR',\n", + " 'Ação consumidor',\t'Percentual de desconto consumidor','Ação revendedor','Percentual de desconto revendedor','Estoque Atual',\n", + " 'Estoque em Transito',\t'Pedido Pendente','DESCRIÇÃO SIMILAR', 'Histórico de Vendas do Ciclo Atual',\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['SUGESTÃO COMERCIAL'] = ''\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43f96709", + "metadata": {}, + "outputs": [], + "source": [ + "df_final = df_final.drop(columns=['Marca','CRESCIMENTO','Canal','Código','Tipo de promoção','dias_ate_inicio','PDV DESC','UFPRODUTO','Arquivo_Origem','UFPRODUTO',\n", + " 'PDV_SKU','MEDIANA DO HISTÓRICO','MEDIA DO HISTÓRICO'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23d6fe59", + "metadata": {}, + "outputs": [], + "source": [ + "df_final['chave'] = df_final['PDV'].astype(str) + df_final['PRODUTO LANÇAMENTO'].astype(str)\n", + "\n", + "chaves_duplicadas = (\n", + " df_final.groupby('chave')['Percentual de desconto consumidor']\n", + " .count()\n", + " .loc[lambda x: x == 2]\n", + " .index\n", + ")\n", + "\n", + "# Selecionar essas linhas\n", + "duplicadas = df_final[df_final['chave'].isin(chaves_duplicadas)]\n", + "\n", + "# Filtrar apenas os grupos onde pelo menos uma linha tem 0.0\n", + "grupos_com_zero = duplicadas.groupby('chave').filter(\n", + " lambda g: (g['Percentual de desconto consumidor'] == \"0,00\").any()\n", + ")\n", + "\n", + "# Remover apenas as linhas com 0.0 dessas chaves\n", + "limpos = grupos_com_zero[grupos_com_zero['Percentual de desconto consumidor'] != \"0,00\"]\n", + "\n", + "# Concatenar com o restante do dataframe que não foi afetado\n", + "resto = df_final[~df_final['chave'].isin(grupos_com_zero['chave'])]\n", + "df_final = pd.concat([resto, limpos], ignore_index=True)\n" + ] + }, + { + "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}_20.05!!.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" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f039df31", + "metadata": {}, + "outputs": [], + "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": 5 +} diff --git a/promoção/SQL no python.ipynb b/promoção/SQL no python.ipynb new file mode 100644 index 0000000..7e2b1bc --- /dev/null +++ b/promoção/SQL no python.ipynb @@ -0,0 +1,993 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "59770f7e", + "metadata": {}, + "outputs": [], + "source": [ + "import psycopg2\n", + " \n", + "# Conexão com o banco\n", + "conn = psycopg2.connect(\n", + " host=\"10.77.77.29\", # ou IP do servidor\n", + " port=\"5432\", # padrão do PostgreSQL\n", + " database=\"ginseng\",\n", + " user=\"joaoherculano\",\n", + " password=\"Ginseng@\"\n", + ")\n", + " \n", + "# Criar um cursor para executar comandos SQL\n", + "cur = conn.cursor()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "aca4b2c2", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_109208\\760475755.py:21: 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", + " df = pd.read_sql(query, conn)\n" + ] + }, + { + "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", + "
loja_idcodedescriptionlaunchdeactivationthirdtolastcyclesalessecondtolastcyclesaleslastcyclesalescurrentcyclesalesnextcycleprojection...criticalitem_blockedwalletcriticalitem_iscriticalcodsubcategoryisproductdeactivatedbrandgroupcodedayswithoutsalescoveragedayshascoveragestatus_vendavalor_estoque_parado
02099748359ZAAD EDP 50ml V201002...FalseFalsePERFUMARIA MASCULINAFalseBOT5420Falsemais de 40 dias168.09
12099748789THE BLEND DES ANTIT AER 75g/125ml V310001...FalseFalseDESODORANTE MASCULINOFalseBOT7225Truemais de 60 dias12.37
22099770693SOPHIE LOC HID CPO 200ml02003...FalseFalseCUIDADOS COM O CORPOFalseBOT484Falsemais de 40 dias11.41
32099775921SOPHIE BATOM ROSA PINK 3,3g11003...FalseFalseMAQUIAGEMFalseBOT5315Falsemais de 40 dias16.58
42099753410REF NSPA SAB LIQ CPO PERF AMEI/NEG 200ml00006...FalseFalseCORPOFalseBOT13531Trueacima de 100 dias85.12
\n", + "

5 rows × 34 columns

\n", + "
" + ], + "text/plain": [ + " loja_id code description launch \\\n", + "0 20997 48359 ZAAD EDP 50ml V2 \n", + "1 20997 48789 THE BLEND DES ANTIT AER 75g/125ml V3 \n", + "2 20997 70693 SOPHIE LOC HID CPO 200ml \n", + "3 20997 75921 SOPHIE BATOM ROSA PINK 3,3g \n", + "4 20997 53410 REF NSPA SAB LIQ CPO PERF AMEI/NEG 200ml \n", + "\n", + " deactivation thirdtolastcyclesales secondtolastcyclesales lastcyclesales \\\n", + "0 0 1 0 \n", + "1 1 0 0 \n", + "2 0 2 0 \n", + "3 1 1 0 \n", + "4 0 0 0 \n", + "\n", + " currentcyclesales nextcycleprojection ... criticalitem_blockedwallet \\\n", + "0 0 2 ... False \n", + "1 0 1 ... False \n", + "2 0 3 ... False \n", + "3 0 3 ... False \n", + "4 0 6 ... False \n", + "\n", + " criticalitem_iscritical codsubcategory isproductdeactivated \\\n", + "0 False PERFUMARIA MASCULINA False \n", + "1 False DESODORANTE MASCULINO False \n", + "2 False CUIDADOS COM O CORPO False \n", + "3 False MAQUIAGEM False \n", + "4 False CORPO False \n", + "\n", + " brandgroupcode dayswithoutsales coveragedays hascoverage \\\n", + "0 BOT 54 20 False \n", + "1 BOT 72 25 True \n", + "2 BOT 48 4 False \n", + "3 BOT 53 15 False \n", + "4 BOT 135 31 True \n", + "\n", + " status_venda valor_estoque_parado \n", + "0 mais de 40 dias 168.09 \n", + "1 mais de 60 dias 12.37 \n", + "2 mais de 40 dias 11.41 \n", + "3 mais de 40 dias 16.58 \n", + "4 acima de 100 dias 85.12 \n", + "\n", + "[5 rows x 34 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + " \n", + "query = '''\n", + "select\n", + "\t*,\n", + "\tCASE\n", + "\t WHEN dayswithoutsales BETWEEN 40 AND 59 THEN 'mais de 40 dias'\n", + "\t WHEN dayswithoutsales BETWEEN 60 AND 79 THEN 'mais de 60 dias'\n", + "\t WHEN dayswithoutsales BETWEEN 80 AND 99 THEN 'mais de 80 dias'\n", + "\t WHEN dayswithoutsales >= 100 THEN 'acima de 100 dias'\n", + " \tELSE 'menos de 40 dias' \n", + "\tend as status_venda,\n", + "\tpricesellin * (stock_actual + stock_intransit) AS valor_estoque_parado\n", + "from \"public\".\"draft\"\n", + "where dayswithoutsales > 40 \n", + "and deactivation = '' \n", + "and stock_actual > 0 \n", + "and isproductdeactivated is not null \n", + "and currentcyclesales = 0\n", + "'''\n", + "df = pd.read_sql(query, conn)\n", + " \n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6b5a3633", + "metadata": {}, + "outputs": [], + "source": [ + "cur.close()\n", + "conn.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "eec9748d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['loja_id', 'code', 'description', 'launch', 'deactivation',\n", + " 'thirdtolastcyclesales', 'secondtolastcyclesales', 'lastcyclesales',\n", + " 'currentcyclesales', 'nextcycleprojection',\n", + " 'secondtonextcycleprojection', 'stock_actual', 'stock_intransit',\n", + " 'purchasesuggestion', 'smartpurchase_purchasesuggestioncycle',\n", + " 'smartpurchase_nextcyclepurchasesuggestion', 'pendingorder',\n", + " 'salescurve', 'promotions_description', 'promotions_discountpercent',\n", + " 'pricesellin', 'businessunit', 'codcategory',\n", + " 'criticalitem_dtprovidedregularization', 'criticalitem_blockedwallet',\n", + " 'criticalitem_iscritical', 'codsubcategory', 'isproductdeactivated',\n", + " 'brandgroupcode', 'dayswithoutsales', 'coveragedays', 'hascoverage',\n", + " 'status_venda', 'valor_estoque_parado'],\n", + " dtype='object')" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5582a6f0", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib as plt\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "4b58e424", + "metadata": {}, + "outputs": [], + "source": [ + "df['estoque futuro'] = df['stock_actual'] + df['stock_intransit']" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "044a8e30", + "metadata": {}, + "outputs": [], + "source": [ + "pdvs = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C08\\arquivos pra gerar a previsão\\pdvs\\pdvs.xlsx\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "74cc2f69", + "metadata": {}, + "outputs": [], + "source": [ + "df['loja_id'] = df['loja_id'].astype('Int64')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cd1e2831", + "metadata": {}, + "outputs": [], + "source": [ + "pdvs['PDV'] = pdvs['PDV'].astype('Int64')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "94772f8c", + "metadata": {}, + "outputs": [], + "source": [ + "df2= pd.merge(left=df,right=pdvs[['PDV','UF']],left_on='loja_id',right_on='PDV',how='inner')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "115f94d0", + "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", + "
loja_idcodedescriptionlaunchdeactivationthirdtolastcyclesalessecondtolastcyclesaleslastcyclesalescurrentcyclesalesnextcycleprojection...isproductdeactivatedbrandgroupcodedayswithoutsalescoveragedayshascoveragestatus_vendavalor_estoque_paradoestoque futuroPDVUF
02099748359ZAAD EDP 50ml V201002...FalseBOT5420Falsemais de 40 dias168.09320997AL
12099748789THE BLEND DES ANTIT AER 75g/125ml V310001...FalseBOT7225Truemais de 60 dias12.37120997AL
22099770693SOPHIE LOC HID CPO 200ml02003...FalseBOT484Falsemais de 40 dias11.41120997AL
32099775921SOPHIE BATOM ROSA PINK 3,3g11003...FalseBOT5315Falsemais de 40 dias16.58220997AL
42099753410REF NSPA SAB LIQ CPO PERF AMEI/NEG 200ml00006...FalseBOT13531Trueacima de 100 dias85.12720997AL
..................................................................
34372099782845MATCH COND LISO PROLONGADO 280ml30002...FalseBOT6628Truemais de 60 dias42.48320997AL
34382099749093MATCH AMP CAP PREENCHEDORA 9ml10001...FalseBOT6618Falsemais de 60 dias20.04220997AL
34392099750165MALBEC SHW GEL CAB/CPO 75g00001...FalseBOT15717Falseacima de 100 dias9.08120997AL
34402099759017MALBEC LOC DES HID CPO MATE 75ml00001...FalseBOT8934Truemais de 80 dias21.02220997AL
34412099756000PMPCK MEN CABELOS11001...FalseBOT4371Truemais de 40 dias94.48420997AL
\n", + "

3442 rows × 37 columns

\n", + "
" + ], + "text/plain": [ + " loja_id code description launch \\\n", + "0 20997 48359 ZAAD EDP 50ml V2 \n", + "1 20997 48789 THE BLEND DES ANTIT AER 75g/125ml V3 \n", + "2 20997 70693 SOPHIE LOC HID CPO 200ml \n", + "3 20997 75921 SOPHIE BATOM ROSA PINK 3,3g \n", + "4 20997 53410 REF NSPA SAB LIQ CPO PERF AMEI/NEG 200ml \n", + "... ... ... ... ... \n", + "3437 20997 82845 MATCH COND LISO PROLONGADO 280ml \n", + "3438 20997 49093 MATCH AMP CAP PREENCHEDORA 9ml \n", + "3439 20997 50165 MALBEC SHW GEL CAB/CPO 75g \n", + "3440 20997 59017 MALBEC LOC DES HID CPO MATE 75ml \n", + "3441 20997 56000 PMPCK MEN CABELOS \n", + "\n", + " deactivation thirdtolastcyclesales secondtolastcyclesales \\\n", + "0 0 1 \n", + "1 1 0 \n", + "2 0 2 \n", + "3 1 1 \n", + "4 0 0 \n", + "... ... ... ... \n", + "3437 3 0 \n", + "3438 1 0 \n", + "3439 0 0 \n", + "3440 0 0 \n", + "3441 1 1 \n", + "\n", + " lastcyclesales currentcyclesales nextcycleprojection ... \\\n", + "0 0 0 2 ... \n", + "1 0 0 1 ... \n", + "2 0 0 3 ... \n", + "3 0 0 3 ... \n", + "4 0 0 6 ... \n", + "... ... ... ... ... \n", + "3437 0 0 2 ... \n", + "3438 0 0 1 ... \n", + "3439 0 0 1 ... \n", + "3440 0 0 1 ... \n", + "3441 0 0 1 ... \n", + "\n", + " isproductdeactivated brandgroupcode dayswithoutsales coveragedays \\\n", + "0 False BOT 54 20 \n", + "1 False BOT 72 25 \n", + "2 False BOT 48 4 \n", + "3 False BOT 53 15 \n", + "4 False BOT 135 31 \n", + "... ... ... ... ... \n", + "3437 False BOT 66 28 \n", + "3438 False BOT 66 18 \n", + "3439 False BOT 157 17 \n", + "3440 False BOT 89 34 \n", + "3441 False BOT 43 71 \n", + "\n", + " hascoverage status_venda valor_estoque_parado estoque futuro \\\n", + "0 False mais de 40 dias 168.09 3 \n", + "1 True mais de 60 dias 12.37 1 \n", + "2 False mais de 40 dias 11.41 1 \n", + "3 False mais de 40 dias 16.58 2 \n", + "4 True acima de 100 dias 85.12 7 \n", + "... ... ... ... ... \n", + "3437 True mais de 60 dias 42.48 3 \n", + "3438 False mais de 60 dias 20.04 2 \n", + "3439 False acima de 100 dias 9.08 1 \n", + "3440 True mais de 80 dias 21.02 2 \n", + "3441 True mais de 40 dias 94.48 4 \n", + "\n", + " PDV UF \n", + "0 20997 AL \n", + "1 20997 AL \n", + "2 20997 AL \n", + "3 20997 AL \n", + "4 20997 AL \n", + "... ... .. \n", + "3437 20997 AL \n", + "3438 20997 AL \n", + "3439 20997 AL \n", + "3440 20997 AL \n", + "3441 20997 AL \n", + "\n", + "[3442 rows x 37 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df2" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "944f8d93", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk4AAAGGCAYAAACNCg6xAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZodJREFUeJzt3QeYU9X2NvAFDL33IlXpSu9NQBCQJlWqdFCk9yqgoAhcpEjvcAUFBJEmRarSqxQB6b1K7zDke951/zvfSSbJnAHGTHl/zxOHJCcnJwmSd9Zee58oDofDIUREREQUrKjBb0JEREREwOBEREREZBODExEREZFNDE5ERERENjE4EREREdnE4ERERERkE4MTERERkU0MTkREREQ2MTgRERER2cTgREQUSTRr1kwyZszo78MgCtcYnIjIq1mzZkmUKFG8XrZv3257X3/99ZcMGjRIzpw5E6rHTJEL/h62b9/e430//fST3r9x40aX8Ojt7/OqVav+xSOn8CrA3wdARGHfl19+KZkyZQpye+bMmUMUnL744gspU6YMqx7kVzFjxpRp06YFuT1Pnjx+OR4KXxiciChYH3zwgRQsWNDfhxFpPXjwQOLGjSuR0fPnz+XFixcSI0aM17bPgIAAady48WvbH0UuHKojotfixx9/lAIFCkj8+PElQYIEkitXLhkzZoxzyK9u3br657JlyzqHRqxDKBMmTJC3335bqwFp0qSRdu3aye3bt4M8z5QpU+Stt96S2LFjS+HCheX333/XKhYu7kOM7sOCeD7354UdO3ZIpUqVJGHChBInThwpXbq0bNmyJdjXbPY3f/586du3r6RKlUoDTvXq1eX8+fMu2+I48R6kT59eX2O6dOmkS5cu8ujRI5ftMJQUL148OXnypFSuXFnfz0aNGoVoH7BkyRJ55513JFasWPrz559/9hrKunXrpvvCPrNlyyb/+c9/xOFwBPv68Z5j33v27JHixYvrZ4LK5KRJk4Jse+3aNWnZsqWkTJlSjwnVndmzZ7tsg88L7yeef/To0fo545hQrSQKK1hxIqJg3blzR27cuOFyG77gkiZNqn9eu3atNGjQQMqVKyfDhg3T244cOaLho1OnTvLuu+9Kx44dZezYsRowcuTIoduYn+h9wjBe+fLlpW3btnLs2DGZOHGi7Nq1S/cRPXp03W769OnyySef6Jd0586d5dSpUxpSkiRJol/8L2P9+vVaUUPoGzhwoESNGlVmzpwp7733ngYVhLPgfPXVV/p+9OrVSwMCvvTxWvbv369hAhYuXCgPHz7U14f3befOnfLdd9/JhQsX9D73KkvFihWlZMmSGiIQ5kKyjzVr1kjt2rUlZ86cMnToUPnnn3+kefPmkjZtWpfnQTjC+7dhwwYNNXnz5pXVq1dLjx495OLFizJq1KhgX/utW7c04H300Uf6d2DBggV6fKgQtWjRQrdBsEPIOnHihPYjIVzheBESEY7xd8QK7//jx4+lTZs2Gpzw+b5u7n+f8XcMwZkoWA4iIi9mzpyJsoPHS8yYMZ3bderUyZEgQQLH8+fPve5r4cKF+rgNGza43H7t2jVHjBgxHBUqVHAEBgY6bx83bpxuP2PGDL3+9OlTR4oUKRx58+Z1PHnyxLndlClTdLvSpUsHOe7Tp0+7PBee23oML168cGTJksVRsWJF/bPx8OFDR6ZMmRzvv/++z/fH7O+NN95w3L1713n7ggUL9PYxY8a47NPd0KFDHVGiRHGcPXvWeVvTpk31sb179w6yvd194D1KnTq14/bt287b1qxZo/vNkCGD87YlS5bobUOGDHHZZ506dXSfJ06c8Pn68Z7j8SNHjnTehs8Gz4/PCp8ZjB49Wrf7/vvvndvhvmLFijnixYvnfO/weWE7/F3C3ws7sH27du1s/50z76/7xfr3h8gXDtURUbDGjx+vVSXr5ddff3XenyhRIh3ywe0h9dtvv8nTp0+1goRqj9G6dWsd8luxYoVe3717t1ZzPv30U5d+F1QtXrZSgIrQ8ePHpWHDhlqVQRUCF7wWVM82b96s/TXBadKkiQ6pGXXq1JHUqVPLypUrnbeZyhNg/3geVM7w3b9v374g+0TVxp2dfVy+fFlfV9OmTV3el/fff18rUFY4vmjRomk10ApDd9in9TP21S+EKqCBzwbX8VlhCM88D4YxUZGyVnjwvPfv35dNmza57BPVsuTJk0towVCh+9/nkSNHhtrzUcTCoToiChaGq3w1h3/22Wc6RIMhrzfeeEMqVKigQzfoGwrO2bNn9Sd6a6zwBfzmm2867zc/s2TJ4rIdvoCx3ctAaAKEDF/DlIkTJ/a5H/djwrAdZhxae6zOnTsnAwYMkKVLl+rwlvtzuIcR92E1u/vw9j6Z93jv3r3O69gW/WTW0GcdQjX78gWPd29cz5o1q/7E6y9atKjuB8djDca+nsfTDM5Xgc/DCmERQ6lEL4PBiYheWYoUKbTKgf4YVClwQZ8KKjHuDcD/BvcvSiMwMNDluqkmjRgxQvt7PEGj9qvC86Lic/PmTe2Dyp49u4YN9BGhYuZe1UJfj3vICOk+wjNrZS04eK88NccD+sFMhYnodWFwIqLXAhWiatWq6QVf4qhCTZ48WT7//HOtvngLMxkyZNCfaAi3Vo4wfHf69GlnZcBshyoRGreNZ8+e6XbWNXhMhch9Vp57ZQOztgBDgq9SgTCVKwPDXGiEzp07t14/ePCg/P333xoiESaNkAxt2t2H9X1yh/fYfVsMld67d8+l6nT06FGXffly6dKlIMsl4DjBrNeF/Rw4cED/XlgDYUiexxs81v11Geb2V9k/kTv2OBHRK0N/kBW+HE1oePLkif40X6zuYQaBBaELM+6sU+Axgw7DT1WqVNHrGCpE3wumuiNUWZcecN+nCUToUbJWbLCUgRVm0mFbzFxDr42769ev23r9c+bM0fBhXbEavUYYujRDQ2B9ffizWa7BDrv7QG8VqmcIWNYhQAQs92n9mA2H92XcuHEut2M2HYKuOX5fMAMQAdnAZ4Pr+Kzw/prnuXLlii7bYH0cZgSiooflH14W9o0V7E0/lYG/E3PnztX3Av1VRK8LK05EFCwMvZnqgBUak1ElatWqlQ4hoRKE3hxUdvCliC8t08eCP+PLH8sV4AsdQyzYHsN8ffr00eUI0BOF6fGoFGBdp0KFCjkXKkQv05AhQ7TxGI+rV6+eVpowJOje44T1oNBbg/3iuDCdHetM4cvaPeBhBWkEBDwGU/bRo4XhL0zRRyVq2bJlwb4/2D+WDsDjr169qssRoMqGBnfAsBoCWvfu3XXf2O+iRYuC9Cn5EpJ9YAkCBE4cE5YEwHuAzwOv0RoQUR3Eulr9+vXTfiRU7bCUwS+//KLN+iaABtfjhM8Uj0dvE8IRhm0RUs0yElhWAGEKQ4oIOKhEIVxiqQm8V+49ViHRu3dvXdoAS17g7wbeJ1TBEKgRXvH3g+i18jnnjogiNV/LEeCC++Gnn37S5QQwBR1LC6RPn97xySefOC5fvuyyv6lTpzrefPNNR7Ro0YJME8fyA9mzZ3dEjx7dkTJlSkfbtm0dt27dCnJMEyZM0KUCsBxCwYIFHZs3b9ap5O7TyU+ePOkoX768bof99e3b17F27VqPSyLs27fPUatWLUfSpEl1e0zZ/+ijjxzr1q2ztRzBDz/84OjTp4++/tixYzuqVKnisjwA/PXXX3o8mH6fLFkyR+vWrR1//vmny/topsvHjRvX4/PZ3QcsWrTIkSNHDn09OXPmdCxevFj3bV2OAO7du+fo0qWLI02aNPreY3mGESNGuCzP4A3e87ffftuxe/duXVogVqxYun98lu6uXr3qaN68uR43/o7kypUryDGb5Qjw/CFx4cIFR6tWrXRZiICAAEeSJEkcVatWdWzfvj3Itr7eXyI7ouA/rzeKERH9u8yq4e4rgoc2PB8qNqh4YAmCyPi+Y0mEQ4cO+ftQiP417HEiIiIisonBiYiIiMgmBiciIiIim9jjRERERGQTK05ERERENjE4EREREdnEBTDJJ5wiAYvJYYE6b6fMICIiCs/QtYTV/7Ggq/t5It0xOJFPCE3p0qXz92EQERGFuvPnz+vZD3xhcCKfzKkQ8JcJp3ggIiKKaO7evatFAjun/2FwIp/M8BxC0+sMTjhnFc4lRUREFFbYaUlhczi91tMv4MStONs5TnqKM57v3r37pff3999/S82aNfXM5okSJZISJUroSUGtZ2HHaS5wwlD8ZV+yZEmQfWB7nLg0Tpw4epLZbdu2eX2+vXv36tnccex4PpzAdvPmzc77cYJYnAwVv5UgROLYrl275rwfJxPNli2bJEyYUJIlSya1atWSc+fOeX0+nIgVJ6fFvvAaESZxRncD12PEiKHvp7n4On4iIgp9DE70WuEs6Tj7+pUrV6RIkSIaHqzmzJkjOXLkkB9++EFSpEih4crbGeIRInDW+oMHD8o///yjQaJy5cp6biwDZ3//73//63FMGmeEr1q1qrRv316fo127dnrdGk6sMmTIIIsXL9bnwvY4Cz3OMP/o0SO9f8SIEbJixQrZvn27XL16VQNS48aNnY9/7733NKjduXNHLly4oGeWx5npvUHo27dvn5aIERIRBPGcVp999pm+n+ZSrFgxr/sjIqLQx+BEoQKVkqZNm2pv1PXr1/W2ixcvapD49ttvpUGDBnL27Fnp37+/BAR4HjEuXLiwtGnTRpInTy7RokWT1q1b688DBw44n6Nz585SqlQpvd3dzz//LG+88YY+DpUw/ERlB7d7kjRpUg1PqF5hhgX2aUKg2V/Hjh11n7Fjx5YvvvhC1q5dK2fOnNH78VhUmgCPx8yM48ePe32PsmTJouHLCG57IiLyPwYnChWo0kyfPl2DROLEifU2VIoQSjDkBggf77//vq1mPEDlCdNFc+bMaWt7BCwMz1nhugle3mCYDqGsRo0a0qRJE8mUKZNzaQbrQvu4bp7H+OOPP/TxGBpEQMTQni/z5s3ToToEKASzHj16BKnQYejw7bfflpEjRzqfk4iI/IPBiV6rPn36aHCIGzeuhgIMfZmKUq5cuXSoDD83bdoks2fPdhl28wXDa/Xr15e+fftq1cgOVItwLFa4jvAV3HNhGwwBopplYNhuzJgx2reEfQ8YMECDIIbarEOHeDyqbIMHDw425DVs2FAfj+obhunQ82SgunXs2DHdF0IonhsXIiLyHwYneq3Q8IzggCE6DGlZqzEYikJVxQyhLViwQDJnzhxswzN6hipWrKihZNCgQbaPBc3UeKz7vuxUuFANQ//SqFGjtIpkQmH58uU1TGXNmlWrV3gODPG5Q6WtZcuWGhQfPHgQ7POlT59et61evbrztvz58zuHKYsWLSq9e/eW+fPn23z1REQUGhicKFQgGE2dOlV69eqli2haIRAgMKHRum7dujJlypRgQxOGqiZNmhSi1ctz584t+/fvd7kN11HxsuvZs2fOvqNYsWLp8BuqQ3hNaFRHQzea4L09FsdvnXkX3HOhXwo/PQluNVsiIgp9/JeYQg0CEpYo+Prrr/U6AsjKlSudfTqoxOC21KlTe3w8hrAqVaqk1Z1p06Z5DE1PnjyRx48fa+8RAgf+HBgYqPdhuQDMbsMwFwIOfl6+fFlvN7DPjRs36p+XL1+uFTIsO/Dw4UM9bjz+3Xff1fvxWIQmPBeOGxWlrl27ag+SWY4A2+N+NJRjqA3HjuUSPEEQNKHq1KlTWlHCzLzo0aPrbajI4T3A/rCswzfffCO1a9d+hU+EiIhemYPIhzt37qAbWn8Gp3Tp0o5Ro0a53LZ161ZHzJgxHefOnXOcOXPGUa1aNUfatGkd8eLFc6ROndpRr149r/ueNWuWPnecOHEccePGdV6+//575zYZMmTQbayXmTNnOu///fffHbly5XLEihXLkTt3bseWLVuc9509e9YRP358x40bN/Q6Hpc1a1Z9jqRJkzrKlCnjWL9+vXP77du3O958801H7NixHenTp3d89dVXjhcvXjjv79ixoyNNmjR6vHht9evXd5w8edJ5P7avVKmS83qdOnUcyZMn1+3xnrRp08Zx7do15/2lSpVyJEyYUI8HxzVs2DBHYGBgsJ8DERGF3nddFPzn1eMXRVSoeGDGF4acItrK4WhOP3r0qPZlERFR5HU3BN91POUKRVpYZ4qIiCgk2ONEfuHvahMREdHLYMWJXqsCPeb4+xAitD0jmvj7EIiIIjVWnIiIiIhsYnAiIiIisonBiYiIiMgmBiciIiIimxiciIiIiGxicCIiIiKyicGJiIiIyCYGJyIiIqKIFpyw0rQ5iz0RERFRpAtOONFrlChR9BI9enTJlCmT9OzZUx4/fmx7H3/++ac0aNBA0qVLJ7Fjx5YcOXLImDFjgmyH0JU/f36JGTOmZM6c2eMpP8aPHy8ZM2aUWLFiSZEiRWTnzp3BPv/ChQsle/bs+phcuXLJypUrXe7HOZQHDBggqVOn1uMrX768HD9+3GWbmzdvSqNGjfTEgokSJZKWLVvK/fv3fT4v3qN27dpJ0qRJJV68eFK7dm25evWqyzbnzp2TKlWqSJw4cSRFihTSo0cPef78ebCviYiIiMJoxalSpUpy+fJlOXXqlIwaNUomT54sAwcOdN6/YcMGKVGihHTq1Elq1qyp4WfixInO+/fs2aOh4Pvvv5fDhw9Lv379pE+fPjJu3DjnNqdPn9YAUbZsWdm/f7907txZWrVqJatXr3ZuM3/+fOnatas+9969eyVPnjxSsWJFuXbtmtdj37p1q4Y2BJ19+/ZJjRo19HLo0CHnNsOHD5exY8fKpEmTZMeOHRI3blzdrzUcIjTh2NeuXSvLly+XzZs3S5s2bXy+b126dJFly5ZpcNu0aZNcunRJatWq5bw/MDBQX/PTp0/1OGfPnq1hESGOiIiIXk4UB0oifqw43b59W5YsWeK8DZUTBB2EF9yXPn16qV+/vlaUULVJmDCh3LhxQ9q2bet1v6jEHDlyRNavX6/Xe/XqJStWrHAJNNgn9r9q1Sq9jgpToUKFnIHrxYsX+pwdOnSQ3r17e3yeevXqyYMHDzTsGEWLFpW8efNqUMJbmyZNGunWrZt0795d779z546kTJlSQwyOAceZM2dO2bVrlxQsWFC3wTFVrlxZLly4oI93h30kT55c5s2bJ3Xq1NHbjh49qtW2bdu26TH8+uuvUrVqVQ1UeD7AMeG9uH79usSIEcPWZ3T37l19z/GcqIgFh+eqC108Vx0R0esXku86v1ecrBBsUB0xX+onTpyQe/fuaRUIIQZDbHXr1vUZmgAvPEmSJM7rCBMYIrNC1Qe3A6oyqFxZt4kaNapeN9t4Etx+EQCvXLnisg0+GIQ0sw1+YnjOhCbA9nh+VKg8wbE+e/bMZb8YLkTItO4XQ4cmNJljw18OVLe8efLkiW5jvRAREdH/BIifoVqDHh303uBLG4HBVH2yZcsmyZIl04oPQgH6j4KD4IVhN1SYDIQXa4AAXEcoePTokdy6dUuHtjxtg0qON972i9vN/eY2X9tgqNEqICBAg5/ZxtPzIlwicPnar6fntR6XJ0OHDpUvvvjC6/1ERESRmd8rTqbvCNWVpk2bSvPmzXW4DuLHj6/DbQ8fPtTG7WrVqkn16tW1n8hbxerDDz/UClWFChX+5VcSMaA/DBU7czl//ry/D4mIiCjM8HtwQrM0huDQjD1jxgwNUNOnT3fej+GmRYsWyejRo2XYsGE61IWwhT4dq7/++kvKlSunTdX9+/d3uS9VqlRBZpzhOsYxMdMNVa1o0aJ53AaP9cbbfs1jzM/gtnFvQEf1DTPtvD03bsfwInq0fO3X0/Naj8sTzDrE+2K9EBERURgJTlYYpuvbt68GHwyhuUMT9YQJE7QScuDAAeft6NlBmELF6quvvgryuGLFism6detcbsMMNtwOGPYqUKCAyzZoDsd1s40nwe0XyysgpFi3wfAgwqHZBj8RgNC3ZKDKhudHL5QnOFYs32Dd77Fjx3T5Aet+Dx486BLKcGwIQngfiYiIKJwHJ0DzN6o/GJrDzLpBgwZpKEAVBgFjxIgRumaS+fLH8BxCE4bmsJwA+ndwsVakPv30U13uAGtEoWcJ4WvBggU6pd/AY6dOnarT9jHTDQ3omDGHoUNvsEQCZsCNHDlS94tj3b17t7Rv317vx/pUWPpgyJAhsnTpUg0yTZo00ZlyWLYAMBMOSzK0bt1a143asmWLPh4z7syMuosXL2rzt1lXClU3LIGAY8ZyDQhdOE6EJcyoA7wfeI8+/vhjXesKSy8gkGLGIapKREREFA6bw92hMRrBAesfYY0k9NggWCA8IFAhaGDoDksTwE8//aQhCes44WJkyJBBzpw546z8oFkcQQmLY6ZNm1amTZums8ysSwtgP1jnCMELSwogFFkbrLF8AvZpVjAvXry4LgmAQIJKWZYsWXRphXfeecf5GIQ1BDAMISL4lSxZUveL8GfMnTtXXzOGGlF1Q48X1n4yMIMO4RG9XgbWvDLboqkerwWB0MB7hcZ7BEAEKgyJoiL35ZdfvtbPi4iIKDLx6zpOIYF1jzCrrkyZMn47htKlS2t1C5WlyILrOIUtXMeJiMi/33VhruIUVuHNPHnypMsyB0RERBS5hJvghGEyf0ISxUreREREFHmFueZwIiIiorCKwYmIiIjIJgYnIiIiIpsYnIiIiIhsYnAiIiIisonBiYiIiMgmBiciIiIimxiciIiIiGxicCIiIiKyicGJiIiIyCYGJyIiIiKbGJyIiIiIbGJwIiIiIrKJwYmIiIjIJgYnIiIiIpsYnIiIiIhsYnAiIiIisonBiYiIiMgmBiciIiIimxiciIiIiCJacJo1a5Zs3LjR34dBREREkZhfg1OzZs0kSpQoeokePbpkypRJevbsKY8fPw7Rfjp27CgFChSQmDFjSt68eYPcP2jQIOfzWC9x48Z1CWbu98eKFSvY50aYy58/vz535syZdT/uxo8fLxkzZtT9FSlSRHbu3OlyP15vu3btJGnSpBIvXjypXbu2XL161efzOhwOGTBggKROnVpix44t5cuXl+PHj7tsc/PmTWnUqJEkSJBAEiVKJC1btpT79+8H+5qIiIgojFacKlWqJJcvX5ZTp07JqFGjZPLkyTJw4EDn/Rs2bJASJUpIp06dpGbNmhpSJk6cGGQ/LVq0kHr16nl8ju7du+tzWC85c+aUunXrumyHgGHd5uzZsz6P/fTp01KlShUpW7as7N+/Xzp37iytWrWS1atXO7eZP3++dO3aVV/T3r17JU+ePFKxYkW5du2ac5suXbrIsmXLZOHChbJp0ya5dOmS1KpVy+dzDx8+XMaOHSuTJk2SHTt2aAjEfq2hE6Hp8OHDsnbtWlm+fLls3rxZ2rRp43O/RERE5F0UB0oXfqw43b59W5YsWeK8DdUWBBKEDNyXPn16qV+/vqRLl06rKwkTJpQbN25I27ZtPVaWsC+EGF/+/PNPrUwhSJQqVUpvQ6UIwQfPaVevXr1kxYoVcujQIedtOFbsY9WqVXodFaZChQrJuHHj9PqLFy/0tXTo0EF69+4td+7ckeTJk8u8efOkTp06us3Ro0clR44csm3bNilatGiQ58VHliZNGunWrZuGQsB+UqZMqa8Dx3DkyBENh7t27ZKCBQvqNjimypUry4ULF/Txdty9e1ffc+wfwTI4BXrMsbVfejl7RjTx9yEQEUU4Ifmu83vFyQoBZOvWrRIjRgy9fuLECbl3755WaxA2MBSGKpGn0BQS06ZNk6xZszpDk4FhrAwZMuhzffjhh1qt8QXBBkNkVqj64HZ4+vSp7Nmzx2WbqFGj6nWzDe5/9uyZyzbZs2fXwGi2cYdgeeXKFZfH4ANHSDOPwU8Mz5nQBNgez48KFREREYWc34MThpDQ14P+n1y5cukQVo8ePfS+bNmySbJkybQy496/87IwlDV37lzt97HCc82YMUN++eUX+f7777UyVLx4ca3OeIPwgiqPFa4juT569EgrY4GBgR63wWPNPhAUEXK8bePpec02vvabIkUKl/sDAgIkSZIkXvcLT5480eO3XoiIiCiMBCfTH4QqSNOmTaV58+Y6XAfx48eX9evXy8OHD7XBulq1alK9enXZt2/fSz/fzz//rFUsPJdVsWLFpEmTJjqEV7p0aVm8eLEOoaHnKjIZOnSoVq/MBdU3IiIiCiPBCU3NGIJD0zQqPghQ06dPd96PKtSiRYtk9OjRMmzYMP0yR9i6fv36Sw/TVa1aNUi1xh1m+eXLl0+HC71JlSpVkNlvuI7xUcx0Q7UsWrRoHrfBY80+MKTn3ltl3cbT85ptfO3X2oAOz58/15l23vYLffr00TFeczl//rzXbYmIiCIbvwcnK/Tf9O3bV/r3769DXe7Q7DxhwgT9Qj9w4ECI94/eIMzScx+m8wRDbAcPHtSGdG9QpVq3bp3LbZjBhtsBQ3BYJsG6DYYAcd1sg/sR0qzbHDt2TM6dO+fcxh2WbUD4sT4GQ2oIneYx+Ikwhh4qA9U7PD96obzBsgoIftYLERERhcHgBGj+RpUGQ3OYWYeZcggSqJYgCIwYMUL7oRCiDFSFMNyH3h0ELvwZF1RyrFDRQhD64IMPgjzvl19+KWvWrNFlEfC8jRs31uUIsLyAN59++qluj7WnMBMOoW7BggW6vICBpQimTp0qs2fP1pluaGx/8OCBDkkCKmgIctgOoQ5BB/ch+Fhn1KFhHMOMgDWmMANwyJAhsnTpUg14GGbETLkaNWroNpiVh6UeWrduretGbdmyRdq3b68z7uzOqCMiIiJXARLGoIEZX/BYp6hBgwY6VIQAcPHiRQ1UCAQYurNWghBusP6RgSE2U2HCwpOASgum6mMJBOzH3a1btzRkIHwlTpxYK0GY4WcNaAhx2MeZM2eclR8sR4CgNGbMGEmbNq0OBWJmnYG1pTCsiMUqsW/0UGFZAOtQIdavQrUNvV1ozsbjEcKsEB5RaTMQ1hDAsC4TAmXJkiV1v9ZFO9EEj/eyXLlyzv1j7SciIiIKh+s4hQQCC0JQmTJl/HYMaChHtcfT6uARFddxClu4jhMRkX+/68JcxSmsQr7E6VX++OMPfx8KERER+Um4CU4YYvMnVJqCOwULERERRWxhrjmciIiIKKxicCIiIiKyicGJiIiIyCYGJyIiIiKbGJyIiIiIbGJwIiIiIrKJwYmIiIjIJgYnIiIiIpsYnIiIiIhsYnAiIiIisonBiYiIiMgmBiciIiIimxiciIiIiGxicCIiIiKyicGJiIiIyCYGJyIiIiKbGJyIiIiIbGJwIiIiIrKJwYmIiIjIJgYnIiIiIpsYnIiIiIgiWnCaNWuWbNy40d+HQURERJGYX4NTs2bNJEqUKHqJHj26ZMqUSXr27CmPHz8O0X46duwoBQoUkJgxY0revHmD3H/mzBnn81gv27dvd9lu4cKFkj17dokVK5bkypVLVq5cGexzI8zlz59fnztz5swa8NyNHz9eMmbMqPstUqSI7Ny50+V+vN527dpJ0qRJJV68eFK7dm25evWqz+d1OBwyYMAASZ06tcSOHVvKly8vx48fd9nm5s2b0qhRI0mQIIEkSpRIWrZsKffv3w/2NREREVEYrThVqlRJLl++LKdOnZJRo0bJ5MmTZeDAgc77N2zYICVKlJBOnTpJzZo1NaRMnDgxyH5atGgh9erV8/lcv/32mz6XuSBsGVu3bpUGDRpouNi3b5/UqFFDL4cOHfK6v9OnT0uVKlWkbNmysn//funcubO0atVKVq9e7dxm/vz50rVrV31Ne/fulTx58kjFihXl2rVrzm26dOkiy5Yt0+C2adMmuXTpktSqVcvnaxk+fLiMHTtWJk2aJDt27JC4cePqfq2hE6Hp8OHDsnbtWlm+fLls3rxZ2rRp43O/RERE5F0UB0oXfqw43b59W5YsWeK8DdUWBBKEDNyXPn16qV+/vqRLl06rKwkTJpQbN25I27Ztg+xv0KBBui+EGPeKE6pZCESeKlKA0PXgwQMNGEbRokV1e4QTT3r16iUrVqxwCVc4Vhz3qlWr9DoqTIUKFZJx48bp9RcvXuhr6dChg/Tu3Vvu3LkjyZMnl3nz5kmdOnV0m6NHj0qOHDlk27Ztegzu8JGlSZNGunXrJt27d9fbsJ+UKVNqxQvHcOTIEcmZM6fs2rVLChYsqNvgmCpXriwXLlzQx9tx9+5dfc+xf1SuglOgxxxb+6WXs2dEE38fAhFRhBOS7zq/V5ysEEBQ+YkRI4ZeP3HihNy7d0+rNQgbGAqrW7eux9BkR/Xq1SVFihRSsmRJWbp0qct9CCkY7rJCBQe3exPcY54+fSp79uxx2SZq1Kh63WyD+589e+ayDYYLERi9PTeC5ZUrV1wegw8cIc08Bj8xPGdCE2B7PD8qVN48efJE/wJZL0RERBRGghMqPOjrMX1FGMLq0aOH3pctWzZJliyZVmbc+3dCAvsfOXKkDoWhQoTghGE4a3hCEEHFxgrXcbs33h6DsPHo0SOtjAUGBvrcL34iKCLk2H1uc3tw+0VItAoICJAkSZL4fE1Dhw7VEGYuCKxEREQURoKT6Q9CFaRp06bSvHlzHa6D+PHjy/r16+Xhw4faYF2tWjWtGmHILSQQvtBnZIbNvvnmG2ncuLGMGDEilF5V+NWnTx8tVZrL+fPn/X1IREREYYbfgxOamjEEh6bpGTNmaICaPn26835UoRYtWiSjR4+WYcOGaRUEYev69euv9LwIURgKNFKlShVkJhuu43ZvvD0G46OY6YbAFi1aNJ/7xU8M6aEvyu5zm9uD26+1AR2eP3+uM+18vSbMDsTxWy9EREQURoKTFfpv+vbtK/3799ehLndodp4wYYJWQg4cOPBKz4UqF5rNjWLFism6detctsFsNNzuTXCPwRAcZu5Zt0FzOK6bbXA/lmKwbnPs2DE5d+6c1+dGozvCj/UxGB5E6DSPwU+EMfRQGaje4fkRGomIiCjkAiSMQfM3epwwNPfee+9pHxKWCUC1BEEAw2voh0KIMlA5wvpE6N1B4DKz6rANwsvs2bP1Z758+fT2xYsXa3Vr2rRpzn1guYPSpUtrLxSWGPjxxx9l9+7dMmXKFK/H+umnn+psOaw9heUQEEwWLFigfVQGhggxBIkm7cKFC2vlDLP3MCQJqKBhCQRsh/4jVHgw4w7BxzqjDg3j6D/CkgxYgwpLHwwZMkSyZMmiQerzzz/XmXLo3QLMysNSD61bt9ZZgWhAb9++vc64szujjoiIiMJ4cEIDM77gsU4RAhN6bBAALl68qMNeCAQYurNWi7B2EtY/MkxAwuwzLDwJgwcPlrNnz+r+EUKwvpKZ/g/FixfXJQFQ7ULVC4EESxu88847LssdYLo/ljcABBaEJKzDNGbMGEmbNq2GMcyssy5zgGFFLFaJYIflDbAsgLWxG+tXodqG3i7MasPjUVmzQhUKlTYDYQ0BDOsyIVCi4R37Rag05s6dq+9luXLlnPvH2k9EREQUDtdxCgkEFoSgMmXK+O0YUDlCtcfT6uARFddxClu4jhMRkX+/68JcxSmsQr7E6VX++OMPfx8KERER+Um4CU5YZdyfUGnCUB8RERFFXmFqVh0RERFRWMbgRERERGQTgxMRERGRTQxORERERDYxOBERERHZxOBEREREZBODExEREZFNDE5ERERENjE4EREREdnE4ERERERkE4MTERERkU0MTkREREQ2MTgRERER2cTgRERERGQTgxMRERGRTQxORERERDYxOBERERHZxOBEREREZBODExEREZFNDE5EREREES04zZo1SzZu3OjvwyAiIqJIzK/BqVmzZhIlShS9RI8eXTJlyiQ9e/aUx48fh2g/HTt2lAIFCkjMmDElb968Qe5H4Prwww8lderUEjduXN1m7ty5QYKZORZziRUrVrDPjX3nz59fnztz5sy6H3fjx4+XjBkz6v6KFCkiO3fudLkfr7ddu3aSNGlSiRcvntSuXVuuXr3q83kdDocMGDBAX1Ps2LGlfPnycvz4cZdtbt68KY0aNZIECRJIokSJpGXLlnL//v1gXxMRERGF0YpTpUqV5PLly3Lq1CkZNWqUTJ48WQYOHOi8f8OGDVKiRAnp1KmT1KxZU0PKxIkTg+ynRYsWUq9ePY/PsXXrVsmdO7csWrRIDhw4IM2bN5cmTZrI8uXLXbZDwMCxmMvZs2d9Hvvp06elSpUqUrZsWdm/f7907txZWrVqJatXr3ZuM3/+fOnatau+pr1790qePHmkYsWKcu3aNec2Xbp0kWXLlsnChQtl06ZNcunSJalVq5bP5x4+fLiMHTtWJk2aJDt27NBAiP1aQydC0+HDh2Xt2rX6Wjdv3ixt2rTxuV8iIiLyLooDpQs/Vpxu374tS5Yscd6GagsCCUIG7kufPr3Ur19f0qVLp9WVhAkTyo0bN6Rt27ZB9jdo0CDdF0JMcBB4UqZMKTNmzNDrqBQh+OA57erVq5esWLFCDh065LwNx4p9rFq1Sq+jwlSoUCEZN26cXn/x4oW+lg4dOkjv3r3lzp07kjx5cpk3b57UqVNHtzl69KjkyJFDtm3bJkWLFg3yvPjI0qRJI926dZPu3bvrbdgPXg9eB47hyJEjkjNnTtm1a5cULFhQt8ExVa5cWS5cuKCPt+Pu3bv6nmP/CJbBKdBjjq390svZM6KJvw+BiCjCCcl3nd8rTlYIIKgOxYgRQ6+fOHFC7t27p9UahA0MhdWtW9djaAopvDlJkiRxuQ3DWBkyZNDnwtAeqjW+INhgiMwKVR/cDk+fPpU9e/a4bBM1alS9brbB/c+ePXPZJnv27BoYzTbuECyvXLni8hh84Ahp5jH4ieE5E5oA2+P5UaHy5smTJ/oXyHohIiKiMBKcMISEvh70/+TKlUuHsHr06KH3ZcuWTZIlS6aVGff+nVexYMECrcRgyM7Ac6H69Msvv8j333+vlaHixYtrdcYbhBdUeaxwHWHj0aNHWhkLDAz0uA0ea/aBoIiQ420bT89rtvG13xQpUrjcHxAQoGHR235h6NChGsLMBSGSiIiIwkhwMv1BqII0bdpUwwyG6yB+/Piyfv16efjwoTZYV6tWTapXry779u176edDzxSeY+rUqfL22287by9WrJj2PaFxvHTp0rJ48WIdQkPPVWTSp08frcaZy/nz5/19SERERGFGgL8PAE3NGIIDVHzQPD19+nSdAQaoQqGpG707CFAYgkLYQgUKwSYk0HiN8IUmdIQkXzDLL1++fDpc6E2qVKmCzH7DdYyPYqZbtGjR9OJpGzzW7ANDeuiLsladrNt4el6zDfq+rI8xswqxjbUBHZ4/f64z7bztFzA7EBciIiIKgxUnK/Tf9O3bV/r3769DXe7Q7DxhwgSthGB2XEhg2QA0hA8bNszWzDIMsR08eNAlmLhDlWrdunUut2EGG24HDMFhmQTrNhgCxHWzDe5HSLNuc+zYMTl37pxzG3dYtgHhx/oYDA+iamceg58IY+ihMlC9w/OjF4qIiIhCOThhNhe+0EO6zlJIoPkbVRoMzWFmHWbKIUigWoIgMGLECO2HQogyUBXCcB96dxC48GdcUMkxw3MITVjvCcOA2A4XVF+ML7/8UtasWaPLIuB5GzdurMsRYHkBbz799FPdHmtPYSYcQh36p7C8gIGlCDAsOHv2bJ3phsb2Bw8eOPur0EeE6hq2w3Ei6OA+BB/rjDo0jP/888/6Z6wxhRmAQ4YMkaVLl2rAQwUNM+Vq1Kih22BWHpZ6aN26ta4btWXLFmnfvr3OuLM7o46IiIheYagOwQnDaphtliVLFgkNaGDGFzzWKWrQoIH22CAAXLx4UQMVAgGG7qyVIIQbDMMZGGIzs8+w8CRCC4b50PiMi4FeJrMa+a1btzRkIFAlTpxYK0GY4WcNaAhxGDI8c+aMs/KD5QgQlMaMGSNp06aVadOm6cw6A2tLXb9+XRerxL4xlIZlAayN3Rg6RLUNoQ6z2vB4hDArhEdU2gyENQQwVM8QKEuWLKn7tS7aiUU+8V6WK1fOuX+s/URERET/0jpOaKhGD5Kn9YVCEwILQlCZMmXEX9C8jmqPp9XBIyqu4xS2cB0nIqJwto7TN998o8sFWBd9jAyQL1GdGjx4sL8PhYiIiMLLrDr00mDYC7Pf0PyM2WNW1r6h173KuD+h0hTcKViIiIgoYgtxcBo9enToHAkRERFRRAtO6PMhIiIiioxeagFMrHGEk+lier1pGMeK3pj1RkRERBRRhTg4Yc2kypUr6/IAOL8bYIo/zmmGqflvvfVWaBwnERERkd+FeFYdFpFEOML6SlgoEhcsiok1jXAfERERUUQV4ooTFprcvn27JEmSxHlb0qRJdZmCEiVKvO7jIyIiIgq/FSecAPbevXtBbr9//74uT0BEREQUUYU4OFWtWlVP84ETymJRSFxQgcJ529AgTkRERBRRhTg44Vxn6HHCSWhxXjRcMESHc9jhfG1EREREEVWIe5wSJUokv/zyixw/flyOHj2qt+HEuwhORERERBHZS63jBFmyZNELERERUWRhKzh17drV9g6//fbbVzkeIgrjcN7IWbNm+fswiIjCbo/Tvn37bF32798f+kdMRK9dmTJldMZsvHjxdKmR0qVLy+7du19pn5hEgkVyo0aN6vEclzjzAPoj48SJI1mzZpWlS5c673v69KnUqVNHMmbMqCfYxpkKgnP79m1p1aqVJEuWTBIkSCAFCxbUE5LD8+fPpV+/frpQL+6rWbOmXLt2zWVWMCa4pE6dWtsRmjdv7nysL5gcU7JkST1GPL/x7Nkzad++vSROnFjfzw4dOugxEFEkCU4bNmywdVm/fn3oHzERhYphw4ZpgLhy5YoUKVJEatWq5XL/nDlztJ/xhx9+kBQpUmi4unXrltf95cmTRyZMmCCFCxcOch+CRbVq1aRcuXJy8+ZNrVQ3bNhQz0xgIJD897//lbRp0wZ77C9evNAZv9GjR5e///5bQ8zUqVP1OowYMULPbIAZwFevXpWECRNK48aNnY/v1q2bnDp1Sv766y85c+aMXLp0STp37hzs8+L1IXC6GzJkiPzxxx+6v8OHD8vvv/8uX3/9dbD7I6IIOKuOiCI2rMeGk3nj7ADXr1/X23CKpRYtWmjAadCggZw9e1b69+8vAQHeR/vbtWunwQgzb91t3rxZ/vnnH/n888/1foQeBDEEJXMMCC6lSpWydQ7MX3/9Vc9g8N1332mFB1WufPnyOYPTzz//rGc2eOONNyR27NjyxRdfyNq1azUkmft79+6tFSJUnPr27avH8ujRI6/PifcH78fw4cOD3Ddjxgx9f1DBwgXVrunTpwf7OogogjaHo4S/YMEC/YcKJXWrxYsXv65jIyI/QFjAlzyGvBAk4MaNGzochaG1+fPna/h4//33X/o5Dhw4oCcHN8EG8ubNq7e/DJzRADN7P/74Y1mzZo2kSpVKevbsqQHQVKQwrGbgujkODAd6uv/x48c6ezh37twen7Nt27YyaNAgPXOCFapwFy5c0NdjfW349/LOnTta7SKiSFRx+vHHH6V48eLan4Df0lByRykaw3T8B4Eo/OrTp49WW+LGjSvz5s3TX4JMRSlXrlxaFcJPhJTZs2drmHpZGBLEc1nhuqezEtiB4T60CyDYXb58WaZMmaI9RqhsQZUqVXSdOYQXPPeAAQM0CN69e9d5P05WjteEixlWM/e7w3AlghWCmqfXZl6P9bXBy74+IgrHwQn/oIwaNUqWLVum5XT8Y4T1nD766CNJnz596BwlEYU6BAf0BmEICkNa1uoPhr7wixIuuA8VZ1R4tm3b9lLPhSZ0VF+scD1+/PgvvT/0QiEs4d8lBKgaNWrI8uXLnaGwfPnyOvSHRnRUgPAYUy1C8zr+/UJfVoECBZxnQXCvJpmQhmG9iRMnej0W83qsrw1e9vURUTgOTidPntTfzgD/QD148EB/c+vSpYv+lkdE4RuCERqre/XqpU3SVvnz59fAhEbrunXrvvT/8xj+QqUaFWsDs3JR0XoZCDy+oI8K/UjozcJrqly5srYZoAkeMCSJviT0cmEbvEYM92FWoDsESuwDZ0/AcCbeE8AZFX766SfdF0KcdZYx/owZfazKE0XC4IR/FEy5Gf/AHjp0SP+M31TtTN8lorAPYQBLFJghK/T6rFy50tkbhF+YcBsan71BMMFwFh6Dqfj4s5mS/+6772oT91dffSVPnjzRfW/cuFGaNGnifDxux2PQe4SAhT8HBgY678cvbHgMYHkB3D9p0iTdBufSxBkOTOUIw3cIRNgXjrtly5a6Ph2OAU6fPq2z7XA/llbBL4JoIEelzR0CE7ZHGMIFxw6YOYdABljOAK8NMxRxwfuIpRKIKBIFJxOQ8A8eZqMAfuPs1KmTtG7dWmfaYAZNaMGCe+YfSSIKfZgJNm3aNB26Q3UZoSRDhgyyaNEiPWsAKjIYsvKmQoUK2kSOQNGjRw/9M6bpA5rCsW4T/i1B/w/+HZk7d67LqZtQ7cFj0JeEVgD82cy6w20Y9jIVKuwDVTA0tWOdJgSw8ePH65IGZvv33ntP+7cwZId+LQQb488//9QhOtxfr1496d69u65DZSD4fPDBB/pnLD+AipK54H2ANGnS6JpUgNmCCFhYvgEXDB1iph4RhX9RHNapJD7gN69ChQpp3wDWP0HZGb9JYiru1q1b9R9STL81s3DsrkCMJlNAEyr+EUIY+/LLL4NMYUZwwuwX/BbsDtOMt2zZouEO/0h5WogT5XVMj961a5ckT55cF6TDrBurhQsX6j94mKKM14N1bcxvkN4gzOE3Vww74D3Be4DXZYV/wLGODH7zxJACpkxb17bBb8pYRwaN9/gtu2LFiro+TMqUKb0+Lz62gQMH6pAKqn34hxk9F9bT4KAXA68T/Wj4/GrXrq09aaYHww40x2J4AT0a+EIKToEec2zvm0Juz4j/X5GJzCuH498N9FaiL4uI6FWF5LvOdsUJM2kwfRj/UCGcYJovwgp+48RvjiNHjgxRaDIqVaqkZXQsPoem88mTJ2sgMMxMGfxGinI8hhA8NWVijRn8pujtDcFvv/htec+ePRpiMI3Y2p+B8IeqGUr4KNUjIOJiKm2eoFyPfq+yZctqWMO6MyjHr1692rkNpm4jWOE17d27V4MTgpF11WIMCyDcILjhfUb/hPvig+4QWMeOHatVAAxL4Ddl7BchzGjUqJEGOvxWjyZZzDCy/hZNFF7h3x+GJiIK0xUnA70NmFGD3zhRgkdpHWED/5CZknVIfnNFtcR6OgVURRBIEDJwH2a61K9fX6s56KdAIsR0Yayh4g5hCPtyrzghaGHYARUfDDkAAh+2xW+tgNCF12Zm4UDRokV19g3CiSdonsXwgDVc4Vhx3KtWrdLraD5FpW7cuHF6HVU6vBZUgnAMSLeogGH6N04xATgmhFPMWMIxuMNHhmEBVKkwpADYDypU+FxwDFguImfOnFphw6knAMeEChrWmMHj7WDFKWwJCxUnIqKIJiTfdSFeABOVDTQ+4oLTI8ycOVOHojDEheqR9XxTIYUAgsoPKkOA/aMRHdUaVE28DdUFBwEEvVkmNAGqMxiKw2J1qJRhG/eTGWMbX+fIwmPQL+H+GHOqBjTHosKFqdAGhszwGDONG/ej8dW6n+zZs2tg9BacECwRAq2PwQeOkIbHIDjhJ/o+TGgCbI/nR4UK1TsiK4be0MXQSxSJVw43UG1CwyOCDsIBqi8hhQoPem4w2wb9PfhiN9UZNIdiui8qMwgSCE4vAyEjU6ZMLreZ/iHch+CEn+49RbiO233t19NjkFyx+jJCGWb4eNrGVLpMFcx9MUBfz21u93W8+InziVmhjwyziHy9JnwGuBjeFgAkIiKKjF76XHXol8FQG4bnMGMGPTnoeQop0x+EKgiG+1DJwnAdYNYMViTHMgeoauGkoJhejB4kCh3oG0H1ylwwrEhEREQvEZzQtIxpuVh5F0NmGEpDgzJux+wuT8NKdob+ULlC0zQWoEOAsp4ME9ONMf0ZK/tiaA1f5ghb5uSjdiDcYY0WK3Pd9GV528ZX35a3x2B8FFOnUS3DCUp97Rc/MaSHvii7z21uD26/1gZ0QFUPM+18vSZUDjHGay6Yik5EREQhDE5YwwRDcphKj/4YNB//8ccfWiFC+HkdMEyHoT9M6fd0VnI0O2OaPr7QQ3IyUKynggqZdZVi9ExhKNDMBMQ269atc3kctsHtvvbr6zEYgsPaMNZt0ByO62Yb3I81bazbHDt2TNed8fbcGHZE+LE+BkNqCJ3mMfiJMIYeKgPVOzy/WS3ZE6xRg+BnvRAREVEIgxO+3HE6AczIQuXH06kIXges44QqDYbmMLMOM+UQJFAtQRDAUgJY4wkhykDlC8N96N1B4DIr+qKSAw0bNtQQg9l/mJ6PJQKwnpG1GRzLHWDWGZZVQP8Rnnf37t167itvPv30U11GAetB4TEIdZhxiOUFDDwHqnFYdwZhE7MBMXsPgRNQQTOrGGPpBQQd3IfgY63goWEc5wkzKyajAR2LCaIZ/+DBg7rgH2bKYQkFwKw8NOtjcdKdO3fqMCpeCxrH7c6oIyIiopdsDn+V2XIhgQZmfMFjnSKsq4ShIgQAnEMKgQqBAEN31lM9YO0krH9k5MuXzzn7DA3lCCdr1qzRBTBR4cEQGs6Obl3TqHjx4rokAKpdqHphIUnMqHvnnXec2yBMYbo/Fsg0lR80xCMoIYhhAU+stIyZdQaWOcCwIp4PwQ7LGyCgWRu7sX6VWaDSugCmFcKj9aShCGsIYHgNCJRYIRn7tS4cipWY8V5iRXezfwytEhER0b+0jpO/+Fo5/N+C5nVUe/y9avK/ies4RZ4p7fzsQheXIyCKpOs4RVbIlzi9Cvq6iIiIKHIKN8HJ/fxv/zZUmnB2dSIiIoq8XnodJyIiIqLIhsGJiIiIyCYGJyIiIiKbGJyIiIiIbGJwIiIiIrKJwYmIiIjIJgYnIiIiIpsYnIiIiIhsYnAiIiIisonBiYiIiMgmBiciIiIimxiciIiIiGxicCIiIiKyicGJiIiIyCYGJyIiIiKbGJyIiIiIbGJwIiIiIrKJwYmIiIjIJgYnIiIiIpsYnIiIiIhsYnAiIiIiiozBadasWbJx40Z/HwYRERFFUGE+ODVr1kyiRImil+jRo0umTJmkZ8+e8vjx4xAFKrMP98u1a9d0GwQuT/dfuXLF574PHDggpUqVklixYkm6dOlk+PDhQbZZuHChZM+eXbfJlSuXrFy50uV+h8MhAwYMkNSpU0vs2LGlfPnycvz48WBf1/jx4yVjxoy63yJFisjOnTtd7sd71K5dO0maNKnEixdPateuLVevXrX5rhEREVG4C05QqVIluXz5spw6dUpGjRolkydPloEDBzrv37Bhg5QoUUI6deokNWvWlPz588vEiROd99erV08fb71UrFhRSpcuLSlSpHB5rmPHjrls536/1d27d6VChQqSIUMG2bNnj4wYMUIGDRokU6ZMcW6zdetWadCggbRs2VL27dsnNWrU0MuhQ4ec2yBsjR07ViZNmiQ7duyQuHHj6vH5Cofz58+Xrl276vuwd+9eyZMnjz7GBEHo0qWLLFu2TIPbpk2b5NKlS1KrVq0QvvtERERkRHGg3BHGK063b9+WJUuWOG9D5eT06dMaGHBf+vTppX79+lrxQdUmYcKEcuPGDWnbtq3HfV6/fl3eeOMNmT59unz88cfOilPZsmXl1q1bkihRIlvHhnDWr18/rUrFiBFDb+vdu7ce69GjR52h7cGDB7J8+XLn44oWLSp58+bVoIS3P02aNNKtWzfp3r273n/nzh1JmTKlVsrwujxBhalQoUIybtw4vf7ixQt9/R06dNBjwD6SJ08u8+bNkzp16ug2OKYcOXLItm3b9BjsQDjE+4n9JUiQINjtC/SYY2u/9HL2jGgSavvmZxd+PzsiejUh+a4LFxUnK1RqUMUxQeXEiRNy7949rbwgOGTOnFnq1q3rNTTBnDlzJE6cOM5AYYVAg/D1/vvvy5YtW3weCwLIu+++6zwWQNUHVSsEMLMNht6ssA1uBwRABC/rNvjwEIzMNu6ePn2qFS7rY6JGjarXzWNw/7Nnz1y2wXAhQqa3/cKTJ0/0L5D1QkREROEoOKFagx4d0yOE4agePXrofdmyZZNkyZJplcVOXxCg0tSwYUPtJzIQllABWrRokV4QwsqUKaNVLW8QeFAZsjLXTW+Ut22s91sf52kbd6imBQYGBrtfBDr36pmv/cLQoUM1uJkL3gciIiIKR8EJQ2j79+/X/p+mTZtK8+bNdbgO4sePL+vXr5eHDx9qs3S1atWkevXq2k/kCaotR44c0Z4jKwSwTz75RAoUKCDFixeXGTNm6E/0VEUmffr00VKluZw/f97fh0RERBRmhIvghGZpDMGhARqBBgEKVSMDVShUiUaPHi3Dhg3TSgnCFnqZ3E2bNk2H4xCQglO4cGEdCvQmVapUQWapmeu4z9c21vutj/O0jTtU2KJFixbsfjGkhx4wu/uFmDFj6viu9UJEREThKDhZoZenb9++0r9/f3n06FGQ+3PmzCkTJkzQagmWCrC6f/++LFiwIEi1yRtUuTCE502xYsVk8+bN2ktkrF27VqtXiRMndm6zbt06l8dhG9wOWF4BQca6DfqKEA7NNu4wBIfgZ30MmsNx3TwG92P5Bus26L06d+6c1/0SERFRBAtOgOZvVFwwNIceJCwBgFDw/PlzrbBgWQD0QyFEuU/hxzaNGzcOsk9Uq3755RetMKEBvXPnzjoEiHWQvEGfFEIMgtjhw4d1/2PGjNFlAgwskbBq1SoZOXKkzmrDse7evVvat2+v92OtKDzXkCFDZOnSpXLw4EFp0qSJzrTDsgVGuXLlnDPoAM8xdepUmT17tg49ohkes/cwjAmouuG4sB2Wa0CzOO5DaLI7o46IiIhcBUg4FBAQoMED6x9hjST04WCtp4sXL2qgwpR7DN25V4swvId1jDwtN4BhLSwJgH1gxl3u3Lnlt99+0yE/A8sDIHyYFRwQTtasWaPhChUeDKFhIcs2bdo4H4M+KSwJgAoZKmVZsmTR5Qreeecd5zZY0BOhB49D8CtZsqSGLYQ/4+TJk9oUbmCZAwxF4vnQ7I3hRzzG2jCO/ixU6NAPhtlymM2HahwRERFF0HWcQgLBBitpYzZcaMCSB1hIMjKd1oXrOIUtXMcp/OI6TkQR47suXFac/OXXX391GS4jIiKiyCVCBSesMh6a3M8FR0RERJFLuGwOJyIiIvIHBiciIiIimxiciIiIiGxicCIiIiKyicGJiIiIyCYGJyIiIiKbGJyIiIiIbGJwIiIiIrKJwYmIiIjIJgYnIiIiIpsYnIiIiIhsYnAiIiIisonBiYiIiMgmBiciIiIimxiciIiIiGxicCIiIiKyicGJiIiIyCYGJyIiIiKbGJyIiIiIbGJwIiIiIoqMwWnWrFmyceNGfx8GERERRVBhPjg1a9ZMokSJopfo0aNLpkyZpGfPnvL48eMQ7cfsw3r58ccfXbZB6MqfP7/EjBlTMmfOrEEsOAcOHJBSpUpJrFixJF26dDJ8+PAg2yxcuFCyZ8+u2+TKlUtWrlzpcr/D4ZABAwZI6tSpJXbs2FK+fHk5fvx4sM89fvx4yZgxo+63SJEisnPnTpf78R61a9dOkiZNKvHixZPatWvL1atXg90vERERhdPgBJUqVZLLly/LqVOnZNSoUTJ58mQZOHCg8/4NGzZIiRIlpFOnTlKzZk0NPxMnTgyyn5kzZ+p+zKVGjRrO+06fPi1VqlSRsmXLyv79+6Vz587SqlUrWb16tdfjunv3rlSoUEEyZMgge/bskREjRsigQYNkypQpzm22bt0qDRo0kJYtW8q+ffv0OXE5dOiQcxuErbFjx8qkSZNkx44dEjduXKlYsaLPcDh//nzp2rWrvg979+6VPHny6GOuXbvm3KZLly6ybNkyDW6bNm2SS5cuSa1atULwzhMREZFVFAfKHWG84nT79m1ZsmSJ8zZUThB0EBhwX/r06aV+/fpa8UHVJmHChHLjxg1p27at8zGoMP38888uYcmqV69esmLFCpdAg31i/6tWrfL4GISzfv36yZUrVyRGjBh6W+/evfVYjx49qtfr1asnDx48kOXLlzsfV7RoUcmbN68GJbz9adKkkW7dukn37t31/jt37kjKlCm14oVj8AQVpkKFCsm4ceP0+osXL/T1d+jQQY8B+0iePLnMmzdP6tSpo9vgmHLkyCHbtm3TY7AD4RDvJ/aXIEGCYLcv0GOOrf3Sy9kzokmo7ZufXfj97Ijo1YTkuy5cVJysEGxQxTFB5cSJE3Lv3j2tvCA4YIitbt26LqHJwLBVsmTJpHDhwjJjxgwNLQbCBIbIrFDBwe3e4L53333XeSzmMceOHZNbt27Z2i8CIIKXdRt8eAhG3p776dOnWuGyPiZq1Kh63TwG9z979sxlGwwXImT6ek1ERETkXYCEA6jWoEfn+fPn8uTJEw0JptKSLVs2DUOosiAUoOfHky+//FLee+89iRMnjqxZs0Y+++wzuX//vnTs2FHvR3hBlccK15FCHz16pL1H7vAY9Fy5P8bclzhxYq/7xe1mO+vjPG3jDtW0wMBAj48xlS5TBUuUKJHt/QLeX1wMvH4iIiIKRxUn03eE/p+mTZtK8+bNdbgO4sePL+vXr5eHDx9qs3S1atWkevXq2k9k9fnnn2sfVL58+XRYDg3m6EkiV0OHDtWKl7mgikdEREThKDihWRpDcGiAxhAbAtT06dOd92Om2qJFi2T06NEybNgw/cJH2Lp+/brXfWIo7MKFC87qSqpUqYLMOMN1jHV6qjb5eoy5z9c21vutj/O0jTtU2KJFixbsfjGkhx4tu/uFPn366BivuZw/f97rtkRERJFNuAhOVhim69u3r/Tv31+H0NzlzJlTJkyYoF/6WCrAG1SwMJSGpQegWLFism7dOpdt1q5dq7d7g/s2b96svUTWx2D4EPu2s18M9SHIWLfB8BjCobfnxhBcgQIFXB6D5nBcN4/B/Vi+wboNeq/OnTvn8zXh/UBYtF6IiIgonAYnQPM3Ki4YmsPMOiwBgFCAHihUWDAEh7WNEKIAU/KnTZumjeVoJsdsuK+//lpnoBmffvqpLneAITz0CSF8LViwQKf0e9OwYUMNMVhq4PDhw7pEwJgxY3SZAANLJGBW3siRI3W/ONbdu3dL+/btnbP9sPTBkCFDZOnSpXLw4EFp0qSJzrSzzgAsV66cs68L8BxTp06V2bNny5EjR7QZHrP3MIwJqLrhuLAdlmtAszjuQ2iyO6OOiIiIwmFzuLuAgAANHlj/CGskYTgJaz1dvHhRAxWm3GPoDksTACovCFkIQZhJh2G/b7/9Vlq3bu3cJyo/WI4A2yD8pE2bVsMWZsAZWB4A4cPMxkM4QaM5ZuuhwoMhNCxk2aZNG+djihcvrksCoEKGSlmWLFl0uYJ33nnHuQ3CGkIPHofgV7JkSQ1bCH/GyZMntSncwDIHGIrE86HZG8sb4DHWhnGseYUKHfrBMCSJ14JASERERBF0HaeQQLDBrLoyZcqEyv6x5AEWkoxMp3XhOk5hC9dxCr+4jhNRxPiuC5cVJ3/59ddfXYbLiIiIKHKJUMEJq4yHJvdzwREREVHkEi6bw4mIiIj8gcGJiIiIyCYGJyIiIiKbGJyIiIiIbGJwIiKKpEJ7Qg1RRMTgREQUgWAdO5w6KV68eJIkSRIpXbq0nq3gZWHxXOwzRYoUur5N9uzZZcqUKc77cU7MOnXq6Bp6OBMCFvj1BWdtwLGZC85FisctXrxY7798+bKeqB1nT8DtOD2WFdbRw+3WfZgzMXiCM0r069dPT1iO469Zs6Zcu3bN5X6cvQHPh3V8sAAxzrRA5A2DExFRBIOTnd+/f1/PKoATmteqVcvl/jlz5ugZFn744QcNRAhXt27d8nqmhu+++04uXbqkiwQi4Hz++efy+++/O7dB2Pjvf/+rZ1wIDs6ggGMzFxwLAssHH3yg9+NsBzgThK8Ahu2t+/C1vh5OwYWzQmzfvl1Pco7HNm7c2Hk/HovTcm3btk1u3rypz43gFoHWhqbXjMGJiCiCwrk0mzZtqqelwimaAKematGihZ52CqesOnv2rJ4SCgHJE5zGKleuXM77Ue3BBef9NM+Bik2pUqV025CaPn26Hkfs2LH1Ok4b9dlnn0nhwoXldfj555+lY8eO8sYbb+hzfPHFF3qi9TNnzuj9OEcpzgWaIUMGPX6cVgsh8Z9//nktz08RD4MTEVEE9ejRIw0mOI9m4sSJ9Tac8xLBp0SJEnodYeL999+X+PHj+9xX1apVnSdPR7jBkNerunDhgqxevVpatWoVosehyoShNVS4GjVqpGHQmxcvXrhUj3AdDhw4oD9xMnQMzeF8oM+ePdNzlOJk6HjPiDxhcCIiimD69OkjiRIl0v4hnGQcw2umYoTqEUIQfuLcm7Nnz3Y5gbg3y5cv15ORo8cIJw43FaJXMXPmTMmdO7eeJN0u9Fih7wlVNPRuIRRVq1bNGYjcValSRU/cfu7cOQ1cODE6giOGHeHNN9/Uk6Tj5O94TejfmjRp0iu/Noq4GJyIiCKYoUOHyu3btzVcYIjKVFdMDxGGr3DBfQsWLNDQgB6f4GAoC/1Q6BVC79CrQOBBcELFJyRSpUol77zzjh4L/oyg8+eff8rff//tNUSWL19ehxKzZs2qIQkN5UmTJtX7MSyI4UoMzz1+/FhD1nvvvafXwzLOiPQfBicioggKwWjq1KnSq1evIEEgf/78GpjQOF23bl2XmXLBwZDW8ePHX+nY1q1bpzPorI3aLwPVI18wvIh+LhOOKleurDMB0TQP+/bt0xCSOnVqrcphhiAayLdu3SrhfUYkwiSGVBEwUYHE8OyWLVuc98+dO9dldiIueD/xfnlz5MgR3U+cOHE0iC5dutRl6LV48eIaSvEeIqQioHuCv294rtGjR/t8Ddgn/n7i+HGpWLGix+0aNmzocRZmaGBwIiKKwBCQ8IWMZQAAgWflypXOoS0Mv+E2BAdP8EWEZmr0S2HqPoIWvnCtX2BYsgDVGlSREKrw58DAQOf9+ELDEJ8Veq8w2w9fhu7weFwAIQd/Nse7YcMGOX36tD4XGrjbtm0rb7/9tmTJksXj8SOcITRhe7xOVLi6du2qwQTQz4SZfWiex3Pgix5f1hjKDO8zIlF1xGzFgwcP6nuFgIjgaIZm0R9mnZ2IoVtUJBFUPMFnW61aNW2mxwxEBCwEFjNRAH10s2bN0vfyzp07MmHCBA3G+LysEGBRsQzuPcbfzbJly0qePHm0eorjHjJkSJDt8HcSVdB/C4MTEVEEh3WM0PSMLx/MgkMPD2aRLVq0SAMHKhK9e/f2+FiEJSwhgIZwVBLwZ/OFaWTLlk37g9BH9NFHH+mfsTwB4DY0nlu/JPGli4DirSkcjzc9VAgP+PPmzZudFaJ3331XqyMYssPxof/KzOjDMgm4z8DzY+gN/V4YskN/11dffeW8/z//+Y+u8YReK4S4gQMHajjBawrvMyIxM7FNmzaSPHlyfX9at26tP61Dt+5htkKFCvp+eILP4J9//tHlKFDJw3uJ4GY+a7zHqEIhfCGo4icCtJnBaLRr1073YcKrNwhhaNLHa8TfIbzOQoUKuWxz79496dKly7/al+b53SYionDJvbJjqiqmggNmeAUVCHw5+VKwYEHZtWuXz23cvxitUCHCF6XpKQJ8YVqPx52vNZRQLcLFG/QyoXpiIHhhxpw3GFJCYAhvMyLnz5/vnBFpFypPCBqYGenp+TCRwNd7gcD19ttvS/To0Z23YTjOPYghhB49elQrVAit+EyMn376SRvzmzRpIjNmzPB5vKiAYeYkqmY7duyQTJkyyeDBg7VqZu1h+/jjj71WHEMDgxMREYUaVE3IPgSBQYMGabjAUJy3GZGo5mBGJGYN2lk6AcN29evX14ohKozuEGhQ5cLin94gkCZyG1rFdYQxKwQpDLGuWbNGA5SpBmJIsUePHnq7HahMInijMoqwjyE59KBh/+jPQx8aflHYu3ev/Js4VEdEFEkFV22iiDEjEv1G6EnDCu8IZZ6g0oQqkLWa5A5DoHfu3Amyb09rgCGEIeQh+KAnDhCa0GNmtzqE50OzeY0aNfS48BNLVyB4IZhhGHLixIn6XP8mVpyIiMKxAj3m+PsQIrw9I5r4bUYk+rkwMw4LfrrPiETwRd8SZqhhONZXaMIQG/qAPM1CRHM3+peC6xPCENzgwYN1CM4ELEwewPHYmYH522+/aSXNzKTDsWHWIPrSUFVyh6bw9evXe9wvGswxw899IVY0k6N/ytdw7qtixYmIiCgCzohESMG599CwjckB3pZuQLUJwQuLi7rDyZtNZRIhLkmSJNpcj5mUOBYMlaFSZXqSUP1CNQgXPA4VJ9OHhfMFooKGsIUL+udQhZo8ebLH48J+MQyH5n+8ZvzEdQRBNLCjOd7syyxDgN4vhMnQxOBEREQUAWdEYkgPYQXbJkiQwLlWkxk6A8x6Q6+UpxmOCEdoSC9atKheR5Vp6dKlujwFeps6deqk+0L1ywS5Tz75RCcCYBYmhtF+/PFHHSIEHCuavc0Fa1ahOd/0aLnPiHzrrbe096pnz556/Jhdh9eC29E3Zd2XOcE0+sKCO33Qq4ri4CmgyQf8xoK/2Cip4i9ucDhsEH6HDPjZhc/Pjp9bxByqC46dGZGvChUkBDWsGRXR3Q3Bd12EqjjhL5GnqbhEREQUMlijKTKEppAK88EJqRrjsrigTIh1HFC287UGiDucxwiLhWFMFOteYNVVnI/ICoHLPI/1gtVbfcF4LdaowGJg2P/w4cODbLNw4UIdO8Y2mEaKcWErFP1w4kmMU+P4sEibndMZjB8/XsefsV+sVbJz506X+/EemfVTUP7EiTn/zdVViYgodHBGpP+Ei1l1aG7DySDRnb9nzx5dFwShBkvTA5rPMPZ56NAhna6JcIXmMCzFD3gMxj2///57DTdY+wHTGDFG2r59e5fnOnbsmEuZDo/zVdrDKqsIOihnYnExrOqKsV/sH/BcCG2YYoqpmVhgDFMq0eCGVW8BYWvs2LE6zoxjx4wANL/99ddfGoo8QQMcZg3geRGaMEsBj8Hxm2PGaqpY9wLBDSVIvFYs3289VxEREfkHh1nD5zBruAhOaCAzC3Yh+CCooDkNwQnrXXz44Ye6sBcCFqo2CAnmXDyAMGP15ptvauc/FhZzD04IHZ7OneQJmuIwcwCrn6JpD9M90dmP5fBNcEJlC8eFmQOAqZw49nHjxmnoQbUJoQfBD68DsNw/GuuWLFmir8sTPAfCYfPmzfU69oWQhGNBoyDGaTFTAkENK7cCwieqbWgWNM1+REREFIGG6tyhqoQqjlnwCutPYNVSnF8IoQrd/ThBoak2eYNg4ek8OVg+HuEL0yeDq8wgfGF6pnXxLVP1MSddxDYIelbYxixYhpMfYjjQug2CH6pI3hY1Q1hDFc36GFTacN08BvejQmfdBsOF6dOn97lYGmZRoJJmvRAREVE4Ck5YuwE9OqZH6Nq1a84KDk7EiKmMqLLY6QsCBC8MdZmqECAsoWqDqY64IIRh/QxfS7kj8KAyZGWum94ob9tY77c+ztM27lBNwxTS4PaLQOdePfO1X8CQIoKbuXg72SMREVFkFC6CE1YCxRAYTvKH/iYMT6HRGbBeA1YWffjwoTZLV6tWTc+1gzNoe6tYYUgMFSr0JxkIYFh/Asu5Y4l3DHnh56hRoySynScJ1ThzwdohREREFI6CU9y4cXUIDsuvI9AgQFnP4IwqFKpE6BVC3xMqJQhb169fd9kPmq3LlSunlSb0FAWncOHCOhToDfqu3GepmeumJ8vbNtb7rY/ztI07VNjQ2B7cfjGkhx4wu/s1/WRojrdeiIiIKBwFJyv08uDszgg+jx49CnJ/zpw5ZcKECVotsZ4c8fDhwxqmULHCcvF2oMrlbSl7wBL1OL8PeokMNH6jepU4cWLnNuvWrXN5HLYx5xXCLDoEGes26CtCOPR27iEMwaEyZn0MlqPHdfMY3I/lG6zboPfq3LlzXvdLREREESw4AZq/UXHB0Bx6kHC2Z4SC58+fa4VlxIgR2g+FEGWG5xCaMDSHKfzo8cHFWpFCteqXX37RChO279y5sw4BYh0kbxo2bKghBmd7RjBD3xRm0VlPLogl6VetWiUjR46Uo0eP6rHipIZmNh+WVcBzDRkyRJeyx5IGOD8PTuiIZQsMVMowE8/Ac+AEkFjCACc6RDM8lrs3s+xQdcNxYTss14BmcdyH0MQZdURERBF4OQJ3AQEBGjyw/hHWSEIfDqb8X7x4UQMVptxj6M5Ui3CuG4QkrOOEi4Hz/Zw5c0b/jGGtbt266T7ixImjZ4HGmZwRuKwLjiF8mLPUIJysWbNGwxUqPBhCw0KW1qZz9ElhSQBUyFApw7mFsMyAWcMJsKAnQg8eh+CH8/ogbFnXcDp58qTLEgv16tXT14TnQwjEbEA8xtowjv4sVOjQD4bZcpjNh2ocERERvZwIda46BBuspI3ZcKEBDeU4d09kOq0Lz1UXtvBcdeEXz1UXfvGzi/if3d0QfNeFy4qTv/z6668uw2VEREQUuUSo4ITz2oUm93PBERERUeQSLpvDiYiIiPyBwYmIiIjIJgYnIiIiIpsYnIiIiIhsYnAiIiIisonBiYiIiMgmBiciIiIimxiciIiIiGxicCIiIiKyicGJiIiIyCYGJyIiIiKbGJyIiIiIbGJwIiIiIrKJwYmIiIjIJgYnIiIiIpsYnIiIiIhsYnAiIiIisonBiYiIiMgmBiciIiIimxiciIiIiGxicPqXzJo1SzZu3OjvwyAiIqJXwOD0Cpo1ayZRokTRS/To0SVTpkzSs2dPefz4cYj2c+7cOalSpYrEiRNHUqRIIT169JDnz5/7fMzNmzelUaNGkiBBAkmUKJG0bNlS7t+/77LNgQMHpFSpUhIrVixJly6dDB8+/KVeJxEREf1PgL8PILyrVKmSzJw5U549eyZ79uyRpk2bapAaNmyY3r9hwwbp37+/HDp0SKJGjarhqnXr1tK2bVu9PzAwUENTqlSpZOvWrXL58mVp0qSJBrGvv/7a6/MiNGHbtWvX6nM3b95c2rRpI/PmzdP77969KxUqVJDy5cvLpEmT5ODBg9KiRQsNWdiOiIiIQo7B6RXFjBlTQw+gqoOggjCD4HT79m358MMPpX79+hqwUqdOLQkTJpQbN244H79mzRr566+/5LfffpOUKVNK3rx5ZfDgwdKrVy8ZNGiQxIgRI8hzHjlyRFatWiW7du2SggUL6m3fffedVK5cWf7zn/9ImjRpZO7cufL06VOZMWOG7uPtt9+W/fv3y7fffsvgRERE9JI4VPcaoaqEqpEJOydOnJB79+7JwIEDNVRlzpxZ6tat66w2wbZt2yRXrlwamoyKFStqxejw4cMenwePQeXIhCZAYENFa8eOHc5t3n33XZfghf0eO3ZMbt26FSqvn4iIKKJjxekVLV++XOLFi6c9SU+ePNHwMm7cOL0vW7ZskixZMundu7ekT59eMmbMGOTxV65ccQlNYK7jPk9wO3qhrAICAiRJkiTOx+AnhgW97Tdx4sQe943XgItx584d/YkgZ0fgk0e2tqOXY/dzeBn87MLnZ8fPLfTxs4v4n93d/9vO4XAEuy2D0ysqW7asTJw4UR48eCCjRo3SAFO7dm29L378+LJ+/Xodchs/fryMHTtWt//iiy8kX758EhYNHTpUj88dKmbkfwm/+9Tfh0AviZ9d+MXPLvJ8dvfu3dOWGl8YnF5R3LhxdQgO0E+UJ08emT59us5yAwzDLVq0SJcjePjwoQ6hITwdP35ckidPrv1RO3fudNnn1atX9afpnXKH269du+ZyGypemGlnHoOfZj929wt9+vSRrl27Oq+/ePFC95s0aVJteo9I8BsGAuH58+d1diKFH/zswi9+duFXRP7sHA6Hhib0CAeHwek1wjBd3759NXg0bNhQYseO7XJ/zpw55eOPP5bvv/9elwooV66cFCtWTL766isNQmb4Dc3l+EuJ7T3BY9B4jll8BQoU0NtQ2ULIKVKkiHObfv366Yw7zNAz+8XwobdhOtPsjosV+qkiMrzXEe0fgciCn134xc8u/EoQQT+74CpNBpvDXzM0f0eLFk2H5vbu3avDdGjIRkUIYWfEiBG6rpIJRVgywASqP//8U1avXq3LF7Rr184ZYFCRyp49u1y8eFGv58iRQ2fpYVkD3LdlyxZp3769zt4zaRnBDY3hqHyhyXz+/PkyZswYl2oSERERhQwrTq8ZepwQYrDYZIMGDbSkiZCD0INAhdCDoTssTQC4DQ3mmGmHKhGG/rAW1JdffuncJ4b4EL5QPTKw3ACeB1UrVLrQV4UeKmtyxlIHCGCoSqFJfcCAAVyKgIiI6BVEcdhpIadXhh4nzKorU6aMvw+F/g9mD6IZHn1d7sOTFLbxswu/+NmFX/zs/ofB6V/C4ERERBT+MTgRERER2cTmcCIiIiKbGJyIiIiIbGJwokgDi49iFmOVKlVcbj9z5owu7omTIFPY0axZM/1czAWLsGKGKtZAc/fJJ5/oZ7tw4UK/HCsFdf36dZ0tjNNNmZOh43yZWD4F0PNp/XzN5ZtvvvH3oUd41apV0/+XPPn999/1c8D/Z9bPBWfCwMni27Vrpws4u8NJ5TGbHItAx4kTR2dylyhRQmbOnOkyIzwiYHCiSAMrunfo0EE2b94sly5d8vfhkA34x/3y5ct6WbdunS73UbVqVZdtsFzHjz/+KD179tTV+ylswBIp+/btk9mzZ8vff/8tS5cu1ckx//zzj3MbLLtiPl9zwf+jFLqwvh8WRL5w4UKQ+xB0cAJ5s8Dlb7/9pp8L1hn8+uuv5ciRIxqO8P+jNTQhFCP0YskbnOweawwiZH333XdeT1gfbqE5nCiiu3fvniNevHiOo0ePOurVq+f46quvnPedPn0aEyQc+/bt8+sxkqumTZs6PvzwQ5fbfv/9d/2srl275rxt1qxZjqJFizpu377tiBMnjuPcuXN+OFqyunXrln5OGzdu9LpNhgwZHKNGjfpXj4v+59mzZ46UKVM6Bg8e7PHfyYkTJ3r9dzEwMNBRpkwZ/fyeP3+utw0bNswRNWpUx969e4M819OnTx337993RCSsOFGksGDBAl19Haecady4sVYmOKE0fLl//76ergjnhsSwnbWSiM8Ui75+8MEHuvQH+Ve8ePH0smTJEl37h8IWVG6bNGmi/69Y/x3EUHdgYKAu3uxN1KhRpVOnTnL27Fk97ZdZkLl8+fIeT16PU35hYeeIhMGJIgXz5WqGf+7cuSObNm3y92FRMLCqvvkSRo8Fhntw+iD84w3otdi+fbvUq1dPr+MzxlADQ7H/v5jxpYxhOpzrEr0uOI+ne39ar169nJ+vuaDHhkJfixYt5OTJky7/DuL/HQyxBnfOtuzZszv7Q83/h+a2yIDBiSI8nK4G4+3mtyj8o44vWoQpCtvKli2rTfu44DNEHwWqSvhtF1A5xG1oRIXKlStrKMZJr8m/8AWMXkKEXfyysnHjRsmfP79LRbBHjx7Oz9dc0F9DoQ9Bp3jx4s6+wBMnTmhoRf9TcBz/94sJmsat1yMLBieK8BCQcJJlnAAZoQmXiRMn6jkD8SVLYRdK/Biaw6VQoUIybdo0efDggUydOlWHFFDRWLFihfNzxWyemzdvskk8jMAJzd9//335/PPPtWEYMyUHDhzovB+B13y+5hI7dmy/HnNkgpCEfwfv3bun1aa33npLSpcuHezjjhw5oj8zZcqkP7NmzSpHjx6VyILBiSI0BKY5c+bIyJEjXX6rxQwRBKkffvjB34dIIYDfcDFM9+jRI1m5cqX+g4+ZW9bPFp/p4sWL5fbt2/4+XHKTM2dODb4UNnz00Uf6/9O8efP030kM35kqkjcvXrzQE8ojNJmepoYNG+rsO/y/6A5LEUS0zzzA3wdAFNo9Mrdu3dLfrNzH7TGUgGqUWc8EQ3rusG4JmhvJP9BYfOXKFf0zPsdx48ZpkzjWoRk9erSuyYWp0e5fzl26dNGGVUyHpn8flhyoW7eufhHnzp1b+9N2796t6/x8+OGHzu0QfM3na6BqaKbCU+hCTxnaFnDS3rt372pF0NNnic8Iy34cOnRI/7/DsDkqvVg7DTp37qzXy5UrJ4MHD5aSJUs6P/Nhw4bpv7N58+aVCMPf0/qIQlPVqlUdlStX9njfjh07dLrtn3/+qT89Xc6fP/+vHzP9/+UIrJ9F/PjxHYUKFXL89NNPjitXrjgCAgIcCxYs8PjYtm3bOvLly/evHzP9z+PHjx29e/d25M+f35EwYUJdJiJbtmyO/v37Ox4+fKjbYDq7p//nPvnkE38ffqSydetWfd/d/500yxGYCz7DHDlyOD777DPH8ePHPX7mQ4cOdeTKlcsRK1YsR5IkSRwlSpTQ5UKw/EFEwpP8EhEREdnEHiciIiIimxiciIiIiGxicCIiIiKyicGJiIiIyCYGJyIiIiKbGJyIiIiIbGJwIiIiIrKJwYmIiIjIJgYnIiIiIpsYnIiI/KBMmTJ6ji93s2bNkkSJEumfBw0apCdddb/ghKpE5B88yS8RURiGE027B6UkSZL47XiIIjsGJyKiMCwgIEBSpUrl78Mgov/DoToiIiIimxiciIjCsIMHD0q8ePGcl8KFC/v7kIgiNQ7VERGFYdmyZZOlS5c6r8eMGdOvx0MU2TE4ERH5QYIECeTOnTtBbr99+7YkTJjQeT1GjBiSOXPmf/noiMgbDtUREfmpkrR3794gt+O2rFmz+uWYiCh4DE5ERH7Qtm1b+fvvv6Vjx45y4MABOXbsmHz77bfyww8/SLdu3fx9eETkBYfqiIj84M0335TNmzdLv379pHz58vL06VPJnj27LFy4UCpVquTvwyMiL6I4HA6HtzuJiIiI6P/jUB0RERGRTQxORERERDYxOBERERHZxOBEREREZBODExEREZFNDE5ERERENjE4EREREdnE4ERERERkE4MTERERkU0MTkREREQ2MTgRERER2cTgRERERCT2/D+PF6KLsrB1pQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import matplotlib.ticker as mtick\n", + "import seaborn as sns\n", + "\n", + "# Agrupa corretamente e transforma em DataFrame\n", + "df_plot = df2.groupby('UF')['valor_estoque_parado'].sum().reset_index()\n", + "\n", + "plt.figure(figsize=(6, 4))\n", + "ax = sns.barplot(data=df_plot, x='UF', y='valor_estoque_parado', errorbar=None)\n", + "\n", + "ax.yaxis.set_major_formatter(mtick.StrMethodFormatter('R${x:,.2f}'))\n", + "\n", + "# Adiciona os valores no topo de cada barra\n", + "for p in ax.patches:\n", + " valor = p.get_height()\n", + " ax.annotate(f'R$ {valor:,.2f}', (p.get_x() + p.get_width() / 2, valor),\n", + " ha='center', va='bottom', fontsize=9)\n", + "\n", + "plt.title(\"Estoque parado por UF\")\n", + "plt.ylabel(\"Valor\")\n", + "plt.xlabel(\"UF\")\n", + "plt.tight_layout()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "7134a0d6", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'credenciais'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mKeyError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[13]\u001b[39m\u001b[32m, line 19\u001b[39m\n\u001b[32m 16\u001b[39m config = configparser.ConfigParser()\n\u001b[32m 17\u001b[39m config.read(\u001b[33m\"\u001b[39m\u001b[33mconfig.ini\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m---> \u001b[39m\u001b[32m19\u001b[39m remetente = \u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mcredenciais\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m]\u001b[49m[\u001b[33m'\u001b[39m\u001b[33mremetente\u001b[39m\u001b[33m'\u001b[39m]\n\u001b[32m 20\u001b[39m senha = config[\u001b[33m'\u001b[39m\u001b[33mcredenciais\u001b[39m\u001b[33m'\u001b[39m][\u001b[33m'\u001b[39m\u001b[33msenha\u001b[39m\u001b[33m'\u001b[39m]\n\u001b[32m 21\u001b[39m destinatarios = [email.strip() \u001b[38;5;28;01mfor\u001b[39;00m email \u001b[38;5;129;01min\u001b[39;00m config[\u001b[33m'\u001b[39m\u001b[33memail\u001b[39m\u001b[33m'\u001b[39m][\u001b[33m'\u001b[39m\u001b[33mdestinatarios\u001b[39m\u001b[33m'\u001b[39m].split(\u001b[33m'\u001b[39m\u001b[33m,\u001b[39m\u001b[33m'\u001b[39m)]\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\joao.herculano\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\configparser.py:998\u001b[39m, in \u001b[36mRawConfigParser.__getitem__\u001b[39m\u001b[34m(self, key)\u001b[39m\n\u001b[32m 996\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m__getitem__\u001b[39m(\u001b[38;5;28mself\u001b[39m, key):\n\u001b[32m 997\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m key != \u001b[38;5;28mself\u001b[39m.default_section \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m.has_section(key):\n\u001b[32m--> \u001b[39m\u001b[32m998\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key)\n\u001b[32m 999\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._proxies[key]\n", + "\u001b[31mKeyError\u001b[39m: 'credenciais'" + ] + } + ], + "source": [ + "# enviar_email_excel.py\n", + "\n", + "import pandas as pd\n", + "import smtplib\n", + "import ssl\n", + "from email.message import EmailMessage\n", + "from email.utils import make_msgid\n", + "from email.mime.image import MIMEImage\n", + "from pathlib import Path\n", + "import configparser\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.ticker as mtick\n", + "import seaborn as sns\n", + "\n", + "# 0. Ler configurações do arquivo INI\n", + "config = configparser.ConfigParser()\n", + "config.read(\"config.ini\")\n", + "\n", + "remetente = config['credenciais']['remetente']\n", + "senha = config['credenciais']['senha']\n", + "destinatarios = [email.strip() for email in config['email']['destinatarios'].split(',')]\n", + "assunto = config['email']['assunto']\n", + "\n", + "# 1. Criar dados fictícios e gerar Excel\n", + "df = pd.DataFrame({\n", + " 'Nome': ['Ana', 'Bruno', 'Carlos'],\n", + " 'Idade': [28, 34, 45],\n", + " 'Email': ['ana@example.com', 'bruno@example.com', 'carlos@example.com'],\n", + " 'UF': ['SP', 'RJ', 'SP'],\n", + " 'valor_estoque_parado': [12000, 8000, 15000]\n", + "})\n", + "\n", + "excel_path = Path(\"relatorio.xlsx\")\n", + "df.to_excel(excel_path, index=False)\n", + "\n", + "# 2. Criar e salvar gráfico\n", + "plot_df = df.groupby('UF')['valor_estoque_parado'].sum().reset_index()\n", + "plt.figure(figsize=(6, 4))\n", + "ax = sns.barplot(data=plot_df, x='UF', y='valor_estoque_parado', errorbar=None)\n", + "ax.yaxis.set_major_formatter(mtick.StrMethodFormatter('R${x:,.2f}'))\n", + "for p in ax.patches:\n", + " valor = p.get_height()\n", + " ax.annotate(f'R$ {valor:,.2f}', (p.get_x() + p.get_width() / 2, valor),\n", + " ha='center', va='bottom', fontsize=9)\n", + "plt.title(\"Estoque parado por UF\")\n", + "plt.ylabel(\"Valor em Reais\")\n", + "plt.xlabel(\"UF\")\n", + "plt.tight_layout()\n", + "plt.savefig(\"grafico.png\")\n", + "plt.close()\n", + "\n", + "# 3. Criar e-mail com imagem embutida\n", + "grafico_cid = make_msgid()[1:-1] # remove < >\n", + "msg = EmailMessage()\n", + "msg['From'] = remetente\n", + "msg['To'] = ', '.join(destinatarios)\n", + "msg['Subject'] = assunto\n", + "\n", + "html_email = f\"\"\"\n", + "\n", + " \n", + "

Prezados,

\n", + "

Segue em anexo o relatório em Excel conforme solicitado.

\n", + "

Resumo gráfico:

\n", + "
\n", + "

Atenciosamente,
Equipe de Dados

\n", + " \n", + "\n", + "\"\"\"\n", + "\n", + "msg.set_content(\"Seu e-mail precisa de um visualizador HTML.\")\n", + "msg.add_alternative(html_email, subtype='html')\n", + "\n", + "# 4. Anexar gráfico inline\n", + "with open(\"grafico.png\", 'rb') as img:\n", + " msg.get_payload()[1].add_related(img.read(), 'image', 'png', cid=grafico_cid)\n", + "\n", + "# 5. Anexar o Excel\n", + "with open(excel_path, 'rb') as f:\n", + " msg.add_attachment(\n", + " f.read(),\n", + " maintype='application',\n", + " subtype='vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n", + " filename=excel_path.name\n", + " )\n", + "\n", + "# 6. Enviar o e-mail via SMTP Outlook com configurações fornecidas\n", + "with smtplib.SMTP('smtp-mail.outlook.com', 587) as smtp:\n", + " smtp.ehlo()\n", + " smtp.starttls(context=ssl.create_default_context())\n", + " smtp.login(remetente, senha)\n", + " smtp.send_message(msg)\n", + "\n", + "print(\"E-mail enviado com sucesso.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27f8eff0", + "metadata": {}, + "outputs": [], + "source": [ + "df2['valor_estoque_parado']" + ] + } + ], + "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 +} diff --git a/promoção/__pycache__/compilador_estoque.cpython-313.pyc b/promoção/__pycache__/compilador_estoque.cpython-313.pyc new file mode 100644 index 0000000..0c2f6fc Binary files /dev/null and b/promoção/__pycache__/compilador_estoque.cpython-313.pyc differ diff --git a/promoção/compilador de promo_analistas.ipynb b/promoção/compilador de promo_analistas.ipynb new file mode 100644 index 0000000..46e0643 --- /dev/null +++ b/promoção/compilador de promo_analistas.ipynb @@ -0,0 +1,155 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "fd67cc1a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\joao.herculano\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\openpyxl\\worksheet\\_reader.py:329: UserWarning: Unknown extension is not supported and will be removed\n", + " warn(msg)\n", + "c:\\Users\\joao.herculano\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\openpyxl\\worksheet\\_reader.py:329: UserWarning: Unknown extension is not supported and will be removed\n", + " warn(msg)\n", + "c:\\Users\\joao.herculano\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\openpyxl\\worksheet\\_reader.py:329: UserWarning: Unknown extension is not supported and will be removed\n", + " warn(msg)\n", + "c:\\Users\\joao.herculano\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\openpyxl\\worksheet\\_reader.py:329: UserWarning: Unknown extension is not supported and will be removed\n", + " warn(msg)\n" + ] + } + ], + "source": [ + "import os\n", + "import glob\n", + "import pandas as pd\n", + "\n", + "# Directory path\n", + "folder_path = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BOT\\Bot - C13\\LANÇAMENTOS\\devolutiva comercial\"\n", + "# Collect files\n", + "file_paths = glob.glob(os.path.join(folder_path, \"*.xls\")) + glob.glob(os.path.join(folder_path, \"*.xlsx\"))\n", + "\n", + "# Required columns\n", + "required_columns = [\"PDV\", \"PRODUTO LANÇAMENTO\", \"SUGESTÃO COMERCIAL\"]\n", + "\n", + "# Load files\n", + "dfs = []\n", + "for file_path in file_paths:\n", + " try:\n", + " df = pd.read_excel(file_path,sheet_name='Sheet1')\n", + " \n", + " missing = [col for col in required_columns if col not in df.columns]\n", + " \n", + " if missing:\n", + " print(f\"Missing columns {missing} ins file: {file_path}\")\n", + " continue # Skip file with missing columns\n", + "\n", + " df[\"source_file\"] = os.path.basename(file_path)\n", + " dfs.append(df)\n", + "\n", + " except Exception as e:\n", + " print(f\"Failed to read {file_path}: {e}\")\n", + "\n", + "# Combine\n", + "if dfs:\n", + " combined_df = pd.concat(dfs, ignore_index=True)\n", + "else:\n", + " print(\"No valid files loaded.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c4c50096", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.int64(82418)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "\n", + "combined_df['SUGESTÃO COMERCIAL'].isna().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3e1ada65", + "metadata": {}, + "outputs": [], + "source": [ + "combined_df = combined_df.drop_duplicates()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f5968d9a", + "metadata": {}, + "outputs": [], + "source": [ + "combined_df['chavers'] = combined_df['PDV'].astype('str') + combined_df['PRODUTO LANÇAMENTO'].astype('str')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "fd6a08e7", + "metadata": {}, + "outputs": [], + "source": [ + "combined_df['chavers'] = combined_df['chavers'].str.replace('.','')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b6eee60e", + "metadata": {}, + "outputs": [], + "source": [ + "combined_df.to_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\BD_LANÇAMENTOS\\BOT\\Bot - C13\\LANÇAMENTOS\\compilado_comercial_BOTI!!!.xlsx\",index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84f989f7", + "metadata": {}, + "outputs": [], + "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": 5 +} diff --git a/promoção/compilador_estoque.py b/promoção/compilador_estoque.py new file mode 100644 index 0000000..748b859 --- /dev/null +++ b/promoção/compilador_estoque.py @@ -0,0 +1,51 @@ +import pandas as pd +import numpy as np +import os +from datetime import date + +def unificador_estoque(pasta_entrada): + hoje = date.today().isoformat() + caminho_saida = os.path.join(pasta_entrada, f"compilado_estoque_{hoje}.xlsx") + print("Salvando em:", caminho_saida) + + subpastas = [ + os.path.join(pasta_entrada, d) + for d in os.listdir(pasta_entrada) + if os.path.isdir(os.path.join(pasta_entrada, d)) + ] + + df_list = [] + + for subpasta in subpastas: + arquivos = [f for f in os.listdir(subpasta) if f.endswith(".csv")] + nome_pasta = os.path.basename(subpasta) + + for arquivo in arquivos: + caminho_arquivo = os.path.join(subpasta, arquivo) + try: + df = pd.read_csv(caminho_arquivo, encoding="utf-8", low_memory=False) + df["Arquivo_Origem"] = arquivo + df["Pasta_Origem"] = nome_pasta + df_list.append(df) + except Exception as e: + print(f"Erro ao ler o arquivo {arquivo}: {e}") + + if not df_list: + raise ValueError("Nenhum arquivo CSV válido foi encontrado.") + + df_estoque = pd.concat(df_list, ignore_index=True) + + df_estoque["PDV"] = df_estoque["PDV"].astype(str) + + df_estoque["SKU_FINAL"] = np.where( + df_estoque["SKU_PARA"] == "-", + df_estoque["SKU"], + df_estoque["SKU_PARA"] + ).astype(str) + + try: + df_estoque.to_excel(caminho_saida, index=False) + except Exception as e: + raise RuntimeError(f"Erro ao salvar o arquivo Excel: {e}") + + return caminho_saida \ No newline at end of file diff --git a/promoção/importador_teste.ipynb b/promoção/importador_teste.ipynb new file mode 100644 index 0000000..1c9e780 --- /dev/null +++ b/promoção/importador_teste.ipynb @@ -0,0 +1,71 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "eba7e63d", + "metadata": {}, + "outputs": [], + "source": [ + "from compilador_estoque import unificador_estoque\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b59cf803", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Salvando em: C:/Users/joao.herculano/OneDrive - GRUPO GINSENG/Documentos/estoque EUD 14.05\\compilado_estoque_2025-05-14.xlsx\n" + ] + }, + { + "data": { + "text/plain": [ + "'C:/Users/joao.herculano/OneDrive - GRUPO GINSENG/Documentos/estoque EUD 14.05\\\\compilado_estoque_2025-05-14.xlsx'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "unificador_estoque('C:/Users/joao.herculano/OneDrive - GRUPO GINSENG/Documentos/estoque EUD 14.05')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b91d6db", + "metadata": {}, + "outputs": [], + "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": 5 +} diff --git a/promoção/pensamentos de att do painel 40 d.ipynb b/promoção/pensamentos de att do painel 40 d.ipynb new file mode 100644 index 0000000..4a9d98a --- /dev/null +++ b/promoção/pensamentos de att do painel 40 d.ipynb @@ -0,0 +1,67 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "id": "967a68c6", + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import date" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "04e89b60", + "metadata": {}, + "outputs": [], + "source": [ + "with open(r\"C:\\Users\\joao.herculano\\OneDrive - GRUPO GINSENG\\Ambiente de Trabalho\\acompanhamento improdutivo.csv\",mode='a',newline='',encoding='utf8') as f:\n", + " f.write('DATA;TOTAL_IMPRODUTIVO\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7ef5065f", + "metadata": {}, + "outputs": [], + "source": [ + "hoje = date.today()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "93c54816", + "metadata": {}, + "outputs": [], + "source": [ + "with open(r\"C:\\Users\\joao.herculano\\OneDrive - GRUPO GINSENG\\Ambiente de Trabalho\\acompanhamento improdutivo.csv\",mode='a',newline='',encoding='utf8') as f:\n", + " f.write(f'{hoje};2.931.906,29')" + ] + } + ], + "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 +} diff --git a/promoção/promoção_EUD_ciclo07.ipynb b/promoção/promoção_EUD_ciclo07.ipynb index a6ba58a..906f5c5 100644 --- a/promoção/promoção_EUD_ciclo07.ipynb +++ b/promoção/promoção_EUD_ciclo07.ipynb @@ -2,14 +2,14 @@ "cells": [ { "cell_type": "code", - "execution_count": 4, + "execution_count": 132, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_6076\\879577847.py:48: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_41628\\2131003807.py:50: 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" ] } @@ -37,6 +37,7 @@ "query = '''\n", "SELECT \n", " e.pdv,\n", + " e.SKU,\n", " COALESCE(e.SKU_PARA, e.SKU) AS SKU_FINAL,\n", " MAX(e.[ESTOQUE ATUAL]) AS [ESTOQUE ATUAL],\n", " MAX(e.[ESTOQUE EM TRANSITO]) AS [ESTOQUE EM TRANSITO],\n", @@ -55,6 +56,7 @@ " d.businessunit = 'EUD'\n", "GROUP BY \n", " e.pdv,\n", + " e.SKU,\n", " COALESCE(e.SKU_PARA, e.SKU),\n", " d.salescurve,\n", " e.CATEGORIA,\n", @@ -68,14 +70,73 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 279, + "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", + "
pdvSKUSKU_FINALESTOQUE ATUALESTOQUE EM TRANSITOPEDIDO PENDENTECurvaCATEGORIADiasSemVendanextcycleprojectionsecondtonextcycleprojection
\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [pdv, SKU, SKU_FINAL, ESTOQUE ATUAL, ESTOQUE EM TRANSITO, PEDIDO PENDENTE, Curva, CATEGORIA, DiasSemVenda, nextcycleprojection, secondtonextcycleprojection]\n", + "Index: []" + ] + }, + "execution_count": 279, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df0[(df0['SKU'] == '93403') & (df0['pdv'] == 21375)]" + ] + }, + { + "cell_type": "code", + "execution_count": 134, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_6076\\1692316838.py:25: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_41628\\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" ] } @@ -112,7 +173,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 135, "metadata": {}, "outputs": [], "source": [ @@ -121,7 +182,103 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 136, + "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
01282348664BOTICOLL PORTINARI DES COL 100ml V51.0C202411
11282648060LILY CREM DES HID ACET CPO 250g V87.0C202414
22099855142CASA 214 DIFUS VARET BRIS/CEDROS 250ml1.0C202414
32149552225NSPA SAB BARR CPO AMEI 90g V60.0C202412
42044152016NSPA CREM HID MAOS AMEI DOUR 75g1.0C202413
\n", + "
" + ], + "text/plain": [ + " PDV SKU DESCRICAO VENDAS_CICLO Ciclo\n", + "0 12823 48664 BOTICOLL PORTINARI DES COL 100ml V5 1.0 C202411\n", + "1 12826 48060 LILY CREM DES HID ACET CPO 250g V8 7.0 C202414\n", + "2 20998 55142 CASA 214 DIFUS VARET BRIS/CEDROS 250ml 1.0 C202414\n", + "3 21495 52225 NSPA SAB BARR CPO AMEI 90g V6 0.0 C202412\n", + "4 20441 52016 NSPA CREM HID MAOS AMEI DOUR 75g 1.0 C202413" + ] + }, + "execution_count": 136, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dfv0.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 137, "metadata": {}, "outputs": [ { @@ -156,7 +313,6 @@ " C202416\n", " C202417\n", " ...\n", - " C202502\n", " C202503\n", " C202504\n", " C202505\n", @@ -166,6 +322,7 @@ " C202509\n", " C202510\n", " C202511\n", + " C202512\n", " \n", " \n", " \n", @@ -289,212 +446,37 @@ " 0.0\n", " 0.0\n", " \n", - " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " \n", - " \n", - " 188531\n", - " 5699\n", - " 90770\n", - " PIN BALAO O BOTICARIO PAIS/25 UNIT\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " ...\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " \n", - " \n", - " 188532\n", - " 5699\n", - " 90772\n", - " PIN AMOR O BOTICARIO PAIS/25 UNIT\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " ...\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " \n", - " \n", - " 188533\n", - " 5699\n", - " 90774\n", - " PIN MELHOR PAI O BOTICARIO PAIS/25 UNIT\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " ...\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " \n", - " \n", - " 188534\n", - " 5699\n", - " 90776\n", - " SACOLA TOP M O BOTICARIO PAIS 2025 UNIT\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " ...\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " \n", - " \n", - " 188535\n", - " 8074\n", - " 43151\n", - " MATERIAL POS CONSUMO\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " ...\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " \n", " \n", "\n", - "

188536 rows × 21 columns

\n", + "

5 rows × 22 columns

\n", "" ], "text/plain": [ - " PDV SKU DESCRICAO C202411 \\\n", - "0 11201 1004 FLORATTA DES COL MY BLUE 75ml 0.0 \n", - "1 11201 1005 DEM FLORATTA DES COL MY BLUE 4ml 0.0 \n", - "2 11201 1078 MATCH SRUM CAP POS QUIMICA 50ml 0.0 \n", - "3 11201 1296 PMPCK THE BLEND DES ANTIT AER 2x75g 0.0 \n", - "4 11201 1302 PMPCK LILY DES ANTIT AER 2x75g 0.0 \n", - "... ... ... ... ... \n", - "188531 5699 90770 PIN BALAO O BOTICARIO PAIS/25 UNIT 0.0 \n", - "188532 5699 90772 PIN AMOR O BOTICARIO PAIS/25 UNIT 0.0 \n", - "188533 5699 90774 PIN MELHOR PAI O BOTICARIO PAIS/25 UNIT 0.0 \n", - "188534 5699 90776 SACOLA TOP M O BOTICARIO PAIS 2025 UNIT 0.0 \n", - "188535 8074 43151 MATERIAL POS CONSUMO 0.0 \n", + " 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", - " C202412 C202413 C202414 C202415 C202416 C202417 ... C202502 \\\n", - "0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", - "1 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", - "2 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", - "3 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", - "4 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", - "... ... ... ... ... ... ... ... ... \n", - "188531 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", - "188532 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", - "188533 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", - "188534 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", - "188535 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + " C202413 C202414 C202415 C202416 C202417 ... C202503 C202504 \\\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", - " C202503 C202504 C202505 C202506 C202507 C202508 C202509 \\\n", - "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "... ... ... ... ... ... ... ... \n", - "188531 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "188532 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "188533 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "188534 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "188535 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " C202505 C202506 C202507 C202508 C202509 C202510 C202511 C202512 \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", - " C202510 C202511 \n", - "0 0.0 0.0 \n", - "1 0.0 0.0 \n", - "2 0.0 0.0 \n", - "3 0.0 0.0 \n", - "4 0.0 0.0 \n", - "... ... ... \n", - "188531 0.0 0.0 \n", - "188532 0.0 0.0 \n", - "188533 0.0 0.0 \n", - "188534 0.0 0.0 \n", - "188535 0.0 0.0 \n", - "\n", - "[188536 rows x 21 columns]" + "[5 rows x 22 columns]" ] }, - "execution_count": 7, + "execution_count": 137, "metadata": {}, "output_type": "execute_result" } @@ -520,12 +502,12 @@ "df_vendas = df_vendas.rename(columns=lambda x: f'Ciclo_{x}' if isinstance(x, (int, str)) and str(x).isdigit() else x)\n", "\n", "# Resultado final\n", - "df_vendas\n" + "df_vendas.head()\n" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 138, "metadata": {}, "outputs": [], "source": [ @@ -543,7 +525,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 139, "metadata": {}, "outputs": [], "source": [ @@ -564,7 +546,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 140, "metadata": {}, "outputs": [], "source": [ @@ -605,7 +587,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 141, "metadata": {}, "outputs": [ { @@ -623,7 +605,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 142, "metadata": {}, "outputs": [ { @@ -634,7 +616,7 @@ " dtype='object')" ] }, - "execution_count": 12, + "execution_count": 142, "metadata": {}, "output_type": "execute_result" } @@ -645,7 +627,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 143, "metadata": {}, "outputs": [], "source": [ @@ -659,7 +641,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 144, "metadata": {}, "outputs": [ { @@ -701,7 +683,7 @@ "Name: count, dtype: int64" ] }, - "execution_count": 14, + "execution_count": 144, "metadata": {}, "output_type": "execute_result" } @@ -712,7 +694,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 145, "metadata": {}, "outputs": [], "source": [ @@ -734,7 +716,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 146, "metadata": {}, "outputs": [], "source": [ @@ -743,7 +725,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 147, "metadata": {}, "outputs": [], "source": [ @@ -752,7 +734,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 148, "metadata": {}, "outputs": [], "source": [ @@ -784,7 +766,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 149, "metadata": {}, "outputs": [ { @@ -822,17 +804,17 @@ " \n", " \n", " \n", - " 2346\n", - " C202513\n", - " 2025-08-27\n", - " 2025-09-16\n", + " 2388\n", + " C202514\n", + " 2025-09-17\n", + " 2025-10-07\n", " 21\n", " EUDORA\n", - " 2025-08-27\n", - " 13\n", + " 2025-09-17\n", + " 14\n", " C2025\n", - " C202515\n", - " 29\n", + " C202516\n", + " 23\n", " \n", " \n", "\n", @@ -840,13 +822,13 @@ ], "text/plain": [ " Ciclo INICIO CICLO FIM CICLO DURAÇÃO MARCA Date NUM_CICLO \\\n", - "2346 C202513 2025-08-27 2025-09-16 21 EUDORA 2025-08-27 13 \n", + "2388 C202514 2025-09-17 2025-10-07 21 EUDORA 2025-09-17 14 \n", "\n", " ANO_CICLO CICLOMAIS2 dias_ate_inicio \n", - "2346 C2025 C202515 29 " + "2388 C2025 C202516 23 " ] }, - "execution_count": 19, + "execution_count": 149, "metadata": {}, "output_type": "execute_result" } @@ -857,7 +839,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 150, "metadata": {}, "outputs": [], "source": [ @@ -866,7 +848,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 151, "metadata": {}, "outputs": [], "source": [ @@ -875,7 +857,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 152, "metadata": {}, "outputs": [], "source": [ @@ -884,7 +866,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 153, "metadata": {}, "outputs": [ { @@ -1052,223 +1034,55 @@ " 0.35\n", " Sim\n", " \n", - " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " \n", - " \n", - " 345\n", - " 202513\n", - " Fora Guia\n", - " Promoção RE\n", - " Movimentar Flow\n", - " Desconto Direto\n", - " Ciclo todo\n", - " Não\n", - " CABELOS\n", - " NaN\n", - " 53094\n", - " ...\n", - " 0.00\n", - " 0.00\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " Sim\n", - " \n", - " \n", - " 346\n", - " 202513\n", - " Fora Guia\n", - " Promoção RE\n", - " Movimentar Flow\n", - " Desconto Direto\n", - " Ciclo todo\n", - " Não\n", - " CABELOS\n", - " NaN\n", - " 55803\n", - " ...\n", - " 0.00\n", - " 0.00\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " Sim\n", - " \n", - " \n", - " 347\n", - " 202513\n", - " Fora Guia\n", - " Promoção RE\n", - " Movimentar Flow\n", - " Desconto Direto\n", - " Ciclo todo\n", - " Não\n", - " CABELOS\n", - " NaN\n", - " 93106\n", - " ...\n", - " 0.00\n", - " 0.00\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " Sim\n", - " \n", - " \n", - " 348\n", - " 202513\n", - " Fora Guia\n", - " Promoção RE\n", - " Movimentar Flow\n", - " Desconto Direto\n", - " Ciclo todo\n", - " Não\n", - " CABELOS\n", - " NaN\n", - " 93105\n", - " ...\n", - " 0.00\n", - " 0.00\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " Sim\n", - " \n", - " \n", - " 349\n", - " 202513\n", - " Fora Guia\n", - " Promoção RE\n", - " Movimentar Flow\n", - " Desconto Direto\n", - " Ciclo todo\n", - " Não\n", - " CABELOS\n", - " NaN\n", - " 55805\n", - " ...\n", - " 0.00\n", - " 0.00\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " Sim\n", - " \n", " \n", "\n", - "

350 rows × 47 columns

\n", + "

5 rows × 47 columns

\n", "" ], "text/plain": [ - " Ciclo Veiculo Tipo de Promoção Estratégia de Promoção \\\n", - "0 202513 Guia CF Promoção CF Movimentar Flow \n", - "1 202513 Guia CF Promoção CF Movimentar Flow \n", - "2 202513 Guia CF Promoção CF Movimentar Flow \n", - "3 202513 Guia CF Promoção CF Movimentar Flow \n", - "4 202513 Guia CF Promoção CF Movimentar Flow \n", - ".. ... ... ... ... \n", - "345 202513 Fora Guia Promoção RE Movimentar Flow \n", - "346 202513 Fora Guia Promoção RE Movimentar Flow \n", - "347 202513 Fora Guia Promoção RE Movimentar Flow \n", - "348 202513 Fora Guia Promoção RE Movimentar Flow \n", - "349 202513 Fora Guia Promoção RE Movimentar Flow \n", + " Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n", + "0 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "1 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "2 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "3 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "4 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", "\n", - " Tipo_mecanica Promo Período Limitado? EAM Categoria Cód. Combo \\\n", - "0 Desconto Direto NaN Não PERF. FEMININA NaN \n", - "1 Desconto Direto NaN Não PERF. FEMININA NaN \n", - "2 Desconto Direto NaN Não PERF. FEMININA NaN \n", - "3 Desconto Direto NaN Não PERF. FEMININA NaN \n", - "4 Desconto Direto NaN Não PERF. FEMININA NaN \n", - ".. ... ... ... ... ... \n", - "345 Desconto Direto Ciclo todo Não CABELOS NaN \n", - "346 Desconto Direto Ciclo todo Não CABELOS NaN \n", - "347 Desconto Direto Ciclo todo Não CABELOS NaN \n", - "348 Desconto Direto Ciclo todo Não CABELOS NaN \n", - "349 Desconto Direto Ciclo todo Não CABELOS NaN \n", + " Promo Período Limitado? EAM Categoria Cód. Combo Código do Item \\\n", + "0 NaN Não PERF. FEMININA NaN 85268 \n", + "1 NaN Não PERF. FEMININA NaN 93541 \n", + "2 NaN Não PERF. FEMININA NaN 53138 \n", + "3 NaN Não PERF. FEMININA NaN 50762 \n", + "4 NaN Não PERF. FEMININA NaN 49803 \n", "\n", - " Código do Item ... 0.34.2 0.35.2 0.2.3 0.25.3 0.28.3 0.3.3 0.32.3 \\\n", - "0 85268 ... 59.47 61.22 0.2 0.25 0.28 0.3 0.32 \n", - "1 93541 ... 30.57 31.47 0.2 0.25 0.28 0.3 0.32 \n", - "2 53138 ... 35.67 36.72 0.2 0.25 0.28 0.3 0.32 \n", - "3 50762 ... 23.43 24.12 0.2 0.25 0.28 0.3 0.32 \n", - "4 49803 ... 28.53 29.37 0.2 0.25 0.28 0.3 0.32 \n", - ".. ... ... ... ... ... ... ... ... ... \n", - "345 53094 ... 0.00 0.00 NaN NaN NaN NaN NaN \n", - "346 55803 ... 0.00 0.00 NaN NaN NaN NaN NaN \n", - "347 93106 ... 0.00 0.00 NaN NaN NaN NaN NaN \n", - "348 93105 ... 0.00 0.00 NaN NaN NaN NaN NaN \n", - "349 55805 ... 0.00 0.00 NaN NaN NaN NaN NaN \n", + " ... 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 ... 59.47 61.22 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n", + "1 ... 30.57 31.47 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n", + "2 ... 35.67 36.72 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n", + "3 ... 23.43 24.12 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n", + "4 ... 28.53 29.37 0.2 0.25 0.28 0.3 0.32 0.34 0.35 \n", "\n", - " 0.34.3 0.35.3 BSO \n", - "0 0.34 0.35 Sim \n", - "1 0.34 0.35 Sim \n", - "2 0.34 0.35 Sim \n", - "3 0.34 0.35 Sim \n", - "4 0.34 0.35 Sim \n", - ".. ... ... ... \n", - "345 NaN NaN Sim \n", - "346 NaN NaN Sim \n", - "347 NaN NaN Sim \n", - "348 NaN NaN Sim \n", - "349 NaN NaN Sim \n", + " BSO \n", + "0 Sim \n", + "1 Sim \n", + "2 Sim \n", + "3 Sim \n", + "4 Sim \n", "\n", - "[350 rows x 47 columns]" + "[5 rows x 47 columns]" ] }, - "execution_count": 23, + "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_tabela" + "df_tabela.head()" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 154, "metadata": {}, "outputs": [], "source": [ @@ -1285,51 +1099,683 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 155, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_6076\\2370731253.py:1: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " df_tabela['Código do Item'] = df_tabela['Código do Item'].astype(str).str.replace(\".0\",\"\",regex=False)\n" - ] - } - ], + "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": 26, + "execution_count": 156, "metadata": {}, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_6076\\1166075419.py:1: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " df_tabela['MATCH'] = 1\n" - ] + "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$)
0202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN85268EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.47
1202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN93541DIVA ESPLÊNDIDA DESODORANTE COLONIA 100mlFESTIVAL DE PERFUMARIA - ATÉ 40% OFF: DIVA ESP...139.989.90.35762.9389.926.97
2202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN53138EUDORA IMENSI DESODORANTE COLÔNIA SANCHO 100 MLFESTIVAL DE PERFUMARIA - ATÉ 40% OFF: EUDORA I...149.9104.90.30073.43104.931.47
3202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN50762EUDORA VELVET SENSUAL DESODORANTE COLÔNIA 100MLFESTIVAL DE PERFUMARIA - ATÉ 40% OFF: EUDORA V...119.968.90.42548.2368.920.67
4202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN49803CHIC DES COL RETRO 95ml V2FESTIVAL DE PERFUMARIA - ATÉ 40% OFF: CHIC DES...119.983.90.30058.7383.925.17
\n", + "
" + ], + "text/plain": [ + " Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n", + "0 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "1 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "2 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "3 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "4 202513 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 NaN Não PERF. FEMININA NaN 85268 \n", + "1 NaN Não PERF. FEMININA NaN 93541 \n", + "2 NaN Não PERF. FEMININA NaN 53138 \n", + "3 NaN Não PERF. FEMININA NaN 50762 \n", + "4 NaN Não PERF. FEMININA NaN 49803 \n", + "\n", + " Descrição do Item \\\n", + "0 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "1 DIVA ESPLÊNDIDA DESODORANTE COLONIA 100ml \n", + "2 EUDORA IMENSI DESODORANTE COLÔNIA SANCHO 100 ML \n", + "3 EUDORA VELVET SENSUAL DESODORANTE COLÔNIA 100ML \n", + "4 CHIC DES COL RETRO 95ml V2 \n", + "\n", + " Chamada Promocional Valor do Guia \\\n", + "0 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "1 FESTIVAL DE PERFUMARIA - ATÉ 40% OFF: DIVA ESP... 139.9 \n", + "2 FESTIVAL DE PERFUMARIA - ATÉ 40% OFF: EUDORA I... 149.9 \n", + "3 FESTIVAL DE PERFUMARIA - ATÉ 40% OFF: EUDORA V... 119.9 \n", + "4 FESTIVAL DE PERFUMARIA - ATÉ 40% OFF: CHIC DES... 119.9 \n", + "\n", + " Preço Promocionado % de Desconto RE compra por RE Vende por \\\n", + "0 174.9 0.255 122.43 174.9 \n", + "1 89.9 0.357 62.93 89.9 \n", + "2 104.9 0.300 73.43 104.9 \n", + "3 68.9 0.425 48.23 68.9 \n", + "4 83.9 0.300 58.73 83.9 \n", + "\n", + " RE lucra (R$) \n", + "0 52.47 \n", + "1 26.97 \n", + "2 31.47 \n", + "3 20.67 \n", + "4 25.17 " + ] + }, + "execution_count": 156, + "metadata": {}, + "output_type": "execute_result" } ], + "source": [ + "df_tabela.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "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
0202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN85268EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.478526856572
1202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN85268EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.478526856572
2202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN85268EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.478526856572
3202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN85268EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.478526856572
4202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN85268EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.478526856572
\n", + "
" + ], + "text/plain": [ + " Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n", + "0 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "1 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "2 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "3 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "4 202513 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 NaN Não PERF. FEMININA NaN 85268 \n", + "1 NaN Não PERF. FEMININA NaN 85268 \n", + "2 NaN Não PERF. FEMININA NaN 85268 \n", + "3 NaN Não PERF. FEMININA NaN 85268 \n", + "4 NaN Não PERF. FEMININA NaN 85268 \n", + "\n", + " Descrição do Item \\\n", + "0 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "1 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "2 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "3 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "4 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "\n", + " Chamada Promocional Valor do Guia \\\n", + "0 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "1 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "2 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "3 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "4 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "\n", + " Preço Promocionado % de Desconto RE compra por RE Vende por \\\n", + "0 174.9 0.255 122.43 174.9 \n", + "1 174.9 0.255 122.43 174.9 \n", + "2 174.9 0.255 122.43 174.9 \n", + "3 174.9 0.255 122.43 174.9 \n", + "4 174.9 0.255 122.43 174.9 \n", + "\n", + " RE lucra (R$) SKU SKU_FINAL \n", + "0 52.47 85268 56572 \n", + "1 52.47 85268 56572 \n", + "2 52.47 85268 56572 \n", + "3 52.47 85268 56572 \n", + "4 52.47 85268 56572 " + ] + }, + "execution_count": 157, + "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": 158, + "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": 159, + "metadata": {}, + "outputs": [], + "source": [ + "df_tabela = df_tabela.drop(columns=['SKU','SKU_FINAL'])" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "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$)
0202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN56572EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.47
1202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN56572EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.47
2202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN56572EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.47
3202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN56572EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.47
4202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN56572EUDORA EAU DE PARFUM ROSÉ V2, 75 mlEUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234...234.9174.90.255122.43174.952.47
\n", + "
" + ], + "text/plain": [ + " Ciclo Veiculo Tipo de Promoção Estratégia de Promoção Tipo_mecanica \\\n", + "0 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "1 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "2 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "3 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "4 202513 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 NaN Não PERF. FEMININA NaN 56572 \n", + "1 NaN Não PERF. FEMININA NaN 56572 \n", + "2 NaN Não PERF. FEMININA NaN 56572 \n", + "3 NaN Não PERF. FEMININA NaN 56572 \n", + "4 NaN Não PERF. FEMININA NaN 56572 \n", + "\n", + " Descrição do Item \\\n", + "0 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "1 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "2 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "3 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "4 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml \n", + "\n", + " Chamada Promocional Valor do Guia \\\n", + "0 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "1 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "2 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "3 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "4 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml | DE R$234... 234.9 \n", + "\n", + " Preço Promocionado % de Desconto RE compra por RE Vende por \\\n", + "0 174.9 0.255 122.43 174.9 \n", + "1 174.9 0.255 122.43 174.9 \n", + "2 174.9 0.255 122.43 174.9 \n", + "3 174.9 0.255 122.43 174.9 \n", + "4 174.9 0.255 122.43 174.9 \n", + "\n", + " RE lucra (R$) \n", + "0 52.47 \n", + "1 52.47 \n", + "2 52.47 \n", + "3 52.47 \n", + "4 52.47 " + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_tabela.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": {}, + "outputs": [], "source": [ "df_tabela['MATCH'] = 1" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 162, "metadata": {}, "outputs": [], "source": [ @@ -1338,7 +1784,223 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 163, + "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
0202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN56572...174.90.255122.43174.952.47120968SEHIB ITABAIANINHAMARCYARA
1202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN56572...174.90.255122.43174.952.47120969ALHIB MARECHAL DEODHARY
2202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN56572...174.90.255122.43174.952.47120970BAER SAO SEBASTIAODARLIN
3202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN56572...174.90.255122.43174.952.47120986BAHIB OLINDINALUCAS
4202513Guia CFPromoção CFMovimentar FlowDesconto DiretoNaNNãoPERF. FEMININANaN56572...174.90.255122.43174.952.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 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "1 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "2 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "3 202513 Guia CF Promoção CF Movimentar Flow Desconto Direto \n", + "4 202513 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 NaN Não PERF. FEMININA NaN 56572 \n", + "1 NaN Não PERF. FEMININA NaN 56572 \n", + "2 NaN Não PERF. FEMININA NaN 56572 \n", + "3 NaN Não PERF. FEMININA NaN 56572 \n", + "4 NaN Não PERF. FEMININA NaN 56572 \n", + "\n", + " ... Preço Promocionado % de Desconto RE compra por RE Vende por \\\n", + "0 ... 174.9 0.255 122.43 174.9 \n", + "1 ... 174.9 0.255 122.43 174.9 \n", + "2 ... 174.9 0.255 122.43 174.9 \n", + "3 ... 174.9 0.255 122.43 174.9 \n", + "4 ... 174.9 0.255 122.43 174.9 \n", + "\n", + " RE lucra (R$) MATCH PDV UF DESCRIÇÃO PDV ANALISTA \n", + "0 52.47 1 20968 SE HIB ITABAIANINHA MARCYARA \n", + "1 52.47 1 20969 AL HIB MARECHAL DEOD HARY \n", + "2 52.47 1 20970 BA ER SAO SEBASTIAO DARLIN \n", + "3 52.47 1 20986 BA HIB OLINDINA LUCAS \n", + "4 52.47 1 20988 BA HIB QUEIMADAS DARLIN \n", + "\n", + "[5 rows x 23 columns]" + ] + }, + "execution_count": 163, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_tabela.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 164, "metadata": {}, "outputs": [], "source": [ @@ -1347,7 +2009,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 165, "metadata": {}, "outputs": [ { @@ -1362,7 +2024,7 @@ " dtype='object')" ] }, - "execution_count": 29, + "execution_count": 165, "metadata": {}, "output_type": "execute_result" } @@ -1373,19 +2035,19 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 166, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + "Index(['pdv', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", " 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n", " 'nextcycleprojection', 'secondtonextcycleprojection'],\n", " dtype='object')" ] }, - "execution_count": 30, + "execution_count": 166, "metadata": {}, "output_type": "execute_result" } @@ -1396,445 +2058,7 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "df['pdv'] = df['pdv'].astype(str)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "df['SKU_FINAL'] = df['SKU_FINAL'].astype(str)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "df_tabela['Código do Item'] = df_tabela['Código do Item'].astype('str')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "df_tabela['PDV'] = df_tabela['PDV'].astype(str)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(10656, 33)" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final = pd.merge(left=df,right=df_tabela,right_on=['Código do Item','PDV'],left_on=['SKU_FINAL','pdv'],how='right')\n", - "df_final.shape " - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "df_final['match'] = 1" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(10656, 39)" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final = pd.merge(left=df_final, right=filtered_calendario[['Ciclo','INICIO CICLO','FIM CICLO','DURAÇÃO','match','dias_ate_inicio']], on='match',how='inner')\n", - "df_final.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(10656, 39)" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#df_final = pd.merge(left=df_final,right=df_pdv[['PDV', 'CANAL', 'DESCRIÇÃO PDV', 'PDV DESC','UF', 'MARCA', 'ANALISTA']],on = 'PDV',how='inner')\n", - "df_final.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "#df_final['SKU'] = df_final['SKU'].astype(str) \n", - "#df_final['PDV'] = df_final['PDV'].astype(str) \n", - "#df_final = pd.merge(left=df_final,right=df_estoque[['SKU_FINAL', 'DDV PREVISTO', 'COBERTURA ATUAL','PDV']],right_on=['PDV','SKU_FINAL'],left_on=['PDV','SKU'],how='left')\n", - "#df_final.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(10656, 43)" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype(str).str.replace('.0','',regex=False) \n", - "\n", - "df_final = pd.merge(left=df_final,right=df_bi_preco[['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": 41, - "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": 42, - "metadata": {}, - "outputs": [], - "source": [ - "#df_bi_preco = df_bi_preco[df_bi_preco['MARCA']=='EUDORA']" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "#df_final['PRECO DE COMPRA'] = np.where(~df_final['PC_x'].isna(),df_final['PC_x'],df_final['PC_y'])\n", - "\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": 44, - "metadata": {}, - "outputs": [], - "source": [ - "#df_estoque = df_estoque.rename(columns={'SKU_FINAL':'SKU_PARA_VALIDACAO'})\n", - "#df_final = pd.merge( left= df_final, right = df_estoque[['SKU_PARA_VALIDACAO','Arquivo_Origem']], left_on= 'SKU', right_on='SKU_PARA_VALIDACAO', how='left')" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", - " 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n", - " 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n", - " 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n", - " 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n", - " 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n", - " 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n", - " '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n", - " 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n", - " 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n", - " 'Tipo Preço', 'PC', 'PV'],\n", - " dtype='object')" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "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": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(10656, 45)" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final['PDV_SKU'] = df_final['PDV'].astype(str) + df_final['SKU_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": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "secondtonextcycleprojection\n", - "0.0 5042\n", - "1.0 237\n", - "3.0 210\n", - "2.0 162\n", - "4.0 104\n", - " ... \n", - "366.0 1\n", - "95.0 1\n", - "177.0 1\n", - "110.0 1\n", - "109.0 1\n", - "Name: count, Length: 126, dtype: int64" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final['nextcycleprojection'].value_counts()\n", - "\n", - "df_final['secondtonextcycleprojection'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "#df_final['PROJEÇÃO DO CICLO PROMOCIONADO'] =df_final['Projeção Próximo Ciclo + 1'] - df_final['Projeção Próximo Ciclo'] # projeção do ciclo em estudo" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "#df_final['PROJEÇÃO DO CICLO PROMOCIONADO'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "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": 52, - "metadata": {}, - "outputs": [], - "source": [ - "df_final = df_final.rename(columns={'Arquivo_Origem': 'MARCA'})" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "#df_final = df_final[~df_final['MARCA'].isna()]\n", - "#df_final['MARCA'].isna().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(10656, 45)" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final = df_final.drop_duplicates()\n", - "df_final.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", - " 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n", - " 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n", - " 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n", - " 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n", - " 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n", - " 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n", - " '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n", - " 'MATCH', 'PDV', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n", - " 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n", - " 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO'],\n", - " dtype='object')" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['PDV', 'SKU', 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414',\n", - " 'C202415', 'C202416', 'C202417', 'C202501', 'C202502', 'C202503',\n", - " 'C202504', 'C202505', 'C202506', 'C202507', 'C202508', 'C202509',\n", - " 'C202510', 'C202511'],\n", - " dtype='object')" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_vendas['PDV'] = df_vendas['PDV'].astype(str)\n", - "df_vendas['SKU'] = df_vendas['SKU'].astype(str)\n", - "\n", - "df_vendas.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(10656, 45)" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [], - "source": [ - "df_final = pd.merge(df_final,df_vendas,left_on=['pdv','SKU_FINAL'],right_on=['PDV','SKU'],how='inner')" - ] - }, - { - "cell_type": "code", - "execution_count": 60, + "execution_count": 167, "metadata": {}, "outputs": [ { @@ -1859,6 +2083,7 @@ " \n", " \n", " pdv\n", + " SKU\n", " SKU_FINAL\n", " ESTOQUE ATUAL\n", " ESTOQUE EM TRANSITO\n", @@ -1868,8 +2093,1801 @@ " DiasSemVenda\n", " nextcycleprojection\n", " secondtonextcycleprojection\n", + " \n", + " \n", + " \n", + " \n", + " 0\n", + " 20968\n", + " 47814\n", + " 47814\n", + " 3\n", + " 0\n", + " 0\n", + " C\n", + " DESODORANTES\n", + " 78\n", + " 3\n", + " 2\n", + " \n", + " \n", + " 1\n", + " 20968\n", + " 47888\n", + " 47888\n", + " 11\n", + " 0\n", + " 0\n", + " B\n", + " CUIDADOS COM A PELE\n", + " 45\n", + " 4\n", + " 2\n", + " \n", + " \n", + " 2\n", + " 20968\n", + " 49459\n", + " 49459\n", + " 0\n", + " 0\n", + " 0\n", + " C\n", + " MAQUIAGEM\n", + " 247\n", + " 0\n", + " 0\n", + " \n", + " \n", + " 3\n", + " 20968\n", + " 49543\n", + " 49543\n", + " 8\n", + " 0\n", + " 0\n", + " A\n", + " PERFUMARIA\n", + " 32\n", + " 2\n", + " 2\n", + " \n", + " \n", + " 4\n", + " 20968\n", + " 50093\n", + " 50093\n", + " 0\n", + " 0\n", + " 0\n", + " E\n", + " CABELOS\n", + " 0\n", + " 0\n", + " 0\n", + " \n", + " \n", + "\n", + "" + ], + "text/plain": [ + " pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE \\\n", + "0 20968 47814 47814 3 0 0 \n", + "1 20968 47888 47888 11 0 0 \n", + "2 20968 49459 49459 0 0 0 \n", + "3 20968 49543 49543 8 0 0 \n", + "4 20968 50093 50093 0 0 0 \n", + "\n", + " Curva CATEGORIA DiasSemVenda nextcycleprojection \\\n", + "0 C DESODORANTES 78 3 \n", + "1 B CUIDADOS COM A PELE 45 4 \n", + "2 C MAQUIAGEM 247 0 \n", + "3 A PERFUMARIA 32 2 \n", + "4 E CABELOS 0 0 \n", + "\n", + " secondtonextcycleprojection \n", + "0 2 \n", + "1 2 \n", + "2 0 \n", + "3 2 \n", + "4 0 " + ] + }, + "execution_count": 167, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [], + "source": [ + "df['pdv'] = df['pdv'].astype(str)" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [], + "source": [ + "df['SKU_FINAL'] = df['SKU_FINAL'].astype(str)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [], + "source": [ + "df_tabela['Código do Item'] = df_tabela['Código do Item'].astype('str')" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "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": 171, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_tabela.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": {}, + "outputs": [], + "source": [ + "df_tabela['PDV'] = df_tabela['PDV'].astype(str)" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "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
04781420968
14788820968
24945920968
34954320968
45009320968
\n", + "
" + ], + "text/plain": [ + " SKU_FINAL pdv\n", + "0 47814 20968\n", + "1 47888 20968\n", + "2 49459 20968\n", + "3 49543 20968\n", + "4 50093 20968" + ] + }, + "execution_count": 173, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[['SKU_FINAL','pdv']].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 276, + "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", + "
pdvSKUSKU_FINALESTOQUE ATUALESTOQUE EM TRANSITOPEDIDO PENDENTECurvaCATEGORIADiasSemVendanextcycleprojectionsecondtonextcycleprojection
711209689340393403113CINFANTIL1831
1857209699340393403000CINFANTIL5310
5032209919340393403500CINFANTIL6092
5282209929340393403000EINFANTIL0153
7541209959340393403000CINFANTIL451
838220996934039340311217CINFANTIL3102
10303209979340393403930CINFANTIL2245
1046120998934039340342234CINFANTIL2559
13097212789340393403500CINFANTIL2152
13702214959340393403200CINFANTIL11131
14577225419340393403020CINFANTIL8151
18488242559340393403100EINFANTIL0153
\n", + "
" + ], + "text/plain": [ + " pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO \\\n", + "711 20968 93403 93403 1 1 \n", + "1857 20969 93403 93403 0 0 \n", + "5032 20991 93403 93403 5 0 \n", + "5282 20992 93403 93403 0 0 \n", + "7541 20995 93403 93403 0 0 \n", + "8382 20996 93403 93403 1 12 \n", + "10303 20997 93403 93403 9 3 \n", + "10461 20998 93403 93403 4 22 \n", + "13097 21278 93403 93403 5 0 \n", + "13702 21495 93403 93403 2 0 \n", + "14577 22541 93403 93403 0 2 \n", + "18488 24255 93403 93403 1 0 \n", + "\n", + " PEDIDO PENDENTE Curva CATEGORIA DiasSemVenda nextcycleprojection \\\n", + "711 3 C INFANTIL 18 3 \n", + "1857 0 C INFANTIL 53 1 \n", + "5032 0 C INFANTIL 60 9 \n", + "5282 0 E INFANTIL 0 15 \n", + "7541 0 C INFANTIL 4 5 \n", + "8382 17 C INFANTIL 3 10 \n", + "10303 0 C INFANTIL 2 24 \n", + "10461 34 C INFANTIL 2 55 \n", + "13097 0 C INFANTIL 2 15 \n", + "13702 0 C INFANTIL 111 3 \n", + "14577 0 C INFANTIL 81 5 \n", + "18488 0 E INFANTIL 0 15 \n", + "\n", + " secondtonextcycleprojection \n", + "711 1 \n", + "1857 0 \n", + "5032 2 \n", + "5282 3 \n", + "7541 1 \n", + "8382 2 \n", + "10303 5 \n", + "10461 9 \n", + "13097 2 \n", + "13702 1 \n", + "14577 1 \n", + "18488 3 " + ] + }, + "execution_count": 276, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[(df['SKU_FINAL']=='93403')]" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(11606, 34)" + ] + }, + "execution_count": 174, + "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": 175, + "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": 177, + "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": 177, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "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": 179, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml\n", + "1 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml\n", + "2 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml\n", + "3 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml\n", + "4 EUDORA EAU DE PARFUM ROSÉ V2, 75 ml\n", + " ... \n", + "10651 SIÀGE ELIXIR CAPILAR TRATAMENTO OVERNIGHT NUTR...\n", + "10652 SIÀGE ELIXIR CAPILAR TRATAMENTO OVERNIGHT NUTR...\n", + "10653 SIÀGE ELIXIR CAPILAR TRATAMENTO OVERNIGHT NUTR...\n", + "10654 SIÀGE ELIXIR CAPILAR TRATAMENTO OVERNIGHT NUTR...\n", + "10655 SIÀGE ELIXIR CAPILAR TRATAMENTO OVERNIGHT NUTR...\n", + "Name: Descrição do Item, Length: 10656, dtype: object" + ] + }, + "execution_count": 179, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final['Descrição do Item']" + ] + }, + { + "cell_type": "code", + "execution_count": 180, + "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
0209685657256572350NoneBPERFUMARIA0.00.0...174.90.255122.43174.952.47120968SEHIB ITABAIANINHAMARCYARA
1209695657256572300NoneBPERFUMARIA0.00.0...174.90.255122.43174.952.47120969ALHIB MARECHAL DEODHARY
2209705657256572810NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47120970BAER SAO SEBASTIAODARLIN
3209865657256572710NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47120986BAHIB OLINDINALUCAS
4209885657256572510NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47120988BAHIB QUEIMADASDARLIN
5209895657256572950NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47120989BAHIB ENTRE RIOSMARCYARA
6209915657256572350NoneBPERFUMARIA0.00.0...174.90.255122.43174.952.47120991ALHIB CAMPO ALEGREHARY
72099256572565721490NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47120992BAER CONC COITEJEFFERSON
82099356572565720291NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47120993BAER CANDEIASDARLIN
92099456572565722180NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47120994BAER SIMOES FILHOLUCAS
10209955657256572550NoneBPERFUMARIA0.00.0...174.90.255122.43174.952.47120995SEER LAGARTOMARCYARA
11209965657256572690NoneBPERFUMARIA0.00.0...174.90.255122.43174.952.47120996ALER ANTARESLAIS
122099756572565722310NoneBPERFUMARIA0.00.0...174.90.255122.43174.952.47120997ALER PITANGUINHALAIS
132099856572565722120NoneBPERFUMARIA0.00.0...174.90.255122.43174.952.47120998ALCD SERRARIAVA
142099956572565721270NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47120999BAHIB ESPLANADAMARCYARA
15210005657256572570NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47121000BAHIB SANTALUZDARLIN
16210015657256572700NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47121001BAHIB RIO REALLUCAS
17212785657256572810NoneBPERFUMARIA0.00.0...174.90.255122.43174.952.47121278SEVD SOCORROJEFFERSON
182137556572565721070NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.47121375BAIPIRA HBDARLIN
19213835657256572950NoneEPERFUMARIA0.00.0...174.90.255122.43174.952.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 56572 56572 35 0 None \n", + "1 20969 56572 56572 30 0 None \n", + "2 20970 56572 56572 81 0 None \n", + "3 20986 56572 56572 71 0 None \n", + "4 20988 56572 56572 51 0 None \n", + "5 20989 56572 56572 95 0 None \n", + "6 20991 56572 56572 35 0 None \n", + "7 20992 56572 56572 149 0 None \n", + "8 20993 56572 56572 0 291 None \n", + "9 20994 56572 56572 218 0 None \n", + "10 20995 56572 56572 55 0 None \n", + "11 20996 56572 56572 69 0 None \n", + "12 20997 56572 56572 231 0 None \n", + "13 20998 56572 56572 212 0 None \n", + "14 20999 56572 56572 127 0 None \n", + "15 21000 56572 56572 57 0 None \n", + "16 21001 56572 56572 70 0 None \n", + "17 21278 56572 56572 81 0 None \n", + "18 21375 56572 56572 107 0 None \n", + "19 21383 56572 56572 95 0 None \n", + "\n", + " Curva CATEGORIA DiasSemVenda nextcycleprojection ... \\\n", + "0 B PERFUMARIA 0.0 0.0 ... \n", + "1 B PERFUMARIA 0.0 0.0 ... \n", + "2 E PERFUMARIA 0.0 0.0 ... \n", + "3 E PERFUMARIA 0.0 0.0 ... \n", + "4 E PERFUMARIA 0.0 0.0 ... \n", + "5 E PERFUMARIA 0.0 0.0 ... \n", + "6 B PERFUMARIA 0.0 0.0 ... \n", + "7 E PERFUMARIA 0.0 0.0 ... \n", + "8 E PERFUMARIA 0.0 0.0 ... \n", + "9 E PERFUMARIA 0.0 0.0 ... \n", + "10 B PERFUMARIA 0.0 0.0 ... \n", + "11 B PERFUMARIA 0.0 0.0 ... \n", + "12 B PERFUMARIA 0.0 0.0 ... \n", + "13 B PERFUMARIA 0.0 0.0 ... \n", + "14 E PERFUMARIA 0.0 0.0 ... \n", + "15 E PERFUMARIA 0.0 0.0 ... \n", + "16 E PERFUMARIA 0.0 0.0 ... \n", + "17 B PERFUMARIA 0.0 0.0 ... \n", + "18 E PERFUMARIA 0.0 0.0 ... \n", + "19 E PERFUMARIA 0.0 0.0 ... \n", + "\n", + " Preço Promocionado % de Desconto RE compra por RE Vende por \\\n", + "0 174.9 0.255 122.43 174.9 \n", + "1 174.9 0.255 122.43 174.9 \n", + "2 174.9 0.255 122.43 174.9 \n", + "3 174.9 0.255 122.43 174.9 \n", + "4 174.9 0.255 122.43 174.9 \n", + "5 174.9 0.255 122.43 174.9 \n", + "6 174.9 0.255 122.43 174.9 \n", + "7 174.9 0.255 122.43 174.9 \n", + "8 174.9 0.255 122.43 174.9 \n", + "9 174.9 0.255 122.43 174.9 \n", + "10 174.9 0.255 122.43 174.9 \n", + "11 174.9 0.255 122.43 174.9 \n", + "12 174.9 0.255 122.43 174.9 \n", + "13 174.9 0.255 122.43 174.9 \n", + "14 174.9 0.255 122.43 174.9 \n", + "15 174.9 0.255 122.43 174.9 \n", + "16 174.9 0.255 122.43 174.9 \n", + "17 174.9 0.255 122.43 174.9 \n", + "18 174.9 0.255 122.43 174.9 \n", + "19 174.9 0.255 122.43 174.9 \n", + "\n", + " RE lucra (R$) MATCH PDV UF DESCRIÇÃO PDV ANALISTA \n", + "0 52.47 1 20968 SE HIB ITABAIANINHA MARCYARA \n", + "1 52.47 1 20969 AL HIB MARECHAL DEOD HARY \n", + "2 52.47 1 20970 BA ER SAO SEBASTIAO DARLIN \n", + "3 52.47 1 20986 BA HIB OLINDINA LUCAS \n", + "4 52.47 1 20988 BA HIB QUEIMADAS DARLIN \n", + "5 52.47 1 20989 BA HIB ENTRE RIOS MARCYARA \n", + "6 52.47 1 20991 AL HIB CAMPO ALEGRE HARY \n", + "7 52.47 1 20992 BA ER CONC COITE JEFFERSON \n", + "8 52.47 1 20993 BA ER CANDEIAS DARLIN \n", + "9 52.47 1 20994 BA ER SIMOES FILHO LUCAS \n", + "10 52.47 1 20995 SE ER LAGARTO MARCYARA \n", + "11 52.47 1 20996 AL ER ANTARES LAIS \n", + "12 52.47 1 20997 AL ER PITANGUINHA LAIS \n", + "13 52.47 1 20998 AL CD SERRARIA VA \n", + "14 52.47 1 20999 BA HIB ESPLANADA MARCYARA \n", + "15 52.47 1 21000 BA HIB SANTALUZ DARLIN \n", + "16 52.47 1 21001 BA HIB RIO REAL LUCAS \n", + "17 52.47 1 21278 SE VD SOCORRO JEFFERSON \n", + "18 52.47 1 21375 BA IPIRA HB DARLIN \n", + "19 52.47 1 21383 BA CAPIM GROSSO ER DARLIN \n", + "\n", + "[20 rows x 34 columns]" + ] + }, + "execution_count": 180, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.head(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": {}, + "outputs": [], + "source": [ + "df_final['match'] = 1" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(10656, 40)" + ] + }, + "execution_count": 182, + "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": 183, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PDV\n", + "20968 333\n", + "20969 333\n", + "20970 333\n", + "20986 333\n", + "20988 333\n", + "20989 333\n", + "20991 333\n", + "20992 333\n", + "20993 333\n", + "20994 333\n", + "20995 333\n", + "20996 333\n", + "20997 333\n", + "20998 333\n", + "20999 333\n", + "21000 333\n", + "21001 333\n", + "21278 333\n", + "21375 333\n", + "21383 333\n", + "21495 333\n", + "22448 333\n", + "22541 333\n", + "23703 333\n", + "23704 333\n", + "23711 333\n", + "23712 333\n", + "24255 333\n", + "24257 333\n", + "24269 333\n", + "24293 333\n", + "23813 333\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 183, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.PDV.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(10656, 40)" + ] + }, + "execution_count": 184, + "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": 185, + "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": 186, + "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": 186, + "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": 187, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pdv\n", + "20968 333\n", + "20969 333\n", + "20970 333\n", + "20986 333\n", + "20988 333\n", + "20989 333\n", + "20991 333\n", + "20992 333\n", + "20993 333\n", + "20994 333\n", + "20995 333\n", + "20996 333\n", + "20997 333\n", + "20998 333\n", + "20999 333\n", + "21000 333\n", + "21001 333\n", + "21278 333\n", + "21375 333\n", + "21383 333\n", + "21495 333\n", + "22448 333\n", + "22541 333\n", + "23703 333\n", + "23704 333\n", + "23711 333\n", + "23712 333\n", + "24255 333\n", + "24257 333\n", + "24269 333\n", + "24293 333\n", + "23813 333\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 187, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final['pdv'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "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": 189, + "metadata": {}, + "outputs": [], + "source": [ + "#df_bi_preco = df_bi_preco[df_bi_preco['MARCA']=='EUDORA']" + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "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": 191, + "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": 192, + "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": 192, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "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": 194, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(10656, 42)" + ] + }, + "execution_count": 194, + "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": 195, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 20968\n", + "1 20969\n", + "2 20970\n", + "3 20986\n", + "4 20988\n", + " ... \n", + "10651 24255\n", + "10652 24257\n", + "10653 24269\n", + "10654 24293\n", + "10655 23813\n", + "Name: PDV, Length: 10656, dtype: object" + ] + }, + "execution_count": 195, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final['PDV']" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "secondtonextcycleprojection\n", + "0.0 1603\n", + "1.0 1102\n", + "2.0 738\n", + "4.0 566\n", + "3.0 478\n", + " ... \n", + "368.0 1\n", + "141.0 1\n", + "105.0 1\n", + "310.0 1\n", + "231.0 1\n", + "Name: count, Length: 145, dtype: int64" + ] + }, + "execution_count": 196, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final['nextcycleprojection'].value_counts()\n", + "\n", + "df_final['secondtonextcycleprojection'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "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": 198, + "metadata": {}, + "outputs": [], + "source": [ + "#df_final['PROJEÇÃO DO CICLO PROMOCIONADO'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "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": 200, + "metadata": {}, + "outputs": [], + "source": [ + "df_final = df_final.rename(columns={'Arquivo_Origem': 'MARCA'})" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": {}, + "outputs": [], + "source": [ + "#df_final = df_final[~df_final['MARCA'].isna()]\n", + "#df_final['MARCA'].isna().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(10656, 42)" + ] + }, + "execution_count": 202, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final = df_final.drop_duplicates()\n", + "df_final.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 203, + "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": 203, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 204, + "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'],\n", + " dtype='object')" + ] + }, + "execution_count": 204, + "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": 205, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(10656, 42)" + ] + }, + "execution_count": 205, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 206, + "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", @@ -1879,93 +3897,94 @@ " \n", " \n", " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -1980,159 +3999,15 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -2148,83 +4023,61 @@ " \n", " \n", "
PDVSKUDESCRICAOC202411C202412C202413C202414C202415C202416C202417...C202502C202503C202504C202505C202509C202510C202511C202512
020968935412300BPERFUMARIA13.0112011004FLORATTA DES COL MY BLUE 75ml0.00.00.00.00.00.00.0...9.03.01.01.021.03.01.013.01.01.00.00.00.00.00.00.00.00.00.00.0
120969935412700BPERFUMARIA3.0112011005DEM FLORATTA DES COL MY BLUE 4ml0.00.00.00.00.00.00.0...18.03.08.09.023.04.09.02.011.01.00.00.00.00.00.00.00.00.00.00.0
220991935412000BPERFUMARIA5.0112011078MATCH SRUM CAP POS QUIMICA 50ml0.00.00.00.00.00.00.0...12.01.09.014.016.06.08.026.09.01.00.00.00.00.00.00.00.00.00.00.0
3209929354117800EPERFUMARIA112011296PMPCK THE BLEND DES ANTIT AER 2x75g0.00.00.00.00.00.00.0121.0...0.00.0
420995935416700BPERFUMARIA3.014.053.0...12.013.04.010.043.08.06.027.01.02.0
..................................................................
3207209985309427500ACABELOS112011302PMPCK LILY DES ANTIT AER 2x75g0.00.00.0...190.0208.048.047.0179.031.044.018.0180.069.0
320821278530943800ACABELOS0.00.00.0...27.015.024.013.071.013.08.020.030.021.0
32092149553094400ACABELOS2.00.00.0...9.00.00.05.05.03.02.05.06.01.0
321022541530944600ACABELOS2.00.00.0...9.06.04.010.024.042.04.03.09.08.0
3211242555309445625ECABELOS0.00.00.0...0.0
\n", - "

3212 rows × 66 columns

\n", + "

5 rows × 22 columns

\n", "
" ], "text/plain": [ - " pdv SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE Curva \\\n", - "0 20968 93541 23 0 0 B \n", - "1 20969 93541 27 0 0 B \n", - "2 20991 93541 20 0 0 B \n", - "3 20992 93541 178 0 0 E \n", - "4 20995 93541 67 0 0 B \n", - "... ... ... ... ... ... ... \n", - "3207 20998 53094 275 0 0 A \n", - "3208 21278 53094 38 0 0 A \n", - "3209 21495 53094 4 0 0 A \n", - "3210 22541 53094 46 0 0 A \n", - "3211 24255 53094 4 56 25 E \n", + " 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", - " CATEGORIA DiasSemVenda nextcycleprojection \\\n", - "0 PERFUMARIA 13.0 0.0 \n", - "1 PERFUMARIA 3.0 0.0 \n", - "2 PERFUMARIA 5.0 0.0 \n", - "3 PERFUMARIA 0.0 0.0 \n", - "4 PERFUMARIA 3.0 14.0 \n", - "... ... ... ... \n", - "3207 CABELOS 0.0 0.0 \n", - "3208 CABELOS 0.0 0.0 \n", - "3209 CABELOS 2.0 0.0 \n", - "3210 CABELOS 2.0 0.0 \n", - "3211 CABELOS 0.0 0.0 \n", + " C202413 C202414 C202415 C202416 C202417 ... C202503 C202504 \\\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", - " secondtonextcycleprojection ... C202502 C202503 C202504 C202505 \\\n", - "0 0.0 ... 9.0 3.0 1.0 1.0 \n", - "1 0.0 ... 18.0 3.0 8.0 9.0 \n", - "2 0.0 ... 12.0 1.0 9.0 14.0 \n", - "3 121.0 ... 0.0 0.0 0.0 0.0 \n", - "4 53.0 ... 12.0 13.0 4.0 10.0 \n", - "... ... ... ... ... ... ... \n", - "3207 0.0 ... 190.0 208.0 48.0 47.0 \n", - "3208 0.0 ... 27.0 15.0 24.0 13.0 \n", - "3209 0.0 ... 9.0 0.0 0.0 5.0 \n", - "3210 0.0 ... 9.0 6.0 4.0 10.0 \n", - "3211 0.0 ... 0.0 0.0 0.0 0.0 \n", + " C202505 C202506 C202507 C202508 C202509 C202510 C202511 C202512 \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", - " C202506 C202507 C202508 C202509 C202510 C202511 \n", - "0 21.0 3.0 1.0 13.0 1.0 1.0 \n", - "1 23.0 4.0 9.0 2.0 11.0 1.0 \n", - "2 16.0 6.0 8.0 26.0 9.0 1.0 \n", - "3 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "4 43.0 8.0 6.0 27.0 1.0 2.0 \n", - "... ... ... ... ... ... ... \n", - "3207 179.0 31.0 44.0 18.0 180.0 69.0 \n", - "3208 71.0 13.0 8.0 20.0 30.0 21.0 \n", - "3209 5.0 3.0 2.0 5.0 6.0 1.0 \n", - "3210 24.0 42.0 4.0 3.0 9.0 8.0 \n", - "3211 0.0 0.0 0.0 0.0 0.0 0.0 \n", - "\n", - "[3212 rows x 66 columns]" + "[5 rows x 22 columns]" ] }, - "execution_count": 60, + "execution_count": 206, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final" + "df_vendas.head()" ] }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 207, + "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": 208, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + "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", @@ -2232,17 +4085,16 @@ " 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n", " 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n", " '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n", - " 'MATCH', 'PDV_x', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n", - " 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n", - " 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO', 'PDV_y', 'SKU',\n", - " 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414', 'C202415',\n", - " 'C202416', 'C202417', 'C202501', 'C202502', 'C202503', 'C202504',\n", - " 'C202505', 'C202506', 'C202507', 'C202508', 'C202509', 'C202510',\n", - " 'C202511'],\n", + " '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'],\n", " dtype='object')" ] }, - "execution_count": 61, + "execution_count": 208, "metadata": {}, "output_type": "execute_result" } @@ -2253,7 +4105,16 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 209, + "metadata": {}, + "outputs": [], + "source": [ + "df_final.iloc[:, -18:-1] = df_final.iloc[:, -18:-1].fillna(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 210, "metadata": {}, "outputs": [], "source": [ @@ -2266,19 +4127,288 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 211, + "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...C202504C202505C202506C202507C202508C202509C202510C202511C202512PICO DE VENDAS 17CICLOS
0209685657256572350NoneBPERFUMARIA0.00.0...0.09.04.014.00.00.01.00.00.038.0
1209695657256572300NoneBPERFUMARIA0.00.0...2.037.034.014.03.02.04.01.00.037.0
2209705657256572810NoneEPERFUMARIA0.00.0...0.00.00.00.00.00.00.00.0NaN0.0
3209865657256572710NoneEPERFUMARIA0.00.0...0.00.00.00.00.00.00.00.00.00.0
4209885657256572510NoneEPERFUMARIA0.00.0...0.00.00.00.00.00.00.00.00.00.0
\n", + "

5 rows × 63 columns

\n", + "
" + ], + "text/plain": [ + " pdv SKU SKU_FINAL ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE \\\n", + "0 20968 56572 56572 35 0 None \n", + "1 20969 56572 56572 30 0 None \n", + "2 20970 56572 56572 81 0 None \n", + "3 20986 56572 56572 71 0 None \n", + "4 20988 56572 56572 51 0 None \n", + "\n", + " Curva CATEGORIA DiasSemVenda nextcycleprojection ... C202504 C202505 \\\n", + "0 B PERFUMARIA 0.0 0.0 ... 0.0 9.0 \n", + "1 B PERFUMARIA 0.0 0.0 ... 2.0 37.0 \n", + "2 E PERFUMARIA 0.0 0.0 ... 0.0 0.0 \n", + "3 E PERFUMARIA 0.0 0.0 ... 0.0 0.0 \n", + "4 E PERFUMARIA 0.0 0.0 ... 0.0 0.0 \n", + "\n", + " C202506 C202507 C202508 C202509 C202510 C202511 C202512 \\\n", + "0 4.0 14.0 0.0 0.0 1.0 0.0 0.0 \n", + "1 34.0 14.0 3.0 2.0 4.0 1.0 0.0 \n", + "2 0.0 0.0 0.0 0.0 0.0 0.0 NaN \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 38.0 \n", + "1 37.0 \n", + "2 0.0 \n", + "3 0.0 \n", + "4 0.0 \n", + "\n", + "[5 rows x 63 columns]" + ] + }, + "execution_count": 211, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 212, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['C202411', 'C202412', 'C202413', 'C202414', 'C202415', 'C202416',\n", - " 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n", - " 'C202506', 'C202507', 'C202508', 'C202509', 'C202510'],\n", + "PDV\n", + "20968 348\n", + "20991 348\n", + "20995 348\n", + "20996 348\n", + "20997 348\n", + "20998 348\n", + "21278 348\n", + "20969 347\n", + "22541 347\n", + "21495 346\n", + "20992 333\n", + "20986 333\n", + "20993 333\n", + "20989 333\n", + "20988 333\n", + "20970 333\n", + "21000 333\n", + "20999 333\n", + "20994 333\n", + "21001 333\n", + "21383 333\n", + "21375 333\n", + "22448 333\n", + "23703 333\n", + "23704 333\n", + "23711 333\n", + "23712 333\n", + "24255 333\n", + "24257 333\n", + "24269 333\n", + "24293 333\n", + "23813 333\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 212, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.PDV.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 213, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['C202412', 'C202413', 'C202414', 'C202415', 'C202416', 'C202417',\n", + " 'C202501', 'C202502', 'C202503', 'C202504', 'C202505', 'C202506',\n", + " 'C202507', 'C202508', 'C202509', 'C202510', 'C202511'],\n", " dtype='object')" ] }, - "execution_count": 63, + "execution_count": 213, "metadata": {}, "output_type": "execute_result" } @@ -2289,7 +4419,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 214, "metadata": {}, "outputs": [], "source": [ @@ -2300,16 +4430,16 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 215, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'C202412'" + "'C202413'" ] }, - "execution_count": 65, + "execution_count": 215, "metadata": {}, "output_type": "execute_result" } @@ -2320,14 +4450,14 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 216, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "0.3740666443775772\n" + "0.22600883356755672\n" ] } ], @@ -2340,7 +4470,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 217, "metadata": {}, "outputs": [], "source": [ @@ -2351,16 +4481,16 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 218, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'C202413'" + "'C202414'" ] }, - "execution_count": 68, + "execution_count": 218, "metadata": {}, "output_type": "execute_result" } @@ -2371,19 +4501,19 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 219, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['C202411', 'C202412', 'C202413', 'C202414', 'C202415', 'C202416',\n", - " 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n", - " 'C202506', 'C202507', 'C202508', 'C202509', 'C202510', 'C202511'],\n", + "Index(['C202412', 'C202413', 'C202414', 'C202415', 'C202416', 'C202417',\n", + " 'C202501', 'C202502', 'C202503', 'C202504', 'C202505', 'C202506',\n", + " 'C202507', 'C202508', 'C202509', 'C202510', 'C202511', 'C202512'],\n", " dtype='object')" ] }, - "execution_count": 69, + "execution_count": 219, "metadata": {}, "output_type": "execute_result" } @@ -2394,7 +4524,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 220, "metadata": {}, "outputs": [], "source": [ @@ -2409,16 +4539,16 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 221, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "np.float64(0.3740666443775772)" + "np.float64(0.22600883356755672)" ] }, - "execution_count": 71, + "execution_count": 221, "metadata": {}, "output_type": "execute_result" } @@ -2429,43 +4559,7 @@ }, { "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", - " 'PEDIDO PENDENTE', 'Curva', 'CATEGORIA', 'DiasSemVenda',\n", - " 'nextcycleprojection', 'secondtonextcycleprojection', 'Ciclo_x',\n", - " 'Veiculo', 'Tipo de Promoção', 'Estratégia de Promoção',\n", - " 'Tipo_mecanica', 'Promo Período Limitado?', 'EAM', 'Categoria',\n", - " 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n", - " 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n", - " '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n", - " 'MATCH', 'PDV_x', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n", - " 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n", - " 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO', 'PDV_y', 'SKU',\n", - " 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414', 'C202415',\n", - " 'C202416', 'C202417', 'C202501', 'C202502', 'C202503', 'C202504',\n", - " 'C202505', 'C202506', 'C202507', 'C202508', 'C202509', 'C202510',\n", - " 'C202511', 'PICO DE VENDAS 17CICLOS', 'Pico Vendas Ultimos 6 ciclos',\n", - " 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO'],\n", - " dtype='object')" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 73, + "execution_count": 222, "metadata": {}, "outputs": [], "source": [ @@ -2476,7 +4570,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 223, "metadata": {}, "outputs": [], "source": [ @@ -2485,7 +4579,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 224, "metadata": {}, "outputs": [], "source": [ @@ -2494,13 +4588,13 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 225, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + "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", @@ -2508,19 +4602,18 @@ " 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n", " 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n", " '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n", - " 'MATCH', 'PDV_x', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n", - " 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n", - " 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO', 'PDV_y', 'SKU',\n", - " 'DESCRICAO', 'C202411', 'C202412', 'C202413', 'C202414', 'C202415',\n", - " 'C202416', 'C202417', 'C202501', 'C202502', 'C202503', 'C202504',\n", - " 'C202505', 'C202506', 'C202507', 'C202508', 'C202509', 'C202510',\n", - " 'C202511', 'PICO DE VENDAS 17CICLOS', 'Pico Vendas Ultimos 6 ciclos',\n", - " 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO',\n", - " 'PV GINSENG'],\n", + " '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', '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": 76, + "execution_count": 225, "metadata": {}, "output_type": "execute_result" } @@ -2531,7 +4624,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 226, "metadata": {}, "outputs": [], "source": [ @@ -2542,7 +4635,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 227, "metadata": {}, "outputs": [], "source": [ @@ -2556,7 +4649,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 228, "metadata": {}, "outputs": [], "source": [ @@ -2565,7 +4658,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 229, "metadata": {}, "outputs": [], "source": [ @@ -2574,7 +4667,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 230, "metadata": {}, "outputs": [], "source": [ @@ -2587,7 +4680,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 231, "metadata": {}, "outputs": [], "source": [ @@ -2596,7 +4689,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 232, "metadata": {}, "outputs": [], "source": [ @@ -2605,7 +4698,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 233, "metadata": {}, "outputs": [], "source": [ @@ -2614,7 +4707,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 234, "metadata": {}, "outputs": [], "source": [ @@ -2623,7 +4716,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 235, "metadata": {}, "outputs": [], "source": [ @@ -2632,7 +4725,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 236, "metadata": {}, "outputs": [], "source": [ @@ -2641,7 +4734,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 237, "metadata": {}, "outputs": [], "source": [ @@ -2651,7 +4744,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 238, "metadata": {}, "outputs": [], "source": [ @@ -2660,7 +4753,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 239, "metadata": {}, "outputs": [], "source": [ @@ -2672,7 +4765,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 240, "metadata": {}, "outputs": [], "source": [ @@ -2682,7 +4775,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 241, "metadata": {}, "outputs": [], "source": [ @@ -2691,7 +4784,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 242, "metadata": {}, "outputs": [], "source": [ @@ -2700,7 +4793,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 243, "metadata": {}, "outputs": [], "source": [ @@ -2709,7 +4802,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 244, "metadata": {}, "outputs": [], "source": [ @@ -2719,13 +4812,13 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 245, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + "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", @@ -2733,17 +4826,17 @@ " 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n", " 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n", " '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n", - " 'MATCH', 'PDV_x', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n", - " 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n", - " 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO', 'PDV_y', 'SKU',\n", - " 'DESCRICAO', 'C202413', 'C202508', 'C202509', 'C202510', 'C202511',\n", - " 'PICO DE VENDAS 17CICLOS', 'Pico Vendas Ultimos 6 ciclos',\n", - " 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO',\n", - " 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t', 'VENDAS R$ ABASTECIMENTO'],\n", + " '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', 'C202414', 'C202509', 'C202510',\n", + " 'C202511', 'C202512', '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": 96, + "execution_count": 245, "metadata": {}, "output_type": "execute_result" } @@ -2754,7 +4847,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 246, "metadata": {}, "outputs": [], "source": [ @@ -2763,7 +4856,7 @@ "\n", "# Passo 2: obter até 3 chamadas promocionais por grupo\n", "promo_grouped = (\n", - " df_sorted.groupby(['SKU_FINAL', 'pdv'])['Chamada Promocional']\n", + " df_sorted.groupby(['SKU_FINAL', 'PDV'])['Chamada Promocional']\n", " .apply(lambda x: x.dropna().unique()[:3])\n", " .apply(pd.Series)\n", " .rename(columns={0: 'MECÂNICA 1', 1: 'MECÂNICA 2', 2: 'MECÂNICA 3'})\n", @@ -2771,17 +4864,17 @@ ")\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", + "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", + "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", + "# 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", + " .groupby(['SKU_FINAL', 'PDV'])['Cód. Combo']\n", " .first()\n", " .to_dict()\n", ")\n", @@ -2794,6 +4887,59 @@ "\n" ] }, + { + "cell_type": "code", + "execution_count": 247, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PDV\n", + "21375 270\n", + "21383 270\n", + "21495 270\n", + "22448 270\n", + "22541 270\n", + "23703 270\n", + "20969 270\n", + "20968 270\n", + "23704 270\n", + "23711 270\n", + "20999 270\n", + "21000 270\n", + "20994 270\n", + "20993 270\n", + "20995 270\n", + "20996 270\n", + "20997 270\n", + "20998 270\n", + "20986 270\n", + "20970 270\n", + "20991 270\n", + "20992 270\n", + "20989 270\n", + "20988 270\n", + "21001 270\n", + "21278 270\n", + "23813 270\n", + "24293 270\n", + "24269 270\n", + "24257 270\n", + "24255 270\n", + "23712 270\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 247, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_merged.PDV.value_counts()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -2820,7 +4966,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 248, "metadata": {}, "outputs": [], "source": [ @@ -2831,13 +4977,13 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 249, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['pdv', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + "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", @@ -2845,18 +4991,17 @@ " 'Cód. Combo', 'Código do Item', 'Descrição do Item',\n", " 'Chamada Promocional', 'Valor do Guia', 'Preço Promocionado',\n", " '% de Desconto', 'RE compra por', 'RE Vende por', 'RE lucra (R$)',\n", - " 'MATCH', 'PDV_x', 'UF', 'DESCRIÇÃO PDV', 'ANALISTA', 'match', 'Ciclo_y',\n", - " 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'SKU2',\n", - " 'Tipo Preço', 'PC', 'PV', 'PDV_SKU', 'UFPRODUTO', 'PDV_y', 'SKU',\n", - " 'DESCRICAO', 'C202413', 'C202508', 'C202509', 'C202510', 'C202511',\n", - " 'PICO DE VENDAS 17CICLOS', 'Pico Vendas Ultimos 6 ciclos',\n", - " 'CRESCIMENTO', 'MEDIANA DO HISTÓRICO', 'MEDIA DO HISTÓRICO',\n", - " 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t', 'VENDAS R$ ABASTECIMENTO',\n", - " 'MECÂNICA 1', 'MECÂNICA 2', 'MECÂNICA 3'],\n", + " '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', 'C202414', 'C202509', 'C202510',\n", + " 'C202511', 'C202512', '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": 100, + "execution_count": 249, "metadata": {}, "output_type": "execute_result" } @@ -2867,7 +5012,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 250, "metadata": {}, "outputs": [], "source": [ @@ -2876,7 +5021,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 251, "metadata": {}, "outputs": [], "source": [ @@ -2885,40 +5030,47 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 252, + "metadata": {}, + "outputs": [], + "source": [ + "df_merged['DESCRICAO'] = df_merged['Descrição do Item']" + ] + }, + { + "cell_type": "code", + "execution_count": 253, + "metadata": {}, + "outputs": [], + "source": [ + "df_merged['SKU'] = np.where(df_merged['SKU'].isna(),df_merged['SKU_FINAL'],df_merged['SKU'])" + ] + }, + { + "cell_type": "code", + "execution_count": 254, "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', 'SKU_FINAL','Descrição do Item','CRESCIMENTO',\n", + " ,'Chamada Promocional','MATCH','match','Descrição do Item','CRESCIMENTO',\n", " 'Cód. Combo'])" ] }, { "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [], - "source": [ - "df_merged['SUGESTÃO ANALISTA'] = \"\"\n", - "\n", - "df_merged['SUGESTÃO COMERCIAL'] = \"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 106, + "execution_count": 255, "metadata": {}, "outputs": [], "source": [ "df_merged = df_merged.drop(columns=['Código do Item','PDV','RE compra por',\t'RE Vende por',\t'RE lucra (R$)','INICIO CICLO',\n", - " 'FIM CICLO','SKU2','Tipo Preço','Ciclo','CATEGORIA','ANALISTA','dias_ate_inicio','PDV_SKU','UFPRODUTO',\n", - " 'VENDAS R$ ABASTECIMENTO','DURAÇÃO','MEDIANA DO HISTÓRICO','DURAÇÃO','PC','PV'])" + " '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": 107, + "execution_count": 256, "metadata": {}, "outputs": [], "source": [ @@ -2927,7 +5079,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 257, "metadata": {}, "outputs": [], "source": [ @@ -2936,7 +5088,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 258, "metadata": {}, "outputs": [], "source": [ @@ -2945,7 +5097,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 259, "metadata": {}, "outputs": [], "source": [ @@ -2954,25 +5106,24 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 260, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['PDV', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO', 'PEDIDO PENDENTE',\n", - " 'CURVA', 'DIASSEMVENDA', 'PROJEÇÃO PROX CICLO',\n", + "Index(['PDV', 'SKU', 'SKU_FINAL', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + " 'PEDIDO PENDENTE', 'CURVA', 'DIASSEMVENDA', 'PROJEÇÃO PROX CICLO',\n", " 'PROJEÇÃO PROX CICLO +1', 'PROMO PERÍODO LIMITADO?', 'EAM', 'CATEGORIA',\n", " 'VALOR DO GUIA', 'PREÇO PROMOCIONADO', '% DE DESCONTO', 'UF',\n", - " 'DESCRIÇÃO PDV', 'SKU', 'DESCRICAO', 'C202413', 'C202508', 'C202509',\n", - " 'C202510', 'C202511', 'PICO DE VENDAS 17CICLOS',\n", + " 'DESCRIÇÃO PDV', 'DESCRICAO', 'C202411', 'C202414', 'C202509',\n", + " 'C202510', 'C202511', 'C202512', 'PICO DE VENDAS 17CICLOS',\n", " 'PICO VENDAS ULTIMOS 6 CICLOS', 'MEDIA DO HISTÓRICO', 'PV GINSENG',\n", - " 'SUGESTÃO ABTASTECIMENTO\\t', 'MECÂNICA 1', 'MECÂNICA 2', 'MECÂNICA 3',\n", - " 'SUGESTÃO ANALISTA', 'SUGESTÃO COMERCIAL'],\n", + " 'SUGESTÃO ABTASTECIMENTO\\t', 'MECÂNICA 1', 'MECÂNICA 2', 'MECÂNICA 3'],\n", " dtype='object')" ] }, - "execution_count": 111, + "execution_count": 260, "metadata": {}, "output_type": "execute_result" } @@ -2983,7 +5134,16 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 261, + "metadata": {}, + "outputs": [], + "source": [ + "df_merged['SUGESTÃO COMERCIAL'] =\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 262, "metadata": {}, "outputs": [], "source": [ @@ -2998,7 +5158,7 @@ "\n", "# Colunas que devem estar no fim\n", "colunas_fim = [\n", - " 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t', 'SUGESTÃO ANALISTA', 'SUGESTÃO COMERCIAL'\n", + " 'PV GINSENG', 'SUGESTÃO ABTASTECIMENTO\\t', 'SUGESTÃO COMERCIAL'\n", "]\n", "\n", "# Todas as outras colunas (não estão nem no início nem no fim)\n", @@ -3010,7 +5170,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 263, "metadata": {}, "outputs": [], "source": [ @@ -3019,7 +5179,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 264, "metadata": {}, "outputs": [], "source": [ @@ -3029,7 +5189,7 @@ "\n", "\n", "# Export to Excel\n", - "output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\EUD_promoção_{ciclo_mais2}_04.06.xlsx'\n", + "output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\EUD_promoção_{ciclo_mais2}_25.08.xlsx'\n", "with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n", " df_merged.to_excel(writer, index=False, sheet_name='Sheet1')\n", "\n", @@ -3083,6 +5243,11 @@ "CRIAR PROJEÇÃO DE VENDA DO CICLO ATUAL\n", "Compra inteligente Próximo Ciclo + 1 >>>>>>> RENAME PRA NOROMAL" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { diff --git a/promoção/promoção_boti_ciclo07.ipynb b/promoção/promoção_boti_ciclo07.ipynb index ad04e7a..138d865 100644 --- a/promoção/promoção_boti_ciclo07.ipynb +++ b/promoção/promoção_boti_ciclo07.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 101, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -26,29 +26,20 @@ }, { "cell_type": "code", - "execution_count": 103, + "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." + "#precisa ver duplicidade de desc e vendas irece." ] }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 203, "metadata": {}, "outputs": [], "source": [ - "df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C11\\TABELA DE PEDIDOS\\Pedidos Semanais Especiais - BOT - 202511 (1).xlsx\")\n", + "df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C14\\TABELA DE PEDIDOS\\Pedidos Semanais Especiais - BOT - 202514 (3).xlsx\")\n", "\n", "df_tabela = df_tabela[df_tabela['Ação revendedor'].notna() | df_tabela['Ação consumidor'].notna()]\n", "\n", @@ -60,7 +51,7 @@ "\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", + "#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", @@ -76,50 +67,599 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 205, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "(332,)" - ] - }, - "execution_count": 105, - "metadata": {}, - "output_type": "execute_result" + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\2225685327.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", + " dfi = pd.read_sql(query, conn)\n" + ] } ], "source": [ - "df_tabela['Código'].shape" + "import pyodbc\n", + "import configparser\n", + "\n", + "#query de vendas por ciclo\n", + "\n", + "config = configparser.ConfigParser()\n", + "config.read(r\"C:\\Users\\joao.herculano\\Documents\\Enviador de email\\credenciais.ini\")\n", + "\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", + "\n", + "query = f'''\n", + "SELECT \n", + " B.PDV, \n", + " B.SKU,\n", + " bd.SKU2, \n", + " COALESCE(bd.SKU2, b.SKU) AS SKU_FINAL,\n", + " B.DESCRICAO,\n", + " SUM(CAST(b.VENDAS AS DECIMAL(18,2))) AS VENDAS_CICLO,\n", + " C.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 base_depara bd on b.SKU = bd.SKU \n", + "WHERE CAST(b.[DATA] AS DATE) >= DATEADD(YEAR, -1, GETDATE())\n", + "GROUP BY\n", + " B.PDV, \n", + " B.SKU,\n", + " bd.SKU2,\n", + " B.DESCRICAO,\n", + " C.Ciclo\n", + "HAVING SUM(CAST(b.VENDAS AS DECIMAL(18,2))) > 0\n", + "'''\n", + "dfi = pd.read_sql(query, conn)\n", + "conn.close()" ] }, { "cell_type": "code", - "execution_count": 106, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(332, 24)" - ] - }, - "execution_count": 106, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_tabela.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 107, + "execution_count": 206, "metadata": {}, "outputs": [], "source": [ + "dfi['SKU2'] = dfi['SKU2'].fillna(\"-\")" + ] + }, + { + "cell_type": "code", + "execution_count": 207, + "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", + "
PDVSKUSKU2SKU_FINALDESCRICAOVENDAS_CICLOCiclo
02099251021-51021\"QDB BLUSH LIQ GUARANA 68.0C202416
1200574510-4510REF BOTIK CR FAC FIRM AC/HIALUR 40g2.0C202417
2209971808-1808MAKE B BAS LIQ MATE SALICYLIC 200 30g1.0C202504
31282356804-56804MATCH MASC CAP SCIENCE RECONS V2 250g2.0C202511
42099883836-83836OUI CREM DES HID CPO MADELEINE 200g8.0C202501
\n", + "
" + ], + "text/plain": [ + " PDV SKU SKU2 SKU_FINAL DESCRICAO \\\n", + "0 20992 51021 - 51021 \"QDB BLUSH LIQ GUARANA 6 \n", + "1 20057 4510 - 4510 REF BOTIK CR FAC FIRM AC/HIALUR 40g \n", + "2 20997 1808 - 1808 MAKE B BAS LIQ MATE SALICYLIC 200 30g \n", + "3 12823 56804 - 56804 MATCH MASC CAP SCIENCE RECONS V2 250g \n", + "4 20998 83836 - 83836 OUI CREM DES HID CPO MADELEINE 200g \n", + "\n", + " VENDAS_CICLO Ciclo \n", + "0 8.0 C202416 \n", + "1 2.0 C202417 \n", + "2 1.0 C202504 \n", + "3 2.0 C202511 \n", + "4 8.0 C202501 " + ] + }, + "execution_count": 207, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dfi = dfi[dfi['SKU2'] == \"-\"]\n", + "\n", + "dfi.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 208, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDVSKU_FINALDESCRICAOC202412C202413C202414C202415C202416C202417C202501...C202503C202504C202505C202506C202507C202508C202509C202510C202511C202512
0125221004FLORATTA DES COL MY BLUE 75ml0.015.02.03.056.06.01.0...1.05.012.07.02.00.01.02.05.02.0
1125221080INTENSE GLOS LAB BUBBAL TUT/FRUT 5ml2.00.04.00.010.02.02.0...2.03.01.07.017.00.00.00.00.00.0
2125221296PMPCK THE BLEND DES ANTIT AER 2x75g0.01.03.03.02.00.00.0...0.00.00.00.00.00.00.00.00.00.0
3125221302PMPCK LILY DES ANTIT AER 2x75g1.04.03.05.06.00.00.0...0.00.00.03.04.00.04.04.02.01.0
4125221314PMPCK ZAAD DES ANTIT AER 2x75g0.02.03.01.01.00.00.0...0.00.00.00.00.00.00.00.01.00.0
..................................................................
142986569989048ENVELOPE M BOTI NAMORADOS/25 UNITARIO0.00.00.00.00.00.00.0...0.00.00.00.00.026.04.00.00.00.0
142987569989756CAIXA FLAG BOTI NAMORADOS 25 UNIT0.00.00.00.00.00.00.0...0.00.00.00.00.01.00.00.00.00.0
142988569989840CAIXA LACO M BOTI PAIS/25 UNIT0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.011.01.0
142989569989843ENVELOPE M BOTI PAIS 2025 UNIT0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.010.08.0
142990569990774PIN MELHOR PAI O BOTICARIO PAIS/25 UNIT0.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.03.00.0
\n", + "

142991 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " PDV SKU_FINAL DESCRICAO C202412 \\\n", + "0 12522 1004 FLORATTA DES COL MY BLUE 75ml 0.0 \n", + "1 12522 1080 INTENSE GLOS LAB BUBBAL TUT/FRUT 5ml 2.0 \n", + "2 12522 1296 PMPCK THE BLEND DES ANTIT AER 2x75g 0.0 \n", + "3 12522 1302 PMPCK LILY DES ANTIT AER 2x75g 1.0 \n", + "4 12522 1314 PMPCK ZAAD DES ANTIT AER 2x75g 0.0 \n", + "... ... ... ... ... \n", + "142986 5699 89048 ENVELOPE M BOTI NAMORADOS/25 UNITARIO 0.0 \n", + "142987 5699 89756 CAIXA FLAG BOTI NAMORADOS 25 UNIT 0.0 \n", + "142988 5699 89840 CAIXA LACO M BOTI PAIS/25 UNIT 0.0 \n", + "142989 5699 89843 ENVELOPE M BOTI PAIS 2025 UNIT 0.0 \n", + "142990 5699 90774 PIN MELHOR PAI O BOTICARIO PAIS/25 UNIT 0.0 \n", + "\n", + " C202413 C202414 C202415 C202416 C202417 C202501 ... C202503 \\\n", + "0 15.0 2.0 3.0 56.0 6.0 1.0 ... 1.0 \n", + "1 0.0 4.0 0.0 10.0 2.0 2.0 ... 2.0 \n", + "2 1.0 3.0 3.0 2.0 0.0 0.0 ... 0.0 \n", + "3 4.0 3.0 5.0 6.0 0.0 0.0 ... 0.0 \n", + "4 2.0 3.0 1.0 1.0 0.0 0.0 ... 0.0 \n", + "... ... ... ... ... ... ... ... ... \n", + "142986 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "142987 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "142988 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "142989 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "142990 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "\n", + " C202504 C202505 C202506 C202507 C202508 C202509 C202510 \\\n", + "0 5.0 12.0 7.0 2.0 0.0 1.0 2.0 \n", + "1 3.0 1.0 7.0 17.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 3.0 4.0 0.0 4.0 4.0 \n", + "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... ... \n", + "142986 0.0 0.0 0.0 0.0 26.0 4.0 0.0 \n", + "142987 0.0 0.0 0.0 0.0 1.0 0.0 0.0 \n", + "142988 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "142989 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "142990 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " C202511 C202512 \n", + "0 5.0 2.0 \n", + "1 0.0 0.0 \n", + "2 0.0 0.0 \n", + "3 2.0 1.0 \n", + "4 1.0 0.0 \n", + "... ... ... \n", + "142986 0.0 0.0 \n", + "142987 0.0 0.0 \n", + "142988 11.0 1.0 \n", + "142989 10.0 8.0 \n", + "142990 3.0 0.0 \n", + "\n", + "[142991 rows x 21 columns]" + ] + }, + "execution_count": 208, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# 1. Agrupamento\n", + "df_agrupado = dfi.groupby(['PDV', 'SKU_FINAL', '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_FINAL', '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_pivotadowawa = df_pivotado.reset_index()\n", + "\n", + "# 4. (Opcional) Renomear colunas com prefixo \"Ciclo_\"\n", + "df_pivotadowawa.columns.name = None\n", + "df_pivotadowawa = df_pivotadowawa.rename(columns=lambda x: f'Ciclo_{x}' if isinstance(x, (int, str)) and str(x).isdigit() else x)\n", + "\n", + "# Resultado final\n", + "df_pivotadowawa\n" + ] + }, + { + "cell_type": "code", + "execution_count": 209, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", "df_pdv = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n", "\n", "df_pdv_origi = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\PDV_ATT.xlsx\")\n", @@ -130,252 +670,293 @@ "\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", + "df_pdv = df_pdv[(df_pdv['PDV']!=910291)&(df_pdv['PDV']!=910173)]\n", "\n" ] }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 210, "metadata": {}, "outputs": [], "source": [ - "df_pdv = df_pdv.drop(columns=['pdv como texto','PDV DESC'])" + "df_pdv = df_pdv.drop(columns=['PDV DESC'])" ] }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 211, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_17756\\3645011820.py:10: DtypeWarning: Columns (6,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" + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\268247862.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", + " df_draft_ = pd.read_sql(query_est_draft, conn)\n" + ] + } + ], + "source": [ + "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", + "\n", + "query_est_draft = f'''\n", + "select em.PDV ,\n", + "COALESCE(em.SKU_PARA , em.SKU) as SKU,\n", + "em.DESCRICAO,\n", + "d.salescurve as curva,\n", + "d.codcategory as categoria,\n", + "d.nextcycleprojection as proj_mar\n", + ",d.secondtonextcycleprojection as 'proj_mar+1',\n", + "em.[ESTOQUE ATUAL],em.[ESTOQUE EM TRANSITO],\n", + "em.[PEDIDO PENDENTE],\n", + "em.[DDV PREVISTO] ,\n", + "d.pricesellin as 'preço'\n", + "from estoque_mar em \n", + "left join draft d on d.code = COALESCE(em.SKU_PARA , em.SKU) and d.loja_id = em.PDV \n", + "where em.ORIGEM = 'BOT'\n", + "'''\n", + "df_draft_ = pd.read_sql(query_est_draft, conn)\n", + "conn.close()\n", + "\n", + "#FALTA ATUALIZAR QUERY" + ] + }, + { + "cell_type": "code", + "execution_count": 212, + "metadata": {}, + "outputs": [], + "source": [ + "df_draft = df_draft_" + ] + }, + { + "cell_type": "code", + "execution_count": 213, + "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", + "
PDVSKUDESCRICAOcurvacategoriaproj_marproj_mar+1ESTOQUE ATUALESTOQUE EM TRANSITOPEDIDO PENDENTEDDV PREVISTOpreço
392512371148060LILY CREM DES HID ACET CPO 250g V8ACUIDADOS COM A PELE87.00.0511409,2042.54
\n", + "
" + ], + "text/plain": [ + " PDV SKU DESCRICAO curva \\\n", + "39251 23711 48060 LILY CREM DES HID ACET CPO 250g V8 A \n", + "\n", + " categoria proj_mar proj_mar+1 ESTOQUE ATUAL \\\n", + "39251 CUIDADOS COM A PELE 87.0 0.0 511 \n", + "\n", + " ESTOQUE EM TRANSITO PEDIDO PENDENTE DDV PREVISTO preço \n", + "39251 4 0 9,20 42.54 " + ] + }, + "execution_count": 213, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_draft[(df_draft['PDV']=='23711') & (df_draft['SKU']=='48060')].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 214, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(350518, 12)" + ] + }, + "execution_count": 214, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_draft = df_draft[~df_draft['DESCRICAO'].str.contains('OUI', na=False)]\n", + "\n", + "df_draft.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 215, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\1765304903.py:1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df_draft['ESTOQUE ATUAL'] = df_draft['ESTOQUE ATUAL'].astype(float)\n", + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\1765304903.py:3: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df_draft['ESTOQUE EM TRANSITO'] = df_draft['ESTOQUE EM TRANSITO'].astype(float)\n", + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\1765304903.py:5: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df_draft['PEDIDO PENDENTE'] = df_draft['PEDIDO PENDENTE'].astype(float)\n" ] }, { "data": { "text/plain": [ - "(127198, 46)" + "PDV object\n", + "SKU object\n", + "DESCRICAO object\n", + "curva object\n", + "categoria object\n", + "proj_mar float64\n", + "proj_mar+1 float64\n", + "ESTOQUE ATUAL float64\n", + "ESTOQUE EM TRANSITO float64\n", + "PEDIDO PENDENTE float64\n", + "DDV PREVISTO object\n", + "preço float64\n", + "dtype: object" ] }, - "execution_count": 109, + "execution_count": 215, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Caminho onde estão as subpastas com os arquivos CSV\n", + "df_draft['ESTOQUE ATUAL'] = df_draft['ESTOQUE ATUAL'].astype(float)\n", "\n", - "# Set the path to the folder containing CSV files\n", - "folder_path = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C11\\DRAFT_PDVS_SEM_\" # arquivo dos drafts\n", + "df_draft['ESTOQUE EM TRANSITO'] = df_draft['ESTOQUE EM TRANSITO'].astype(float)\n", "\n", - "# Pattern to match all CSV files\n", - "csv_files = glob.glob(os.path.join(folder_path, '*.csv'))\n", + "df_draft['PEDIDO PENDENTE'] = df_draft['PEDIDO PENDENTE'].astype(float)\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" + "df_draft.dtypes" ] }, { "cell_type": "code", - "execution_count": 110, - "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": 111, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "# Caminho onde estão as subpastas com os arquivos CSV\n", - "pasta_entrada = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C11\\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": 112, + "execution_count": 216, "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": 112, - "metadata": {}, - "output_type": "execute_result" + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\1952797845.py:1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].str.replace(',','.')\n", + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\1952797845.py:3: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].astype(float)\n", + "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_22664\\1952797845.py:5: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].fillna(0)\n" + ] } ], "source": [ - "df_tabela.columns" + "df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].str.replace(',','.')\n", + "\n", + "df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].astype(float)\n", + "\n", + "df_draft['DDV PREVISTO'] = df_draft['DDV PREVISTO'].fillna(0)" ] }, { "cell_type": "code", - "execution_count": 113, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(332, 24)" - ] - }, - "execution_count": 113, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_tabela.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Canal\n", - "Todos 183\n", - "Loja 72\n", - "VD 67\n", - "Loja | VD 6\n", - "Ecomm | VD 2\n", - "Ecomm | Loja 2\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 114, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_tabela['Canal'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, + "execution_count": 217, "metadata": {}, "outputs": [], "source": [ - "df_estoque['SKU_FINAL'] = df_estoque['SKU_FINAL'].astype('Int64')" + "df_draft = df_draft.groupby(['PDV','SKU','curva','categoria'])[['proj_mar','proj_mar+1','ESTOQUE ATUAL','ESTOQUE EM TRANSITO','PEDIDO PENDENTE','DDV PREVISTO','preço']].max().reset_index()" ] }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "df_tabela = pd.merge(left=df_tabela,right=df_estoque[['SKU','SKU_FINAL']],left_on='Código',right_on='SKU',how='left')\n", - "\n", - "df_tabela['Código'] = df_tabela['SKU_FINAL']\n", - "\n", - "df_tabela = df_tabela.drop(columns=['SKU','SKU_FINAL'])" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "315" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_tabela['Código'].nunique()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "df_tabela = pd.merge(left=df_tabela,right=df_estoque[['SKU','SKU_FINAL']],left_on='Código',right_on='SKU_FINAL',how='left')\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": 18, + "execution_count": 218, "metadata": {}, "outputs": [], "source": [ @@ -384,16 +965,253 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 219, "metadata": {}, "outputs": [], "source": [ - "df_tabela.to_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C11\\teste.xlsx\",index=False)" + "df_bi_preco = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C13\\preço BI\\TABELA DE PREÇOS (2).xlsx\")\n", + "\n", + "df_bi_preco = df_bi_preco.drop(columns=['Descrição','Tipo Preço','CATEGORIA','LINHA','MARCA'])\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 220, + "metadata": {}, + "outputs": [], + "source": [ + "df_pivotadowawa['SKU_FINAL'] = df_pivotadowawa['SKU_FINAL'].astype('str')" + ] + }, + { + "cell_type": "code", + "execution_count": 221, + "metadata": {}, + "outputs": [], + "source": [ + "df_draft = pd.merge(df_draft,df_pivotadowawa,left_on=['PDV','SKU'],right_on=['PDV','SKU_FINAL'])" + ] + }, + { + "cell_type": "code", + "execution_count": 222, + "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", + "
PDVSKUcurvacategoriaproj_marproj_mar+1ESTOQUE ATUALESTOQUE EM TRANSITOPEDIDO PENDENTEDDV PREVISTO...C202503C202504C202505C202506C202507C202508C202509C202510C202511C202512
761252248060ACUIDADOS COM A PELE14.019.042.00.00.00.68...14.030.011.038.010.019.023.03.019.010.0
11961281748060ACUIDADOS COM A PELE61.076.087.060.00.02.82...30.082.036.0219.033.079.0106.044.064.09.0
23751281848060ACUIDADOS COM A PELE9.012.03.00.00.00.44...5.08.04.020.02.08.09.07.09.00.0
33621282048060ACUIDADOS COM A PELE11.013.040.00.00.00.49...9.015.08.022.04.024.016.07.02.02.0
43201282348060ACUIDADOS COM A PELE10.012.020.00.00.00.46...5.026.06.015.01.05.013.07.09.00.0
\n", + "

5 rows × 31 columns

\n", + "
" + ], + "text/plain": [ + " PDV SKU curva categoria proj_mar proj_mar+1 \\\n", + "76 12522 48060 A CUIDADOS COM A PELE 14.0 19.0 \n", + "1196 12817 48060 A CUIDADOS COM A PELE 61.0 76.0 \n", + "2375 12818 48060 A CUIDADOS COM A PELE 9.0 12.0 \n", + "3362 12820 48060 A CUIDADOS COM A PELE 11.0 13.0 \n", + "4320 12823 48060 A CUIDADOS COM A PELE 10.0 12.0 \n", + "\n", + " ESTOQUE ATUAL ESTOQUE EM TRANSITO PEDIDO PENDENTE DDV PREVISTO ... \\\n", + "76 42.0 0.0 0.0 0.68 ... \n", + "1196 87.0 60.0 0.0 2.82 ... \n", + "2375 3.0 0.0 0.0 0.44 ... \n", + "3362 40.0 0.0 0.0 0.49 ... \n", + "4320 20.0 0.0 0.0 0.46 ... \n", + "\n", + " C202503 C202504 C202505 C202506 C202507 C202508 C202509 C202510 \\\n", + "76 14.0 30.0 11.0 38.0 10.0 19.0 23.0 3.0 \n", + "1196 30.0 82.0 36.0 219.0 33.0 79.0 106.0 44.0 \n", + "2375 5.0 8.0 4.0 20.0 2.0 8.0 9.0 7.0 \n", + "3362 9.0 15.0 8.0 22.0 4.0 24.0 16.0 7.0 \n", + "4320 5.0 26.0 6.0 15.0 1.0 5.0 13.0 7.0 \n", + "\n", + " C202511 C202512 \n", + "76 19.0 10.0 \n", + "1196 64.0 9.0 \n", + "2375 9.0 0.0 \n", + "3362 2.0 2.0 \n", + "4320 9.0 0.0 \n", + "\n", + "[5 rows x 31 columns]" + ] + }, + "execution_count": 222, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_draft[df_draft['SKU']=='48060'].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 223, "metadata": {}, "outputs": [ { @@ -441,407 +1259,55 @@ " \n", " \n", " \n", - " \n", - " 0\n", - " 202511\n", - " NNE\n", - " VD\n", - " 74438\n", - " ARBO DES COL 100ml V4\n", - " Não\n", - " Semanal\n", - " Não\n", - " BOT\n", - " ARBO\n", - " ...\n", - " Sim\n", - " REGULAR\n", - " NaN\n", - " 0,00\n", - " VD - FAVORITOS PARA INÍCIOS ARBO - C11\n", - " 35,00\n", - " Sortido\n", - " Sortido\n", - " Sortido\n", - " 1\n", - " \n", - " \n", - " 7440\n", - " 202511\n", - " NNE\n", - " VD\n", - " 57210\n", - " AU MIGOS PETS BANHO SECO ADULTOS 240ml\n", - " Não\n", - " Semanal\n", - " Não\n", - " BOT\n", - " AU.MIGOS PETS\n", - " ...\n", - " Sim\n", - " REGULAR\n", - " NaN\n", - " 0,00\n", - " VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ...\n", - " 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ...\n", - " Sortido\n", - " Sortido\n", - " Sortido\n", - " 1\n", - " \n", - " \n", - " 12624\n", - " 202511\n", - " NNE\n", - " VD\n", - " 57211\n", - " AU MIGOS PETS COL ADULTOS 60ml\n", - " Não\n", - " Semanal\n", - " Não\n", - " BOT\n", - " AU.MIGOS PETS\n", - " ...\n", - " Sim\n", - " REGULAR\n", - " NaN\n", - " 0,00\n", - " VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ...\n", - " 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ...\n", - " Sortido\n", - " Sortido\n", - " Sortido\n", - " 1\n", - " \n", - " \n", - " 17953\n", - " 202511\n", - " NNE\n", - " VD\n", - " 57209\n", - " AU MIGOS PETS COL FILHOTES 60ml\n", - " Não\n", - " Semanal\n", - " Não\n", - " BOT\n", - " AU.MIGOS PETS\n", - " ...\n", - " Sim\n", - " REGULAR\n", - " NaN\n", - " 0,00\n", - " VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ...\n", - " 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ...\n", - " Sortido\n", - " Sortido\n", - " Sortido\n", - " 1\n", - " \n", - " \n", - " 23578\n", - " 202511\n", - " NNE\n", - " VD\n", - " 57208\n", - " AU MIGOS PETS COND ADULTOS 400ml\n", - " Não\n", - " Semanal\n", - " Não\n", - " BOT\n", - " AU.MIGOS PETS\n", - " ...\n", - " Sim\n", - " REGULAR\n", - " NaN\n", - " 0,00\n", - " VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ...\n", - " 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ...\n", - " Sortido\n", - " Sortido\n", - " Sortido\n", - " 1\n", - " \n", - " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " \n", - " \n", - " 1918086\n", - " 202511\n", - " NNE\n", - " Loja\n", - " 55477\n", - " SCH BOTIK SERUM FAC RESV/SILICIO VDA 2ml\n", - " Não\n", - " Semanal\n", - " Não\n", - " BOT\n", - " BOTIK\n", - " ...\n", - " Sim\n", - " REGULAR\n", - " [BOT] AÇÃO DE FLUXO BOTIK CICACERAMIDAS COM DE...\n", - " 10,00\n", - " [BOT] AÇÃO DE FLUXO BOTIK CICACERAMIDAS COM DE...\n", - " 0,00\n", - " Sortido\n", - " Sortido\n", - " Sortido\n", - " 1\n", - " \n", - " \n", - " 1918662\n", - " 202511\n", - " NNE\n", - " Ecomm | VD\n", - " 83961\n", - " ARBO DES BDY SPR 100ml V6\n", - " Não\n", - " Semanal\n", - " Não\n", - " BOT\n", - " ARBO\n", - " ...\n", - " Sim\n", - " REGULAR\n", - " [ECOMM] PAIS 2025 - COMBO ARBO - NNE\n", - " 21,49\n", - " VD - FAVORITOS PARA INÍCIOS BODY SPRAY ARBO - C11\n", - " 35,00\n", - " Sortido\n", - " Sortido\n", - " Sortido\n", - " 1\n", - " \n", - " \n", - " 1926362\n", - " 202511\n", - " NNE\n", - " Ecomm | VD\n", - " 73614\n", - " COFFEE DES COL DUO MAN 100ml\n", - " Não\n", - " Semanal\n", - " Não\n", - " BOT\n", - " COFFEE\n", - " ...\n", - " Sim\n", - " REGULAR\n", - " [ECOMM] PAIS 2025 - COMBO COFFEE E BOTMEN\n", - " 18,67\n", - " VD - COFFEE PERFUMARIA MASCULINA - LUCRO EXTRA...\n", - " 20,00 | 25,00 | 30,00\n", - " Sortido\n", - " Sortido\n", - " Sortido\n", - " 1\n", - " \n", - " \n", - " 1931987\n", - " 202511\n", - " NNE\n", - " Ecomm | Loja\n", - " 52948\n", - " NSPA CREM ESF CPO AMEI DOUR 200g\n", - " Não\n", - " Semanal\n", - " Não\n", - " BOT\n", - " NATIVA SPA\n", - " ...\n", - " Sim\n", - " REGULAR\n", - " [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ...\n", - " 7,82\n", - " [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ...\n", - " 0,00\n", - " Não sortido\n", - " Sortido\n", - " Sortido\n", - " 1\n", - " \n", - " \n", - " 1937171\n", - " 202511\n", - " NNE\n", - " Ecomm | Loja\n", - " 58987\n", - " NSPA OL BIF DES HID CPO UVA MERL 200ml\n", - " Não\n", - " Semanal\n", - " Não\n", - " BOT\n", - " NATIVA SPA\n", - " ...\n", - " Sim\n", - " REGULAR\n", - " [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ...\n", - " 14,88\n", - " [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ...\n", - " 0,00\n", - " Sortido\n", - " Sortido\n", - " Sortido\n", - " 1\n", - " \n", " \n", "\n", - "

332 rows × 24 columns

\n", + "

0 rows × 24 columns

\n", "" ], "text/plain": [ - " Ciclo Região Canal Código \\\n", - "0 202511 NNE VD 74438 \n", - "7440 202511 NNE VD 57210 \n", - "12624 202511 NNE VD 57211 \n", - "17953 202511 NNE VD 57209 \n", - "23578 202511 NNE VD 57208 \n", - "... ... ... ... ... \n", - "1918086 202511 NNE Loja 55477 \n", - "1918662 202511 NNE Ecomm | VD 83961 \n", - "1926362 202511 NNE Ecomm | VD 73614 \n", - "1931987 202511 NNE Ecomm | Loja 52948 \n", - "1937171 202511 NNE Ecomm | Loja 58987 \n", + "Empty DataFrame\n", + "Columns: [Ciclo, Região, Canal, Código, Descrição, IAF, Tipo de pedido, Foco, Unidade de negócio, Marca, Categoria, Subcategoria, Quantidade por caixa, Tipo de promoção, Catálogo, Tipo de produto, Ação consumidor, Percentual de desconto consumidor, Ação revendedor, Percentual de desconto revendedor, Sortimento P, Sortimento M, Sortimento G, MATCH]\n", + "Index: []\n", "\n", - " Descrição IAF Tipo de pedido Foco \\\n", - "0 ARBO DES COL 100ml V4 Não Semanal Não \n", - "7440 AU MIGOS PETS BANHO SECO ADULTOS 240ml Não Semanal Não \n", - "12624 AU MIGOS PETS COL ADULTOS 60ml Não Semanal Não \n", - "17953 AU MIGOS PETS COL FILHOTES 60ml Não Semanal Não \n", - "23578 AU MIGOS PETS COND ADULTOS 400ml Não Semanal Não \n", - "... ... ... ... ... \n", - "1918086 SCH BOTIK SERUM FAC RESV/SILICIO VDA 2ml Não Semanal Não \n", - "1918662 ARBO DES BDY SPR 100ml V6 Não Semanal Não \n", - "1926362 COFFEE DES COL DUO MAN 100ml Não Semanal Não \n", - "1931987 NSPA CREM ESF CPO AMEI DOUR 200g Não Semanal Não \n", - "1937171 NSPA OL BIF DES HID CPO UVA MERL 200ml Não Semanal Não \n", - "\n", - " Unidade de negócio Marca ... Catálogo Tipo de produto \\\n", - "0 BOT ARBO ... Sim REGULAR \n", - "7440 BOT AU.MIGOS PETS ... Sim REGULAR \n", - "12624 BOT AU.MIGOS PETS ... Sim REGULAR \n", - "17953 BOT AU.MIGOS PETS ... Sim REGULAR \n", - "23578 BOT AU.MIGOS PETS ... Sim REGULAR \n", - "... ... ... ... ... ... \n", - "1918086 BOT BOTIK ... Sim REGULAR \n", - "1918662 BOT ARBO ... Sim REGULAR \n", - "1926362 BOT COFFEE ... Sim REGULAR \n", - "1931987 BOT NATIVA SPA ... Sim REGULAR \n", - "1937171 BOT NATIVA SPA ... Sim REGULAR \n", - "\n", - " Ação consumidor \\\n", - "0 NaN \n", - "7440 NaN \n", - "12624 NaN \n", - "17953 NaN \n", - "23578 NaN \n", - "... ... \n", - "1918086 [BOT] AÇÃO DE FLUXO BOTIK CICACERAMIDAS COM DE... \n", - "1918662 [ECOMM] PAIS 2025 - COMBO ARBO - NNE \n", - "1926362 [ECOMM] PAIS 2025 - COMBO COFFEE E BOTMEN \n", - "1931987 [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ... \n", - "1937171 [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ... \n", - "\n", - " Percentual de desconto consumidor \\\n", - "0 0,00 \n", - "7440 0,00 \n", - "12624 0,00 \n", - "17953 0,00 \n", - "23578 0,00 \n", - "... ... \n", - "1918086 10,00 \n", - "1918662 21,49 \n", - "1926362 18,67 \n", - "1931987 7,82 \n", - "1937171 14,88 \n", - "\n", - " Ação revendedor \\\n", - "0 VD - FAVORITOS PARA INÍCIOS ARBO - C11 \n", - "7440 VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ... \n", - "12624 VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ... \n", - "17953 VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ... \n", - "23578 VD - LUCRATIVIDADE BASE AUMIGOS - BRONZE | VD ... \n", - "... ... \n", - "1918086 [BOT] AÇÃO DE FLUXO BOTIK CICACERAMIDAS COM DE... \n", - "1918662 VD - FAVORITOS PARA INÍCIOS BODY SPRAY ARBO - C11 \n", - "1926362 VD - COFFEE PERFUMARIA MASCULINA - LUCRO EXTRA... \n", - "1931987 [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ... \n", - "1937171 [LOJA/ECOMM] ITENS SELECIONADOS DE NATIVA SPA ... \n", - "\n", - " Percentual de desconto revendedor Sortimento P \\\n", - "0 35,00 Sortido \n", - "7440 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ... Sortido \n", - "12624 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ... Sortido \n", - "17953 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ... Sortido \n", - "23578 10,00 | 13,00 | 15,00 | 17,00 | 19,00 | 20,00 ... Sortido \n", - "... ... ... \n", - "1918086 0,00 Sortido \n", - "1918662 35,00 Sortido \n", - "1926362 20,00 | 25,00 | 30,00 Sortido \n", - "1931987 0,00 Não sortido \n", - "1937171 0,00 Sortido \n", - "\n", - " Sortimento M Sortimento G MATCH \n", - "0 Sortido Sortido 1 \n", - "7440 Sortido Sortido 1 \n", - "12624 Sortido Sortido 1 \n", - "17953 Sortido Sortido 1 \n", - "23578 Sortido Sortido 1 \n", - "... ... ... ... \n", - "1918086 Sortido Sortido 1 \n", - "1918662 Sortido Sortido 1 \n", - "1926362 Sortido Sortido 1 \n", - "1931987 Sortido Sortido 1 \n", - "1937171 Sortido Sortido 1 \n", - "\n", - "[332 rows x 24 columns]" + "[0 rows x 24 columns]" ] }, - "execution_count": 20, + "execution_count": 223, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_tabela" + "df_tabela[df_tabela['Código']=='48060']" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 224, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(47509, 31)" + ] + }, + "execution_count": 224, + "metadata": {}, + "output_type": "execute_result" + } + ], "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'])" + "df_final = pd.merge(left=df_tabela,right=df_pdv,on='MATCH',how='left')\n", + "\n", + "df_final = df_final.drop_duplicates()\n", + "\n", + "df_final.shape" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 225, "metadata": {}, "outputs": [ { @@ -865,295 +1331,103 @@ " \n", " \n", " \n", - " SKU\n", - " SKU_PARA\n", + " Ciclo\n", + " Região\n", + " Canal\n", + " Código\n", + " Descrição\n", + " IAF\n", + " Tipo de pedido\n", + " Foco\n", + " Unidade de negócio\n", + " Marca\n", + " ...\n", + " Sortimento M\n", + " Sortimento G\n", + " MATCH\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", + " CANAL\n", + " DESCRIÇÃO PDV\n", + " UF\n", + " MARCA\n", + " ANALISTA\n", + " SUPERVISOR\n", " \n", " \n", " \n", - " \n", - " 0\n", - " 94394\n", - " -\n", - " 20968\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " NaN\n", - " NaN\n", - " NaN\n", - " BOT.csv\n", - " 94394\n", - " \n", - " \n", - " 1\n", - " 94394\n", - " -\n", - " 20969\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " NaN\n", - " NaN\n", - " NaN\n", - " BOT.csv\n", - " 94394\n", - " \n", - " \n", - " 2\n", - " 94394\n", - " -\n", - " 20970\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " NaN\n", - " NaN\n", - " NaN\n", - " BOT.csv\n", - " 94394\n", - " \n", - " \n", - " 3\n", - " 94394\n", - " -\n", - " 20986\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " NaN\n", - " NaN\n", - " NaN\n", - " BOT.csv\n", - " 94394\n", - " \n", - " \n", - " 4\n", - " 94394\n", - " -\n", - " 20988\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " NaN\n", - " NaN\n", - " NaN\n", - " BOT.csv\n", - " 94394\n", - " \n", - " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " \n", - " \n", - " 454599\n", - " 4438\n", - " -\n", - " 910291\n", - " 9.0\n", - " 10.0\n", - " 0.0\n", - " 0.78\n", - " 11.0\n", - " 24.0\n", - " QDB.csv\n", - " 4438\n", - " \n", - " \n", - " 454600\n", - " 4431\n", - " -\n", - " 21007\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " NaN\n", - " NaN\n", - " NaN\n", - " QDB.csv\n", - " 4431\n", - " \n", - " \n", - " 454601\n", - " 4431\n", - " -\n", - " 910173\n", - " 2.0\n", - " 10.0\n", - " 0.0\n", - " 0.40\n", - " 5.0\n", - " 30.0\n", - " QDB.csv\n", - " 4431\n", - " \n", - " \n", - " 454602\n", - " 4431\n", - " -\n", - " 910291\n", - " 1.0\n", - " 10.0\n", - " 0.0\n", - " 0.78\n", - " 1.0\n", - " 14.0\n", - " QDB.csv\n", - " 4431\n", - " \n", - " \n", - " 454603\n", - " 1594\n", - " -\n", - " 21007\n", - " 2.0\n", - " 0.0\n", - " 0.0\n", - " NaN\n", - " NaN\n", - " NaN\n", - " QDB.csv\n", - " 1594\n", - " \n", " \n", "\n", - "

454604 rows × 11 columns

\n", + "

0 rows × 31 columns

\n", "" ], "text/plain": [ - " SKU SKU_PARA PDV ESTOQUE ATUAL ESTOQUE EM TRANSITO \\\n", - "0 94394 - 20968 0.0 0.0 \n", - "1 94394 - 20969 0.0 0.0 \n", - "2 94394 - 20970 0.0 0.0 \n", - "3 94394 - 20986 0.0 0.0 \n", - "4 94394 - 20988 0.0 0.0 \n", - "... ... ... ... ... ... \n", - "454599 4438 - 910291 9.0 10.0 \n", - "454600 4431 - 21007 0.0 0.0 \n", - "454601 4431 - 910173 2.0 10.0 \n", - "454602 4431 - 910291 1.0 10.0 \n", - "454603 1594 - 21007 2.0 0.0 \n", + "Empty DataFrame\n", + "Columns: [Ciclo, Região, Canal, Código, Descrição, IAF, Tipo de pedido, Foco, Unidade de negócio, Marca, Categoria, Subcategoria, Quantidade por caixa, Tipo de promoção, Catálogo, Tipo de produto, Ação consumidor, Percentual de desconto consumidor, Ação revendedor, Percentual de desconto revendedor, Sortimento P, Sortimento M, Sortimento G, MATCH, PDV, CANAL, DESCRIÇÃO PDV, UF, MARCA, ANALISTA, SUPERVISOR]\n", + "Index: []\n", "\n", - " PEDIDO PENDENTE DDV PREVISTO COBERTURA ATUAL \\\n", - "0 0.0 NaN NaN \n", - "1 0.0 NaN NaN \n", - "2 0.0 NaN NaN \n", - "3 0.0 NaN NaN \n", - "4 0.0 NaN NaN \n", - "... ... ... ... \n", - "454599 0.0 0.78 11.0 \n", - "454600 0.0 NaN NaN \n", - "454601 0.0 0.40 5.0 \n", - "454602 0.0 0.78 1.0 \n", - "454603 0.0 NaN NaN \n", - "\n", - " COBERTURA ATUAL + TRANSITO Arquivo_Origem SKU_FINAL \n", - "0 NaN BOT.csv 94394 \n", - "1 NaN BOT.csv 94394 \n", - "2 NaN BOT.csv 94394 \n", - "3 NaN BOT.csv 94394 \n", - "4 NaN BOT.csv 94394 \n", - "... ... ... ... \n", - "454599 24.0 QDB.csv 4438 \n", - "454600 NaN QDB.csv 4431 \n", - "454601 30.0 QDB.csv 4431 \n", - "454602 14.0 QDB.csv 4431 \n", - "454603 NaN QDB.csv 1594 \n", - "\n", - "[454604 rows x 11 columns]" + "[0 rows x 31 columns]" ] }, - "execution_count": 22, + "execution_count": 225, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_estoque" + "df_final[df_final['Código']=='48060'].head()" ] }, { "cell_type": "code", - "execution_count": 23, - "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\\BOTICARIO\\C11\\preço BI\\TABELA DE PREÇOS (2).xlsx\")\n", - "\n", - "df_bi_preco = df_bi_preco.drop(columns=['Descrição','Tipo Preço','CATEGORIA','LINHA','MARCA'])\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 24, + "execution_count": 226, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(25232, 31)" + "PDV\n", + "12522 617\n", + "12817 617\n", + "12818 617\n", + "12820 617\n", + "12823 617\n", + " ... \n", + "24257 617\n", + "24268 617\n", + "24269 617\n", + "24293 617\n", + "23813 617\n", + "Name: count, Length: 77, dtype: int64" ] }, - "execution_count": 24, + "execution_count": 226, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final = pd.merge(left=df_tabela,right=df_pdv,on='MATCH',how='left')\n", - "\n", - "df_final = df_final.drop_duplicates()\n", - "\n", - "df_final.shape" + "df_final['PDV'].value_counts()" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 227, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(25232, 62)" + "(49398, 61)" ] }, - "execution_count": 25, + "execution_count": 227, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final['PDV'] = df_final['PDV'].astype('Int64')\n", - "df_final['Código'] = df_final['Código'].astype('Int64')\n", + "df_final['PDV'] = df_final['PDV'].astype('str')\n", + "df_final['Código'] = df_final['Código'].astype('str')\n", "\n", "\n", "df_final = pd.merge(left=df_final,right=df_draft,left_on=['PDV','Código'],right_on=['PDV','SKU'],how='left')\n", @@ -1162,27 +1436,248 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 228, "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", + "
CicloRegiãoCanalCódigoDescriçãoIAFTipo de pedidoFocoUnidade de negócioMarca...C202503C202504C202505C202506C202507C202508C202509C202510C202511C202512
17861C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...14.030.011.038.010.019.023.03.019.010.0
17862C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...30.082.036.0219.033.079.0106.044.064.09.0
17863C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...5.08.04.020.02.08.09.07.09.00.0
17864C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...9.015.08.022.04.024.016.07.02.02.0
17865C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...5.026.06.015.01.05.013.07.09.00.0
\n", + "

5 rows × 61 columns

\n", + "
" + ], "text/plain": [ - "Series([], Name: Histórico de Vendas do Ciclo 202505, dtype: float64)" + " Ciclo Região Canal Código Descrição IAF \\\n", + "17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "\n", + " Tipo de pedido Foco Unidade de negócio Marca ... C202503 C202504 \\\n", + "17861 NaN NaN NaN BOTI ... 14.0 30.0 \n", + "17862 NaN NaN NaN BOTI ... 30.0 82.0 \n", + "17863 NaN NaN NaN BOTI ... 5.0 8.0 \n", + "17864 NaN NaN NaN BOTI ... 9.0 15.0 \n", + "17865 NaN NaN NaN BOTI ... 5.0 26.0 \n", + "\n", + " C202505 C202506 C202507 C202508 C202509 C202510 C202511 C202512 \n", + "17861 11.0 38.0 10.0 19.0 23.0 3.0 19.0 10.0 \n", + "17862 36.0 219.0 33.0 79.0 106.0 44.0 64.0 9.0 \n", + "17863 4.0 20.0 2.0 8.0 9.0 7.0 9.0 0.0 \n", + "17864 8.0 22.0 4.0 24.0 16.0 7.0 2.0 2.0 \n", + "17865 6.0 15.0 1.0 5.0 13.0 7.0 9.0 0.0 \n", + "\n", + "[5 rows x 61 columns]" ] }, - "execution_count": 26, + "execution_count": 228, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final[(df_final['Código'] == 52023) & (df_final['PDV'] == 23712)]['Histórico de Vendas do Ciclo 202505']" + "df_final[df_final['Código']=='48060'].head()" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 229, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PDV\n", + "23711 659\n", + "21278 656\n", + "20993 656\n", + "20997 656\n", + "21375 654\n", + " ... \n", + "24257 617\n", + "24268 617\n", + "24269 617\n", + "24293 617\n", + "23813 617\n", + "Name: count, Length: 77, dtype: int64" + ] + }, + "execution_count": 229, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final['PDV'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 230, "metadata": {}, "outputs": [], "source": [ @@ -1192,7 +1687,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 231, "metadata": {}, "outputs": [], "source": [ @@ -1201,30 +1696,7 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "#ignorando a PDV que ainda não está online\n", - "df_pdv = df_pdv[df_pdv['DESCRIÇÃO PDV'] != '23813-COMERCIO-HIB VALENTE']" - ] - }, - { - "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": 30, + "execution_count": 232, "metadata": {}, "outputs": [ { @@ -1261,16 +1733,16 @@ " \n", " \n", " \n", - " 2241\n", - " C202511\n", - " 2025-07-21\n", - " 2025-08-10\n", + " 2367\n", + " C202514\n", + " 2025-09-22\n", + " 2025-10-12\n", " 21\n", - " 2025-07-21\n", - " 11\n", + " 2025-09-22\n", + " 14\n", " C2025\n", - " C202513\n", - " 38\n", + " C202516\n", + " 31\n", " \n", " \n", "\n", @@ -1278,13 +1750,13 @@ ], "text/plain": [ " Ciclo INICIO CICLO FIM CICLO DURAÇÃO Date NUM_CICLO \\\n", - "2241 C202511 2025-07-21 2025-08-10 21 2025-07-21 11 \n", + "2367 C202514 2025-09-22 2025-10-12 21 2025-09-22 14 \n", "\n", " ANO_CICLO CICLOMAIS2 dias_ate_inicio \n", - "2241 C2025 C202513 38 " + "2367 C2025 C202516 31 " ] }, - "execution_count": 30, + "execution_count": 232, "metadata": {}, "output_type": "execute_result" } @@ -1321,7 +1793,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 233, "metadata": {}, "outputs": [], "source": [ @@ -1330,7 +1802,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 234, "metadata": {}, "outputs": [], "source": [ @@ -1339,16 +1811,7 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "#df_tabela = df_tabela[(df_tabela['Tipo de promoção'] == \"Revendedor\" ) | (df_tabela['Tipo de promoção'] == \"Promoções\") |(df_tabela['Tipo de promoção'] == \"Promoções | Revendedor\" )]" - ] - }, - { - "cell_type": "code", - "execution_count": 34, + "execution_count": 235, "metadata": {}, "outputs": [], "source": [ @@ -1357,16 +1820,16 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 236, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(25232, 62)" + "(49398, 61)" ] }, - "execution_count": 35, + "execution_count": 236, "metadata": {}, "output_type": "execute_result" } @@ -1378,51 +1841,357 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 237, "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", + "
Ciclo_xRegiãoCanalCódigoDescriçãoIAFTipo de pedidoFocoUnidade de negócioMarca...C202508C202509C202510C202511C202512Ciclo_yINICIO CICLOFIM CICLODURAÇÃOdias_ate_inicio
17861C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...19.023.03.019.010.0C2025142025-09-222025-10-122131
17862C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...79.0106.044.064.09.0C2025142025-09-222025-10-122131
17863C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...8.09.07.09.00.0C2025142025-09-222025-10-122131
17864C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...24.016.07.02.02.0C2025142025-09-222025-10-122131
17865C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...5.013.07.09.00.0C2025142025-09-222025-10-122131
\n", + "

5 rows × 61 columns

\n", + "
" + ], "text/plain": [ - "(30861, 72)" + " Ciclo_x Região Canal Código Descrição IAF \\\n", + "17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "\n", + " Tipo de pedido Foco Unidade de negócio Marca ... C202508 C202509 \\\n", + "17861 NaN NaN NaN BOTI ... 19.0 23.0 \n", + "17862 NaN NaN NaN BOTI ... 79.0 106.0 \n", + "17863 NaN NaN NaN BOTI ... 8.0 9.0 \n", + "17864 NaN NaN NaN BOTI ... 24.0 16.0 \n", + "17865 NaN NaN NaN BOTI ... 5.0 13.0 \n", + "\n", + " C202510 C202511 C202512 Ciclo_y INICIO CICLO FIM CICLO DURAÇÃO \\\n", + "17861 3.0 19.0 10.0 C202514 2025-09-22 2025-10-12 21 \n", + "17862 44.0 64.0 9.0 C202514 2025-09-22 2025-10-12 21 \n", + "17863 7.0 9.0 0.0 C202514 2025-09-22 2025-10-12 21 \n", + "17864 7.0 2.0 2.0 C202514 2025-09-22 2025-10-12 21 \n", + "17865 7.0 9.0 0.0 C202514 2025-09-22 2025-10-12 21 \n", + "\n", + " dias_ate_inicio \n", + "17861 31 \n", + "17862 31 \n", + "17863 31 \n", + "17864 31 \n", + "17865 31 \n", + "\n", + "[5 rows x 61 columns]" ] }, - "execution_count": 36, + "execution_count": 237, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final['Código'] = df_final['Código'].astype('Int64') \n", - "df_final['PDV'] = df_final['PDV'].astype('Int64') \n", - "\n", - "df_estoque['PDV'] = df_estoque['PDV'].astype('Int64') \n", - "df_estoque['SKU_FINAL'] = df_estoque['SKU_FINAL'].astype('Int64') \n", - "\n", - "df_final = pd.merge(left=df_final,right=df_estoque,right_on=['PDV','SKU_FINAL'],left_on=['PDV','Código'],how='left')\n", - "df_final.shape" + "df_final[df_final['SKU_FINAL']=='48060'].head()" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 238, + "metadata": {}, + "outputs": [], + "source": [ + "df_final['Código'] = df_final['Código'].astype('Int64') \n", + "df_final['PDV'] = df_final['PDV'].astype('Int64') " + ] + }, + { + "cell_type": "code", + "execution_count": 239, "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", + "
SKU1SKU2UFPCPVchave sku2chave sku1
08491884918AL393.701300.0AL84918AL84918
18491884918BA436.731300.0BA84918BA84918
28491884918SE379.941300.0SE84918SE84918
35423054230AL138.54499.9AL54230AL54230
45423054230BA148.66499.9BA54230BA54230
\n", + "
" + ], "text/plain": [ - "(30861, 76)" + " SKU1 SKU2 UF PC PV chave sku2 chave sku1\n", + "0 84918 84918 AL 393.70 1300.0 AL84918 AL84918\n", + "1 84918 84918 BA 436.73 1300.0 BA84918 BA84918\n", + "2 84918 84918 SE 379.94 1300.0 SE84918 SE84918\n", + "3 54230 54230 AL 138.54 499.9 AL54230 AL54230\n", + "4 54230 54230 BA 148.66 499.9 BA54230 BA54230" ] }, - "execution_count": 37, + "execution_count": 239, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype('Int64')\n", + "df_bi_preco.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 240, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(49398, 67)" + ] + }, + "execution_count": 240, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final['Código'] = df_final['Código'].astype('str')\n", "\n", - "df_bi_preco['SKU2'] = df_bi_preco['SKU2'].astype('str')\n", "\n", "df_final = pd.merge(left=df_final,right=df_bi_preco,right_on=['UF','SKU2'],left_on=['UF','Código'],how='left')\n", "df_final.shape " @@ -1430,30 +2199,471 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 241, "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", + "
Ciclo_xRegiãoCanalCódigoDescriçãoIAFTipo de pedidoFocoUnidade de negócioMarca...INICIO CICLOFIM CICLODURAÇÃOdias_ate_inicioSKU1SKU2PCPVchave sku2chave sku1
17861C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...2025-09-222025-10-122131110854806038.03139.9AL48060AL11085
17862C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...2025-09-222025-10-122131110854806038.03139.9AL48060AL11085
17863C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...2025-09-222025-10-122131110854806038.03139.9AL48060AL11085
17864C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...2025-09-222025-10-122131110854806038.03139.9AL48060AL11085
17865C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...2025-09-222025-10-122131110854806038.03139.9AL48060AL11085
\n", + "

5 rows × 67 columns

\n", + "
" + ], "text/plain": [ - "(30950, 80)" + " Ciclo_x Região Canal Código Descrição IAF \\\n", + "17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "\n", + " Tipo de pedido Foco Unidade de negócio Marca ... INICIO CICLO \\\n", + "17861 NaN NaN NaN BOTI ... 2025-09-22 \n", + "17862 NaN NaN NaN BOTI ... 2025-09-22 \n", + "17863 NaN NaN NaN BOTI ... 2025-09-22 \n", + "17864 NaN NaN NaN BOTI ... 2025-09-22 \n", + "17865 NaN NaN NaN BOTI ... 2025-09-22 \n", + "\n", + " FIM CICLO DURAÇÃO dias_ate_inicio SKU1 SKU2 PC PV \\\n", + "17861 2025-10-12 21 31 11085 48060 38.03 139.9 \n", + "17862 2025-10-12 21 31 11085 48060 38.03 139.9 \n", + "17863 2025-10-12 21 31 11085 48060 38.03 139.9 \n", + "17864 2025-10-12 21 31 11085 48060 38.03 139.9 \n", + "17865 2025-10-12 21 31 11085 48060 38.03 139.9 \n", + "\n", + " chave sku2 chave sku1 \n", + "17861 AL48060 AL11085 \n", + "17862 AL48060 AL11085 \n", + "17863 AL48060 AL11085 \n", + "17864 AL48060 AL11085 \n", + "17865 AL48060 AL11085 \n", + "\n", + "[5 rows x 67 columns]" ] }, - "execution_count": 38, + "execution_count": 241, "metadata": {}, "output_type": "execute_result" } ], "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','Código'],how='left')\n", - "df_final.shape " + "df_final[df_final['SKU_FINAL']=='48060'].head()" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 242, + "metadata": {}, + "outputs": [], + "source": [ + "df_bi_preco['SKU1'] = df_bi_preco['SKU1'].fillna(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 243, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(49398, 71)\n" + ] + } + ], + "source": [ + "# Conversão segura para Int64 (nullable)\n", + "df_bi_preco['SKU1'] = pd.to_numeric(df_bi_preco['SKU1'], errors='coerce').astype('Int64')\n", + "\n", + "# Realiza o merge\n", + "df_final = pd.merge(\n", + " left=df_final,\n", + " right=df_bi_preco[['SKU1', 'SKU2', 'UF', 'PC', 'PV']],\n", + " right_on=['UF', 'SKU1'],\n", + " left_on=['UF', 'Código'],\n", + " how='left'\n", + ")\n", + "\n", + "# Verifica o resultado\n", + "print(df_final.shape)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 244, + "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", + "
Ciclo_xRegiãoCanalCódigoDescriçãoIAFTipo de pedidoFocoUnidade de negócioMarca...SKU1_xSKU2_xPC_xPV_xchave sku2chave sku1SKU1_ySKU2_yPC_yPV_y
17861C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...110854806038.03139.9AL48060AL11085<NA><NA>NaNNaN
17862C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...110854806038.03139.9AL48060AL11085<NA><NA>NaNNaN
17863C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...110854806038.03139.9AL48060AL11085<NA><NA>NaNNaN
17864C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...110854806038.03139.9AL48060AL11085<NA><NA>NaNNaN
17865C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...110854806038.03139.9AL48060AL11085<NA><NA>NaNNaN
\n", + "

5 rows × 71 columns

\n", + "
" + ], + "text/plain": [ + " Ciclo_x Região Canal Código Descrição IAF \\\n", + "17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "\n", + " Tipo de pedido Foco Unidade de negócio Marca ... SKU1_x SKU2_x \\\n", + "17861 NaN NaN NaN BOTI ... 11085 48060 \n", + "17862 NaN NaN NaN BOTI ... 11085 48060 \n", + "17863 NaN NaN NaN BOTI ... 11085 48060 \n", + "17864 NaN NaN NaN BOTI ... 11085 48060 \n", + "17865 NaN NaN NaN BOTI ... 11085 48060 \n", + "\n", + " PC_x PV_x chave sku2 chave sku1 SKU1_y SKU2_y PC_y PV_y \n", + "17861 38.03 139.9 AL48060 AL11085 NaN NaN \n", + "17862 38.03 139.9 AL48060 AL11085 NaN NaN \n", + "17863 38.03 139.9 AL48060 AL11085 NaN NaN \n", + "17864 38.03 139.9 AL48060 AL11085 NaN NaN \n", + "17865 38.03 139.9 AL48060 AL11085 NaN NaN \n", + "\n", + "[5 rows x 71 columns]" + ] + }, + "execution_count": 244, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final[df_final['SKU_FINAL']=='48060'].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 245, "metadata": {}, "outputs": [], "source": [ @@ -1465,19 +2675,19 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 246, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "CANAL\n", - "TODOS 23509\n", - "VD 6445\n", + "TODOS 39069\n", + "VD 10329\n", "Name: count, dtype: int64" ] }, - "execution_count": 40, + "execution_count": 246, "metadata": {}, "output_type": "execute_result" } @@ -1490,61 +2700,252 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 247, "metadata": {}, "outputs": [], "source": [ - "df_estoque = df_estoque.rename(columns={'SKU_FINAL':'SKU_PARA_VALIDACAO'})\n", - "\n", - "df_estoque['SKU_PARA_VALIDACAO'] = df_estoque['SKU_PARA_VALIDACAO'].astype('Int64')\n", - "\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')\n", - "\n", "df_final = df_final.drop_duplicates()" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 248, + "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", + "
Ciclo_xRegiãoCanalCódigoDescriçãoIAFTipo de pedidoFocoUnidade de negócioMarca...PC_xPV_xchave sku2chave sku1SKU1_ySKU2_yPC_yPV_yPRECO DE COMPRAPRECO DE VENDA
17861C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...38.03139.9AL48060AL11085<NA><NA>NaNNaN38.03139.9
17862C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...38.03139.9AL48060AL11085<NA><NA>NaNNaN38.03139.9
17863C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...38.03139.9AL48060AL11085<NA><NA>NaNNaN38.03139.9
17864C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...38.03139.9AL48060AL11085<NA><NA>NaNNaN38.03139.9
17865C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...38.03139.9AL48060AL11085<NA><NA>NaNNaN38.03139.9
\n", + "

5 rows × 73 columns

\n", + "
" + ], + "text/plain": [ + " Ciclo_x Região Canal Código Descrição IAF \\\n", + "17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "\n", + " Tipo de pedido Foco Unidade de negócio Marca ... PC_x PV_x \\\n", + "17861 NaN NaN NaN BOTI ... 38.03 139.9 \n", + "17862 NaN NaN NaN BOTI ... 38.03 139.9 \n", + "17863 NaN NaN NaN BOTI ... 38.03 139.9 \n", + "17864 NaN NaN NaN BOTI ... 38.03 139.9 \n", + "17865 NaN NaN NaN BOTI ... 38.03 139.9 \n", + "\n", + " chave sku2 chave sku1 SKU1_y SKU2_y PC_y PV_y PRECO DE COMPRA \\\n", + "17861 AL48060 AL11085 NaN NaN 38.03 \n", + "17862 AL48060 AL11085 NaN NaN 38.03 \n", + "17863 AL48060 AL11085 NaN NaN 38.03 \n", + "17864 AL48060 AL11085 NaN NaN 38.03 \n", + "17865 AL48060 AL11085 NaN NaN 38.03 \n", + "\n", + " PRECO DE VENDA \n", + "17861 139.9 \n", + "17862 139.9 \n", + "17863 139.9 \n", + "17864 139.9 \n", + "17865 139.9 \n", + "\n", + "[5 rows x 73 columns]" + ] + }, + "execution_count": 248, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final[df_final['SKU_FINAL']=='48060'].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 249, "metadata": {}, "outputs": [], "source": [ "df_final = df_final.drop(columns=['SKU1_x','SKU1_y','SKU2_x','SKU2_y','PC_x', 'PV_x','PC_y', 'PV_y','Subcategoria',\n", - "'Carteira Bloqueada Para Novos Pedidos',\n", "'Quantidade por caixa'\n", "])" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 250, "metadata": {}, "outputs": [], "source": [ - "df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['SKU'].astype(str)\n" + "df_final['UFPRODUTO'] = df_final['UF'].astype(str) + df_final['Código'].astype(str)\n" ] }, { "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "df_final['Projeção Próximo Ciclo + 1'] =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": 45, - "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": 46, + "execution_count": 251, "metadata": {}, "outputs": [], "source": [ @@ -1553,7 +2954,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 252, "metadata": {}, "outputs": [ { @@ -1562,7 +2963,7 @@ "np.int64(0)" ] }, - "execution_count": 47, + "execution_count": 252, "metadata": {}, "output_type": "execute_result" } @@ -1574,16 +2975,1323 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 253, + "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", + "
Ciclo_xRegiãoCanalCódigoDescriçãoIAFTipo de pedidoFocoUnidade de negócioMarca...Ciclo_yINICIO CICLOFIM CICLODURAÇÃOdias_ate_iniciochave sku2chave sku1PRECO DE COMPRAPRECO DE VENDAUFPRODUTO
17861C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...C2025142025-09-222025-10-122131AL48060AL1108538.03139.9AL48060
17862C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...C2025142025-09-222025-10-122131AL48060AL1108538.03139.9AL48060
17863C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...C2025142025-09-222025-10-122131AL48060AL1108538.03139.9AL48060
17864C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...C2025142025-09-222025-10-122131AL48060AL1108538.03139.9AL48060
17865C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...C2025142025-09-222025-10-122131AL48060AL1108538.03139.9AL48060
\n", + "

5 rows × 64 columns

\n", + "
" + ], + "text/plain": [ + " Ciclo_x Região Canal Código Descrição IAF \\\n", + "17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "\n", + " Tipo de pedido Foco Unidade de negócio Marca ... Ciclo_y \\\n", + "17861 NaN NaN NaN BOTI ... C202514 \n", + "17862 NaN NaN NaN BOTI ... C202514 \n", + "17863 NaN NaN NaN BOTI ... C202514 \n", + "17864 NaN NaN NaN BOTI ... C202514 \n", + "17865 NaN NaN NaN BOTI ... C202514 \n", + "\n", + " INICIO CICLO FIM CICLO DURAÇÃO dias_ate_inicio chave sku2 \\\n", + "17861 2025-09-22 2025-10-12 21 31 AL48060 \n", + "17862 2025-09-22 2025-10-12 21 31 AL48060 \n", + "17863 2025-09-22 2025-10-12 21 31 AL48060 \n", + "17864 2025-09-22 2025-10-12 21 31 AL48060 \n", + "17865 2025-09-22 2025-10-12 21 31 AL48060 \n", + "\n", + " chave sku1 PRECO DE COMPRA PRECO DE VENDA UFPRODUTO \n", + "17861 AL11085 38.03 139.9 AL48060 \n", + "17862 AL11085 38.03 139.9 AL48060 \n", + "17863 AL11085 38.03 139.9 AL48060 \n", + "17864 AL11085 38.03 139.9 AL48060 \n", + "17865 AL11085 38.03 139.9 AL48060 \n", + "\n", + "[5 rows x 64 columns]" + ] + }, + "execution_count": 253, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final[df_final['SKU_FINAL']=='48060'].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 254, + "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", + "
Ciclo_xRegiãoCanalCódigoDescriçãoIAFTipo de pedidoFocoUnidade de negócioMarca...Ciclo_yINICIO CICLOFIM CICLODURAÇÃOdias_ate_iniciochave sku2chave sku1PRECO DE COMPRAPRECO DE VENDAUFPRODUTO
17861C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...C2025142025-09-222025-10-122131AL48060AL1108538.03139.9AL48060
17862C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...C2025142025-09-222025-10-122131AL48060AL1108538.03139.9AL48060
17863C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...C2025142025-09-222025-10-122131AL48060AL1108538.03139.9AL48060
17864C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...C2025142025-09-222025-10-122131AL48060AL1108538.03139.9AL48060
17865C202514NNEVD48060LILY CREM DES HID ACET CPO 250g V8NaNNaNNaNNaNBOTI...C2025142025-09-222025-10-122131AL48060AL1108538.03139.9AL48060
\n", + "

5 rows × 64 columns

\n", + "
" + ], + "text/plain": [ + " Ciclo_x Região Canal Código Descrição IAF \\\n", + "17861 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17862 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17863 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17864 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "17865 C202514 NNE VD 48060 LILY CREM DES HID ACET CPO 250g V8 NaN \n", + "\n", + " Tipo de pedido Foco Unidade de negócio Marca ... Ciclo_y \\\n", + "17861 NaN NaN NaN BOTI ... C202514 \n", + "17862 NaN NaN NaN BOTI ... C202514 \n", + "17863 NaN NaN NaN BOTI ... C202514 \n", + "17864 NaN NaN NaN BOTI ... C202514 \n", + "17865 NaN NaN NaN BOTI ... C202514 \n", + "\n", + " INICIO CICLO FIM CICLO DURAÇÃO dias_ate_inicio chave sku2 \\\n", + "17861 2025-09-22 2025-10-12 21 31 AL48060 \n", + "17862 2025-09-22 2025-10-12 21 31 AL48060 \n", + "17863 2025-09-22 2025-10-12 21 31 AL48060 \n", + "17864 2025-09-22 2025-10-12 21 31 AL48060 \n", + "17865 2025-09-22 2025-10-12 21 31 AL48060 \n", + "\n", + " chave sku1 PRECO DE COMPRA PRECO DE VENDA UFPRODUTO \n", + "17861 AL11085 38.03 139.9 AL48060 \n", + "17862 AL11085 38.03 139.9 AL48060 \n", + "17863 AL11085 38.03 139.9 AL48060 \n", + "17864 AL11085 38.03 139.9 AL48060 \n", + "17865 AL11085 38.03 139.9 AL48060 \n", + "\n", + "[5 rows x 64 columns]" + ] + }, + "execution_count": 254, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final[df_final['SKU_FINAL']=='48060'].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 255, + "metadata": {}, + "outputs": [], + "source": [ + "df_vdc = pd.read_csv(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C10\\VENDA VITORIA 2024\\VENDA VITORIA.csv\")\n", + "\n", + "df_vdc['PRODUTO'] = df_vdc['PRODUTO'].astype('Int64')\n", + "\n", + "df_final['Código'] = df_final['Código'].astype('Int64')\n", + "\n", + "df_final =pd.merge(left=df_final,right=df_vdc,left_on= ['PDV','Código'],right_on= ['PDV GINSENG','PRODUTO'],how='left' )\n", + "\n", + "df_final[df_final.columns[-1]] = df_final[df_final.columns[-1]].fillna(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 256, + "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", + "
PDV GINSENGPRODUTO202401202402202403202404202405202406202407202408202409202410202411202412202413202414202415202416
1235237017404312241216814614120810442014
30332370274043222822101414101282261436100
51712370374043101861862200102224226216
\n", + "
" + ], + "text/plain": [ + " PDV GINSENG PRODUTO 202401 202402 202403 202404 202405 202406 \\\n", + "1235 23701 74043 12 24 12 16 8 14 \n", + "3033 23702 74043 2 22 8 22 10 14 \n", + "5171 23703 74043 10 18 6 18 6 2 \n", + "\n", + " 202407 202408 202409 202410 202411 202412 202413 202414 202415 \\\n", + "1235 6 14 12 0 8 10 4 42 0 \n", + "3033 14 10 12 8 22 6 14 36 10 \n", + "5171 20 0 10 2 22 4 2 26 2 \n", + "\n", + " 202416 \n", + "1235 14 \n", + "3033 0 \n", + "5171 16 " + ] + }, + "execution_count": 256, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_vdc[df_vdc['PRODUTO']== 74043].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 257, + "metadata": {}, + "outputs": [], + "source": [ + "df_final = df_final.fillna(0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 258, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(30950, 74)" + "Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n", + " 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n", + " 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n", + " 'Percentual de desconto consumidor', 'Ação revendedor',\n", + " 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n", + " 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n", + " 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + " 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n", + " 'C202412', 'C202413', 'C202414', 'C202415', 'C202416', 'C202417',\n", + " 'C202501', 'C202502', 'C202503', 'C202504', 'C202505', 'C202506',\n", + " 'C202507', 'C202508', 'C202509', 'C202510', 'C202511', 'C202512',\n", + " 'Ciclo_y', 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio',\n", + " 'chave sku2', 'chave sku1', 'PRECO DE COMPRA', 'PRECO DE VENDA',\n", + " 'UFPRODUTO', 'PDV GINSENG', 'PRODUTO', '202401', '202402', '202403',\n", + " '202404', '202405', '202406', '202407', '202408', '202409', '202410',\n", + " '202411', '202412', '202413', '202414', '202415', '202416'],\n", + " dtype='object')" ] }, - "execution_count": 48, + "execution_count": 258, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 259, + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "\n", + "# identificar colunas de ciclo puro (ex: '202407')\n", + "colunas_ciclo_puro = [col for col in df_final.columns[-16:-1]]\n", + "\n", + "for col in colunas_ciclo_puro:\n", + " col_hist = f'C{col}'\n", + " if col_hist in df_final.columns:\n", + " # mantém o maior valor entre a coluna histórica e a pura\n", + " df_final[col_hist] = df_final[[col_hist, col]].max(axis=1)\n", + "\n", + "# remove as colunas puras\n", + "if colunas_ciclo_puro:\n", + " df_final.drop(columns=colunas_ciclo_puro, inplace=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 260, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n", + " 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n", + " 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n", + " 'Percentual de desconto consumidor', 'Ação revendedor',\n", + " 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n", + " 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n", + " 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + " 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n", + " 'C202412', 'C202413', 'C202414', 'C202415', 'C202416', 'C202417',\n", + " 'C202501', 'C202502', 'C202503', 'C202504', 'C202505', 'C202506',\n", + " 'C202507', 'C202508', 'C202509', 'C202510', 'C202511', 'C202512',\n", + " 'Ciclo_y', 'INICIO CICLO', 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio',\n", + " 'chave sku2', 'chave sku1', 'PRECO DE COMPRA', 'PRECO DE VENDA',\n", + " 'UFPRODUTO', 'PDV GINSENG', 'PRODUTO', '202416'],\n", + " dtype='object')" + ] + }, + "execution_count": 260, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 261, + "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", + "
DATA_VENDAPDVpdvs cpDESC PDVCódigoDescriçãoQuantidadeFaturamentoCicloDate
02025-04-011299324253PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA1004FLORATTA DES COL MY BLUE 75ml198,99C2025052025-04-01
12025-04-011299324253PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA4539BOTIK CR FAC FIRMADOR AC/HIAL 40g V21129,05C2025052025-04-01
22025-04-011299324253PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA29046BOTICOLL CONNEX DES BDY SPR 100ml V6 PCK138,9C2025052025-04-01
32025-04-011299324253PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA47154CBEM DES ROLL S/ALUM 55ml121,98C2025052025-04-01
42025-04-011299324253PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA47411ARBO NECESS LONA157,26C2025052025-04-01
\n", + "
" + ], + "text/plain": [ + " DATA_VENDA PDV pdvs cp DESC PDV \\\n", + "0 2025-04-01 12993 24253 PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA \n", + "1 2025-04-01 12993 24253 PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA \n", + "2 2025-04-01 12993 24253 PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA \n", + "3 2025-04-01 12993 24253 PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA \n", + "4 2025-04-01 12993 24253 PERFUMARIA E COSMETICOS QUEIROZ DOURADO LTDA \n", + "\n", + " Código Descrição Quantidade Faturamento \\\n", + "0 1004 FLORATTA DES COL MY BLUE 75ml 1 98,99 \n", + "1 4539 BOTIK CR FAC FIRMADOR AC/HIAL 40g V2 1 129,05 \n", + "2 29046 BOTICOLL CONNEX DES BDY SPR 100ml V6 PCK 1 38,9 \n", + "3 47154 CBEM DES ROLL S/ALUM 55ml 1 21,98 \n", + "4 47411 ARBO NECESS LONA 1 57,26 \n", + "\n", + " Ciclo Date \n", + "0 C202505 2025-04-01 \n", + "1 C202505 2025-04-01 \n", + "2 C202505 2025-04-01 \n", + "3 C202505 2025-04-01 \n", + "4 C202505 2025-04-01 " + ] + }, + "execution_count": 261, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_irece = pd.read_csv(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\DADOS DOURADO\\VENDA\\COMPILADO_VENDAS.csv\", sep=';')\n", + "\n", + "df_irece['DATA_VENDA'] = pd.to_datetime(df_irece['DATA_VENDA'], dayfirst=True)\n", + "\n", + "df_irece = pd.merge(df_irece,calendario[['Ciclo','Date']],how='left', left_on='DATA_VENDA',right_on='Date')\n", + "\n", + "df_irece.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 262, + "metadata": {}, + "outputs": [], + "source": [ + "df_irece_agrupado = df_irece.groupby(['PDV','Código','Ciclo'])['Quantidade'].sum().reset_index()\n", + "\n", + "df_pivotado = df_irece_agrupado.pivot(index=['PDV', 'Código'], columns='Ciclo', values='Quantidade').reset_index()\n", + "\n", + "df_pivotado = df_pivotado.fillna(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 263, + "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', 'Ciclo_y'],\n", + " dtype='object')" + ] + }, + "execution_count": 263, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns[37:55]" + ] + }, + { + "cell_type": "code", + "execution_count": 264, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n", + " 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n", + " 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n", + " 'Percentual de desconto consumidor', 'Ação revendedor',\n", + " 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n", + " 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n", + " 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + " 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n", + " '202412', '202413', '202414', '202415', '202416', '202417', '202501',\n", + " '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n", + " '202509', '202510', '202511', '202512', 'Ciclo_y', 'INICIO CICLO',\n", + " 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'chave sku2', 'chave sku1',\n", + " 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n", + " 'PRODUTO', '202416'],\n", + " dtype='object')" + ] + }, + "execution_count": 264, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "for col_c in df_final.columns[37:55]:\n", + " sufixo = col_c[1:] # Remove o 'C' do início, ex: 'C202407' -> '202407'\n", + " df_final.columns = df_final.columns.str.replace(\"C20\", \"20\", regex=True)\n", + "\n", + "\n", + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 265, + "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", + "
Ciclo_xRegiãoCanalCódigoDescriçãoIAFTipo de pedidoFocoUnidade de negócioMarca...C202415C202416C202417C202501C202502C202503C202504C202505C202506C202507
0C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...0.00.00.00.00.00.00.00.00.00.0
1C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...0.00.00.00.00.00.00.00.00.00.0
2C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...0.00.00.00.00.00.00.00.00.00.0
3C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...0.00.00.00.00.00.00.00.00.00.0
4C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...0.00.00.00.00.00.00.00.00.00.0
\n", + "

5 rows × 91 columns

\n", + "
" + ], + "text/plain": [ + " Ciclo_x Região Canal Código Descrição IAF \\\n", + "0 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "1 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "2 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "3 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "4 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "\n", + " Tipo de pedido Foco Unidade de negócio Marca ... C202415 C202416 \\\n", + "0 0.0 0.0 0.0 BOTI ... 0.0 0.0 \n", + "1 0.0 0.0 0.0 BOTI ... 0.0 0.0 \n", + "2 0.0 0.0 0.0 BOTI ... 0.0 0.0 \n", + "3 0.0 0.0 0.0 BOTI ... 0.0 0.0 \n", + "4 0.0 0.0 0.0 BOTI ... 0.0 0.0 \n", + "\n", + " C202417 C202501 C202502 C202503 C202504 C202505 C202506 C202507 \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 91 columns]" + ] + }, + "execution_count": 265, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final = pd.merge(df_final,df_pivotado,how='left',on=['PDV','Código'])\n", + "\n", + "df_final = df_final.fillna(0)\n", + "\n", + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 266, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n", + " 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n", + " 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n", + " 'Percentual de desconto consumidor', 'Ação revendedor',\n", + " 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n", + " 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n", + " 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + " 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n", + " '202412', '202413', '202414', '202415', '202416', '202417', '202501',\n", + " '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n", + " '202509', '202510', '202511', '202512', 'Ciclo_y', 'INICIO CICLO',\n", + " 'FIM CICLO', 'DURAÇÃO', 'dias_ate_inicio', 'chave sku2', 'chave sku1',\n", + " 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n", + " 'PRODUTO', '202416', 'C202401', 'C202402', 'C202403', 'C202404',\n", + " 'C202405', 'C202406', 'C202407', 'C202408', 'C202409', 'C202410',\n", + " 'C202411', 'C202412', 'C202413', 'C202414', 'C202415', 'C202416',\n", + " 'C202417', 'C202501', 'C202502', 'C202503', 'C202504', 'C202505',\n", + " 'C202506', 'C202507'],\n", + " dtype='object')" + ] + }, + "execution_count": 266, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 267, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "# 1. Identificar colunas no formato 'C2024xx', 'C2025xx', etc.\n", + "colunas_ciclo_c = [col for col in df_pivotado.columns if re.fullmatch(r'C20\\d{4}', col)]\n", + "\n", + "for col_c in colunas_ciclo_c:\n", + " sufixo = col_c[1:] # Remove o 'C' do início, ex: 'C202407' -> '202407'\n", + " col_hist = col_c\n", + " \n", + " if col_hist in df_final.columns:\n", + " # Pega o maior valor entre a coluna de histórico e a de ciclo com \"C\"\n", + " df_final[col_hist] = df_final[[col_hist, col_c]].max(axis=1)\n", + "\n", + "# (Opcional) Remover as colunas 'C20xxxx' após o merge\n", + "df_final.drop(columns=colunas_ciclo_c, inplace=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 268, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "202401 C202401\n", + "202402 C202402\n", + "202403 C202403\n", + "202404 C202404\n", + "202405 C202405\n", + "202406 C202406\n", + "202407 C202407\n", + "202408 C202408\n", + "202409 C202409\n", + "202410 C202410\n", + "202411 C202411\n", + "202412 C202412\n", + "202413 C202413\n", + "202414 C202414\n", + "202415 C202415\n", + "202416 C202416\n", + "202417 C202417\n", + "202501 C202501\n", + "202502 C202502\n", + "202503 C202503\n", + "202504 C202504\n", + "202505 C202505\n", + "202506 C202506\n", + "202507 C202507\n" + ] + }, + { + "data": { + "text/plain": [ + "['C202401',\n", + " 'C202402',\n", + " 'C202403',\n", + " 'C202404',\n", + " 'C202405',\n", + " 'C202406',\n", + " 'C202407',\n", + " 'C202408',\n", + " 'C202409',\n", + " 'C202410',\n", + " 'C202411',\n", + " 'C202412',\n", + " 'C202413',\n", + " 'C202414',\n", + " 'C202415',\n", + " 'C202416',\n", + " 'C202417',\n", + " 'C202501',\n", + " 'C202502',\n", + " 'C202503',\n", + " 'C202504',\n", + " 'C202505',\n", + " 'C202506',\n", + " 'C202507']" + ] + }, + "execution_count": 268, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "colunas_ciclo_c = [col for col in df_pivotado.columns if re.fullmatch(r'C20\\d{4}', col)]\n", + "\n", + "for col_c in colunas_ciclo_c:\n", + " sufixo = col_c[1:] # Remove o 'C' do início, ex: 'C202407' -> '202407'\n", + " col_hist = col_c\n", + " print(sufixo,col_c)\n", + "colunas_ciclo_c" + ] + }, + { + "cell_type": "code", + "execution_count": 269, + "metadata": {}, + "outputs": [], + "source": [ + "df_final = df_final.drop(columns=['Ciclo_y'])" + ] + }, + { + "cell_type": "code", + "execution_count": 270, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n", + " 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n", + " 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n", + " 'Percentual de desconto consumidor', 'Ação revendedor',\n", + " 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n", + " 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n", + " 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + " 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n", + " '202412', '202413', '202414', '202415', '202416', '202417', '202501',\n", + " '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n", + " '202509', '202510', '202511', '202512', 'INICIO CICLO', 'FIM CICLO',\n", + " 'DURAÇÃO', 'dias_ate_inicio', 'chave sku2', 'chave sku1',\n", + " 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n", + " 'PRODUTO', '202416'],\n", + " dtype='object')" + ] + }, + "execution_count": 270, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 271, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(49398, 66)" + ] + }, + "execution_count": 271, "metadata": {}, "output_type": "execute_result" } @@ -1595,59 +4303,53 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 272, "metadata": {}, "outputs": [], "source": [ - "df_final[df_final.columns[26:43]] = df_final[df_final.columns[26:43]].fillna(0)\n" + "df_final['chave'] = df_final['PDV'].astype('str') + df_final['Código'].astype('str')" ] }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 273, + "metadata": {}, + "outputs": [], + "source": [ + "df_final = df_final.fillna(0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 274, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['Histórico de Vendas do Ciclo 202409',\n", - " 'Histórico de Vendas do Ciclo 202410',\n", - " 'Histórico de Vendas do Ciclo 202411',\n", - " 'Histórico de Vendas do Ciclo 202412',\n", - " 'Histórico de Vendas do Ciclo 202413',\n", - " 'Histórico de Vendas do Ciclo 202414',\n", - " 'Histórico de Vendas do Ciclo 202415',\n", - " 'Histórico de Vendas do Ciclo 202416',\n", - " 'Histórico de Vendas do Ciclo 202417',\n", - " 'Histórico de Vendas do Ciclo 202501',\n", - " 'Histórico de Vendas do Ciclo 202502',\n", - " 'Histórico de Vendas do Ciclo 202503',\n", - " 'Histórico de Vendas do Ciclo 202504',\n", - " 'Histórico de Vendas do Ciclo 202505',\n", - " 'Histórico de Vendas do Ciclo 202506',\n", - " 'Histórico de Vendas do Ciclo 202507',\n", - " 'Histórico de Vendas do Ciclo 202508',\n", - " 'Histórico de Vendas do Ciclo Atual'],\n", + "Index(['202412', '202413', '202414', '202415', '202416', '202417', '202501',\n", + " '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n", + " '202509', '202510', '202511', '202512'],\n", " dtype='object')" ] }, - "execution_count": 50, + "execution_count": 274, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final.columns[26:44]" + "df_final.columns[36:54]" ] }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 275, "metadata": {}, "outputs": [], "source": [ "# Define list of target columns\n", - "sales_2024_cols = df_final.columns[26:44]\n", + "sales_2024_cols = df_final.columns[36:54]\n", "# Create a new column with the row-wise max\n", "df_final['PICO DE VENDAS 2024'] = df_final[sales_2024_cols].max(axis=1)\n", "\n" @@ -1655,61 +4357,27 @@ }, { "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['Histórico de Vendas do Ciclo 202503',\n", - " 'Histórico de Vendas do Ciclo 202504',\n", - " 'Histórico de Vendas do Ciclo 202505',\n", - " 'Histórico de Vendas do Ciclo 202506',\n", - " 'Histórico de Vendas do Ciclo 202507',\n", - " 'Histórico de Vendas do Ciclo 202508',\n", - " 'Histórico de Vendas do Ciclo Atual'],\n", - " dtype='object')" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final.columns[37:44]" - ] - }, - { - "cell_type": "code", - "execution_count": 53, + "execution_count": 276, "metadata": {}, "outputs": [], "source": [ - "vendas_6_meses = df_final.columns[37:44]\n", + "vendas_6_meses = df_final.columns[48:54]\n", "\n", "df_final['Pico Vendas Ultimos 6 ciclos'] = df_final[vendas_6_meses].max(axis=1)" ] }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 277, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['Histórico de Vendas do Ciclo 202503',\n", - " 'Histórico de Vendas do Ciclo 202504',\n", - " 'Histórico de Vendas do Ciclo 202505',\n", - " 'Histórico de Vendas do Ciclo 202506',\n", - " 'Histórico de Vendas do Ciclo 202507',\n", - " 'Histórico de Vendas do Ciclo 202508',\n", - " 'Histórico de Vendas do Ciclo Atual'],\n", - " dtype='object')" + "Index(['202413', '202414', '202415', '202416', '202417', '202501', '202502'], dtype='object')" ] }, - "execution_count": 54, + "execution_count": 277, "metadata": {}, "output_type": "execute_result" } @@ -1720,26 +4388,337 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 278, "metadata": {}, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_17756\\2592201544.py:24: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", - " crescimento_por_pdv = df_final.groupby('PDV').apply(calcular_crescimento)\n" - ] + "data": { + "text/plain": [ + "Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n", + " 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n", + " 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n", + " 'Percentual de desconto consumidor', 'Ação revendedor',\n", + " 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n", + " 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n", + " 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + " 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n", + " '202412', '202413', '202414', '202415', '202416', '202417', '202501',\n", + " '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n", + " '202509', '202510', '202511', '202512', 'INICIO CICLO', 'FIM CICLO',\n", + " 'DURAÇÃO', 'dias_ate_inicio', 'chave sku2', 'chave sku1',\n", + " 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n", + " 'PRODUTO', '202416', 'chave', 'PICO DE VENDAS 2024',\n", + " 'Pico Vendas Ultimos 6 ciclos'],\n", + " dtype='object')" + ] + }, + "execution_count": 278, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# Define as colunas mensais\n", - "colunas_mensais = df_final.columns[26:43]\n", + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 279, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Ciclo_x', 'Região', 'Canal', 'Código', 'Descrição', 'IAF',\n", + " 'Tipo de pedido', 'Foco', 'Unidade de negócio', 'Marca', 'Categoria',\n", + " 'Tipo de promoção', 'Catálogo', 'Tipo de produto', 'Ação consumidor',\n", + " 'Percentual de desconto consumidor', 'Ação revendedor',\n", + " 'Percentual de desconto revendedor', 'MATCH', 'PDV', 'CANAL',\n", + " 'DESCRIÇÃO PDV', 'UF', 'ANALISTA', 'SUPERVISOR', 'curva', 'categoria',\n", + " 'proj_mar', 'proj_mar+1', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", + " 'PEDIDO PENDENTE', 'DDV PREVISTO', 'preço', 'SKU_FINAL', 'DESCRICAO',\n", + " '202412', '202413', '202414', '202415', '202416', '202417', '202501',\n", + " '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n", + " '202509', '202510', '202511', '202512', 'INICIO CICLO', 'FIM CICLO',\n", + " 'DURAÇÃO', 'dias_ate_inicio', 'chave sku2', 'chave sku1',\n", + " 'PRECO DE COMPRA', 'PRECO DE VENDA', 'UFPRODUTO', 'PDV GINSENG',\n", + " 'PRODUTO', '202416', 'chave', 'PICO DE VENDAS 2024',\n", + " 'Pico Vendas Ultimos 6 ciclos'],\n", + " dtype='object')" + ] + }, + "execution_count": 279, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 280, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['202412', '202413', '202414', '202415', '202416', '202417', '202501',\n", + " '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n", + " '202509', '202510', '202511', '202512'],\n", + " dtype='object')" + ] + }, + "execution_count": 280, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns[36:54]" + ] + }, + { + "cell_type": "code", + "execution_count": 281, + "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", + "
Ciclo_xRegiãoCanalCódigoDescriçãoIAFTipo de pedidoFocoUnidade de negócioMarca...chave sku1PRECO DE COMPRAPRECO DE VENDAUFPRODUTOPDV GINSENGPRODUTO202416chavePICO DE VENDAS 2024Pico Vendas Ultimos 6 ciclos
0C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...AL2881358.17224.9AL481410.000.0125224814120.07.0
1C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...AL2881358.17224.9AL481410.000.0128174814145.018.0
2C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...AL2881358.17224.9AL481410.000.0128184814111.03.0
3C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...AL2881358.17224.9AL481410.000.012820481418.03.0
4C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...AL2881358.17224.9AL481410.000.0128234814111.02.0
\n", + "

5 rows × 69 columns

\n", + "
" + ], + "text/plain": [ + " Ciclo_x Região Canal Código Descrição IAF \\\n", + "0 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "1 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "2 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "3 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "4 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "\n", + " Tipo de pedido Foco Unidade de negócio Marca ... chave sku1 \\\n", + "0 0.0 0.0 0.0 BOTI ... AL28813 \n", + "1 0.0 0.0 0.0 BOTI ... AL28813 \n", + "2 0.0 0.0 0.0 BOTI ... AL28813 \n", + "3 0.0 0.0 0.0 BOTI ... AL28813 \n", + "4 0.0 0.0 0.0 BOTI ... AL28813 \n", + "\n", + " PRECO DE COMPRA PRECO DE VENDA UFPRODUTO PDV GINSENG PRODUTO 202416 \\\n", + "0 58.17 224.9 AL48141 0.0 0 0.0 \n", + "1 58.17 224.9 AL48141 0.0 0 0.0 \n", + "2 58.17 224.9 AL48141 0.0 0 0.0 \n", + "3 58.17 224.9 AL48141 0.0 0 0.0 \n", + "4 58.17 224.9 AL48141 0.0 0 0.0 \n", + "\n", + " chave PICO DE VENDAS 2024 Pico Vendas Ultimos 6 ciclos \n", + "0 1252248141 20.0 7.0 \n", + "1 1281748141 45.0 18.0 \n", + "2 1281848141 11.0 3.0 \n", + "3 1282048141 8.0 3.0 \n", + "4 1282348141 11.0 2.0 \n", + "\n", + "[5 rows x 69 columns]" + ] + }, + "execution_count": 281, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 282, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"# Define as colunas mensais\\ncolunas_mensais = df_final.columns[36:54]\\n\\n# Função de cálculo por grupo\\ndef calcular_crescimento(grupo):\\n soma_mensal = grupo[colunas_mensais].sum()\\n variacao_mensal = soma_mensal.pct_change().dropna()\\n variacao_mensal = variacao_mensal[np.isfinite(variacao_mensal)]\\n\\n if len(variacao_mensal) == 0:\\n return pd.Series({'CRESCIMENTO': np.nan})\\n\\n media = variacao_mensal.mean()\\n desvio = variacao_mensal.std()\\n\\n limite_sup = media + 2 * desvio\\n limite_inf = media - 2 * desvio\\n\\n variacoes_filtradas = variacao_mensal[variacao_mensal.between(limite_inf, limite_sup)]\\n crescimento = round(variacoes_filtradas.mean(), 4)\\n return pd.Series({'CRESCIMENTO': crescimento})\\n\\n# Aplica a função por PDV\\ncrescimento_por_pdv = (\\n df_final\\n .groupby('PDV')\\n .apply(calcular_crescimento) # retorna índice com PDV\\n .reset_index(level=0) # reseta só o nível PDV\\n)\\n\\n# Merge do resultado de volta no dataframe original\\ndf_final = df_final.merge(crescimento_por_pdv, on='PDV', how='left')\"" + ] + }, + "execution_count": 282, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'''# Define as colunas mensais\n", + "colunas_mensais = df_final.columns[36:54]\n", "\n", - "# Agrupa por PDV e calcula crescimento médio por PDV\n", + "# Função de cálculo por grupo\n", "def calcular_crescimento(grupo):\n", - " soma_mensal = grupo[colunas_mensais].sum() # soma por mês\n", - " variacao_mensal = soma_mensal.pct_change().dropna() # variação percentual mês a mês\n", + " soma_mensal = grupo[colunas_mensais].sum()\n", + " variacao_mensal = soma_mensal.pct_change().dropna()\n", " variacao_mensal = variacao_mensal[np.isfinite(variacao_mensal)]\n", "\n", " if len(variacao_mensal) == 0:\n", @@ -1756,31 +4735,36 @@ " return pd.Series({'CRESCIMENTO': crescimento})\n", "\n", "# Aplica a função por PDV\n", - "crescimento_por_pdv = df_final.groupby('PDV').apply(calcular_crescimento)\n", + "crescimento_por_pdv = (\n", + " df_final\n", + " .groupby('PDV')\n", + " .apply(calcular_crescimento) # retorna índice com PDV\n", + " .reset_index(level=0) # reseta só o nível PDV\n", + ")\n", "\n", "# Merge do resultado de volta no dataframe original\n", - "df_final = df_final.merge(crescimento_por_pdv, on='PDV', how='left')\n" + "df_final = df_final.merge(crescimento_por_pdv, on='PDV', how='left')'''\n" ] }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 283, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "np.float64(0.0564)" + "np.float64(0.1171)" ] }, - "execution_count": 56, + "execution_count": 283, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Suponha que os meses estão nas colunas 10 a 26 (17 colunas = 17 meses)\n", - "colunas_mensais = df_final.columns[26:43]\n", + "colunas_mensais = df_final.columns[36:54]\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", @@ -1807,14 +4791,37 @@ "df_filtrado = variacao_mensal[filtro]\n", "CRESCIMENTO = round(df_filtrado.mean(),4)\n", "\n", - "df_final['CRESCIMENTO_GERAL'] = CRESCIMENTO\n", + "df_final['CRESCIMENTO_GERAL'] = 0.2\n", "\n", "CRESCIMENTO\n" ] }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 284, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['202412', '202413', '202414', '202415', '202416', '202417', '202501',\n", + " '202502', '202503', '202504', '202505', '202506', '202507', '202508',\n", + " '202509', '202510', '202511', '202512'],\n", + " dtype='object')" + ] + }, + "execution_count": 284, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns[36:54]" + ] + }, + { + "cell_type": "code", + "execution_count": 285, "metadata": {}, "outputs": [ { @@ -1839,6 +4846,8 @@ " \n", " \n", " CANAL\n", + " UF\n", + " Código\n", " med_por_canal\n", " \n", " \n", @@ -1846,86 +4855,175 @@ " \n", " 0\n", " TODOS\n", - " 90.5\n", + " AL\n", + " 1004\n", + " 0.0\n", " \n", " \n", " 1\n", + " TODOS\n", + " AL\n", + " 1788\n", + " 0.0\n", + " \n", + " \n", + " 2\n", + " TODOS\n", + " AL\n", + " 2094\n", + " 0.0\n", + " \n", + " \n", + " 3\n", + " TODOS\n", + " AL\n", + " 2100\n", + " 0.0\n", + " \n", + " \n", + " 4\n", + " TODOS\n", + " AL\n", + " 2150\n", + " 0.0\n", + " \n", + " \n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " 6165\n", " VD\n", - " 715.0\n", + " VDC\n", + " 87925\n", + " 0.0\n", + " \n", + " \n", + " 6166\n", + " VD\n", + " VDC\n", + " 87926\n", + " 0.0\n", + " \n", + " \n", + " 6167\n", + " VD\n", + " VDC\n", + " 87927\n", + " 0.0\n", + " \n", + " \n", + " 6168\n", + " VD\n", + " VDC\n", + " 87959\n", + " 0.0\n", + " \n", + " \n", + " 6169\n", + " VD\n", + " VDC\n", + " 87960\n", + " 0.0\n", " \n", " \n", "\n", + "

6170 rows × 4 columns

\n", "" ], "text/plain": [ - " CANAL med_por_canal\n", - "0 TODOS 90.5\n", - "1 VD 715.0" + " CANAL UF Código med_por_canal\n", + "0 TODOS AL 1004 0.0\n", + "1 TODOS AL 1788 0.0\n", + "2 TODOS AL 2094 0.0\n", + "3 TODOS AL 2100 0.0\n", + "4 TODOS AL 2150 0.0\n", + "... ... ... ... ...\n", + "6165 VD VDC 87925 0.0\n", + "6166 VD VDC 87926 0.0\n", + "6167 VD VDC 87927 0.0\n", + "6168 VD VDC 87959 0.0\n", + "6169 VD VDC 87960 0.0\n", + "\n", + "[6170 rows x 4 columns]" ] }, - "execution_count": 57, + "execution_count": 285, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "vendas_todos_historicos = df_final.columns[26:44]\n", + "vendas_todos_historicos = df_final.columns[36:54]\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", - "medi = df_final.groupby(['CANAL'])['MEDIANA DO HISTÓRICO'].max().reset_index()\n", + "medi = df_final.groupby(['CANAL','UF','Código'])['MEDIANA DO HISTÓRICO'].max().reset_index()\n", "medi = medi.rename(columns={'MEDIANA DO HISTÓRICO':'med_por_canal'})\n", "\n", - "df_final = pd.merge(left=df_final, right=medi,on='CANAL',how='left')\n", + "df_final = pd.merge(left=df_final, right=medi,on=['CANAL','UF','Código'],how='left')\n", "\n", "medi" ] }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 286, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'202411'" + "'202414'" ] }, - "execution_count": 58, + "execution_count": 286, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final.columns[28:29].str.split(\" \")[0][-1]" + "df_final.columns[38]" ] }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 287, "metadata": {}, "outputs": [], "source": [ - "mesmo_ciclo_ano_passado = df_final.columns[28:29]\n", - "ciclo_ano_passado = df_final.columns[28:29].str.split(\" \")[0][-1]\n", + "mesmo_ciclo_ano_passado = df_final.columns[38]\n", + "ciclo_ano_passado = df_final.columns[38]\n", "df_final[ciclo_ano_passado] = df_final[mesmo_ciclo_ano_passado]" ] }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 288, + "metadata": {}, + "outputs": [], + "source": [ + "df_final['CRESCIMENTO_GERAL'] = 0.2\n", + "df_final['CRESCIMENTO'] = 0.2" + ] + }, + { + "cell_type": "code", + "execution_count": 289, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(30950, 84)" + "(49398, 77)" ] }, - "execution_count": 60, + "execution_count": 289, "metadata": {}, "output_type": "execute_result" } @@ -1937,11 +5035,11 @@ "\n", "df_final['CRESCIMENTO_FINAL'] = np.where(df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO']<0,0,df_final['CRESCIMENTO_GERAL'] + df_final['CRESCIMENTO'])\n", "\n", - "df_final['MEDIANA DO HISTÓRICO'] = np.where(df_final['MEDIANA DO HISTÓRICO']==0,df_final['MEDIA DO HISTÓRICO'] ,df_final['MEDIANA DO HISTÓRICO'])\n", + "df_final['MEDIANA DO HISTÓRICO2'] = np.where(df_final['MEDIANA DO HISTÓRICO']==0,df_final['MEDIA DO HISTÓRICO'] ,df_final['MEDIANA DO HISTÓRICO'])\n", "\n", "# Primeiro cálculo intermediário\n", "df_final['PV GINSENG'] = np.where(df_final['CRESCIMENTO_FINAL'] * df_final[ciclo_ano_passado] + df_final[ciclo_ano_passado] <1,\n", - " round(df_final['CRESCIMENTO_FINAL'] * df_final['MEDIANA DO HISTÓRICO']+ df_final['MEDIANA DO HISTÓRICO'],0), \n", + " round(df_final['CRESCIMENTO_FINAL'] * df_final['MEDIANA DO HISTÓRICO2']+ df_final['MEDIANA DO HISTÓRICO2'],0), \n", " round(df_final['CRESCIMENTO_FINAL']*df_final[ciclo_ano_passado]+df_final[ciclo_ano_passado],0))\n", "\n", "\n", @@ -1950,219 +5048,401 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 290, "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", + "
Ciclo_xRegiãoCanalCódigoDescriçãoIAFTipo de pedidoFocoUnidade de negócioMarca...PICO DE VENDAS 2024Pico Vendas Ultimos 6 ciclosCRESCIMENTO_GERALMEDIANA DO HISTÓRICOMEDIA DO HISTÓRICOmed_por_canalCRESCIMENTOCRESCIMENTO_FINALMEDIANA DO HISTÓRICO2PV GINSENG
0C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...20.07.00.23.05.0000008.00.20.43.013.0
1C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...45.018.00.28.012.7894748.00.20.48.059.0
2C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...11.03.00.22.02.5789478.00.20.42.07.0
3C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...8.03.00.21.02.4210538.00.20.41.08.0
4C202514NNEVD48141ACCORDES DES COL 80ml V50.00.00.00.0BOTI...11.02.00.21.02.4736848.00.20.41.08.0
\n", + "

5 rows × 77 columns

\n", + "
" + ], "text/plain": [ - "Index(['Histórico de Vendas do Ciclo 202409',\n", - " 'Histórico de Vendas do Ciclo 202410',\n", - " 'Histórico de Vendas do Ciclo 202411',\n", - " 'Histórico de Vendas do Ciclo 202412',\n", - " 'Histórico de Vendas do Ciclo 202413',\n", - " 'Histórico de Vendas do Ciclo 202414',\n", - " 'Histórico de Vendas do Ciclo 202415',\n", - " 'Histórico de Vendas do Ciclo 202416',\n", - " 'Histórico de Vendas do Ciclo 202417',\n", - " 'Histórico de Vendas do Ciclo 202501',\n", - " 'Histórico de Vendas do Ciclo 202502',\n", - " 'Histórico de Vendas do Ciclo 202503',\n", - " 'Histórico de Vendas do Ciclo 202504'],\n", - " dtype='object')" + " Ciclo_x Região Canal Código Descrição IAF \\\n", + "0 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "1 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "2 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "3 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "4 C202514 NNE VD 48141 ACCORDES DES COL 80ml V5 0.0 \n", + "\n", + " Tipo de pedido Foco Unidade de negócio Marca ... PICO DE VENDAS 2024 \\\n", + "0 0.0 0.0 0.0 BOTI ... 20.0 \n", + "1 0.0 0.0 0.0 BOTI ... 45.0 \n", + "2 0.0 0.0 0.0 BOTI ... 11.0 \n", + "3 0.0 0.0 0.0 BOTI ... 8.0 \n", + "4 0.0 0.0 0.0 BOTI ... 11.0 \n", + "\n", + " Pico Vendas Ultimos 6 ciclos CRESCIMENTO_GERAL MEDIANA DO HISTÓRICO \\\n", + "0 7.0 0.2 3.0 \n", + "1 18.0 0.2 8.0 \n", + "2 3.0 0.2 2.0 \n", + "3 3.0 0.2 1.0 \n", + "4 2.0 0.2 1.0 \n", + "\n", + " MEDIA DO HISTÓRICO med_por_canal CRESCIMENTO CRESCIMENTO_FINAL \\\n", + "0 5.000000 8.0 0.2 0.4 \n", + "1 12.789474 8.0 0.2 0.4 \n", + "2 2.578947 8.0 0.2 0.4 \n", + "3 2.421053 8.0 0.2 0.4 \n", + "4 2.473684 8.0 0.2 0.4 \n", + "\n", + " MEDIANA DO HISTÓRICO2 PV GINSENG \n", + "0 3.0 13.0 \n", + "1 8.0 59.0 \n", + "2 2.0 7.0 \n", + "3 1.0 8.0 \n", + "4 1.0 8.0 \n", + "\n", + "[5 rows x 77 columns]" ] }, - "execution_count": 61, + "execution_count": 290, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final.columns[26:39]" + "df_final.head()" ] }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 291, "metadata": {}, "outputs": [], "source": [ - "df_final = df_final.rename(columns={df_final.columns[39]: \"C-4\", df_final.columns[40]: \"C-3\",df_final.columns[41]: \"C-2\",df_final.columns[42]: \"C-1\"})" + "df_final = df_final.drop(columns=['MEDIANA DO HISTÓRICO2'] )" ] }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 292, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['202414', '202415', '202416', '202417', '202501', '202502', '202503'], dtype='object')" + ] + }, + "execution_count": 292, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "df_final.drop(columns=df_final.columns[26:39], inplace=True)\n" + "df_final.columns[38:45]" ] }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 293, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['202508', '202509', '202510', '202511', '202512'], dtype='object')" + ] + }, + "execution_count": 293, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns[49:54]" + ] + }, + { + "cell_type": "code", + "execution_count": 294, "metadata": {}, "outputs": [], "source": [ - "# List all columns except the two\n", - "cols_to_group_by = df_final.columns.difference(['DDV PREVISTO', 'COBERTURA ATUAL'])\n", + "df_final = df_final.rename(columns={df_final.columns[49]: \"C-4\", df_final.columns[50]: \"C-3\",df_final.columns[51]: \"C-2\",df_final.columns[52]: \"C-1\",df_final.columns[53]: \"Atual\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 295, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'202413'" + ] + }, + "execution_count": 295, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.columns[37]" + ] + }, + { + "cell_type": "code", + "execution_count": 296, + "metadata": {}, + "outputs": [], + "source": [ + "df_final.drop(columns=df_final.columns[39:49], inplace=True)\n", + "df_final.drop(columns=df_final.columns[37], inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 297, + "metadata": {}, + "outputs": [], + "source": [ + "df_final['COBERTURA ATUAL'] = df_final['ESTOQUE ATUAL'].astype(float) / df_final['DDV PREVISTO'].astype(float)" + ] + }, + { + "cell_type": "code", + "execution_count": 298, + "metadata": {}, + "outputs": [], + "source": [ + "df_final['COBERTURA ATUAL'] = df_final['COBERTURA ATUAL'].replace([np.inf, -np.inf], 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 299, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "COBERTURA ATUAL\n", + "0.000000 10548\n", + "100.000000 1253\n", + "50.000000 806\n", + "33.333333 689\n", + "200.000000 605\n", + " ... \n", + "338.235294 1\n", + "622.727273 1\n", + "104.347826 1\n", + "377.777778 1\n", + "2.127660 1\n", + "Name: count, Length: 2608, dtype: int64" + ] + }, + "execution_count": 299, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final['COBERTURA ATUAL'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 300, + "metadata": {}, + "outputs": [], + "source": [ + "df_final[\"DDV PREVISTO\"] = df_final[\"DDV PREVISTO\"].astype(float)\n", "\n", - "# Group and aggregate\n", - "df_final_dedup = (\n", - " df_final\n", - " .groupby(list(cols_to_group_by), dropna=False)[['DDV PREVISTO', 'COBERTURA ATUAL']]\n", - " .max()\n", - " .reset_index()\n", - ")\n" + "df_final[\"DDV PREVISTO\"] = df_final[\"DDV PREVISTO\"].fillna(0)" ] }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 301, "metadata": {}, "outputs": [], "source": [ - "df_final_dedup['DDV PREVISTO'] = df_final_dedup['DDV PREVISTO'].fillna(0.01)\n" + "colunas_chave = [c for c in df_final.columns if c not in [\"DDV PREVISTO\", \"COBERTURA ATUAL\"]]\n", + "\n", + "\n", + "# encontrar índice da linha com maior DDV e depois maior COBERTURA\n", + "idx = (\n", + "df_final\n", + ".sort_values([\"DDV PREVISTO\", \"COBERTURA ATUAL\"], ascending=[False, False])\n", + ".groupby(colunas_chave, as_index=False)\n", + ".head(1)\n", + ")\n", + "\n", + "\n", + "# reordenar colunas como no original\n", + "df_final_dedup = idx[df_final.columns.tolist()].reset_index(drop=True)" ] }, { "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "76 9.0\n", - "152 0.0\n", - "228 0.0\n", - "304 0.0\n", - "380 0.0\n", - " ... \n", - "30610 18.0\n", - "30708 129.0\n", - "30785 744.0\n", - "30861 1074.0\n", - "30937 113.0\n", - "Name: C-3, Length: 371, dtype: float64" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final_dedup[(df_final['PDV'] == 23712)]['C-3']" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "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": 68, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['202411', 'ANALISTA', 'Arquivo_Origem_x', 'Arquivo_Origem_y',\n", - " 'Ação consumidor', 'Ação revendedor', 'C-1', 'C-2', 'C-3', 'C-4',\n", - " 'CANAL', 'COBERTURA ATUAL + TRANSITO', 'CRESCIMENTO',\n", - " 'CRESCIMENTO_FINAL', 'CRESCIMENTO_GERAL', 'Canal', 'Categoria',\n", - " 'Catálogo', 'Ciclo_x', 'Ciclo_y', 'Classe', 'Código', 'DESCRIÇÃO PDV',\n", - " 'DURAÇÃO', 'Data Prevista Regularização', 'Descrição', 'Dias sem venda',\n", - " 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO', 'Estoque Atual',\n", - " 'Estoque em Transito', 'FIM CICLO', 'Foco',\n", - " 'Histórico de Vendas do Ciclo 202408',\n", - " 'Histórico de Vendas do Ciclo Atual', 'IAF', 'INICIO CICLO',\n", - " 'Item Desativado', 'MATCH', 'MEDIA DO HISTÓRICO',\n", - " 'MEDIANA DO HISTÓRICO', 'Marca', 'PDV', 'PEDIDO PENDENTE',\n", - " 'PICO DE VENDAS 2024', 'PRECO DE COMPRA', 'PRECO DE VENDA',\n", - " 'PV GINSENG', 'Pedido Pendente', 'Percentual de desconto consumidor',\n", - " 'Percentual de desconto revendedor', 'Pico Vendas Ultimos 6 ciclos',\n", - " 'Projeção Próximo Ciclo', 'Projeção Próximo Ciclo + 1',\n", - " 'Promoção Próximo Ciclo + 1', 'Região', 'SKU', 'SKU_FINAL', 'SKU_PARA',\n", - " 'SKU_PARA_VALIDACAO', 'SUPERVISOR', 'Tipo de pedido', 'Tipo de produto',\n", - " 'Tipo de promoção', 'UF', 'UFPRODUTO', 'Unidade de negócio',\n", - " 'dias_ate_inicio', 'med_por_canal', 'DDV PREVISTO', 'COBERTURA ATUAL'],\n", - " dtype='object')" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final_dedup.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "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": 70, - "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": 71, - "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": 72, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['SKU', 'SKU_PARA', 'PDV', 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO',\n", - " 'PEDIDO PENDENTE', 'DDV PREVISTO', 'COBERTURA ATUAL',\n", - " 'COBERTURA ATUAL + TRANSITO', 'Arquivo_Origem', 'SKU_PARA_VALIDACAO'],\n", - " dtype='object')" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_estoque.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 73, + "execution_count": 302, "metadata": {}, "outputs": [ { @@ -2175,7 +5455,7 @@ " '202408')" ] }, - "execution_count": 73, + "execution_count": 302, "metadata": {}, "output_type": "execute_result" } @@ -2203,46 +5483,7 @@ }, { "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [], - "source": [ - "#df_final_dedup = df_final_dedup[priority_cols + other_cols]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "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": 76, - "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": 77, - "metadata": {}, - "outputs": [], - "source": [ - "df_final_dedup.drop(df_final_dedup.columns[39:40], axis=1, inplace=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 78, + "execution_count": 303, "metadata": {}, "outputs": [], "source": [ @@ -2252,46 +5493,7 @@ }, { "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [], - "source": [ - "#df_final_dedup['MARCA'] = df_final_dedup['MARCA'].str.replace('.csv','',regex=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [], - "source": [ - "df_final_dedup['COB PROJETADA'] = df_final_dedup['COB PROJETADA'].fillna(999)" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'BOT'" - ] - }, - "execution_count": 81, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "marca_promo = df_estoque['Arquivo_Origem'].iloc[0].replace('.csv','')\n", - "marca_promo" - ] - }, - { - "cell_type": "code", - "execution_count": 82, + "execution_count": 304, "metadata": {}, "outputs": [], "source": [ @@ -2302,7 +5504,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 305, "metadata": {}, "outputs": [], "source": [ @@ -2311,7 +5513,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 306, "metadata": {}, "outputs": [], "source": [ @@ -2324,7 +5526,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 307, "metadata": {}, "outputs": [ { @@ -2333,7 +5535,7 @@ "np.int64(0)" ] }, - "execution_count": 85, + "execution_count": 307, "metadata": {}, "output_type": "execute_result" } @@ -2344,42 +5546,167 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 308, "metadata": {}, "outputs": [], "source": [ - "df_final_dedup.to_excel(r'C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C11\\teste.xlsx')" + "df_irece_agrupado = df_irece.groupby(['PDV','Código','Ciclo'])['Quantidade'].sum().reset_index()" ] }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 309, "metadata": {}, "outputs": [], "source": [ - "df_final_dedup = df_final_dedup[df_final_dedup['Código']!= '']\n" + "df_final_dedup = df_final_dedup.rename(columns={'CANAL_x':'CANAL','UF_X':'UF','Marca':'LINHA'})\n" ] }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 310, "metadata": {}, "outputs": [], "source": [ - "df_vdc = pd.read_csv(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\SUPRIMENTOS\\DB_PROMOÇÕES\\BOTICARIO\\C10\\VENDA VITORIA 2024\\VENDA VITORIA.csv\")\n", - "\n", - "df_vdc['PRODUTO'] = df_vdc['PRODUTO'].astype('Int64')\n", - "\n", - "df_final_dedup['Código'] = df_final_dedup['Código'].astype('Int64')\n", - "\n", - "df_final_dedup =pd.merge(left=df_final_dedup,right=df_vdc[['PDV GINSENG','PRODUTO',ciclo_ano_passado]],left_on= ['PDV','Código'],right_on= ['PDV GINSENG','PRODUTO'],how='left' )\n", - "\n", - "df_final_dedup[df_final_dedup.columns[-1]] = df_final_dedup[df_final_dedup.columns[-1]].fillna(0)" + "df_final_dedup = df_final_dedup.rename(columns={'UF_x':'UF','DESCRICAO_y':'DESCRICAO'})" ] }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 311, + "metadata": {}, + "outputs": [], + "source": [ + "df_final_dedup = df_final_dedup.drop(columns={'CANAL_y', 'UF_y'})\n" + ] + }, + { + "cell_type": "code", + "execution_count": 312, + "metadata": {}, + "outputs": [], + "source": [ + "df_final_dedup['Estoque Total'] = df_final_dedup['ESTOQUE ATUAL'].astype(float) + df_final_dedup['ESTOQUE EM TRANSITO'].astype(float) + df_final_dedup['PEDIDO PENDENTE'].astype(float)" + ] + }, + { + "cell_type": "code", + "execution_count": 313, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'202414'" + ] + }, + "execution_count": 313, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ciclo_ano_passado" + ] + }, + { + "cell_type": "code", + "execution_count": 314, + "metadata": {}, + "outputs": [], + "source": [ + "df_final_dedup = df_final_dedup[['DURAÇÃO','CANAL','ANALISTA','SUPERVISOR','UF','chave','PDV','DESCRIÇÃO PDV','Código','DESCRICAO','LINHA','Categoria','curva','Percentual de desconto consumidor','Ação consumidor',\n", + " 'Percentual de desconto revendedor','Ação revendedor','C-4', 'C-3', 'C-2', 'C-1','Atual','ESTOQUE ATUAL',ciclo_ano_passado ,'ESTOQUE EM TRANSITO','PEDIDO PENDENTE','Estoque Total',\n", + " 'DDV PREVISTO','COBERTURA ATUAL','proj_mar', 'proj_mar+1','MEDIA DO HISTÓRICO','PICO DE VENDAS 2024','Pico Vendas Ultimos 6 ciclos','PRECO DE COMPRA',\n", + " 'PRECO DE VENDA','PV GINSENG']]" + ] + }, + { + "cell_type": "code", + "execution_count": 315, + "metadata": {}, + "outputs": [], + "source": [ + "df_final_dedup['Percentual de desconto revendedor'] = np.where(df_final_dedup['Percentual de desconto revendedor'] == '0,00', df_final_dedup['Percentual de desconto consumidor'],df_final_dedup['Percentual de desconto revendedor'])" + ] + }, + { + "cell_type": "code", + "execution_count": 316, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'202414'" + ] + }, + "execution_count": 316, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ciclo_ano_passado" + ] + }, + { + "cell_type": "code", + "execution_count": 317, + "metadata": {}, + "outputs": [], + "source": [ + "df_final_dedup = df_final_dedup.drop_duplicates()" + ] + }, + { + "cell_type": "code", + "execution_count": 318, + "metadata": {}, + "outputs": [], + "source": [ + "df_final_dedup['Valor Sugestão'] = \"\"\n", + "\n", + "df_final_dedup['Sugestão Comercial'] = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 319, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DDV PREVISTO float64\n", + "COBERTURA ATUAL float64\n", + "dtype: object" + ] + }, + "execution_count": 319, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final_dedup[['DDV PREVISTO',\n", + " 'COBERTURA ATUAL',]].dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 320, + "metadata": {}, + "outputs": [], + "source": [ + "df_final_dedup[ 'DDV PREVISTO'] = df_final_dedup['DDV PREVISTO'].fillna(0)\n", + "\n", + "df_final_dedup = df_final_dedup.drop_duplicates()" + ] + }, + { + "cell_type": "code", + "execution_count": 321, "metadata": {}, "outputs": [ { @@ -2403,404 +5730,116 @@ " \n", " \n", " \n", - " 202411_x\n", + " DURAÇÃO\n", + " CANAL\n", " ANALISTA\n", - " Arquivo_Origem_x\n", - " Arquivo_Origem_y\n", - " Ação consumidor\n", - " Ação revendedor\n", - " C-1\n", - " C-2\n", - " C-3\n", - " C-4\n", + " SUPERVISOR\n", + " UF\n", + " chave\n", + " PDV\n", + " DESCRIÇÃO PDV\n", + " Código\n", + " DESCRICAO\n", " ...\n", - " COBERTURA ATUAL\n", - " EST PROJE FINAL CICLO ATUAL\n", - " VENDAS R$ PV GINSENG\n", - " RBV 202406\n", - " COB PROJETADA\n", - " CANAL_y\n", - " UF_y\n", - " PDV GINSENG\n", - " PRODUTO\n", - " 202411_y\n", + " proj_mar\n", + " proj_mar+1\n", + " MEDIA DO HISTÓRICO\n", + " PICO DE VENDAS 2024\n", + " Pico Vendas Ultimos 6 ciclos\n", + " PRECO DE COMPRA\n", + " PRECO DE VENDA\n", + " PV GINSENG\n", + " Valor Sugestão\n", + " Sugestão Comercial\n", " \n", " \n", " \n", " \n", - " 0\n", - " 0.0\n", - " DANIEL\n", - " BOT.csv\n", - " BOT.csv\n", - " BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO\n", - " BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 1.0\n", - " ...\n", - " 166.0\n", - " 4.0\n", - " NaN\n", - " NaN\n", - " 166.666667\n", - " LJ\n", - " BA\n", - " NaN\n", - " <NA>\n", - " 0.0\n", - " \n", - " \n", " 1\n", - " 0.0\n", - " DANIEL\n", - " BOT.csv\n", - " BOT.csv\n", - " BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO\n", - " BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO\n", - " 0.0\n", - " 2.0\n", - " 0.0\n", - " 0.0\n", - " ...\n", - " 45.0\n", - " 1.0\n", - " NaN\n", - " NaN\n", - " 100.000000\n", - " LJ\n", - " VDC\n", - " NaN\n", - " <NA>\n", - " 0.0\n", - " \n", - " \n", - " 2\n", - " 0.0\n", - " DANIEL\n", - " BOT.csv\n", - " BOT.csv\n", - " BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO\n", - " BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO\n", - " 2.0\n", - " 0.0\n", - " 0.0\n", - " 1.0\n", - " ...\n", - " 200.0\n", - " 2.0\n", - " NaN\n", - " NaN\n", - " 200.000000\n", - " LJ\n", - " BA\n", - " NaN\n", - " <NA>\n", - " 0.0\n", - " \n", - " \n", - " 3\n", - " 0.0\n", - " DANIEL\n", - " BOT.csv\n", - " BOT.csv\n", - " BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO\n", - " BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO\n", - " 3.0\n", - " 0.0\n", - " 0.0\n", - " 3.0\n", - " ...\n", - " 0.0\n", - " 3.0\n", - " NaN\n", - " NaN\n", - " 83.333333\n", - " LJ\n", - " BA\n", - " NaN\n", - " <NA>\n", - " 0.0\n", - " \n", - " \n", - " 4\n", - " 0.0\n", - " DANIEL\n", - " BOT.csv\n", - " BOT.csv\n", - " BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO\n", - " BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO\n", - " 4.0\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " ...\n", - " 100.0\n", - " 1.0\n", - " NaN\n", - " NaN\n", - " 100.000000\n", + " 21\n", " VD\n", + " JEFFERSON\n", + " Juliana Vasconcelos\n", " VDC\n", - " 23703.0\n", - " 29046\n", + " 2371184387\n", + " 23711\n", + " ER VITORIA DA CONQUISTA\n", + " 84387\n", + " MALBEC DES COL V6 100ml\n", + " ...\n", + " 1505.0\n", " 0.0\n", + " 545.894737\n", + " 2734.0\n", + " 857.0\n", + " 0.0\n", + " 0.0\n", + " 412.0\n", + " \n", + " \n", " \n", " \n", "\n", - "

5 rows × 76 columns

\n", + "

1 rows × 39 columns

\n", "" ], "text/plain": [ - " 202411_x ANALISTA Arquivo_Origem_x Arquivo_Origem_y \\\n", - "0 0.0 DANIEL BOT.csv BOT.csv \n", - "1 0.0 DANIEL BOT.csv BOT.csv \n", - "2 0.0 DANIEL BOT.csv BOT.csv \n", - "3 0.0 DANIEL BOT.csv BOT.csv \n", - "4 0.0 DANIEL BOT.csv BOT.csv \n", + " DURAÇÃO CANAL ANALISTA SUPERVISOR UF chave PDV \\\n", + "1 21 VD JEFFERSON Juliana Vasconcelos VDC 2371184387 23711 \n", "\n", - " Ação consumidor \\\n", - "0 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO \n", - "1 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO \n", - "2 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO \n", - "3 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO \n", - "4 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO \n", + " DESCRIÇÃO PDV Código DESCRICAO ... proj_mar \\\n", + "1 ER VITORIA DA CONQUISTA 84387 MALBEC DES COL V6 100ml ... 1505.0 \n", "\n", - " Ação revendedor C-1 C-2 C-3 C-4 ... \\\n", - "0 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO 0.0 0.0 0.0 1.0 ... \n", - "1 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO 0.0 2.0 0.0 0.0 ... \n", - "2 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO 2.0 0.0 0.0 1.0 ... \n", - "3 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO 3.0 0.0 0.0 3.0 ... \n", - "4 BODY SPRAY BOTICOLLECTION COM 20% DE DESCONTO 4.0 0.0 0.0 0.0 ... \n", + " proj_mar+1 MEDIA DO HISTÓRICO PICO DE VENDAS 2024 \\\n", + "1 0.0 545.894737 2734.0 \n", "\n", - " COBERTURA ATUAL EST PROJE FINAL CICLO ATUAL VENDAS R$ PV GINSENG \\\n", - "0 166.0 4.0 NaN \n", - "1 45.0 1.0 NaN \n", - "2 200.0 2.0 NaN \n", - "3 0.0 3.0 NaN \n", - "4 100.0 1.0 NaN \n", + " Pico Vendas Ultimos 6 ciclos PRECO DE COMPRA PRECO DE VENDA PV GINSENG \\\n", + "1 857.0 0.0 0.0 412.0 \n", "\n", - " RBV 202406 COB PROJETADA CANAL_y UF_y PDV GINSENG PRODUTO 202411_y \n", - "0 NaN 166.666667 LJ BA NaN 0.0 \n", - "1 NaN 100.000000 LJ VDC NaN 0.0 \n", - "2 NaN 200.000000 LJ BA NaN 0.0 \n", - "3 NaN 83.333333 LJ BA NaN 0.0 \n", - "4 NaN 100.000000 VD VDC 23703.0 29046 0.0 \n", + " Valor Sugestão Sugestão Comercial \n", + "1 \n", "\n", - "[5 rows x 76 columns]" + "[1 rows x 39 columns]" ] }, - "execution_count": 89, + "execution_count": 321, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final_dedup.head()" + "df_final_dedup[df_final_dedup['chave'] == '2371184387'].head()" ] }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 322, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'202411_y'" + "1 94.98\n", + "Name: DDV PREVISTO, dtype: float64" ] }, - "execution_count": 90, + "execution_count": 322, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_final_dedup.columns[-1]" + "df_final_dedup[df_final_dedup['chave'] == '2371184387']['DDV PREVISTO'].head()\n" ] }, { "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [], - "source": [ - "df_final_dedup[df_final_dedup.columns[0]] = np.where(df_final_dedup[df_final_dedup.columns[-1]]>0,df_final_dedup[df_final_dedup.columns[-1]],df_final_dedup[df_final_dedup.columns[0]])" - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [], - "source": [ - "df_final_dedup = df_final_dedup.drop(columns=['Arquivo_Origem_x','Arquivo_Origem_y','CANAL_x','Canal',\n", - " 'Ciclo_x','Ciclo_y','DURAÇÃO','FIM CICLO','Foco','INICIO CICLO','MATCH',\n", - " 'PRECO DE COMPRA','SKU','SKU_PARA','SKU_PARA_VALIDACAO',\n", - " 'Tipo de pedido',\t'Tipo de produto','UFPRODUTO','Unidade de negócio','EST PROJE FINAL CICLO ATUAL',\n", - " 'UF_x','RBV 202406','Região','Catálogo','SKU','VENDAS R$ PV GINSENG','Data Prevista Regularização',\n", - " 'IAF', 'Item Desativado','Tipo de promoção','PDV GINSENG','PRODUTO','202411_y',\n", - " 'ESTOQUE ATUAL', 'ESTOQUE EM TRANSITO','COBERTURA ATUAL + TRANSITO',\n", - " 'DDV PREVISTO',\t'COB PROJETADA','COBERTURA ATUAL',\n", - " 'CRESCIMENTO_FINAL',\t'CRESCIMENTO_GERAL','med_por_canal','PEDIDO PENDENTE'])" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [], - "source": [ - "df_final_dedup = df_final_dedup.rename(columns={'CANAL_y':'CANAL','UF_y':'UF','Marca':'LINHA','202410_x':'202410'})\n" - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['202411_x', 'ANALISTA', 'Ação consumidor', 'Ação revendedor', 'C-1',\n", - " 'C-2', 'C-3', 'C-4', 'Categoria', 'Classe', 'Código', 'DESCRIÇÃO PDV',\n", - " 'Descrição', 'Dias sem venda', 'Estoque Atual', 'Estoque em Transito',\n", - " 'Histórico de Vendas do Ciclo 202408',\n", - " 'Histórico de Vendas do Ciclo Atual', 'MEDIANA DO HISTÓRICO', 'LINHA',\n", - " 'PDV', 'PICO DE VENDAS 2024', 'PRECO DE VENDA', 'PV GINSENG',\n", - " 'Pedido Pendente', 'Percentual de desconto consumidor',\n", - " 'Percentual de desconto revendedor', 'Pico Vendas Ultimos 6 ciclos',\n", - " 'Projeção Próximo Ciclo', 'Projeção Próximo Ciclo + 1',\n", - " 'Promoção Próximo Ciclo + 1', 'SUPERVISOR', 'CANAL', 'UF'],\n", - " dtype='object')" - ] - }, - "execution_count": 94, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final_dedup.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_17756\\4017566689.py:1: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n", - " df_final_dedup[(df_final['PDV'] == 23712)]['C-3']\n" - ] - }, - { - "data": { - "text/plain": [ - "76 9.0\n", - "152 0.0\n", - "228 0.0\n", - "304 0.0\n", - "380 0.0\n", - " ... \n", - "29314 6.0\n", - "29390 26.0\n", - "29466 137.0\n", - "29542 116.0\n", - "29618 23.0\n", - "Name: C-3, Length: 355, dtype: float64" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final_dedup[(df_final['PDV'] == 23712)]['C-3']" - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [], - "source": [ - "priority_cols = ['SUPERVISOR','ANALISTA','UF','CANAL','LINHA','PDV','DESCRIÇÃO PDV','Código','Descrição','Categoria', \n", - "'Classe','Percentual de desconto consumidor','Ação consumidor','Percentual de desconto revendedor','Ação revendedor','C-1',\n", - "'C-2', 'C-3', 'C-4','Histórico de Vendas do Ciclo Atual','Estoque Atual','Estoque em Transito','Pedido Pendente',\n", - "'Projeção Próximo Ciclo + 1','Projeção Próximo Ciclo']\n", - "\n", - "# All remaining columns\n", - "other_cols = [col for col in df_final_dedup.columns if col not in priority_cols]\n", - "\n", - "# Reorder\n", - "df_final_dedup = df_final_dedup[priority_cols + other_cols]\n", - "\n", - "df_final_dedup['SUGESTÃO ABASTECIMENTO'] = ''\n" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [], - "source": [ - "df_final_dedup = df_final_dedup.drop_duplicates()" - ] - }, - { - "cell_type": "code", - "execution_count": 98, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "np.float64(75876.0)" - ] - }, - "execution_count": 98, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final_dedup['PV GINSENG'].sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "np.int64(0)" - ] - }, - "execution_count": 99, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_final_dedup[df_final_dedup['PDV'] == 23712]['PICO DE VENDAS 2024'].isna().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 100, + "execution_count": 323, "metadata": {}, "outputs": [], "source": [ "# Export to Excel\n", - "output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\promoção_{marca_promo}_{ciclo_mais2}.{hoje}.xlsx'\n", + "output_file = f'C:\\\\Users\\\\joao.herculano\\\\Documents\\\\promoção_BOTI_{ciclo_mais2}.{hoje}.xlsx'\n", "with pd.ExcelWriter(output_file, engine='openpyxl') as writer:\n", " df_final_dedup.to_excel(writer, index=False)\n", "\n", diff --git a/relatorio_ruptura/PDV_ATT.xlsx b/relatorio_ruptura/PDV_ATT.xlsx new file mode 100644 index 0000000..f3ff8be Binary files /dev/null and b/relatorio_ruptura/PDV_ATT.xlsx differ diff --git a/relatorio_ruptura/grafico.png b/relatorio_ruptura/grafico.png new file mode 100644 index 0000000..05ee09b Binary files /dev/null and b/relatorio_ruptura/grafico.png differ diff --git a/relatorio_ruptura/grafico2.png b/relatorio_ruptura/grafico2.png new file mode 100644 index 0000000..fcf12f4 Binary files /dev/null and b/relatorio_ruptura/grafico2.png differ diff --git a/relatorio_ruptura/relatorio.xlsx b/relatorio_ruptura/relatorio.xlsx new file mode 100644 index 0000000..d8095d1 Binary files /dev/null and b/relatorio_ruptura/relatorio.xlsx differ diff --git a/relatório_ruptura/ruptura projetada 23.05.py b/relatorio_ruptura/ruptura_projetada.py similarity index 96% rename from relatório_ruptura/ruptura projetada 23.05.py rename to relatorio_ruptura/ruptura_projetada.py index 1814827..1d44d1b 100644 --- a/relatório_ruptura/ruptura projetada 23.05.py +++ b/relatorio_ruptura/ruptura_projetada.py @@ -71,7 +71,7 @@ df.columns = df.columns.str.lower() filtered_calendario.columns = filtered_calendario.columns.str.lower() df['ddv'] = df['pv_mar'] / filtered_calendario['duração'].values[0] -df['estoque_seguranca'] = np.ceil((df['media_vendas']/20)*11 - (df['ddv']*11)).astype(int) #media de vendas realizada+projetada +df['estoque_seguranca'] = np.ceil((df['media_vendas']/20)*14 - (df['ddv']*14)).astype(int) #media de vendas realizada+projetada df['estoque_seguranca'] = np.where(df['estoque_seguranca'] <1,1,df['estoque_seguranca']) df['risco_ruptura'] = np.where(df['estoque_seguranca'] > df['estoque'], "SIM", "NÃO") df['quantidade_ruptura'] = df['estoque_seguranca'] - df['estoque'] @@ -84,7 +84,7 @@ assunto = config['email_ruptura']['assunto'] df_rpt = pd.read_excel(r"C:\Users\joao.herculano\Downloads\Ruptura Cliente CP GINSENG - 09.06.xlsx") df_rpt.columns = df_rpt.columns.str.lower() -print(df_rpt.columns) + df['pdv'] = df['pdv'].astype('Int64') df['sku'] = df['sku'].astype('Int64') @@ -109,7 +109,7 @@ df2 = df2.join(pdvs_maior_excesso, on=['uf', 'sku']) df2['maior excesso na uf'] = df2['maior_excesso_por_uf'].apply(lambda x: 'não tem excesso no uf' if x == 0 else None) df2['maior excesso na uf'] = df2['maior excesso na uf'].combine_first(df2['pdv_maior_excesso']) df2['quantidade_ruptura'] = df2['quantidade_ruptura'].clip(lower=0) -print(df2[['uf', 'sku', 'excesso', 'maior_excesso_por_uf', 'maior excesso na uf']].head()) + df2.drop(columns=['pdv_maior_excesso','sku1'], inplace=True) df2['estoque livre?'] = np.where( @@ -218,7 +218,7 @@ plt.close() with pd.ExcelWriter(excel_path, engine='openpyxl') as writer: df2.to_excel(writer, sheet_name='Detalhado', index=False) df3.to_excel(writer, sheet_name='Resumo', index=False) -print(excel_path) + ruptura_total = df2['quantidade_ruptura'].sum() ruptura_por_uf_pct = ( df2.groupby('uf')['quantidade_ruptura'].sum() @@ -254,6 +254,7 @@ html_email = f"""

{boa}

Compartilhamos o relatório de ruptura projetada, com o objetivo de monitorar os itens com maior risco de ruptura nos próximos dias.

+

Atualizamos o relatório, e agora mandaremos diariamente às 10:00 automaticamente. Pedimos paciência nessa etapa e contamos com o feedback de vocês.

O relatório a seguir apresenta as seguintes informações:

  • Estoque atual;
  • diff --git a/relatório_cobertura/PDV_ATT.xlsx b/relatório_cobertura/PDV_ATT.xlsx new file mode 100644 index 0000000..f3ff8be Binary files /dev/null and b/relatório_cobertura/PDV_ATT.xlsx differ diff --git a/relatório_cobertura/acompanhamento40DSV.xlsx b/relatório_cobertura/acompanhamento40DSV.xlsx new file mode 100644 index 0000000..776012a Binary files /dev/null and b/relatório_cobertura/acompanhamento40DSV.xlsx differ diff --git a/relatório_cobertura/relatorio.xlsx b/relatório_cobertura/relatorio.xlsx new file mode 100644 index 0000000..68f3681 Binary files /dev/null and b/relatório_cobertura/relatorio.xlsx differ diff --git a/relatório_cobertura/relatório_cobertura.py b/relatório_cobertura/relatório_cobertura.py new file mode 100644 index 0000000..70233cd --- /dev/null +++ b/relatório_cobertura/relatório_cobertura.py @@ -0,0 +1,212 @@ +# enviar_email_excel.py + +import smtplib +import ssl +import pyodbc +import configparser +import pandas as pd +import matplotlib.pyplot as plt +import matplotlib.dates as mdates +import matplotlib.ticker as mtick +import seaborn as sns +from email.message import EmailMessage +from email.utils import make_msgid +from email.mime.image import MIMEImage +from pathlib import Path +from datetime import datetime, time + + +config = configparser.ConfigParser() +config.read(r"credenciais.ini") + +excel_path = Path("relatorio.xlsx") +print(config['banco']['host'],config['banco']['user'],config['banco']['password']) + +# Conexão com o banco +conn = pyodbc.connect( + f"DRIVER={{SQL Server}};" + f"SERVER={config['banco']['host']},1433;" + f"DATABASE=GINSENG;" + f"UID={config['banco']['user']};" + f"PWD={config['banco']['password']}") + +# 1. Criar dados fictícios e gerar Excel +query = ''' +WITH CTE_Estoque AS ( + SELECT + em.ORIGEM, + em.PDV, + CONCAT(em.PDV, em.ORIGEM) AS PDV_Origem, -- Coluna unificada + CASE + WHEN em.SKU_PARA IS NULL THEN em.SKU + ELSE em.SKU_PARA + END AS SKU_FINAL, + em.DESCRICAO, + em.CATEGORIA, + em.CLASSE, + CAST(REPLACE(em.[ESTOQUE ATUAL], ',', '.') AS FLOAT) AS [ESTOQUE ATUAL], + CAST(REPLACE(em.[ESTOQUE EM TRANSITO], ',', '.') AS FLOAT) AS [ESTOQUE EM TRANSITO], + CAST(REPLACE(em.[PEDIDO PENDENTE], ',', '.') AS FLOAT) AS [PEDIDO PENDENTE], + CAST(REPLACE(em.[DDV PREVISTO], ',', '.') AS FLOAT) AS [DDV PREVISTO], + ROUND( + CAST(REPLACE(em.[ESTOQUE ATUAL], ',', '.') AS FLOAT) + / NULLIF(CAST(REPLACE(em.[DDV PREVISTO], ',', '.') AS FLOAT), 0), 0 + ) AS [Cobertura Atual], + ROUND( + (CAST(REPLACE(em.[ESTOQUE ATUAL], ',', '.') AS FLOAT) + + CAST(REPLACE(em.[ESTOQUE EM TRANSITO], ',', '.') AS FLOAT) + + CAST(REPLACE(em.[PEDIDO PENDENTE], ',', '.') AS FLOAT)) + / NULLIF(CAST(REPLACE(em.[DDV PREVISTO], ',', '.') AS FLOAT), 0), 0 + ) AS [Cobertura Projetada], + d.preco_Compra, + d.Dias_sem_Vendas, + pr.ATUAL_PROMO , + pr.PROX_PROMO + FROM estoque_mar em + LEFT JOIN ( + SELECT + d.loja_id AS PDV, + d.code AS SKU, + d.description AS Descricao, + d.pricesellin AS preco_Compra, + d.dayswithoutsales as Dias_sem_Vendas + FROM draft d) d ON em.PDV = d.PDV + AND (CASE WHEN em.SKU_PARA IS NULL THEN em.SKU ELSE em.SKU_PARA END) = CAST( d.SKU AS INT) + LEFT JOIN ( + SELECT + p.loja_id AS PDV, + p.code AS SKU, + CASE + WHEN STRING_AGG(p.currentCycle_description, ', ') IS NULL OR LTRIM(RTRIM( STRING_AGG(p.currentCycle_description, ', '))) = '' + THEN 'Regular' + ELSE 'Promocao' + END AS ATUAL_PROMO, + CASE + WHEN STRING_AGG(p.nextCycle_description, ', ') IS NULL OR LTRIM(RTRIM(STRING_AGG(p.nextCycle_description, ', '))) = '' + THEN 'Regular' + ELSE 'Promocao' + END AS PROX_PROMO + FROM promo p + WHERE P.created_at >= CAST(GETDATE() AS DATE) + AND P.created_at < DATEADD(DAY, 1, CAST(GETDATE() AS DATE)) + GROUP BY + p.loja_id, + p.code + ) pr ON em.PDV = pr.PDV + AND (CASE WHEN em.SKU_PARA IS NULL THEN em.SKU ELSE em.SKU_PARA END) = CAST(pr.SKU AS INT) + WHERE em.CATEGORIA NOT IN ('SUPORTE À VENDA', 'EMBALAGENS') +) +SELECT + bpm.DESCRICAO AS DESCRICAO_PDV, + bpm.UF, + bpm.ANALISTA, + cte.* +FROM CTE_Estoque cte +LEFT JOIN base_pdvs_marca bpm + ON cte.PDV_Origem = bpm.PDV_MARCA -- agora join pelo unificado +WHERE [Cobertura Atual] > 60; +''' +df = pd.read_sql(query, conn) + +df.to_excel(excel_path,index=False) +conn.close() +print(df.columns) +remetente = config['credenciais']['remetente'] +senha = config['credenciais']['senha'] +destinatarios = [email.strip() for email in config['email_cobertura']['destinatarios'].split(',')] +assunto = config['email_cobertura']['assunto'] + +print(remetente,senha,destinatarios,assunto) + + +# Obtém a hora atual +agora = datetime.now().time() +hoje = datetime.today().strftime("%d/%m/%Y") +# Define os intervalos de tempo +manhã_inicio = time(5, 0) +manhã_fim = time(12, 0) +tarde_inicio = time(12, 1) +tarde_fim = time(18, 0) +# noite é dividida em dois intervalos por causa da virada do dia +noite_inicio = time(18, 1) +noite_fim = time(4, 59) +# Verifica em qual intervalo a hora atual está +if manhã_inicio <= agora <= manhã_fim: + boa = "Bom dia!" +elif tarde_inicio <= agora <= tarde_fim: + boa = "Boa tarde!" +else: + boa = "Boa noite!" + + +# 3. Criar e-mail com imagem embutida + +msg = EmailMessage() +msg['From'] = remetente +msg['To'] = ', '.join(destinatarios) +msg['Subject'] = assunto + +# 4. Conteúdo do e-mail +html_email = f""" + + +

    {boa}

    + +

    + Segue o relatório semanal de Cobertura referente às regiões de + Alagoas (AL), Bahia (BA), Sergipe (SE), Conquista (VDC), Bahia3(BA3). +

    + +

    + Este relatório contempla exclusivamente os itens com cobertura superior à 60 dias. +

    + +

    + O objetivo é trazer visibilidade para os produtos parados e reforçar a importância + de ações para estimular a sua saída, contribuindo assim para a redução da cobertura + de estoque e otimização dos recursos. +

    + +

    + Contamos com o apoio de todos para análise e tratativa dos itens listados. + Sugestões de ações como campanhas, transferências ou ajustes de sortimento são + bem-vindas para acelerar a movimentação dos produtos. +

    + +

    + Importante destacar que este relatório ainda não contempla as transferências realizadas internamente, uma vez que estamos trabalhando para viabilizar a inclusão dessas informações no banco de dados. +

    + +

    + Para mais informações, favor consultar a planilha em anexo. +

    + + + +""" + + +msg.set_content("Seu e-mail precisa de um visualizador HTML.") +msg.add_alternative(html_email, subtype='html') + + + +# 5. Anexar o arquivo Excel +with open(excel_path, 'rb') as f: + msg.add_attachment( + f.read(), + maintype='application', + subtype='vnd.openxmlformats-officedocument.spreadsheetml.sheet', + filename=excel_path.name + ) + +# 6. Enviar o e-mail via SMTP Outlook com configurações fornecidas +with smtplib.SMTP('smtp-mail.outlook.com', 587) as smtp: + smtp.ehlo() + smtp.starttls(context=ssl.create_default_context()) + smtp.login(remetente, senha) + smtp.send_message(msg) + + + +print("E-mail enviado com sucesso.") diff --git a/relatório_improdutivo/PDV_ATT.xlsx b/relatório_improdutivo/PDV_ATT.xlsx new file mode 100644 index 0000000..f3ff8be Binary files /dev/null and b/relatório_improdutivo/PDV_ATT.xlsx differ diff --git a/relatório_improdutivo/acompanhamento40DSV.xlsx b/relatório_improdutivo/acompanhamento40DSV.xlsx new file mode 100644 index 0000000..776012a Binary files /dev/null and b/relatório_improdutivo/acompanhamento40DSV.xlsx differ diff --git a/relatório_improdutivo/credenciais.ini b/relatório_improdutivo/credenciais.ini new file mode 100644 index 0000000..810e107 --- /dev/null +++ b/relatório_improdutivo/credenciais.ini @@ -0,0 +1,18 @@ +[credenciais] +remetente=joao.herculano@grupoginseng.com.br +senha=Cecigaming@21 + +[email] +assunto = ACOMPANHAMENTO IMPRODUTIVOS +destinatarios=lucas.Barbosa@grupoginseng.com.br,Andressa.Rocha@grupoginseng.com.br,Lais.Santos@grupoginseng.com.br,Daniel.Rodrigues@grupoginseng.com.br,Darlin.Cunha@grupoginseng.com.br,Dielly.Gomes@grupoginseng.com.br,Haryadne.Gomes@grupoginseng.com.br,Lucas.Bento@grupoginseng.com.br,Marcyara.Batista@grupoginseng.com.br,Pedro.Horgos@grupoginseng.com.br,Thayllan.Santos@grupoginseng.com.br,Jefferson.Ferreira@grupoginseng.com.br,Luan.Omena@grupoginseng.com.br,vinicius.souza@grupoginseng.com.br + +[email_ruptura] +assunto = ACOMPANHAMENTO DE RUPTURA PROJETADA +destinatarios=Lucas.Barbosa@grupoginseng.com.br,Andressa.Rocha@grupoginseng.com.br,Lais.Santos@grupoginseng.com.br,Daniel.Rodrigues@grupoginseng.com.br,Darlin.Cunha@grupoginseng.com.br,Dielly.Gomes@grupoginseng.com.br,Haryadne.Gomes@grupoginseng.com.br,Lucas.Bento@grupoginseng.com.br,Marcyara.Batista@grupoginseng.com.br,Pedro.Horgos@grupoginseng.com.br,Thayllan.Santos@grupoginseng.com.br,Jefferson.Ferreira@grupoginseng.com.br,Luan.Omena@grupoginseng.com.br,vinicius.souza@grupoginseng.com.br + + +[banco] +host = 10.77.77.10 +user = hubsupply +password = =c6#94sE&(v2 + diff --git a/relatório_improdutivo/relatório_improdutivo.py b/relatório_improdutivo/relatório_improdutivo.py index 63f06fe..01270e5 100644 --- a/relatório_improdutivo/relatório_improdutivo.py +++ b/relatório_improdutivo/relatório_improdutivo.py @@ -6,6 +6,7 @@ import pyodbc import configparser import pandas as pd import matplotlib.pyplot as plt +import matplotlib.dates as mdates import matplotlib.ticker as mtick import seaborn as sns from email.message import EmailMessage @@ -16,7 +17,7 @@ from datetime import datetime, time config = configparser.ConfigParser() -config.read(r"C:\Users\joao.herculano\Documents\Enviador de email\credenciais.ini") +config.read(r"relatório_improdutivo\credenciais.ini") print(config['banco']['host'],config['banco']['user'],config['banco']['password']) @@ -57,7 +58,9 @@ assunto = config['email']['assunto'] print(remetente,senha,destinatarios,assunto) -pdvs = pd.read_excel(r"C:\Users\joao.herculano\Documents\PDV_ATT.xlsx") +pdvs = pd.read_excel(r"relatório_improdutivo\PDV_ATT.xlsx") + + df['loja_id'] = df['loja_id'].astype('Int64') pdvs['PDV'] = pdvs['PDV'].astype('Int64') @@ -108,22 +111,45 @@ excel_path = Path("relatorio.xlsx") df2.to_excel(excel_path, index=False) -# 2. Criar e salvar gráfico +# Gerar gráfico melhorado - Estoque parado por UF plot_df = df2.groupby('UF')['valor_estoque_parado'].sum().reset_index() -plt.figure(figsize=(6, 4)) -ax = sns.barplot(data=plot_df, x='UF', y='valor_estoque_parado', errorbar=None) + +sns.set_theme(style="whitegrid") + +plt.figure(figsize=(12, 7)) +ax = sns.barplot( + data=plot_df, + x='UF', + y='valor_estoque_parado', + palette='crest', + errorbar=None +) + ax.yaxis.set_major_formatter(mtick.StrMethodFormatter('R${x:,.2f}')) + +# Anotar valores em cima das barras for p in ax.patches: valor = p.get_height() - ax.annotate(f'R$ {valor:,.2f}', (p.get_x() + p.get_width() / 2, valor), - ha='center', va='bottom', fontsize=9) -plt.title("Estoque parado por UF") -plt.ylabel("Valor em Reais") -plt.xlabel("UF") + ax.annotate( + f'R$ {valor:,.2f}', + (p.get_x() + p.get_width() / 2, valor), + ha='center', va='bottom', + fontsize=10, + fontweight='bold' + ) + +plt.title("Estoque Parado por UF", fontsize=18, fontweight='bold') +plt.ylabel("Valor em Reais", fontsize=13) +plt.xlabel("UF", fontsize=13) +plt.xticks(fontsize=11) +plt.yticks(fontsize=11) + +sns.despine() plt.tight_layout() plt.savefig("grafico.png") plt.close() + # Obtém a hora atual agora = datetime.now().time() hoje = datetime.today().strftime("%d/%m/%Y") @@ -147,7 +173,7 @@ df2['DATA'] = hoje df3 = df2.groupby('DATA', as_index=False)['valor_estoque_parado'].sum() -path2 = r'C:\Users\joao.herculano\OneDrive - GRUPO GINSENG\Documentos\acompanhamentos\40D sem Venda\acompanhamento40DSV.xlsx' +path2 = r'relatório_improdutivo\acompanhamento40DSV.xlsx' # Tenta abrir e escrever com append with pd.ExcelWriter(path2, mode='a', engine='openpyxl', if_sheet_exists='overlay') as writer: @@ -159,8 +185,47 @@ with pd.ExcelWriter(path2, mode='a', engine='openpyxl', if_sheet_exists='overlay # Escreve sem cabeçalho se não for a primeira linha df3.to_excel(writer, index=False, header=not start_row > 1, startrow=start_row) +de_effi = pd.read_excel(r'relatório_improdutivo\acompanhamento40DSV.xlsx') + +de_effi['Data'] = pd.to_datetime(de_effi['Data'], errors='coerce') + +# Step 2: Group and sort +grouped = ( + de_effi.groupby('Data')['Valor'] + .sum() + .sort_index() +) + +# Step 3: Plot +plt.figure(figsize=(12, 6)) +plt.plot(grouped.index, grouped.values, marker='o', linestyle='-', color='cornflowerblue', linewidth=2) + +# Step 4: Format numbers with dot ('.') separator, no decimals +for x, y in zip(grouped.index, grouped.values): + label = f"{y:,.0f}".replace(",", ".") # format like 75.063 + plt.text(x, y + max(grouped.values) * 0.015, label, ha='center', fontsize=9) + +# Step 5: Format chart +plt.title('Evolução de Estoque Improdutivo por Data', fontsize=14) +plt.xlabel('Data', fontsize=8) +plt.ylabel('Estoque Improdutivo', fontsize=12) +plt.grid(True, linestyle='--', alpha=0.6) + +# ✅ Set xticks to match the actual data points +ax = plt.gca() +ax.set_xticks(grouped.index) +ax.xaxis.set_major_formatter(mdates.DateFormatter('%d/%m/%Y')) +plt.xticks(rotation=45) + +# Format x-axis as dd/mm/yyyy +plt.gca().set_xticklabels([d.strftime('%d/%m/%Y') for d in grouped.index]) +plt.tight_layout() +plt.savefig("grafico2.png") +plt.close() + # 3. Criar e-mail com imagem embutida grafico_cid = make_msgid()[1:-1] # remove < > +grafico2_cid = make_msgid()[1:-1] msg = EmailMessage() msg['From'] = remetente msg['To'] = ', '.join(destinatarios) @@ -175,7 +240,7 @@ html_email = f"""

    Segue o relatório semanal de estoque improdutivo referente às regiões de - Alagoas (AL), Bahia (BA), Sergipe (SE), Vitória da Conquista (VDC) e Iracê. + Alagoas (AL), Bahia (BA), Sergipe (SE), Vitória da Conquista (VDC), Jacobina e Iracê.

    @@ -200,7 +265,8 @@ html_email = f"""

    Segue resumo:

    - +

    +

    """ @@ -213,6 +279,9 @@ msg.add_alternative(html_email, subtype='html') with open("grafico.png", 'rb') as img: msg.get_payload()[1].add_related(img.read(), 'image', 'png', cid=grafico_cid) +with open("grafico2.png", 'rb') as img2: + msg.get_payload()[1].add_related(img2.read(), 'image', 'png', cid=grafico2_cid) + # 5. Anexar o arquivo Excel with open(excel_path, 'rb') as f: