1370 lines
91 KiB
Plaintext
1370 lines
91 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"id": "d697ff2c",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"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",
|
||
"folder_path = r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\CRITICOS INDUSTRIA\\AcerteSeuPedido\"\n",
|
||
"\n",
|
||
"file_paths = glob.glob(os.path.join(folder_path, \"*.xls\")) + glob.glob(os.path.join(folder_path, \"*.xlsx\"))\n",
|
||
"\n",
|
||
"dfs = []\n",
|
||
"\n",
|
||
"for file_path in file_paths:\n",
|
||
" try:\n",
|
||
" excel_file = pd.ExcelFile(file_path)\n",
|
||
" # Procura aba que comece com 'BOT_Itens_Críticos'\n",
|
||
" for i in excel_file.sheet_names:\n",
|
||
" if i.startswith('BOT_Itens Críticos'):\n",
|
||
" target_sheet = i\n",
|
||
" \n",
|
||
" if target_sheet:\n",
|
||
" df = pd.read_excel(excel_file, sheet_name=target_sheet, skiprows=5, usecols=lambda col: col != 'A')\n",
|
||
" df[\"source_file\"] = os.path.basename(file_path)\n",
|
||
" dfs.append(df)\n",
|
||
" else:\n",
|
||
" print(f\"[AVISO] Nenhuma aba correspondente encontrada em: {file_path}\")\n",
|
||
" \n",
|
||
" except Exception as e:\n",
|
||
" print(f\"[ERRO] Falha ao ler {file_path}: {e}\")\n",
|
||
"\n",
|
||
"if dfs:\n",
|
||
" combined_df = pd.concat(dfs, ignore_index=True)\n",
|
||
" combined_df\n",
|
||
"else:\n",
|
||
" print(\"Nenhum dado foi carregado.\")\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "bad3ffb6",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(131702, 21)"
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"combined_df.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"id": "f7a54c0d",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#combined_df.to_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\CRITICOS INDUSTRIA\\compiladoAcertePedido.xlsx\",index=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"id": "eecd60ee",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\CRITICOS INDUSTRIA\\compiladoAcertePedido.xlsx\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"id": "5a671aca",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Unnamed: 0', 'CENTRO DE DISTRIBUIÇÃO', 'MATERIAL', 'DESCRIÇÃO',\n",
|
||
" 'CATEGORIA', 'DATA PREVISTA\\nREGULARIZAÇÃO',\n",
|
||
" 'Carteira Bloqueada Para Novos Pedidos?',\n",
|
||
" 'Incluir pedido?\\n(Orientação industria)', 'source_file', 'SEMANA',\n",
|
||
" 'CURVA', 'MATERIAL SUBSTITUTO', 'DESCRIÇÃO SUBSTITUTO',\n",
|
||
" 'Previsão de Atendimento\\n', 'Data de regularização ', 'Unnamed: 8',\n",
|
||
" 'Unnamed: 9', 'Unnamed: 10', 'GRID', 'Unnamed: 12',\n",
|
||
" 'Previsão de Atendimento', 'Coluna1', 'Coluna2'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"id": "7bd2075c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Unnamed: 0</th>\n",
|
||
" <th>CENTRO DE DISTRIBUIÇÃO</th>\n",
|
||
" <th>MATERIAL</th>\n",
|
||
" <th>DESCRIÇÃO</th>\n",
|
||
" <th>CATEGORIA</th>\n",
|
||
" <th>DATA PREVISTA\\nREGULARIZAÇÃO</th>\n",
|
||
" <th>Carteira Bloqueada Para Novos Pedidos?</th>\n",
|
||
" <th>Incluir pedido?\\n(Orientação industria)</th>\n",
|
||
" <th>source_file</th>\n",
|
||
" <th>SEMANA</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>Previsão de Atendimento\\n</th>\n",
|
||
" <th>Data de regularização</th>\n",
|
||
" <th>Unnamed: 8</th>\n",
|
||
" <th>Unnamed: 9</th>\n",
|
||
" <th>Unnamed: 10</th>\n",
|
||
" <th>GRID</th>\n",
|
||
" <th>Unnamed: 12</th>\n",
|
||
" <th>Previsão de Atendimento</th>\n",
|
||
" <th>Coluna1</th>\n",
|
||
" <th>Coluna2</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>CD BAHIA</td>\n",
|
||
" <td>53460.0</td>\n",
|
||
" <td>DR BOTICA COL POC/AMIZ V2 120ml</td>\n",
|
||
" <td>PERFUMARIA</td>\n",
|
||
" <td>ACIMA DE 60</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Acerte-seu-pedido-Boticario-S01-1735856932687....</td>\n",
|
||
" <td>S01</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>CD BAHIA</td>\n",
|
||
" <td>59176.0</td>\n",
|
||
" <td>BOTIK GEL CONC LIMP FAC AC/GLIC V2 150g</td>\n",
|
||
" <td>LIMPEZA</td>\n",
|
||
" <td>ACIMA DE 60</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Acerte-seu-pedido-Boticario-S01-1735856932687....</td>\n",
|
||
" <td>S01</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>CD BAHIA</td>\n",
|
||
" <td>50931.0</td>\n",
|
||
" <td>ESTJ NSPA 3 AMEIXAS REG/22</td>\n",
|
||
" <td>ESTOJO REGULAR</td>\n",
|
||
" <td>ACIMA DE 60</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Acerte-seu-pedido-Boticario-S01-1735856932687....</td>\n",
|
||
" <td>S01</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>CD BAHIA</td>\n",
|
||
" <td>48620.0</td>\n",
|
||
" <td>DEM FLORATTA EDP FLEUR D ECLIPSE 4ml</td>\n",
|
||
" <td>DEMONSTRADOR</td>\n",
|
||
" <td>ACIMA DE 60</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Acerte-seu-pedido-Boticario-S01-1735856932687....</td>\n",
|
||
" <td>S01</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>CD BAHIA</td>\n",
|
||
" <td>75478.0</td>\n",
|
||
" <td>DEM LILY EDP LOVE 4ml</td>\n",
|
||
" <td>DEMONSTRADOR</td>\n",
|
||
" <td>ACIMA DE 60</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Não</td>\n",
|
||
" <td>Acerte-seu-pedido-Boticario-S01-1735856932687....</td>\n",
|
||
" <td>S01</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>5 rows × 23 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Unnamed: 0 CENTRO DE DISTRIBUIÇÃO MATERIAL \\\n",
|
||
"0 NaN CD BAHIA 53460.0 \n",
|
||
"1 NaN CD BAHIA 59176.0 \n",
|
||
"2 NaN CD BAHIA 50931.0 \n",
|
||
"3 NaN CD BAHIA 48620.0 \n",
|
||
"4 NaN CD BAHIA 75478.0 \n",
|
||
"\n",
|
||
" DESCRIÇÃO CATEGORIA \\\n",
|
||
"0 DR BOTICA COL POC/AMIZ V2 120ml PERFUMARIA \n",
|
||
"1 BOTIK GEL CONC LIMP FAC AC/GLIC V2 150g LIMPEZA \n",
|
||
"2 ESTJ NSPA 3 AMEIXAS REG/22 ESTOJO REGULAR \n",
|
||
"3 DEM FLORATTA EDP FLEUR D ECLIPSE 4ml DEMONSTRADOR \n",
|
||
"4 DEM LILY EDP LOVE 4ml DEMONSTRADOR \n",
|
||
"\n",
|
||
" DATA PREVISTA\\nREGULARIZAÇÃO Carteira Bloqueada Para Novos Pedidos? \\\n",
|
||
"0 ACIMA DE 60 Não \n",
|
||
"1 ACIMA DE 60 Não \n",
|
||
"2 ACIMA DE 60 Não \n",
|
||
"3 ACIMA DE 60 Não \n",
|
||
"4 ACIMA DE 60 Não \n",
|
||
"\n",
|
||
" Incluir pedido?\\n(Orientação industria) \\\n",
|
||
"0 Não \n",
|
||
"1 Não \n",
|
||
"2 Não \n",
|
||
"3 Não \n",
|
||
"4 Não \n",
|
||
"\n",
|
||
" source_file SEMANA ... \\\n",
|
||
"0 Acerte-seu-pedido-Boticario-S01-1735856932687.... S01 ... \n",
|
||
"1 Acerte-seu-pedido-Boticario-S01-1735856932687.... S01 ... \n",
|
||
"2 Acerte-seu-pedido-Boticario-S01-1735856932687.... S01 ... \n",
|
||
"3 Acerte-seu-pedido-Boticario-S01-1735856932687.... S01 ... \n",
|
||
"4 Acerte-seu-pedido-Boticario-S01-1735856932687.... S01 ... \n",
|
||
"\n",
|
||
" Previsão de Atendimento\\n Data de regularização Unnamed: 8 Unnamed: 9 \\\n",
|
||
"0 NaN NaN NaN NaN \n",
|
||
"1 NaN NaN NaN NaN \n",
|
||
"2 NaN NaN NaN NaN \n",
|
||
"3 NaN NaN NaN NaN \n",
|
||
"4 NaN NaN NaN NaN \n",
|
||
"\n",
|
||
" Unnamed: 10 GRID Unnamed: 12 Previsão de Atendimento Coluna1 Coluna2 \n",
|
||
"0 NaN NaN NaN NaN NaN NaN \n",
|
||
"1 NaN NaN NaN NaN NaN NaN \n",
|
||
"2 NaN NaN NaN NaN NaN NaN \n",
|
||
"3 NaN NaN NaN NaN NaN NaN \n",
|
||
"4 NaN NaN NaN NaN NaN NaN \n",
|
||
"\n",
|
||
"[5 rows x 23 columns]"
|
||
]
|
||
},
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"id": "ca8dedc2",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Carrega o arquivo\n",
|
||
"\n",
|
||
"df = df[['MATERIAL','SEMANA','CURVA']]\n",
|
||
"df['semana_num'] = df['SEMANA'].str.extract(r'S(\\d+)').astype(int)\n",
|
||
"\n",
|
||
"# Supondo df com colunas: MATERIAL e semana ('S01', 'S02', ...)\n",
|
||
"df['semana_num'] = df['SEMANA'].str.extract(r'S(\\d+)').astype(int)\n",
|
||
"\n",
|
||
"# Ordenar os dados\n",
|
||
"df = df.sort_values(['MATERIAL', 'semana_num'])\n",
|
||
"\n",
|
||
"# Identificar rupturas de sequência para cada MATERIAL\n",
|
||
"df['grupo'] = df.groupby('MATERIAL')['semana_num'].diff().ne(1).cumsum()\n",
|
||
"\n",
|
||
"# Para cada MATERIAL + grupo, contar duração do período crítico\n",
|
||
"grupos = df.groupby(['MATERIAL', 'CURVA', 'grupo']).size().reset_index(name='duracao')\n",
|
||
"\n",
|
||
"# Agora calcular métricas por SKU\n",
|
||
"resultado = grupos.groupby('MATERIAL')['duracao'].agg(media_duracao='mean', max_duracao='max').reset_index()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"id": "4b24bad4",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"resultado = grupos.groupby('MATERIAL')['duracao'].agg(media_duracao='mean', max_duracao='max',cont='count').reset_index()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"id": "ed6d7fd7",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>MATERIAL</th>\n",
|
||
" <th>media_duracao</th>\n",
|
||
" <th>max_duracao</th>\n",
|
||
" <th>cont</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>1.456522</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>46</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1005.0</td>\n",
|
||
" <td>2.000000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1006.0</td>\n",
|
||
" <td>1.250000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>16</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1078.0</td>\n",
|
||
" <td>1.428571</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>14</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1080.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3546</th>\n",
|
||
" <td>88585.0</td>\n",
|
||
" <td>1.545455</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3547</th>\n",
|
||
" <td>88646.0</td>\n",
|
||
" <td>1.200000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3548</th>\n",
|
||
" <td>88893.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3549</th>\n",
|
||
" <td>88997.0</td>\n",
|
||
" <td>1.166667</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3550</th>\n",
|
||
" <td>89256.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>4</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>3551 rows × 4 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" MATERIAL media_duracao max_duracao cont\n",
|
||
"0 1004.0 1.456522 8 46\n",
|
||
"1 1005.0 2.000000 2 1\n",
|
||
"2 1006.0 1.250000 2 16\n",
|
||
"3 1078.0 1.428571 3 14\n",
|
||
"4 1080.0 1.000000 1 5\n",
|
||
"... ... ... ... ...\n",
|
||
"3546 88585.0 1.545455 2 11\n",
|
||
"3547 88646.0 1.200000 2 10\n",
|
||
"3548 88893.0 1.000000 1 3\n",
|
||
"3549 88997.0 1.166667 2 6\n",
|
||
"3550 89256.0 1.000000 1 4\n",
|
||
"\n",
|
||
"[3551 rows x 4 columns]"
|
||
]
|
||
},
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"resultado"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"id": "b555fdc8",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>MATERIAL</th>\n",
|
||
" <th>CURVA</th>\n",
|
||
" <th>grupo</th>\n",
|
||
" <th>duracao</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>8</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>63352</th>\n",
|
||
" <td>88997.0</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>63353</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>63353</th>\n",
|
||
" <td>89256.0</td>\n",
|
||
" <td>C</td>\n",
|
||
" <td>63354</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>63354</th>\n",
|
||
" <td>89256.0</td>\n",
|
||
" <td>C</td>\n",
|
||
" <td>63355</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>63355</th>\n",
|
||
" <td>89256.0</td>\n",
|
||
" <td>C</td>\n",
|
||
" <td>63356</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>63356</th>\n",
|
||
" <td>89256.0</td>\n",
|
||
" <td>C</td>\n",
|
||
" <td>63357</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>63357 rows × 4 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" MATERIAL CURVA grupo duracao\n",
|
||
"0 1004.0 A 1 2\n",
|
||
"1 1004.0 A 2 8\n",
|
||
"2 1004.0 A 3 1\n",
|
||
"3 1004.0 A 4 1\n",
|
||
"4 1004.0 A 5 2\n",
|
||
"... ... ... ... ...\n",
|
||
"63352 88997.0 E 63353 1\n",
|
||
"63353 89256.0 C 63354 1\n",
|
||
"63354 89256.0 C 63355 1\n",
|
||
"63355 89256.0 C 63356 1\n",
|
||
"63356 89256.0 C 63357 1\n",
|
||
"\n",
|
||
"[63357 rows x 4 columns]"
|
||
]
|
||
},
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"grupos"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"id": "35f6424b",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"np.int64(17)"
|
||
]
|
||
},
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"resultado['max_duracao'].max()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"id": "5e491a0d",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Média geral de semanas em estado crítico: 1.40 ou 10 dias.\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"media_geral = grupos['duracao'].mean()\n",
|
||
"print(f\"Média geral de semanas em estado crítico: {media_geral:.2f} ou {round(media_geral*7)} dias.\")\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"id": "7ee00755",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"np.int64(17)"
|
||
]
|
||
},
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"grupos['duracao'].max()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"id": "c1795cb9",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#resultado.to_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\CRITICOS INDUSTRIA\\EstudoItensCriticos.xlsx\",index=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"id": "8899d109",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>CURVA</th>\n",
|
||
" <th>media_duracao_critico</th>\n",
|
||
" <th>media_entradas_critico</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>A</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>35.852535</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>B</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>29.591413</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>C</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>17.367594</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>E</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>11.119888</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" CURVA media_duracao_critico media_entradas_critico\n",
|
||
"0 A 10 35.852535\n",
|
||
"1 B 10 29.591413\n",
|
||
"2 C 10 17.367594\n",
|
||
"3 E 10 11.119888"
|
||
]
|
||
},
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Corrige o agrupamento incluindo CURVA\n",
|
||
"grupos = df.groupby(['MATERIAL', 'CURVA', 'grupo']).size().reset_index(name='duracao')\n",
|
||
"\n",
|
||
"# Duração média dos períodos críticos por CURVA\n",
|
||
"media_duracao_por_curva = grupos.groupby('CURVA')['duracao'].mean().reset_index(name='media_duracao_critico')\n",
|
||
"media_duracao_por_curva['media_duracao_critico'] = round(media_duracao_por_curva['media_duracao_critico']*7).astype('Int64') #transforma de semanas em dias\n",
|
||
"\n",
|
||
"# Quantas vezes cada SKU entrou em estado crítico\n",
|
||
"entradas_por_sku = grupos.groupby(['MATERIAL', 'CURVA']).size().reset_index(name='qtd_entradas')\n",
|
||
"\n",
|
||
"# Média de entradas por SKU da mesma CURVA\n",
|
||
"media_entradas_por_curva = entradas_por_sku.groupby('CURVA')['qtd_entradas'].mean().reset_index(name='media_entradas_critico')\n",
|
||
"\n",
|
||
"# Consolidar resultado\n",
|
||
"curva_analise = pd.merge(media_duracao_por_curva, media_entradas_por_curva, on='CURVA')\n",
|
||
"\n",
|
||
"# Exibir resultado\n",
|
||
"curva_analise\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"id": "e3bd820a",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>MATERIAL</th>\n",
|
||
" <th>CURVA</th>\n",
|
||
" <th>grupo</th>\n",
|
||
" <th>duracao</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>8</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>A</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>63352</th>\n",
|
||
" <td>88997.0</td>\n",
|
||
" <td>E</td>\n",
|
||
" <td>63353</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>63353</th>\n",
|
||
" <td>89256.0</td>\n",
|
||
" <td>C</td>\n",
|
||
" <td>63354</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>63354</th>\n",
|
||
" <td>89256.0</td>\n",
|
||
" <td>C</td>\n",
|
||
" <td>63355</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>63355</th>\n",
|
||
" <td>89256.0</td>\n",
|
||
" <td>C</td>\n",
|
||
" <td>63356</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>63356</th>\n",
|
||
" <td>89256.0</td>\n",
|
||
" <td>C</td>\n",
|
||
" <td>63357</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>63357 rows × 4 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" MATERIAL CURVA grupo duracao\n",
|
||
"0 1004.0 A 1 2\n",
|
||
"1 1004.0 A 2 8\n",
|
||
"2 1004.0 A 3 1\n",
|
||
"3 1004.0 A 4 1\n",
|
||
"4 1004.0 A 5 2\n",
|
||
"... ... ... ... ...\n",
|
||
"63352 88997.0 E 63353 1\n",
|
||
"63353 89256.0 C 63354 1\n",
|
||
"63354 89256.0 C 63355 1\n",
|
||
"63355 89256.0 C 63356 1\n",
|
||
"63356 89256.0 C 63357 1\n",
|
||
"\n",
|
||
"[63357 rows x 4 columns]"
|
||
]
|
||
},
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"grupos"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"id": "e83b92d0",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>MATERIAL</th>\n",
|
||
" <th>qtd_entradas</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1004.0</td>\n",
|
||
" <td>46</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1005.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1006.0</td>\n",
|
||
" <td>16</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1078.0</td>\n",
|
||
" <td>14</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1080.0</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3546</th>\n",
|
||
" <td>88585.0</td>\n",
|
||
" <td>11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3547</th>\n",
|
||
" <td>88646.0</td>\n",
|
||
" <td>10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3548</th>\n",
|
||
" <td>88893.0</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3549</th>\n",
|
||
" <td>88997.0</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3550</th>\n",
|
||
" <td>89256.0</td>\n",
|
||
" <td>4</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>3551 rows × 2 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" MATERIAL qtd_entradas\n",
|
||
"0 1004.0 46\n",
|
||
"1 1005.0 1\n",
|
||
"2 1006.0 16\n",
|
||
"3 1078.0 14\n",
|
||
"4 1080.0 5\n",
|
||
"... ... ...\n",
|
||
"3546 88585.0 11\n",
|
||
"3547 88646.0 10\n",
|
||
"3548 88893.0 3\n",
|
||
"3549 88997.0 6\n",
|
||
"3550 89256.0 4\n",
|
||
"\n",
|
||
"[3551 rows x 2 columns]"
|
||
]
|
||
},
|
||
"execution_count": 17,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"entradas_por_sku2 = grupos.groupby(['MATERIAL']).size().reset_index(name='qtd_entradas')\n",
|
||
"\n",
|
||
"entradas_por_sku2"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"id": "7086d840",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Média geral de semanas em estado crítico: 1.40 ou 10 dias.\n",
|
||
"\n",
|
||
"Arquivo Excel salvo com sucesso em:\n",
|
||
"C:/Users/joao.herculano/GRUPO GINSENG/Assistência Suprimentos - 2025/CRITICOS INDUSTRIA/analise_curva_resultado20250604.xlsx\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAGGCAYAAADmRxfNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAMu5JREFUeJzt3QmcVWX9P/CHRcEFcEdNVEyKFJfcSi2D0pSQwiyXXLHUFDHTMtHEcAn3yDQtN7QUcZef/bIUCzU1F9S0XCI1+eeWoqCoqHD/r+/zep353Rlmhotn4M7A+/16XZi5c5fnnnPuvc/n2U6nSqVSSQAAACV0LnNnAACAIFgAAAClCRYAAEBpggUAAFCaYAEAAJQmWAAAAKUJFgAAQGmCBQAAUJpgAXRYkyZNSmeccUb64IMP6l0UaFemTZuWfvKTn6Snn3663kUBliKCBZDef//9NHDgwLTyyiunM888M02fPj2ttNJKqT176KGH0l577ZU23HDDtMwyy9R0n06dOuXKVmH8+PH5uueff75NyxbbsH///mnevHmt3i6eN54/ylGI8sV1i8Lrr7+eVlhhhfS///u/i+Txl1ZNj6t6q1Qqafjw4enee+9N/fr1a/W266+/fjrwwAMXW9mAJZtgASUUFdPi0r1797T22munnXfeOZ133nnprbfeSh3BHXfckV5++eV03HHHpXHjxqX11lsvfec730nt1Ztvvpn22GOPdPrpp6fdd989tSezZs3KvSg/+tGPUufO7esjdtVVV8379cQTT0xLmwhT7anyvyhdcMEF6dlnn01XXXVVPgYjYMRrj/cN/+e9995LP/vZz9JnPvOZ1KtXr/z5/YlPfCIdccQR6Zlnnmm4XQSvFVdcscXHib9Vh7M///nPjb4XunTpktZYY430jW98Iz355JMNt9t0003Tuuuum4NgS7bffvvUu3fv9OGHHzZcF49RfN/Yp7Q37etbDzqok08+Of3mN79JF154YRo5cmS+7qijjkqbbLJJ+tvf/pbau89//vPprrvuypXhf//73+nFF19MZ599dmqvHn300fTjH/84HXnkkaUeZ7/99kvvvvtuDlJt5bLLLsuVgL333vsj3T9eV5RpUfnud7+bpk6dmu688860tAWLMWPGpCXdCy+8kIPjNddck1ZfffV8XQSLeO3NVUJjqNTFF1+cljavvfZa+tznPpeOPvroXOmPz/AIZMOGDctDLAcMGFD6OeLzKb4XLrnkkrTPPvuk3/3ud/mzNhpxQlwXvcN33313iz2a9913X9pzzz1T165dG67/7W9/m9Zcc8388/XXX1+6nNCW/u9IBT6ywYMHp6222qrh91GjRuWK26677pq++tWv5ham5ZZbrvTzRIU1htcsu+yyqS316NEjX0IMKyq+tNqrGLYVl7KiJTEubenyyy/P+zxaEz+KqEBUVyLa2qc+9alcaYreti9+8YuL7HlYvOJzIYY0Rgv4G2+8UfP9unXrlpbU3oj4nGyp1zB6GB555JFcMW/a63nKKaekE044oXQZIkREL0Xhk5/8ZDrssMPSlVdemY499tj0rW99K39XXH311WmHHXaY7/4TJkzIvRkRQArxe9w+7vvcc8/lXqn23LvM0kePBSwiUWmLlsPoAYgWpgVViuOLLsY7Nx1/Hz0HMTzp4x//eK4E/OMf/8gViNGjR6ctt9wyd+HHuPn4EvvTn/7UbIXj5z//ee49icputGLusssueY5C4dJLL83ljZa7eI6NNtoo974055e//GXaeOON8+1i2NeIESNq6o4v5g7EEIN99903lzvKEtsoviyj5e5rX/ta6tmzZw4255xzznyPMWfOnHTSSSfleRXx/H369Mlf0HF909t9//vfz48fgSkq+v/v//2/+R6vuTkWt9xySxoyZEh+bfEcsd2jojF37twFvsb4oo8eqh133HG+v8U2in0crzvmrxxwwAHNbrfm5lhEWKll/8Q+jWF4q622Wg6yffv2TQcddNB8t9tpp53S//zP/7Q6BKO63NH7Fts6nju2fQz1qp4/Un2sRqvvBhtskJZffvn05S9/Oe/XeJ7Yhuuss04uV+znGTNmpFo89dRTuXK2yiqr5OM3Any0KFeLyfvRIh/zCeI2MeQrWqNvv/32/PfY7lGuUD1EpRDl3m677fL9onzxvmquJbjW4ypEpTUaHOJ4jqEyX/rSl9L9999f02uu5T0b5Y8hO1GxLN6Pt912W8PfimFf8f8Pf/jD/HMcD8VrL4755uZYxD6P1xl/i8eN/bb//vvnVv7Cq6++mr797W/nYTpRxs022yxdccUVNb2+eNxodPnjH/+YNt9883z/OKZvvPHG+W4bQ7q++c1v5v0fx9RnP/vZ3PJfrRh6FL000eP3sY99LN82hiU2569//Wt+jCh/c0Mp4zUvih7b+IwO//rXv/L/8Z6KQBHHWnMLUESAiM+fGKpV+Mtf/pL3Xcwvi0v0NLd0DEI96LGARSiG2hx//PH5C/Tggw/+SI8RlcpofTvkkEPyF158wcYXZnSvx3CbeNyYyxHhICqVDzzwQP6yLsSXZ1Sgo5ITLVvR6xFd71HJKXpZIixExSAqStFaHpXOww8/PFdwIjgUopISFbioOEfLWwyjiArugw8+mL/waplEHd360Woe8yPiy/3UU0/Nr+lXv/pVrjxHpTUqSz/4wQ/S1ltv3dCSF2WJ8t1zzz15W8RjPP7443mMdISVm2++ueE54nVGmItWvagwRu9RhIVaxLaKimAMkYj/474R4mKbn3XWWa3eN4achC222KLR9VGxjsp0lD2GIkXZb7rpphwuahHbOCqPre2fqOhFRT4qoTFXJsJLVECaq6xFxTm229///vdWh3y888476Qtf+EL6z3/+kw499NDcGh6vMVpZX3rppRx4q8V+i9AbwwEjOMQk9pgLE/s1Kn8x1C5WK/rFL36R928MG2tNlC/GmEdFMV5TBOhrr702D1e54YYb0m677dZwXI4dOzbv92222Sbvq6iEx5CvCFFR9hjeF0EjhqY0FZX42LbRMhzljwpqVGZvvfXWRsdNrcdVlDsqkREqIvjG+yKO72hQmDJlSqOKYnNqec+GeP7YHhEwIkxWN0wUvv71r+f3R7R+xz6P24VimFRTb7/9di579LJGKI1jOQJFhLmowMb9Y6hevJbYl/HcEViuu+66HFAilHzve99LC/LPf/4zfxbE+yHeB/E5F9s8wlHss/DKK6/k7RzHYQwriuAX4SX2VVTGi/1fiPAavRRxbEUIbKlntwim8fm8OBVhLhbJKMQxF59nf/jDH3LYKsRn2xNPPJE/e5q+xyJsxGdjvHcjQMW+LcIj1F0F+Mguv/zyaPKtPPjggy3eplevXpVPf/rTDb9/4QtfyJemDjjggMp6663X8Ptzzz2XH7tnz56VV199tdFtP/zww8qcOXMaXffGG29UevfuXTnooIMarrvzzjvzYxx55JHzPd+8efMafp49e/Z8f995550rG2ywQcPvUYZll1228uUvf7kyd+7chuvPP//8/ByXXXZZpTUnnXRSvt0hhxzS6HWss846lU6dOlVOP/30Rq9lueWWy9uk8Jvf/KbSuXPnyt13393ocS+66KL8uH/5y1/y748++mj+/fDDD290u29961v5+ihH0/0X27rwzjvvzFf2Qw89tLL88stX3nvvvVZf449//OP8eG+99Vaj62+++eZ8/ZlnntnotX/+85/P10c5mm6nas2Vqen+uemmmxZ4LBbuvffefNuJEye2ertTTjmlssIKK1SeeeaZRtcfd9xxlS5dulReeOGFRsfq6quvXnnzzTcbbjdq1Kh8/WabbVb54IMPGq7fe++987G0oO35pS99qbLJJps0ul0ct9ttt12lX79+DdfF4w8ZMqTVxxoxYsR827Wl7fv+++9XBgwYUPniF7/YcN3CHFfDhg3Lr+9f//pXw3UvvvhipUePHpUddtih1XLW+p6N28T74e9///t8t2tanrPOOmu+47wQnznV77PRo0fn2954440tPv+4cePybX7729822mbbbrttZcUVV6zMmjWr1dcYzxn3v+GGGxqumzlzZmWttdZq9Fl51FFH5dtVv+fjvdW3b9/K+uuv3/A59Kc//SnfLt4Pzb1Xmtptt93y7eNzphaxfeJ90JL4W/U2LMoTn4n//e9/876/7bbbKhtuuGH+rHvggQcabjtjxoxKt27d8nui6XssHuPpp59utI1XXXXVygknnNDo+IvjH9oLQ6FgEYtW7zKrQ0VXfdPWxZgXULTGRat1tA5Hq2a0ZkYrbSFadWOIQAwfaqp6KEi0ehVmzpyZWyijpTqGIcTvxcpR0Zobw2Kqxy1Hj0m0zDYdntCS6vHA8TqizFEXilbaQrS2x3jkeP5CtIhGS38s4xrlKy7FPIFiGFixlGrTid1R7lpUz4WJ/RbPES240Woaw3IWtJxr9Cg0XUEmyhTXRy9P9WsvJvovTJla2j/F8sDRyr6g83oULabVQ1uaE9s8XnvcvnqbR49VDA2LYRjVosU5hnoVipb5GPpWPW8kro9jKXpCWhLHdLTIR49HsR/iEts4euaixbu4f7z26CWI6z6K6u0b8xNim8brrn4v1XpcxXaJHsroVYkhYYW11lor93REr1VLQ3QW5j0b4hiIIURtKZ4/ei+b9gZUP39sixiuWL1AQfTKxLaJHo/olVmQGGpY/RzxGRLDrWIIWTG5OZ4neqBiWFsh3lvRwh+t/zEstFr0fNQyl63Y/sW8skUlenziszteawxli+Mqesyi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t9xyy0JtA2hrneKfRRdbgPYklrqMScgLM+yKhROt2dGyHi3T1UvothexPGosExstzSZ6Ug/RwxE9e7EaF7BkMccCliIxNCPOqNvc5HHaRsxdiFWU4izdbb2iVlkxFyHGlcdQHaECgLZmjgUsBWIyYIxhLlrUq+dh0PaiVygu7U0sh2vfA7CoCBawFIhJzjGpL1YOiknW1UuhAgC0BXMsAACA0syxAAAAShMsAACA0gQLAACgtCV+8nYs9xhnrYwzgVpeEQAAahfTsd9666209tprL/CM90t8sIhQ0adPn3oXAwAAOqzp06enddZZZ+kOFtFTUWyMnj171rs4AADQYcyaNSs30hd16qU6WBTDnyJUCBYAALDwaplSYPI2AABQmmABAACUJlgAAAClCRYAAEBpggUAAFCaYAEAAJQmWAAAAB07WNx1111p6NCh+RThsTbuzTffPN8pxEePHp3WWmuttNxyy6Udd9wx/fOf/6xbeQEAgHYYLGbPnp0222yzdMEFFzT79zPPPDOdd9556aKLLkp//etf0worrJB23nnn9N577y32sgIAAO30zNuDBw/Ol+ZEb8W4cePSj3/84/S1r30tX3fllVem3r17556NvfbaazGXFgAA6HBzLJ577rn08ssv5+FPhV69eqXPfOYz6b777mvxfnPmzEmzZs1qdAEAAJbgHovWRKgI0UNRLX4v/tacsWPHpjFjxqT2Zv3jflfvItABPH/6kNReOGaphWOWjsYxS0fzfDs6Zjtsj8VHNWrUqDRz5syGy/Tp0+tdJAAAWOK122Cx5ppr5v9feeWVRtfH78XfmtOtW7fUs2fPRhcAAGApDRZ9+/bNAWLy5MkN18V8iVgdatttt61r2QAAgHY0x+Ltt99O06ZNazRh+9FHH02rrLJKWnfdddNRRx2VTj311NSvX78cNE488cR8zothw4bVs9gAAEB7ChYPPfRQGjRoUMPvRx99dP7/gAMOSOPHj0/HHntsPtfFIYcckt588830uc99Lt12222pe/fudSw1AADQroLFwIED8/kqWhJn4z755JPzBQAAaL/a7RwLAACg4xAsAACA0gQLAACgNMECAAAoTbAAAABKEywAAIDSBAsAAKA0wQIAAChNsAAAAEoTLAAAgNIECwAAoDTBAgAAKE2wAAAAShMsAACA0gQLAACgNMECAAAoTbAAAABKEywAAIDSBAsAAKA0wQIAAChNsAAAAEoTLAAAgNIECwAAoDTBAgAAKE2wAAAAShMsAACA0gQLAACgNMECAAAoTbAAAABKEywAAIDSBAsAAKA0wQIAAChNsAAAAEoTLAAAgNIECwAAoDTBAgAAKE2wAAAAShMsAACA0gQLAACgNMECAAAoTbAAAABKEywAAIDSBAsAAKA0wQIAAChNsAAAAEoTLAAAgNIECwAAYMkOFnPnzk0nnnhi6tu3b1puueXSxz/+8XTKKaekSqVS76IBAABVuqZ27IwzzkgXXnhhuuKKK9LGG2+cHnrooTR8+PDUq1evdOSRR9a7eAAAQEcIFvfee2/62te+loYMGZJ/X3/99dOECRPSAw88UO+iAQAAHWUo1HbbbZcmT56cnnnmmfz7Y489lu655540ePDgFu8zZ86cNGvWrEYXAABgKe6xOO6443Iw6N+/f+rSpUuec3HaaaelffbZp8X7jB07No0ZM2axlhMAAJZ27brH4tprr01XXXVVuvrqq9PUqVPzXIuzzz47/9+SUaNGpZkzZzZcpk+fvljLDAAAS6N23WPxwx/+MPda7LXXXvn3TTbZJP373//OvRIHHHBAs/fp1q1bvgAAAItPu+6xeOedd1Lnzo2LGEOi5s2bV7cyAQAAHazHYujQoXlOxbrrrpuXm33kkUfSueeemw466KB6Fw0AAOgoweIXv/hFPkHe4Ycfnl599dW09tprp0MPPTSNHj263kUDAAA6SrDo0aNHGjduXL4AAADtV7ueYwEAAHQMggUAAFCaYAEAAJQmWAAAAKUJFgAAQGmCBQAAUJpgAQAAlCZYAAAApQkWAABAaYIFAABQmmABAACUJlgAAAClCRYAAEBpggUAAFCaYAEAAJQmWAAAAKUJFgAAQGmCBQAAUJpgAQAAlCZYAAAApQkWAABAaYIFAABQmmABAACUJlgAAAClCRYAAEBpggUAAFCaYAEAAJQmWAAAAKUJFgAAQGmCBQAAUJpgAQAAlCZYAAAApQkWAABAaYIFAABQmmABAACUJlgAAAClCRYAAEBpggUAAFCaYAEAAJQmWAAAAKUJFgAAQGmCBQAAUJpgAQAAlCZYAAAApQkWAABAaYIFAABQmmABAAAs+cHiP//5T9p3333TqquumpZbbrm0ySabpIceeqjexQIAAKp0Te3YG2+8kbbffvs0aNCg9Pvf/z6tvvrq6Z///GdaeeWV6100AACgowSLM844I/Xp0yddfvnlDdf17du3rmUCAAA62FCoSZMmpa222ip985vfTGussUb69Kc/nS6++OJW7zNnzpw0a9asRhcAAGApDhbPPvtsuvDCC1O/fv3SH/7wh3TYYYelI488Ml1xxRUt3mfs2LGpV69eDZfo8QAAAJbiYDFv3ry0xRZbpJ/+9Ke5t+KQQw5JBx98cLroootavM+oUaPSzJkzGy7Tp09frGUGAIClUbsOFmuttVbaaKONGl33qU99Kr3wwgst3qdbt26pZ8+ejS4AAMBSHCxiRainn3660XXPPPNMWm+99epWJgAAoIMFi+9///vp/vvvz0Ohpk2blq6++ur061//Oo0YMaLeRQMAADpKsNh6663TTTfdlCZMmJAGDBiQTjnllDRu3Li0zz771LtoAABARzmPRdh1113zBQAAaL/adY8FAADQMQgWAABAaYIFAABQn2AxderU9Pjjjzf8fsstt6Rhw4al448/Pr3//vvlSwUAACz5weLQQw/N55MIzz77bNprr73S8ssvn6677rp07LHHtnUZAQCAJTFYRKjYfPPN888RJnbYYYd8jonx48enG264oa3LCAAALInBolKppHnz5uWf77jjjvSVr3wl/9ynT5/02muvtW0JAQCAJTNYbLXVVunUU09Nv/nNb9KUKVPSkCFD8vXPPfdc6t27d1uXEQAAWBKDRZz9OiZwH3HEEemEE05IG264Yb7++uuvT9ttt11blxEAAFgSz7y96aabNloVqnDWWWelLl26tEW5AACAJT1YtKR79+5t+XAAAMCSHCzmzp2bfvazn6Vrr702vfDCC/Odu2LGjBltVT4AAGBJnWMxZsyYdO6556Y999wzzZw5Mx199NHp61//eurcuXP6yU9+0valBAAAlrxgcdVVV6WLL744HXPMMalr165p7733TpdcckkaPXp0uv/++9u+lAAAwJIXLF5++eW0ySab5J9XXHHF3GsRdt111/S73/2ubUsIAAAsmcFinXXWSS+99FL++eMf/3j64x//mH9+8MEHU7du3dq2hAAAwJIZLHbbbbc0efLk/PPIkSPTiSeemPr165f233//dNBBB7V1GQEAgCVxVajTTz+94eeYwL3uuuum++67L4eLoUOHtmX5AACApeU8Fttuu22+AAAAS6eag8WkSZPS4MGD0zLLLJN/bs1Xv/rVtigbAACwpAWLYcOG5dWg1lhjjfxzSzp16pRPoAcAACw9ag4W8+bNa/ZnAACAhZ5jEaFi/Pjx6cYbb0zPP/987qHYYIMN0u67757222+//DsAALB0WajlZiuVSp4/8Z3vfCf95z//ySfJ23jjjXPAOPDAA/MytAAAwNJnoXosoqfirrvuyuewGDRoUKO/3XnnnXnuxZVXXpnPZwEAACw9FqrHYsKECen444+fL1SEL37xi+m4445LV111VVuWDwAAWNKCxd/+9re0yy67tPj3WI72sccea4tyAQAAS2qwmDFjRurdu3eLf4+/vfHGG21RLgAAYEkNFnF+iq5dW56W0aVLl/Thhx+2RbkAAIAldfJ2rAoVqz9169at2b/PmTOnrcoFAAAsqcHigAMOWOBtrAgFAABLn4UKFpdffvmiKwkAALB0zLEAAABojmABAACUJlgAAAClCRYAAEBpggUAAFCaYAEAAJQmWAAAAKUJFgAAQGmCBQAAUJpgAQAAlCZYAAAApQkWAABAaYIFAABQmmABAAAsXcHi9NNPT506dUpHHXVUvYsCAAB0xGDx4IMPpl/96ldp0003rXdRAACAjhgs3n777bTPPvukiy++OK288sr1Lg4AANARg8WIESPSkCFD0o477ljvogAAAM3omtq5a665Jk2dOjUPharFnDlz8qUwa9asRVg6AACg3fdYTJ8+PX3ve99LV111VerevXtN9xk7dmzq1atXw6VPnz6LvJwAALC0a9fB4uGHH06vvvpq2mKLLVLXrl3zZcqUKem8887LP8+dO3e++4waNSrNnDmz4RLhBAAAWIqHQn3pS19Kjz/+eKPrhg8fnvr3759+9KMfpS5dusx3n27duuULAACw+LTrYNGjR480YMCARtetsMIKadVVV53vegAAoH7a9VAoAACgY2jXPRbN+fOf/1zvIgAAAE3osQAAAEoTLAAAgNIECwAAoDTBAgAAKE2wAAAAShMsAACA0gQLAACgNMECAAAoTbAAAABKEywAAIDSBAsAAKA0wQIAAChNsAAAAEoTLAAAgNIECwAAoDTBAgAAKE2wAAAAShMsAACA0gQLAACgNMECAAAoTbAAAABKEywAAIDSBAsAAKA0wQIAAChNsAAAAEoTLAAAgNIECwAAoDTBAgAAKE2wAAAAShMsAACA0gQLAACgNMECAAAoTbAAAABKEywAAIDSBAsAAKA0wQIAAChNsAAAAEoTLAAAgNIECwAAoDTBAgAAKE2wAAAAShMsAACA0gQLAACgNMECAAAoTbAAAABKEywAAIDSBAsAAGDJDhZjx45NW2+9derRo0daY4010rBhw9LTTz9d72IBAAAdKVhMmTIljRgxIt1///3p9ttvTx988EH68pe/nGbPnl3vogEAAFW6pnbstttua/T7+PHjc8/Fww8/nHbYYYe6lQsAAOhAPRZNzZw5M/+/yiqr1LsoAABAR+mxqDZv3rx01FFHpe233z4NGDCgxdvNmTMnXwqzZs1aTCUEAIClV4fpsYi5Fk888US65pprFjjhu1evXg2XPn36LLYyAgDA0qpDBIsjjjgi3XrrrelPf/pTWmeddVq97ahRo/KQqeIyffr0xVZOAABYWrXroVCVSiWNHDky3XTTTenPf/5z6tu37wLv061bt3wBAAAWn67tffjT1VdfnW655ZZ8LouXX345Xx9DnJZbbrl6Fw8AAOgIQ6EuvPDCPJxp4MCBaa211mq4TJw4sd5FAwAAOtJQKAAAoP1r1z0WAABAxyBYAAAApQkWAABAaYIFAABQmmABAACUJlgAAAClCRYAAEBpggUAAFCaYAEAAJQmWAAAAKUJFgAAQGmCBQAAUJpgAQAAlCZYAAAApQkWAABAaYIFAABQmmABAACUJlgAAAClCRYAAEBpggUAAFCaYAEAAJQmWAAAAKUJFgAAQGmCBQAAUJpgAQAAlCZYAAAApQkWAABAaYIFAABQmmABAACUJlgAAAClCRYAAEBpggUAAFCaYAEAAJQmWAAAAKUJFgAAQGmCBQAAUJpgAQAAlCZYAAAApQkWAABAaYIFAABQmmABAACUJlgAAAClCRYAAEBpggUAAFCaYAEAAJQmWAAAAKUJFgAAwNIRLC644IK0/vrrp+7du6fPfOYz6YEHHqh3kQAAgI4ULCZOnJiOPvrodNJJJ6WpU6emzTbbLO28887p1VdfrXfRAACAjhIszj333HTwwQen4cOHp4022ihddNFFafnll0+XXXZZvYsGAAB0hGDx/vvvp4cffjjtuOOODdd17tw5/37ffffVtWwAAMD/6Zrasddeey3NnTs39e7du9H18ftTTz3V7H3mzJmTL4WZM2fm/2fNmpXqad6cd+r6/HQM9T5OqzlmqYVjlo7GMUtHM6vOx2zx/JVKpWMHi49i7NixacyYMfNd36dPn7qUBxZGr3H1LgEsHMcsHY1jlo6mVzs5Zt96663Uq1evjhssVltttdSlS5f0yiuvNLo+fl9zzTWbvc+oUaPyZO/CvHnz0owZM9Kqq66aOnXqtMjLTO3pN8Le9OnTU8+ePetdHFggxywdjWOWjsYx2z5FT0WEirXXXnuBt23XwWLZZZdNW265ZZo8eXIaNmxYQ1CI34844ohm79OtW7d8qbbSSistlvKy8OKDw4cHHYljlo7GMUtH45htfxbUU9EhgkWI3ocDDjggbbXVVmmbbbZJ48aNS7Nnz86rRAEAAO1Duw8We+65Z/rvf/+bRo8enV5++eW0+eabp9tuu22+Cd0AAED9tPtgEWLYU0tDn+iYYrhanPSw6bA1aK8cs3Q0jlk6Gsdsx9epUsvaUQAAAB31BHkAAEDHIFgAAAClCRYAAEBpggWL3X333ZdPfDhkyJB6FwUW6MADD8wn1ywucbLNXXbZJf3tb3+rd9GgRbGK4siRI9MGG2yQJ8LGSceGDh2azwMF7f1ztrjEZy0di2DBYnfppZfmL7y77rorvfjii/UuDixQfLm99NJL+RIVs65du6Zdd9213sWCZj3//PP55LJ33nlnOuuss9Ljjz+el2kfNGhQGjFiRL2LBwv8nC0uEyZMqHexWBKXm2XJ8fbbb6eJEyemhx56KLeojR8/Ph1//PH1Lha0Klp811xzzfxz/H/cccelz3/+8/kcO6uvvnq9iweNHH744bm194EHHkgrrLBCw/Ubb7xxOuigg+paNqjlc5aOS48Fi9W1116b+vfvnz75yU+mfffdN1122WXJisd0tHD829/+Nm244YZ5WBS0JzNmzMi9E9EzUR0qCiuttFJdygUsHQQLFvswqAgURbfnzJkz05QpU+pdLGjVrbfemlZcccV86dGjR5o0aVLueevc2Uco7cu0adNyY0004EBH/ZwtLj/96U/rXSwWkqFQLDZPP/107pq/6aab8u8xTn3PPffMYWPgwIH1Lh60KMamX3jhhfnnN954I/3yl79MgwcPzsfzeuutV+/iQQM9wCwJn7OFVVZZpW7l4aMRLFhsIkB8+OGHae211270JRjjKs8///zUq1evupYPWhJDSmLoU+GSSy7Jx+vFF1+cTj311LqWDar169cvz6946qmn6l0UKPU5S8ekH5/FIgLFlVdemc4555z06KOPNlwee+yxHDSs/EBHEhW3GAb17rvv1rsoMF8L784775wuuOCCNHv27Pn+/uabb9alXMDSQY8Fi23sZAwh+fa3vz1fz8Tuu++eezO++93v1q180Jo5c+bkVcxCHMfRwxaTuOO8ANDeRKjYfvvt0zbbbJNOPvnktOmmm+bGndtvvz0PNXnyySfrXURo9XO2EEOmV1tttbqViYUnWLBYRHDYcccdmx3uFMHizDPPzCcciy9AaG9ilZ211lor/xyTt2Ni7HXXXWduEO1SnBRv6tSp6bTTTkvHHHNMPh9ALIsc57ZoOoYd2uPnbCFWkDSsr2PpVDHTCwAAKMkcCwAAoDTBAgAAKE2wAAAAShMsAACA0gQLAACgNMECAAAoTbAAAABKEywAAIDSBAsAAKA0wQKAhfLyyy+nkSNHpg022CB169Yt9enTJw0dOjRNnjw5/71Tp07p5ptvnu9+Bx54YBo2bFjD7wMHDsy3jUv37t3TJz7xiTR27NhUqVTS+++/n1ZbbbV0+umnN1uGU045JfXu3Tt98MEHDdf1798/lyfKB8DiJ1gAULPnn38+bbnllunOO+9MZ511Vnr88cfTbbfdlgYNGpRGjBix0I938MEHp5deeik9/fTTadSoUWn06NHpoosuSssuu2zad9990+WXXz7ffSJ4jB8/Pu2///5pmWWWydfdc8896d13303f+MY30hVXXNEmrxWAhSNYAFCzww8/PPcwPPDAA2n33XfPvQwbb7xxOvroo9P999+/0I+3/PLLpzXXXDOtt956afjw4WnTTTdNt99+e/7bt7/97fTMM8/k0FBtypQp6dlnn81/L1x66aXpW9/6Vtpvv/3SZZdd1gavFICFJVgAUJMZM2bk3onomVhhhRXm+/tKK630kR87eiHuvvvu9NRTT+XeirDJJpukrbfeer6gEL0Y2223XR76FN5666103XXX5R6OnXbaKc2cOTM/FgCLl2ABQE2mTZuWA0BRoW8Lv/zlL9OKK66Y50bssMMOad68eenII49s+Hv0SkRoePvttxtCxPXXX58OOuighttcc801qV+/frnnpEuXLmmvvfbKPRgALF6CBQA1iVDR1vbZZ5/06KOPpr/85S9p8ODB6YQTTsi9EYW99947zZ07N1177bX594kTJ6bOnTunPffcs+E20aMRvRWF+DnCSIQQABYfwQKAmkSvQMyviOFKrenRo0cejtTUm2++mXr16tXouvh9ww03zEOeIjycf/756Y477mj4e8+ePfOE7GISd/y/xx575F6O8I9//CPP7Tj22GNT165d8+Wzn/1seuedd3JPBgCLj2ABQE1WWWWVtPPOO6cLLrggzZ49u9ngED75yU+mhx9+uNHfotfhsccey5O9WxJh4Xvf+176wQ9+0Kh3JIZDxQTuW2+9Nd17773zTdqOIVTx2NHzUVxiMrnhUACLV6fKoujbBmCJFKsxbb/99jlknHzyyXkVpw8//DCv5HThhRemJ598Mk2YMCFX/s8+++w8mTpCyC9+8Yt0ww035GVl4/wTxXksNt988zRu3LhGE8TXWWeddOWVV+aeihBfUxFIXn/99XzfeI4Q57D42Mc+lsvx3e9+t1E54zYbbbRReuKJJ/LcCwAWPT0WANQsToo3derUfN6KY445Jg0YMCCHhzg5XgSLYl7EJZdckuc+xDkvdtlll3zSurvuuqshVLQkAkucn+InP/lJnsgdYvhVTNZ+4403Gk3anjRpUg4bu+2223yP86lPfSpf9FoALD56LAAAgNL0WAAAAKUJFgAAQGmCBQAAUJpgAQAAlCZYAAAApQkWAABAaYIFAABQmmABAACUJlgAAAClCRYAAEBpggUAAFCaYAEAAKSy/j91tvbGc5klHwAAAABJRU5ErkJggg==",
|
||
"text/plain": [
|
||
"<Figure size 800x400 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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LV++3D0gr2HDhtayZcucSSEAAACA/BdYSFxcnLVr185NAAAAABBxUygAAAAACEdgAQAAAMA3AgsAAAAAvhFYAAAAAIhO523Zvn27m44dO5ZqvkaIAgAAAFCwRBxYLFmyxLp162arV6+2QCAQHCVKf+v/o0eP5kQ6AQAAAOSnwOKOO+6ws846yyZNmmSnnXaaCyYAAAAAFGwRBxa//PKLvffee1azZs2cSREAAACA/N95u02bNu6J2wAAAABwwjUWEydOdH0sVq5cafXr17eiRYumWn7VVVdleVvDhg2zadOm2Zo1a+ykk06yiy66yJ5++mk7++yzg+scOHDABgwYYG+//bYdPHjQ2rdvby+++KJrhgUAAAAgjwYWCxcutK+//to++eSTNMsi7bw9b9486927t51//vl25MgRe/jhh61du3a2atUqK1WqlFunX79+9tFHH9k777xj8fHxdu+999q1117r0gAAAAAgjwYWffr0sVtvvdUeeeQR37UGs2bNSvV68uTJVqFCBTfyVMuWLS05Odl1En/zzTftkksuceu8+uqrVqdOHVu0aJFdeOGFvvYPAAAAIEp9LHbs2OFqEXKiKZICCSlbtqz7XwHG4cOHrW3btsF1ateubWeccYarOUmPmkulpKSkmgAAAADEWGChZkhffPFFtidED9rr27evNWvWzPXdkG3btlmxYsUsISEh1boKarQso34bajLlTYmJidmeVgAAAAA+m0LpGRaDBg2yBQsWWIMGDdJ03r7vvvvsRKivhTqEa7t+KG39+/cPvlaNBcEFAAAAEIOjQpUuXdp1vNYU3nn7RAILdcieOXOmzZ8/36pUqRKcX7FiRTt06JAlJSWlqrX4448/3LL0FC9e3E0AAAAAYjiw2LhxY7btPBAIuM7g06dPty+//NKqVauWannjxo1djcjcuXOtc+fObt7atWtt8+bN1rRp02xLBwAAAIBcDiw8qklQkFGjRg0rUqTICTd/0ohP77//vp188snBfhPqG6HnWuj/Hj16uKZN6tBdpkwZF4goqGBEKAAAACAPd97et2+fy+yXLFnS6tWr52oPRBn+4cOHR7StcePGuZGgWrVqZZUqVQpOU6ZMCa4zatQou+KKK1yNhYagVRMoPVQPAAAAQB4OLNQ5evny5a7pUokSJYLzNSRsaECQ1aZQ6U3du3cPrqN9jB071nbu3Gl79+51QUVG/SsAAAAAREfEbZhmzJjhAgg1RVJnbY9qLzZs2JDd6QMAAACQH2ss/vzzT/d07HCqTQgNNAAAAAAUHBEHFuedd5599NFHwddeMKFhaBmpCQAAACiYIm4K9dRTT1mHDh1s1apVduTIERszZoz7+5tvvknzXAsAAAAABUPENRbNmze3ZcuWuaBCT97+9NNPXdOohQsXuudOAAAAACh4TugBFHp2xYQJE7I/NQAAAAAKRo0FAAAAAIQjsAAAAADgG4EFAAAAAN8ILAAAAABEP7BISUlxT+NevXq1/9QAAAAAKBiBxQ033GAvvPCC+3v//v3ugXma17BhQ3vvvfdyIo0AAAAA8ltgMX/+fGvRooX7e/r06RYIBCwpKcmee+45Gzp0aE6kEQAAAEB+CyySk5OtbNmy7u9Zs2ZZ586drWTJktaxY0dbt25dTqQRAAAAQH4LLBITE91Ttvfu3esCi3bt2rn5u3btshIlSuREGgEAAADktydv9+3b17p06WKlS5e2qlWrWqtWrYJNpBo0aJATaQQA4LjOHPhRtJOAPGDT8I7RTgKQb0UcWNxzzz3WpEkT27x5s1166aVWqND/VXpUr16dPhYAAABAARVxYCGNGzd2Uyj1sQAAAABQMJ1QYPHrr7/aBx984GotDh06lGrZyJEjsyttAAAAAPJrYDF37ly76qqrXNOnNWvWWP369W3Tpk1u2Nlzzz03Z1IJAAAAIH+NCjVo0CC7//77bcWKFW4UKD0Ub8uWLXbxxRfb9ddfnzOpBAAAAJC/AovVq1db165d3d9FihRxT9/WCFFDhgyxp59+OifSCAAAACC/BRalSpUK9quoVKmSbdiwIbjsr7/+yt7UAQAAAMiffSwuvPBCW7BggdWpU8cuv/xyGzBggGsWNW3aNLcMAAAAQMETcWChUZ/27Nnj/h48eLD7e8qUKVarVi1GhAIAAAAKqIgDC40GFdosavz48dmdJgAAAAD5vY8FAAAAAJxQjcUpp5xicXFxWVnVdu7cmaX1AAAAABSwwGL06NHBv3fs2GFDhw619u3bW9OmTd28hQsX2uzZs+2RRx7JuZQCAAAAyNtNobp16xacvv76a/fMirfeesvuu+8+N+lvzZs3b15EO58/f75deeWVVrlyZVcjMmPGjFTLu3fv7uaHTpdddllkRwgAAAAg9vpYqGYivcy95s2ZMyeibe3du9caNWpkY8eOzXAdbXfr1q3BSUEMAAAAgDw+KlS5cuXs/fffd8+vCKV5WhaJDh06uCkzxYsXt4oVK0aaTAAAAACxHFjo2RV33nmnffnll9akSRM379tvv7VZs2bZhAkTsj2B2k+FChVcB/JLLrnE9e+INIABAAAAEGOBhfo96Knbzz33nHvatui1nsbtBRrZRc2grr32WqtWrZpt2LDBHn74YVfDoc7ihQsXTvc9Bw8edJMnJSUlW9MEAAAAIBsCC1EA8cYbb1hOu+mmm4J/N2jQwBo2bGg1atRwtRht2rRJ9z3Dhg1ztSoAAAAA8sgD8g4cOOBqBEKnnKSnfpcvX97Wr1+f4TqDBg2y5OTk4LRly5YcTRMAAACAE6ix2Ldvnz344IM2depU90yLcEePHrWc8uuvv7p9VqpUKdPO3poAAAAAxHCNxQMPPGCff/65jRs3zmXgJ06c6Joe6VkUr7/+ekTb2rNnjy1btsxNsnHjRvf35s2b3TLta9GiRbZp0yabO3euderUyWrWrOkezgcAAAAgD9dYfPjhhy6AaNWqld1+++3WokULl9mvWrWq63fRpUuXLG9r8eLF1rp16+Dr/v37u//1ID4FLj/++KO99tprlpSU5AKXdu3a2RNPPEGNBAAAAJDXA4udO3e6vg5SpkwZ91qaN29ud999d0TbUnASCAQyfRgfAAAAgHzYFEpBhZosSe3atV1fC68mIyEhIftTCAAAACD/BRZq/rR8+XL398CBA23s2LFWokQJ69evn+sTAQAAAKDgibgplAIIT9u2bW3NmjW2ZMkS189Cz5kAAAAAUPBEVGNx+PBh92C6devWBeep07aejk1QAQAAABRcEQUWRYsWdSM1AQAAAICvPha33nqrTZo0KdK3AQAAAMjHIu5jceTIEXvllVdszpw51rhxYytVqlSq5SNHjszO9AEAAADIj4HFypUr7dxzz3V///zzzzmRJgAAAAD5PbD44osvciYlAAAAAApOH4s77rjDdu/enWb+3r173TIAAAAABU/EgcVrr71m+/fvTzNf815//fXsShcAAACA/NgUKiUlxQKBgJtUY6GnbXuOHj1qH3/8sVWoUCGn0gkAAAAgPwQWCQkJFhcX56azzjorzXLNHzx4cHanDwAAAEB+CizUaVu1FZdccom99957VrZs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",
|
||
"text/plain": [
|
||
"<Figure size 800x400 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from datetime import datetime\n",
|
||
"\n",
|
||
"hoje = datetime.today().strftime('%Y%m%d') # Exemplo: '20250604'\n",
|
||
"\n",
|
||
"# === ETAPA 1: Carrega e prepara os dados ===\n",
|
||
"df = pd.read_excel(r\"C:\\Users\\joao.herculano\\GRUPO GINSENG\\Assistência Suprimentos - 2025\\CRITICOS INDUSTRIA\\compiladoAcertePedido.xlsx\")\n",
|
||
"df = df[['MATERIAL', 'SEMANA', 'CURVA']]\n",
|
||
"df['semana_num'] = df['SEMANA'].str.extract(r'S(\\d+)').astype(int)\n",
|
||
"df = df.sort_values(['MATERIAL', 'semana_num'])\n",
|
||
"df['grupo'] = df.groupby('MATERIAL')['semana_num'].diff().ne(1).cumsum()\n",
|
||
"\n",
|
||
"# === ETAPA 2: Agrupa dados ===\n",
|
||
"grupos = df.groupby(['MATERIAL', 'CURVA', 'grupo']).size().reset_index(name='duracao')\n",
|
||
"resultado = grupos.groupby('MATERIAL')['duracao'].agg(media_duracao='mean', max_duracao='max').reset_index()\n",
|
||
"media_geral = grupos['duracao'].mean()\n",
|
||
"print(f\"Média geral de semanas em estado crítico: {media_geral:.2f} ou {round(media_geral * 7)} dias.\")\n",
|
||
"\n",
|
||
"# === ETAPA 3: Análise por CURVA ===\n",
|
||
"media_duracao_por_curva = grupos.groupby('CURVA')['duracao'].mean().reset_index(name='media_duracao_critico')\n",
|
||
"media_duracao_por_curva['media_duracao_critico'] = round(media_duracao_por_curva['media_duracao_critico']*7).astype('Int64') # semanas → dias\n",
|
||
"\n",
|
||
"entradas_por_sku = grupos.groupby(['MATERIAL', 'CURVA']).size().reset_index(name='qtd_entradas')\n",
|
||
"media_entradas_por_curva = entradas_por_sku.groupby('CURVA')['qtd_entradas'].mean().reset_index(name='media_entradas_critico')\n",
|
||
"\n",
|
||
"curva_analise = pd.merge(media_duracao_por_curva, media_entradas_por_curva, on='CURVA')\n",
|
||
"\n",
|
||
"# === ETAPA 4: Junta dados finais por SKU (CURVA + qtd_entradas)\n",
|
||
"resultado_final = pd.merge(resultado, entradas_por_sku, on='MATERIAL')\n",
|
||
"resultado_final = resultado_final[['MATERIAL', 'CURVA', 'media_duracao', 'max_duracao', 'qtd_entradas']]\n",
|
||
"\n",
|
||
"# === ETAPA 5: Exporta para Excel ===\n",
|
||
"output_path = f\"C:/Users/joao.herculano/GRUPO GINSENG/Assistência Suprimentos - 2025/CRITICOS INDUSTRIA/analise_curva_resultado{hoje}.xlsx\"\n",
|
||
"with pd.ExcelWriter(output_path, engine='xlsxwriter') as writer:\n",
|
||
" resultado_final.to_excel(writer, sheet_name='Por SKU', index=False)\n",
|
||
" curva_analise.to_excel(writer, sheet_name='Por CURVA', index=False)\n",
|
||
"\n",
|
||
"print(f\"\\nArquivo Excel salvo com sucesso em:\\n{output_path}\")\n",
|
||
"\n",
|
||
"# === ETAPA 6: Gráficos ===\n",
|
||
"# 1. Duração média por CURVA\n",
|
||
"plt.figure(figsize=(8, 4))\n",
|
||
"plt.bar(curva_analise['CURVA'], curva_analise['media_duracao_critico'])\n",
|
||
"plt.title('Duração média (dias) em estado crítico por CURVA')\n",
|
||
"plt.xlabel('CURVA')\n",
|
||
"plt.ylabel('Dias')\n",
|
||
"plt.tight_layout()\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"# 2. Entradas médias por CURVA\n",
|
||
"plt.figure(figsize=(8, 4))\n",
|
||
"plt.bar(curva_analise['CURVA'], curva_analise['media_entradas_critico'])\n",
|
||
"plt.title('Número médio de entradas em crítico por CURVA')\n",
|
||
"plt.xlabel('CURVA')\n",
|
||
"plt.ylabel('Entradas em crítico')\n",
|
||
"plt.tight_layout()\n",
|
||
"plt.show()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "422c3a16",
|
||
"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
|
||
}
|