{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "849b6b4d", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "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", ")" ] }, { "cell_type": "code", "execution_count": 2, "id": "62fc9678", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\joao.herculano\\AppData\\Local\\Temp\\ipykernel_16792\\1235837546.py:16: 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_vendas = pd.read_sql(query, conn)\n" ] } ], "source": [ "query = '''\n", "select\n", "\tbvb.[DATA],\n", "\tbvb.pdv,\n", "\tbvb.SKU ,\n", "\tcast(replace(bvb.VENDAS,'.','') as int) as Vendas,\n", "\tem.ORIGEM\n", "from base_vendas_bi bvb \n", "left join (\n", "select *\n", "from\n", "estoque_mar\n", "where origem is not null) em on cast(em.SKU as int) = cast(replace(bvb.SKU,'.','') as int) and cast( em.pdv as int) = cast(bvb.PDV as int)\n", "WHERE EM.CATEGORIA not in ('SUPORTE À VENDA','EMBALAGENS') AND bvb.[DATA] >'2025-04-14'\n", "'''\n", "df_vendas = pd.read_sql(query, conn)\n", "conn.close()" ] }, { "cell_type": "code", "execution_count": 3, "id": "6c7089b1", "metadata": {}, "outputs": [], "source": [ "df_vendas['pdv'] = np.where(df_vendas['pdv'] == '23703','23708',df_vendas['pdv'])" ] }, { "cell_type": "code", "execution_count": 4, "id": "834f4c3f", "metadata": {}, "outputs": [], "source": [ "df_vendas['DATA'] = pd.to_datetime(df_vendas['DATA'])\n", "\n", "df_vendas['DATA_MES'] = pd.to_datetime(df_vendas['DATA'], dayfirst=True, errors='coerce').dt.to_period('M').astype(str)\n", "\n", "df_vendas['Vendas'] = df_vendas['Vendas'].astype('Int64')" ] }, { "cell_type": "code", "execution_count": 5, "id": "6f94c57e", "metadata": {}, "outputs": [], "source": [ "df_tabela = pd.read_excel(r\"C:\\Users\\joao.herculano\\Documents\\compilado_tab_pedido.xlsx\")\n", "\n", "df_tabela['extracao_desc'] = df_tabela['Descrição'].str.split(' ').str[0]" ] }, { "cell_type": "code", "execution_count": 6, "id": "532d718d", "metadata": {}, "outputs": [], "source": [ "df_tabela['LINHA'] = np.where(df_tabela['MARCA'] == 'EUDORA',df_tabela['extracao_desc'],df_tabela['LINHA'])" ] }, { "cell_type": "code", "execution_count": 7, "id": "d8116439", "metadata": {}, "outputs": [], "source": [ "df_tabela = df_tabela.groupby(['Nome da Origem','SKU1', 'SKU2','Descrição', 'MARCA','CATEGORIA', 'LINHA','Tipo Preço','extracao_desc'])[['PC','PV']].max().reset_index()" ] }, { "cell_type": "code", "execution_count": 8, "id": "117ee782", "metadata": {}, "outputs": [], "source": [ "df_vendas2 = pd.merge(df_vendas,df_tabela,left_on='SKU',right_on='SKU2',how='left')\n", "df_vendas2 = df_vendas2.drop_duplicates()" ] }, { "cell_type": "code", "execution_count": 9, "id": "374e679c", "metadata": {}, "outputs": [], "source": [ "df_vendas2['preço_venda'] = df_vendas2['Vendas']*df_vendas2['PV']" ] }, { "cell_type": "code", "execution_count": 10, "id": "caecc276", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1568926, 18)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_vendas2.shape" ] }, { "cell_type": "code", "execution_count": 11, "id": "619bc34d", "metadata": {}, "outputs": [], "source": [ "df_vendas2['PV'] = df_vendas2['PV'].astype('str').str.replace(',','')\n", "df_vendas2['PV'] = df_vendas2['PV'].astype('float')" ] }, { "cell_type": "code", "execution_count": 12, "id": "9e0ef539", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(306748811.9699977)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_vendas2['preço_venda'].sum()" ] }, { "cell_type": "code", "execution_count": 13, "id": "42c56b2f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.int64(16832)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_vendas2[(df_vendas2['SKU']==84387)& (df_vendas2['pdv']=='20998')]['Vendas'].sum()" ] }, { "cell_type": "code", "execution_count": 14, "id": "d1ce7af2", "metadata": {}, "outputs": [], "source": [ "# Agrupar vendas por PDV, Marca e SKU\n", "vendas_por_pdv_sku = df_vendas2.groupby(['pdv', 'MARCA', 'SKU'])['preço_venda'].sum().reset_index()\n", "\n", "# Ordenar por PDV, MARCA e vendas (maior para menor)\n", "vendas_por_pdv_sku = vendas_por_pdv_sku.sort_values(['pdv', 'MARCA', 'preço_venda'], ascending=[True, True, False])\n", "\n", "# Calcular percentual acumulado DENTRO de cada PDV e MARCA\n", "vendas_por_pdv_sku['percentual_acumulado'] = vendas_por_pdv_sku.groupby(['pdv', 'MARCA'])['preço_venda'].transform(\n", " lambda x: (x.cumsum() / x.sum()) * 100\n", ")\n", "\n", "# Criar coluna CLASSE\n", "vendas_por_pdv_sku['CLASSE'] = vendas_por_pdv_sku['percentual_acumulado'].apply(\n", " lambda x: 'A' if x <= 80 else ('B' if x <= 95 else 'C')\n", ")\n", "\n", "\n", "# Visualizar resultado\n", "vendas_por_pdv2 =vendas_por_pdv_sku.reset_index().sort_values(['pdv','percentual_acumulado'])" ] }, { "cell_type": "code", "execution_count": 15, "id": "de01395e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | index | \n", "PDV | \n", "MARCA | \n", "SKU | \n", "preço_venda | \n", "percentual_acumulado | \n", "CLASSE | \n", "
|---|---|---|---|---|---|---|---|
| 0 | \n", "972 | \n", "12522 | \n", "BOTICARIO | \n", "84387 | \n", "31384.3 | \n", "2.360871 | \n", "A | \n", "
| 1 | \n", "787 | \n", "12522 | \n", "BOTICARIO | \n", "75792 | \n", "23384.4 | \n", "4.119953 | \n", "A | \n", "
| 2 | \n", "747 | \n", "12522 | \n", "BOTICARIO | \n", "74043 | \n", "22028.4 | \n", "5.77703 | \n", "A | \n", "
| 3 | \n", "315 | \n", "12522 | \n", "BOTICARIO | \n", "50677 | \n", "20946.9 | \n", "7.352751 | \n", "A | \n", "
| 4 | \n", "816 | \n", "12522 | \n", "BOTICARIO | \n", "77524 | \n", "19423.3 | \n", "8.813861 | \n", "A | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 107809 | \n", "107809 | \n", "5699 | \n", "BOTICARIO | \n", "87421 | \n", "0.0 | \n", "100.0 | \n", "C | \n", "
| 107810 | \n", "107810 | \n", "5699 | \n", "BOTICARIO | \n", "87422 | \n", "0.0 | \n", "100.0 | \n", "C | \n", "
| 107811 | \n", "107811 | \n", "5699 | \n", "BOTICARIO | \n", "87423 | \n", "0.0 | \n", "100.0 | \n", "C | \n", "
| 107812 | \n", "107812 | \n", "5699 | \n", "BOTICARIO | \n", "87424 | \n", "0.0 | \n", "100.0 | \n", "C | \n", "
| 107813 | \n", "107813 | \n", "5699 | \n", "EUDORA | \n", "53095 | \n", "0.0 | \n", "NaN | \n", "C | \n", "
107814 rows × 7 columns
\n", "| \n", " | index | \n", "PDV | \n", "MARCA | \n", "SKU | \n", "preço_venda | \n", "percentual_acumulado | \n", "CLASSE | \n", "CLASSE_MAR | \n", "
|---|---|---|---|---|---|---|---|---|
| 0 | \n", "972 | \n", "12522 | \n", "BOTICARIO | \n", "84387 | \n", "31384.3 | \n", "2.360871 | \n", "A | \n", "A | \n", "
| 1 | \n", "787 | \n", "12522 | \n", "BOTICARIO | \n", "75792 | \n", "23384.4 | \n", "4.119953 | \n", "A | \n", "E | \n", "
| 2 | \n", "747 | \n", "12522 | \n", "BOTICARIO | \n", "74043 | \n", "22028.4 | \n", "5.77703 | \n", "A | \n", "A | \n", "
| 3 | \n", "315 | \n", "12522 | \n", "BOTICARIO | \n", "50677 | \n", "20946.9 | \n", "7.352751 | \n", "A | \n", "A | \n", "
| 4 | \n", "816 | \n", "12522 | \n", "BOTICARIO | \n", "77524 | \n", "19423.3 | \n", "8.813861 | \n", "A | \n", "A | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 107809 | \n", "107809 | \n", "5699 | \n", "BOTICARIO | \n", "87421 | \n", "0.0 | \n", "100.0 | \n", "C | \n", "E | \n", "
| 107810 | \n", "107810 | \n", "5699 | \n", "BOTICARIO | \n", "87422 | \n", "0.0 | \n", "100.0 | \n", "C | \n", "E | \n", "
| 107811 | \n", "107811 | \n", "5699 | \n", "BOTICARIO | \n", "87423 | \n", "0.0 | \n", "100.0 | \n", "C | \n", "E | \n", "
| 107812 | \n", "107812 | \n", "5699 | \n", "BOTICARIO | \n", "87424 | \n", "0.0 | \n", "100.0 | \n", "C | \n", "E | \n", "
| 107813 | \n", "107813 | \n", "5699 | \n", "EUDORA | \n", "53095 | \n", "0.0 | \n", "NaN | \n", "C | \n", "E | \n", "
107814 rows × 8 columns
\n", "