{ "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/cRPXp03W769OnyySef6Jd0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", "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 }