This commit is contained in:
2026-03-14 22:57:45 +00:00
commit 02f65e6f50
52 changed files with 274542 additions and 0 deletions
Binary file not shown.
+38
View File
@@ -0,0 +1,38 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['d:\\Trabalhos\\Bot DAQ\\DAQ\\Untitled-1.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='Bot_DAQ',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
+229
View File
@@ -0,0 +1,229 @@
import os
import re
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
from datetime import datetime
import pandas as pd
import pdfplumber
START_MARKER = "Planeamento e execução da formação Respostas:"
END_MARKER = "Ação dos formadores"
def clean_cell(x) -> str:
if x is None:
return ""
x = str(x).replace("\n", " ").replace("\r", " ").strip()
x = re.sub(r"\s+", " ", x)
return x
def normalize_df(df: pd.DataFrame) -> pd.DataFrame:
df = df.copy()
df = df.applymap(clean_cell)
df = df.loc[~(df.apply(lambda r: all(v == "" for v in r), axis=1))].reset_index(drop=True)
return df
def df_text(df: pd.DataFrame) -> str:
vals = df.astype(str).fillna("").values.flatten().tolist()
return " ".join(vals)
def safe_filename(s: str) -> str:
s = re.sub(r"[\\/:*?\"<>|]+", "_", s)
s = re.sub(r"\s+", "_", s.strip())
return s[:180] if len(s) > 180 else s
def save_outputs(df: pd.DataFrame, pdf_path: str, year: str, course: str, out_dir: str):
os.makedirs(out_dir, exist_ok=True)
stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
base = f"{safe_filename(os.path.splitext(os.path.basename(pdf_path))[0])}__{safe_filename(course)}__{safe_filename(year)}__{stamp}"
csv_path = os.path.join(out_dir, base + ".csv")
xlsx_path = os.path.join(out_dir, base + ".xlsx")
df.to_csv(csv_path, index=False, encoding="utf-8-sig")
df.to_excel(xlsx_path, index=False)
return csv_path, xlsx_path
def normalize_marker(s: str) -> str:
s = s.replace("", "-")
s = re.sub(r"\s+", " ", s).strip().lower()
return s
def find_target_table(pdf_path: str):
start_n = normalize_marker(START_MARKER)
end_n = normalize_marker(END_MARKER)
with pdfplumber.open(pdf_path) as pdf:
start_page_idx = None
for i, page in enumerate(pdf.pages):
text = page.extract_text() or ""
tnorm = normalize_marker(text)
if start_n in tnorm:
start_page_idx = i
break
if start_page_idx is None:
raise ValueError(f"Não encontrei o início do bloco: '{START_MARKER}'")
end_page_idx = None
for j in range(start_page_idx, len(pdf.pages)):
text = pdf.pages[j].extract_text() or ""
tnorm = normalize_marker(text)
if end_n in tnorm:
end_page_idx = j
break
if end_page_idx is None:
raise ValueError(f"Encontrei o início, mas não encontrei o fim do bloco: '{END_MARKER}'")
candidate_tables = []
for pno in range(start_page_idx, end_page_idx + 1):
page = pdf.pages[pno]
tables = page.extract_tables() or []
page_text = normalize_marker(page.extract_text() or "")
for ti, tbl in enumerate(tables, start=1):
if not tbl or len(tbl) < 2:
continue
df = pd.DataFrame(tbl[1:], columns=tbl[0])
df = normalize_df(df)
raw = df_text(df)
raw_n = normalize_marker(raw)
score = 0
r, c = df.shape
if c >= 3: score += 10
if r >= 4: score += 10
if pno == start_page_idx:
score += 15
for kw in ["respostas", "planeamento", "execução", "formação", "formadores"]:
if kw in raw_n:
score += 2
empties = (df == "").sum().sum()
total = r * c
if total and empties / total > 0.6:
score -= 10
candidate_tables.append((score, pno, ti, df))
if not candidate_tables:
raise ValueError("Encontrei o bloco, mas não encontrei tabelas nesse intervalo.")
candidate_tables.sort(key=lambda x: x[0], reverse=True)
best_score, best_pno, best_ti, best_df = candidate_tables[0]
return {
"start_page": start_page_idx + 1,
"end_page": end_page_idx + 1,
"best_page": best_pno + 1,
"best_table_id": f"p{best_pno+1}_t{best_ti}",
"score": best_score,
"df": best_df
}
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Extrair Tabela do PDF (bloco entre títulos)")
self.geometry("820x300")
self.resizable(False, False)
self.pdf_path = tk.StringVar(value="")
self.year_var = tk.StringVar(value="")
self.course_var = tk.StringVar(value="")
self.outdir_var = tk.StringVar(value="output_tables")
self._build_ui()
def _build_ui(self):
frm = ttk.Frame(self, padding=14)
frm.pack(fill="both", expand=True)
# PDF
ttk.Label(frm, text="PDF:").grid(row=0, column=0, sticky="w")
ttk.Entry(frm, textvariable=self.pdf_path, width=74).grid(row=0, column=1, sticky="w", padx=(8, 8))
ttk.Button(frm, text="Escolher...", command=self.on_browse_pdf).grid(row=0, column=2, sticky="w")
# Ano
ttk.Label(frm, text="Ano:").grid(row=1, column=0, sticky="w", pady=(12, 0))
ttk.Entry(frm, textvariable=self.year_var, width=20).grid(row=1, column=1, sticky="w", padx=(8, 0), pady=(12, 0))
# Curso
ttk.Label(frm, text="Curso:").grid(row=2, column=0, sticky="w", pady=(12, 0))
ttk.Entry(frm, textvariable=self.course_var, width=50).grid(row=2, column=1, sticky="w", padx=(8, 0), pady=(12, 0))
# Output dir
ttk.Label(frm, text="Pasta de saída:").grid(row=3, column=0, sticky="w", pady=(12, 0))
ttk.Entry(frm, textvariable=self.outdir_var, width=40).grid(row=3, column=1, sticky="w", padx=(8, 0), pady=(12, 0))
# info sobre markers
info = (
f"Vai extrair a tabela do bloco:\n"
f"INÍCIO: {START_MARKER}\n"
f"FIM: {END_MARKER}"
)
ttk.Label(frm, text=info).grid(row=4, column=0, columnspan=3, sticky="w", pady=(14, 0))
# Botões
btns = ttk.Frame(frm)
btns.grid(row=5, column=0, columnspan=3, sticky="e", pady=(18, 0))
ttk.Button(btns, text="Extrair", command=self.on_extract).pack(side="right", padx=(8, 0))
ttk.Button(btns, text="Sair", command=self.destroy).pack(side="right")
def on_browse_pdf(self):
path = filedialog.askopenfilename(
title="Seleciona um PDF",
filetypes=[("PDF files", "*.pdf"), ("All files", "*.*")]
)
if path:
self.pdf_path.set(path)
def on_extract(self):
pdf_path = self.pdf_path.get().strip()
year = self.year_var.get().strip()
course = self.course_var.get().strip()
outdir = self.outdir_var.get().strip() or "output_tables"
if not pdf_path or not os.path.exists(pdf_path):
messagebox.showerror("Erro", "Seleciona um PDF válido.")
return
if not year:
messagebox.showerror("Erro", "Preenche o Ano.")
return
if not course:
messagebox.showerror("Erro", "Preenche o Curso.")
return
try:
self.configure(cursor="watch")
self.update_idletasks()
result = find_target_table(pdf_path)
df = result["df"]
csv_path, xlsx_path = save_outputs(df, pdf_path, year, course, outdir)
messagebox.showinfo(
"OK",
"Tabela extraída com sucesso!\n\n"
f"Bloco encontrado nas páginas: {result['start_page']}{result['end_page']}\n"
f"Tabela escolhida: {result['best_table_id']} (score={result['score']})\n"
f"Dimensões: {df.shape[0]} x {df.shape[1]}\n\n"
f"CSV: {csv_path}\n"
f"XLSX: {xlsx_path}"
)
except Exception as e:
messagebox.showerror("Erro", f"Falhou.\n\nDetalhes: {e}")
finally:
self.configure(cursor="")
self.update_idletasks()
if __name__ == "__main__":
App().mainloop()
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

+865
View File
@@ -0,0 +1,865 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "1f540c43",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import tkinter as tk\n",
"from tkinter import filedialog, simpledialog, messagebox\n",
"import re\n",
"from datetime import datetime\n",
"import pandas as pd\n",
"import pdfplumber\n",
"from tkinter import messagebox\n",
"import sys\n"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "74f35480",
"metadata": {},
"outputs": [],
"source": [
"START_MARKER = \"Planeamento e execução da formação Respostas:\"\n",
"END_MARKER = \"Ação dos formadores\"\n",
"OUT_DIR = \"output_tables\"\n",
"os.makedirs(OUT_DIR, exist_ok=True)\n",
"\n",
"root = tk.Tk()\n",
"root.withdraw() \n",
"root.update()\n"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "8b51acae",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'D:\\\\DAQ\\\\Relatorios\\\\2CFPQP-ART\\\\2CFPQP_RAI_Art.pdf'"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pdf_path = filedialog.askopenfilename(\n",
" title=\"Seleciona o PDF\",\n",
" filetypes=[(\"PDF files\", \"*.pdf\"), (\"All files\", \"*.*\")]\n",
")\n",
"\n",
"if not pdf_path:\n",
" messagebox.showerror(\"Erro\", \"Nenhum PDF selecionado.\")\n",
" raise SystemExit\n",
"\n",
"pdf_path = os.path.abspath(pdf_path)\n",
"pdf_path\n"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "e62c1fbb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'2CFPQP-Art'"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"course_name = simpledialog.askstring(\n",
" title=\"Nome do Curso\",\n",
" prompt=\"Introduz o nome do curso:\"\n",
")\n",
"\n",
"if not course_name:\n",
" messagebox.showerror(\"Erro\", \"Nome do curso não foi preenchido.\")\n",
" raise SystemExit\n",
"\n",
"course_name\n"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "212eb52c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'2024'"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"year = simpledialog.askstring(\n",
" title=\"Ano\",\n",
" prompt=\"Introduz o ano (ex: 2024):\"\n",
")\n",
"\n",
"if not year or not year.isdigit():\n",
" messagebox.showerror(\"Erro\", \"Ano inválido.\")\n",
" raise SystemExit\n",
"\n",
"year\n"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "5a225637",
"metadata": {},
"outputs": [],
"source": [
"def norm_text(s: str) -> str:\n",
" if not s:\n",
" return \"\"\n",
" s = s.replace(\"\", \"-\")\n",
" s = re.sub(r\"\\s+\", \" \", s).strip().lower()\n",
" return s\n",
"\n",
"def clean_cell(x) -> str:\n",
" if x is None:\n",
" return \"\"\n",
" x = str(x).replace(\"\\n\", \" \").replace(\"\\r\", \" \").strip()\n",
" x = re.sub(r\"\\s+\", \" \", x)\n",
" return x\n",
"\n",
"def normalize_df(df: pd.DataFrame) -> pd.DataFrame:\n",
" df = df.copy().applymap(clean_cell)\n",
" df = df.loc[~(df.apply(lambda r: all(v == \"\" for v in r), axis=1))].reset_index(drop=True)\n",
" return df\n",
"\n",
"def df_flattext(df: pd.DataFrame) -> str:\n",
" vals = df.astype(str).fillna(\"\").values.flatten().tolist()\n",
" return \" \".join(vals)\n",
"\n",
"def safe_filename(s: str) -> str:\n",
" s = re.sub(r\"[\\\\/:*?\\\"<>|]+\", \"_\", s)\n",
" s = re.sub(r\"\\s+\", \"_\", s.strip())\n",
" return s[:180]\n"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "990ce85a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(7, 8)"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"start_n = norm_text(START_MARKER)\n",
"end_n = norm_text(END_MARKER)\n",
"with pdfplumber.open(pdf_path) as pdf:\n",
" start_page = None\n",
" end_page = None\n",
" for i, page in enumerate(pdf.pages):\n",
" txt = norm_text(page.extract_text() or \"\")\n",
" if start_n in txt:\n",
" start_page = i\n",
" break\n",
" if start_page is None:\n",
" raise ValueError(f\"Não encontrei o início: {START_MARKER}\")\n",
" for j in range(start_page, len(pdf.pages)):\n",
" txt = norm_text(pdf.pages[j].extract_text() or \"\")\n",
" if end_n in txt:\n",
" end_page = j\n",
" break\n",
" if end_page is None:\n",
" raise ValueError(f\"Encontrei o início, mas não encontrei o fim: {END_MARKER}\")\n",
"(start_page + 1, end_page + 1)\n"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "43916fc0",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\garci\\AppData\\Local\\Temp\\ipykernel_17004\\2567387785.py:16: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n",
" df = df.copy().applymap(clean_cell)\n",
"C:\\Users\\garci\\AppData\\Local\\Temp\\ipykernel_17004\\2567387785.py:16: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n",
" df = df.copy().applymap(clean_cell)\n",
"C:\\Users\\garci\\AppData\\Local\\Temp\\ipykernel_17004\\2567387785.py:16: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n",
" df = df.copy().applymap(clean_cell)\n",
"C:\\Users\\garci\\AppData\\Local\\Temp\\ipykernel_17004\\2567387785.py:16: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n",
" df = df.copy().applymap(clean_cell)\n"
]
},
{
"data": {
"text/plain": [
"4"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"candidates = []\n",
"\n",
"with pdfplumber.open(pdf_path) as pdf:\n",
" for pno in range(start_page, end_page + 1):\n",
" page = pdf.pages[pno]\n",
" tables = page.extract_tables() or []\n",
"\n",
" for ti, tbl in enumerate(tables, start=1):\n",
" if not tbl or len(tbl) < 2:\n",
" continue\n",
" header = tbl[0]\n",
" body = tbl[1:]\n",
" df = pd.DataFrame(body, columns=header)\n",
" df = normalize_df(df)\n",
"\n",
" r, c = df.shape\n",
" if r < 2 or c < 2:\n",
" continue\n",
" text_n = norm_text(df_flattext(df))\n",
" score = 0\n",
" if c >= 3: score += 10\n",
" if r >= 4: score += 10\n",
" if pno == start_page: score += 15\n",
" for kw in [\"planeamento\", \"execucao\", \"formacao\", \"respostas\", \"formadores\"]:\n",
" if kw in text_n:\n",
" score += 2\n",
"\n",
" empties = (df == \"\").sum().sum()\n",
" total = r * c\n",
" if total and empties / total > 0.6:\n",
" score -= 10\n",
"\n",
" candidates.append((score, pno, ti, df))\n",
"\n",
"len(candidates)\n"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "cd4bd06b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bloco: páginas 7 → 8\n",
"Tabela escolhida: p7_t1 (score=35)\n",
"Dimensões: (18, 4)\n"
]
},
{
"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>Indicadores</th>\n",
" <th>Avaliação</th>\n",
" <th>None</th>\n",
" <th>Ganhos / Perdas</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1. Intervenção da Unidade Formadora</td>\n",
" <td>Inicial</td>\n",
" <td>Final</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.1 Apoio Técnico administrativo</td>\n",
" <td>N/A</td>\n",
" <td>3.91</td>\n",
" <td>N/A</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.2 Alojamento</td>\n",
" <td>4.55</td>\n",
" <td>4.45</td>\n",
" <td>-0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.3 Alimentação</td>\n",
" <td>4.27</td>\n",
" <td>4.0</td>\n",
" <td>-0.27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2. Intervenção da Direção de Curso</td>\n",
" <td>Inicial</td>\n",
" <td>Final</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2.1 Apoio prestado pela Direção de Curso</td>\n",
" <td>N/A</td>\n",
" <td>4.09</td>\n",
" <td>N/A</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>3. Programa de Curso</td>\n",
" <td>Inicial</td>\n",
" <td>Final</td>\n",
" <td></td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>3.1 Grau de dificuldade do curso</td>\n",
" <td>3.55</td>\n",
" <td>3.27</td>\n",
" <td>-0.28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>3.2 Utilidade do Curso para futuras funções</td>\n",
" <td>4.09</td>\n",
" <td>3.82</td>\n",
" <td>-0.27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>3.3 Motivação e participação</td>\n",
" <td>4.45</td>\n",
" <td>4.09</td>\n",
" <td>-0.36</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>3.4 Grau de conhecimento adquirido com o curso</td>\n",
" <td>3.73</td>\n",
" <td>4.09</td>\n",
" <td>0.36</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>4. Funcionamento do Curso</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>Média</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>4.1 Objetivo do curso</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>3.64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>4.2 Conteúdo do curso</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>3.55</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>4.3 Adequação dos trabalhos/exercícios</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>3.36</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>4.4 Instalações afetas à formação</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>3.82</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>4.5 Meios audiovisuais e didáticos</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>4.09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>4.6 Documentos e bibliografias disponibilizadas</td>\n",
" <td></td>\n",
" <td></td>\n",
" <td>4.09</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Indicadores Avaliação None \\\n",
"0 1. Intervenção da Unidade Formadora Inicial Final \n",
"1 1.1 Apoio Técnico administrativo N/A 3.91 \n",
"2 1.2 Alojamento 4.55 4.45 \n",
"3 1.3 Alimentação 4.27 4.0 \n",
"4 2. Intervenção da Direção de Curso Inicial Final \n",
"5 2.1 Apoio prestado pela Direção de Curso N/A 4.09 \n",
"6 3. Programa de Curso Inicial Final \n",
"7 3.1 Grau de dificuldade do curso 3.55 3.27 \n",
"8 3.2 Utilidade do Curso para futuras funções 4.09 3.82 \n",
"9 3.3 Motivação e participação 4.45 4.09 \n",
"10 3.4 Grau de conhecimento adquirido com o curso 3.73 4.09 \n",
"11 4. Funcionamento do Curso \n",
"12 4.1 Objetivo do curso \n",
"13 4.2 Conteúdo do curso \n",
"14 4.3 Adequação dos trabalhos/exercícios \n",
"15 4.4 Instalações afetas à formação \n",
"16 4.5 Meios audiovisuais e didáticos \n",
"17 4.6 Documentos e bibliografias disponibilizadas \n",
"\n",
" Ganhos / Perdas \n",
"0 \n",
"1 N/A \n",
"2 -0.1 \n",
"3 -0.27 \n",
"4 \n",
"5 N/A \n",
"6 \n",
"7 -0.28 \n",
"8 -0.27 \n",
"9 -0.36 \n",
"10 0.36 \n",
"11 Média \n",
"12 3.64 \n",
"13 3.55 \n",
"14 3.36 \n",
"15 3.82 \n",
"16 4.09 \n",
"17 4.09 "
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"if not candidates:\n",
" raise ValueError(\"Encontrei o bloco, mas não encontrei tabelas nas páginas desse intervalo.\")\n",
"\n",
"candidates.sort(key=lambda x: x[0], reverse=True)\n",
"best_score, best_pno, best_ti, best_df = candidates[0]\n",
"\n",
"print(f\"Bloco: páginas {start_page+1} → {end_page+1}\")\n",
"print(f\"Tabela escolhida: p{best_pno+1}_t{best_ti} (score={best_score})\")\n",
"print(\"Dimensões:\", best_df.shape)\n",
"\n",
"best_df.head(30)\n"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "884d3881",
"metadata": {},
"outputs": [],
"source": [
"def dot_to_comma(df: pd.DataFrame) -> pd.DataFrame:\n",
" df = df.copy()\n",
"\n",
" def convert(x):\n",
" if isinstance(x, (int, float)):\n",
" return str(x).replace(\".\", \",\")\n",
" if isinstance(x, str):\n",
" # só troca se parecer número (ex: \"3.5\")\n",
" if re.fullmatch(r\"-?\\d+\\.\\d+\", x):\n",
" return x.replace(\".\", \",\")\n",
" return x\n",
"\n",
" return df.applymap(convert)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "f1d5c545",
"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>0</th>\n",
" <th>1</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.1 Apoio Técnico administrativo</td>\n",
" <td>3.91</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.2 Alojamento</td>\n",
" <td>4.45</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.3 Alimentação</td>\n",
" <td>4.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2.1 Apoio prestado pela Direção de Curso</td>\n",
" <td>4.09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3.1 Grau de dificuldade do curso</td>\n",
" <td>3.27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>3.2 Utilidade do Curso para futuras funções</td>\n",
" <td>3.82</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>3.3 Motivação e participação</td>\n",
" <td>4.09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>3.4 Grau de conhecimento adquirido com o curso</td>\n",
" <td>4.09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>4.1 Objetivo do curso</td>\n",
" <td>3.64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>4.2 Conteúdo do curso</td>\n",
" <td>3.55</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>4.3 Adequação dos trabalhos/exercícios</td>\n",
" <td>3.36</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>4.4 Instalações afetas à formação</td>\n",
" <td>3.82</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>4.5 Meios audiovisuais e didáticos</td>\n",
" <td>4.09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>4.6 Documentos e bibliografias disponibilizadas</td>\n",
" <td>4.09</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1\n",
"0 1.1 Apoio Técnico administrativo 3.91\n",
"1 1.2 Alojamento 4.45\n",
"2 1.3 Alimentação 4.0\n",
"3 2.1 Apoio prestado pela Direção de Curso 4.09\n",
"4 3.1 Grau de dificuldade do curso 3.27\n",
"5 3.2 Utilidade do Curso para futuras funções 3.82\n",
"6 3.3 Motivação e participação 4.09\n",
"7 3.4 Grau de conhecimento adquirido com o curso 4.09\n",
"8 4.1 Objetivo do curso 3.64\n",
"9 4.2 Conteúdo do curso 3.55\n",
"10 4.3 Adequação dos trabalhos/exercícios 3.36\n",
"11 4.4 Instalações afetas à formação 3.82\n",
"12 4.5 Meios audiovisuais e didáticos 4.09\n",
"13 4.6 Documentos e bibliografias disponibilizadas 4.09"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rows_config = {\n",
" 1: [0, 2],\n",
" 2: [0, 2],\n",
" 3: [0, 2],\n",
" 5: [0, 2],\n",
" 7: [0, 2],\n",
" 8: [0, 2],\n",
" 9: [0, 2],\n",
" 10: [0, 2],\n",
" 12: [0, 3],\n",
" 13: [0, 3],\n",
" 14: [0, 3],\n",
" 15: [0, 3],\n",
" 16: [0, 3],\n",
" 17: [0, 3]\n",
"}\n",
"\n",
"new_rows = []\n",
"\n",
"for row_idx, col_idxs in rows_config.items():\n",
" values = best_df.iloc[row_idx, col_idxs].tolist()\n",
" new_rows.append(values)\n",
"\n",
"new_df = pd.DataFrame(new_rows)\n",
"new_df"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "5dfa7c90",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\garci\\AppData\\Local\\Temp\\ipykernel_17004\\2220260037.py:13: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n",
" return df.applymap(convert)\n"
]
},
{
"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>1.1 Apoio Técnico administrativo</th>\n",
" <th>1.2 Alojamento</th>\n",
" <th>1.3 Alimentação</th>\n",
" <th>2.1 Apoio prestado pela Direção de Curso</th>\n",
" <th>3.1 Grau de dificuldade do curso</th>\n",
" <th>3.2 Utilidade do Curso para futuras funções</th>\n",
" <th>3.3 Motivação e participação</th>\n",
" <th>3.4 Grau de conhecimento adquirido com o curso</th>\n",
" <th>4.1 Objetivo do curso</th>\n",
" <th>4.2 Conteúdo do curso</th>\n",
" <th>4.3 Adequação dos trabalhos/exercícios</th>\n",
" <th>4.4 Instalações afetas à formação</th>\n",
" <th>4.5 Meios audiovisuais e didáticos</th>\n",
" <th>4.6 Documentos e bibliografias disponibilizadas</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2024 - 2CFPQP-Art</th>\n",
" <td>3,91</td>\n",
" <td>4,45</td>\n",
" <td>4,0</td>\n",
" <td>4,09</td>\n",
" <td>3,27</td>\n",
" <td>3,82</td>\n",
" <td>4,09</td>\n",
" <td>4,09</td>\n",
" <td>3,64</td>\n",
" <td>3,55</td>\n",
" <td>3,36</td>\n",
" <td>3,82</td>\n",
" <td>4,09</td>\n",
" <td>4,09</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 1.1 Apoio Técnico administrativo 1.2 Alojamento \\\n",
"2024 - 2CFPQP-Art 3,91 4,45 \n",
"\n",
" 1.3 Alimentação 2.1 Apoio prestado pela Direção de Curso \\\n",
"2024 - 2CFPQP-Art 4,0 4,09 \n",
"\n",
" 3.1 Grau de dificuldade do curso \\\n",
"2024 - 2CFPQP-Art 3,27 \n",
"\n",
" 3.2 Utilidade do Curso para futuras funções \\\n",
"2024 - 2CFPQP-Art 3,82 \n",
"\n",
" 3.3 Motivação e participação \\\n",
"2024 - 2CFPQP-Art 4,09 \n",
"\n",
" 3.4 Grau de conhecimento adquirido com o curso \\\n",
"2024 - 2CFPQP-Art 4,09 \n",
"\n",
" 4.1 Objetivo do curso 4.2 Conteúdo do curso \\\n",
"2024 - 2CFPQP-Art 3,64 3,55 \n",
"\n",
" 4.3 Adequação dos trabalhos/exercícios \\\n",
"2024 - 2CFPQP-Art 3,36 \n",
"\n",
" 4.4 Instalações afetas à formação \\\n",
"2024 - 2CFPQP-Art 3,82 \n",
"\n",
" 4.5 Meios audiovisuais e didáticos \\\n",
"2024 - 2CFPQP-Art 4,09 \n",
"\n",
" 4.6 Documentos e bibliografias disponibilizadas \n",
"2024 - 2CFPQP-Art 4,09 "
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_dict = dict(zip(new_df[0], new_df[1]))\n",
"final_df = pd.DataFrame([data_dict])\n",
"final_df.index = [f\"{year} - {course_name}\"]\n",
"final_df = dot_to_comma(final_df)\n",
"final_df"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "10337d57",
"metadata": {},
"outputs": [],
"source": [
"def save_row_if_new(final_df: pd.DataFrame, xlsx_path: str, row_name: str, sheet_name: str = \"Resultados\"):\n",
" root = tk.Tk()\n",
" root.withdraw()\n",
" if not os.path.exists(xlsx_path):\n",
" final_df.to_excel(xlsx_path, sheet_name=sheet_name, index=True)\n",
" messagebox.showinfo(\"OK\", f\"Ficheiro criado e linha guardada:\\n{row_name}\\n\\n{xlsx_path}\")\n",
" return False \n",
" try:\n",
" existing = pd.read_excel(xlsx_path, sheet_name=sheet_name, index_col=0)\n",
" except ValueError:\n",
" final_df.to_excel(xlsx_path, sheet_name=sheet_name, index=True)\n",
" messagebox.showinfo(\"OK\", f\"Sheet '{sheet_name}' criada e linha guardada:\\n{row_name}\")\n",
" return False\n",
" if row_name in existing.index.astype(str):\n",
" messagebox.showwarning(\"Já existe\", f\"Já existe uma linha com este nome:\\n{row_name}\\n\\nNada foi gravado.\")\n",
" return True\n",
" updated = pd.concat([existing, final_df], axis=0)\n",
" with pd.ExcelWriter(xlsx_path, engine=\"openpyxl\", mode=\"w\") as writer:\n",
" updated.to_excel(writer, sheet_name=sheet_name, index=True)\n",
" messagebox.showinfo(\"OK\", f\"Linha adicionada com sucesso:\\n{row_name}\\n\\n{xlsx_path}\")\n",
" return False\n",
"row_name = f\"{year} - {course_name}\"\n",
"xlsx_path = \"BDpowerbi.xlsx\"\n",
"_duplicado = save_row_if_new(final_df, xlsx_path, row_name, sheet_name=\"Resultados\")\n",
"\n",
"sys.exit(0)"
]
}
],
"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.14.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
+242
View File
@@ -0,0 +1,242 @@
import os
import re
import sys
from datetime import datetime
import tkinter as tk
from tkinter import filedialog, simpledialog, messagebox
import pandas as pd
import pdfplumber
START_MARKER = "Planeamento e execução da formação "
END_MARKER = "Ação dos formadores"
def norm_text(s: str) -> str:
if not s:
return ""
s = s.replace("–", "-")
s = re.sub(r"\s+", " ", s).strip().lower()
return s
def clean_cell(x) -> str:
if x is None:
return ""
x = str(x).replace("\n", " ").replace("\r", " ").strip()
x = re.sub(r"\s+", " ", x)
return x
def convert(x):
if isinstance(x, (int, float)):
return str(x).replace(".", ",")
if isinstance(x, str):
import re
if re.fullmatch(r"-?\d+\.\d+", x):
return x.replace(".", ",")
return x
def normalize_df(df: pd.DataFrame) -> pd.DataFrame:
df = df.copy()
df = df.apply(lambda col: col.map(clean_cell))
df = df.apply(lambda col: col.map(convert))
df = df.loc[
~(df.apply(lambda r: all(v == "" for v in r), axis=1))
].reset_index(drop=True)
return df
def df_flattext(df: pd.DataFrame) -> str:
vals = df.astype(str).fillna("").values.flatten().tolist()
return " ".join(vals)
def safe_filename(s: str) -> str:
s = re.sub(r"[\\/:*?\"<>|]+", "_", s)
s = re.sub(r"\s+", "_", s.strip())
return s[:180]
def dot_to_comma(df: pd.DataFrame) -> pd.DataFrame:
df = df.copy()
def convert(x):
if isinstance(x, (int, float)):
return str(x).replace(".", ",")
if isinstance(x, str):
if re.fullmatch(r"-?\d+\.\d+", x):
return x.replace(".", ",")
return x
return df.apply(lambda col: col.map(convert))
def save_row_if_new(
final_df: pd.DataFrame,
xlsx_path: str,
row_name: str,
sheet_name: str = "Resultados",
):
root = tk.Tk()
root.withdraw()
if not os.path.exists(xlsx_path):
final_df.to_excel(xlsx_path, sheet_name=sheet_name, index=True)
messagebox.showinfo("OK", f"Ficheiro criado e linha guardada:\n{row_name}\n\n{xlsx_path}")
return False
try:
existing = pd.read_excel(xlsx_path, sheet_name=sheet_name, index_col=0)
except ValueError:
final_df.to_excel(xlsx_path, sheet_name=sheet_name, index=True)
messagebox.showinfo("OK", f"Sheet '{sheet_name}' criada e linha guardada:\n{row_name}")
return False
if row_name in existing.index.astype(str):
messagebox.showwarning(
"Já existe",
f"Já existe uma linha com este nome:\n{row_name}\n\nNada foi gravado.",
)
return True
updated = pd.concat([existing, final_df], axis=0)
with pd.ExcelWriter(xlsx_path, engine="openpyxl", mode="w") as writer:
updated.to_excel(writer, sheet_name=sheet_name, index=True)
messagebox.showinfo("OK", f"Linha adicionada com sucesso:\n{row_name}\n\n{xlsx_path}")
return False
def main() -> int:
root = tk.Tk()
root.withdraw()
root.update()
pdf_path = filedialog.askopenfilename(
title="Seleciona o PDF",
filetypes=[("PDF files", "*.pdf"), ("All files", "*.*")],
)
if not pdf_path:
messagebox.showerror("Erro", "Nenhum PDF selecionado.")
return 1
pdf_path = os.path.abspath(pdf_path)
course_name = simpledialog.askstring(
title="Nome do Curso",
prompt="Introduz o nome do curso:",
)
if not course_name:
messagebox.showerror("Erro", "Nome do curso nÃo foi preenchido.")
return 1
year = simpledialog.askstring(
title="Ano",
prompt="Introduz o ano (ex: 2024):",
)
if not year or not year.isdigit():
messagebox.showerror("Erro", "Ano inválido.")
return 1
start_n = norm_text(START_MARKER)
end_n = norm_text(END_MARKER)
with pdfplumber.open(pdf_path) as pdf:
start_page = None
end_page = None
for i, page in enumerate(pdf.pages):
txt = norm_text(page.extract_text() or "")
if start_n in txt:
start_page = i
break
if start_page is None:
raise ValueError(f"Não encontrei o ini­cio: {START_MARKER}")
for j in range(start_page, len(pdf.pages)):
txt = norm_text(pdf.pages[j].extract_text() or "")
if end_n in txt:
end_page = j
break
if end_page is None:
raise ValueError(f"Encontrei o inicio, mas não encontrei o fim: {END_MARKER}")
candidates = []
with pdfplumber.open(pdf_path) as pdf:
for pno in range(start_page, end_page + 1):
page = pdf.pages[pno]
tables = page.extract_tables() or []
for ti, tbl in enumerate(tables, start=1):
if not tbl or len(tbl) < 2:
continue
header = tbl[0]
body = tbl[1:]
df = pd.DataFrame(body, columns=header)
df = normalize_df(df)
r, c = df.shape
if r < 2 or c < 2:
continue
text_n = norm_text(df_flattext(df))
score = 0
if c >= 3:
score += 10
if r >= 4:
score += 10
if pno == start_page:
score += 15
for kw in ["planeamento", "execucao", "formacao", "respostas", "formadores"]:
if kw in text_n:
score += 2
empties = (df == "").sum().sum()
total = r * c
if total and empties / total > 0.6:
score -= 10
candidates.append((score, pno, ti, df))
if not candidates:
raise ValueError("Encontrei o bloco, mas não encontrei tabelas nas páginas desse intervalo.")
candidates.sort(key=lambda x: x[0], reverse=True)
best_score, best_pno, best_ti, best_df = candidates[0]
print(f"Bloco: páginas {start_page+1} até {end_page+1}")
print(f"Tabela escolhida: p{best_pno+1}_t{best_ti} (score={best_score})")
print("Dimensões:", best_df.shape)
rows_config = {
1: [0, 2],
2: [0, 2],
3: [0, 2],
5: [0, 2],
7: [0, 2],
8: [0, 2],
9: [0, 2],
10: [0, 2],
12: [0, 3],
13: [0, 3],
14: [0, 3],
15: [0, 3],
16: [0, 3],
17: [0, 3],
}
new_rows = []
for row_idx, col_idxs in rows_config.items():
values = best_df.iloc[row_idx, col_idxs].tolist()
new_rows.append(values)
new_df = pd.DataFrame(new_rows)
data_dict = dict(zip(new_df[0], new_df[1]))
final_df = pd.DataFrame([data_dict])
final_df.index = [f"{year} - {course_name}"]
final_df = dot_to_comma(final_df)
row_name = f"{year} - {course_name}"
xlsx_path = "BDpowerbi.xlsx"
save_row_if_new(final_df, xlsx_path, row_name, sheet_name="Resultados")
return 0
if __name__ == "__main__":
sys.exit(main())
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.
Binary file not shown.
+38
View File
@@ -0,0 +1,38 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['reportcreator.py'],
pathex=[],
binaries=[],
datas=[('Anexo RAI..docx', '.'), ('OllamaInstall.txt', '.')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='ReportCreator',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,435 @@
This file lists modules PyInstaller was not able to find. This does not
necessarily mean these modules are required for running your program. Both
Python's standard library and 3rd-party Python packages often conditionally
import optional modules, some of which may be available only on certain
platforms.
Types of import:
* top-level: imported at the top-level - look at these first
* conditional: imported within an if-statement
* delayed: imported within a function
* optional: imported within a try-except-statement
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
tracking down the missing module yourself. Thanks!
missing module named pyimod02_importers - imported by C:\Users\17525206\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed), C:\Users\17525206\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgres.py (delayed)
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), http.server (delayed, optional), psutil (optional), netrc (delayed, conditional), getpass (delayed), setuptools._distutils.util (delayed, conditional, optional), setuptools._vendor.backports.tarfile (optional), setuptools._distutils.archive_util (optional)
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), setuptools._vendor.backports.tarfile (optional), setuptools._distutils.archive_util (optional)
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
missing module named fcntl - imported by subprocess (optional)
missing module named urllib.urlopen - imported by urllib (delayed, optional), lxml.html (delayed, optional)
missing module named urllib.urlencode - imported by urllib (delayed, optional), lxml.html (delayed, optional)
missing module named posix - imported by os (conditional, optional), shutil (conditional), importlib._bootstrap_external (conditional), posixpath (optional)
missing module named resource - imported by posix (top-level), IPython.utils.timing (optional)
missing module named _manylinux - imported by packaging._manylinux (delayed, optional), setuptools._vendor.packaging._manylinux (delayed, optional)
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
missing module named _scproxy - imported by urllib.request (conditional)
missing module named termios - imported by tty (top-level), getpass (optional), IPython.core.page (delayed, optional), prompt_toolkit.input.vt100 (top-level)
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.Process - imported by multiprocessing (top-level), jupyter_client.ssh.tunnel (top-level)
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
missing module named annotationlib - imported by typing_extensions (conditional), IPython.lib.pretty (conditional)
missing module named '_typeshed.importlib' - imported by pkg_resources (conditional)
missing module named _typeshed - imported by numpy.random.bit_generator (top-level), prompt_toolkit.eventloop.inputhook (conditional), setuptools._distutils.dist (conditional), setuptools.command.bdist_egg (conditional), setuptools.glob (conditional), setuptools._vendor.wheel.wheelfile (conditional), setuptools.compat.py311 (conditional), pkg_resources (conditional)
missing module named jnius - imported by platformdirs.android (delayed, conditional, optional)
missing module named android - imported by platformdirs.android (delayed, conditional, optional)
missing module named usercustomize - imported by site (delayed, optional)
missing module named sitecustomize - imported by site (delayed, optional)
missing module named readline - imported by cmd (delayed, conditional, optional), code (delayed, conditional, optional), pdb (delayed, optional), pstats (conditional, optional), site (delayed, optional), rlcompleter (optional)
missing module named trove_classifiers - imported by setuptools.config._validate_pyproject.formats (optional)
missing module named setuptools._vendor.backports.zstd - imported by setuptools._vendor.backports (top-level), urllib3.util.request (conditional, optional), urllib3.response (conditional, optional)
missing module named importlib_resources - imported by setuptools._vendor.jaraco.text (optional)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named vms_lib - imported by platform (delayed, optional)
missing module named 'java.lang' - imported by platform (delayed, optional)
missing module named java - imported by platform (delayed)
missing module named _winreg - imported by platform (delayed, optional), pygments.formatters.img (optional)
missing module named collections.Mapping - imported by collections (optional), pytz.lazy (optional), parso.python.tree (optional)
missing module named simplejson - imported by requests.compat (conditional, optional)
missing module named dummy_threading - imported by requests.cookies (optional)
missing module named compression - imported by urllib3.util.request (conditional, optional), urllib3.response (conditional, optional)
missing module named 'h2.events' - imported by urllib3.http2.connection (top-level)
missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level)
missing module named h2 - imported by urllib3.http2.connection (top-level)
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
missing module named socks - imported by urllib3.contrib.socks (optional)
missing module named cryptography - imported by urllib3.contrib.pyopenssl (top-level), requests (conditional, optional)
missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional)
missing module named 'cryptography.x509' - imported by urllib3.contrib.pyopenssl (delayed, optional)
missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
missing module named chardet - imported by pygments.lexer (delayed, conditional, optional), requests (optional)
missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional)
missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level)
missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level)
missing module named htmlentitydefs - imported by lxml.html.soupparser (optional)
missing module named BeautifulSoup - imported by lxml.html.soupparser (optional)
missing module named bs4 - imported by pandas.io.html (delayed), lxml.html.soupparser (optional)
missing module named urlparse - imported by lxml.ElementInclude (optional), lxml.html.html5parser (optional)
missing module named urllib2 - imported by lxml.ElementInclude (optional), lxml.html.html5parser (optional)
missing module named 'html5lib.treebuilders' - imported by lxml.html.html5parser (top-level)
missing module named html5lib - imported by lxml.html._html5builder (top-level), lxml.html.html5parser (top-level)
missing module named 'cython.cimports' - imported by lxml.html.diff (optional), zmq.backend.cython._zmq (top-level)
missing module named cython - imported by lxml.html.diff (optional), lxml.html._difflib (optional), zmq.backend.cython._zmq (top-level)
missing module named lxml_html_clean - imported by lxml.html.clean (optional)
missing module named cssselect - imported by lxml.cssselect (optional)
missing module named six.moves.range - imported by six.moves (top-level), dateutil.rrule (top-level)
runtime module named six.moves - imported by dateutil.tz.tz (top-level), dateutil.tz._factories (top-level), dateutil.tz.win (top-level), dateutil.rrule (top-level)
missing module named dateutil.tz.tzfile - imported by dateutil.tz (top-level), dateutil.zoneinfo (top-level)
missing module named StringIO - imported by six (conditional)
missing module named numexpr - imported by pandas.core.computation.expressions (conditional), pandas.core.computation.engines (delayed)
missing module named numba - imported by pandas.core._numba.executor (delayed, conditional), pandas.core.util.numba_ (delayed, conditional), pandas.core.window.numba_ (delayed, conditional), pandas.core.window.online (delayed, conditional), pandas.core._numba.kernels.mean_ (top-level), pandas.core._numba.kernels.shared (top-level), pandas.core._numba.kernels.sum_ (top-level), pandas.core._numba.kernels.min_max_ (top-level), pandas.core._numba.kernels.var_ (top-level), pandas.core.groupby.numba_ (delayed, conditional), pandas.core._numba.extensions (top-level)
missing module named 'numba.extending' - imported by pandas.core._numba.kernels.sum_ (top-level)
missing module named 'pyarrow.compute' - imported by pandas.core.arrays._arrow_string_mixins (conditional), pandas.core.arrays.string_arrow (conditional), pandas.core.reshape.merge (delayed, conditional), pandas.core.arrays.arrow.array (conditional), pandas.core.arrays.arrow.accessors (conditional)
missing module named 'numba.typed' - imported by pandas.core._numba.extensions (delayed)
missing module named 'numba.core' - imported by pandas.core._numba.extensions (top-level)
missing module named pyarrow - imported by pandas.core.arrays._arrow_string_mixins (conditional), pandas.core.arrays.masked (delayed), pandas.core.arrays.boolean (delayed, conditional), pandas.core.arrays.numeric (delayed, conditional), pandas.core.arrays.arrow._arrow_utils (top-level), pandas.core.interchange.utils (delayed, conditional), pandas.core.strings.accessor (delayed, conditional), pandas.io._util (conditional), pandas.io.parsers.base_parser (delayed, conditional), pandas.core.arrays.interval (delayed), pandas.core.arrays.arrow.extension_types (top-level), pandas.core.arrays.period (delayed), pandas.core.methods.describe (delayed, conditional), pandas.io.sql (delayed, conditional), pandas.core.arrays.string_arrow (conditional), pandas.core.reshape.merge (delayed, conditional), pandas.core.arrays.arrow.array (conditional), pandas.core.interchange.buffer (conditional), pandas.io.feather_format (delayed), pandas.core.indexes.base (delayed, conditional), pandas.core.dtypes.cast (delayed, conditional), pandas.core.arrays.string_ (delayed, conditional), pandas.core.arrays.arrow.accessors (conditional), pandas.core.dtypes.dtypes (delayed, conditional), pandas.compat.pyarrow (optional), pandas.core.reshape.encoding (delayed, conditional), pandas._testing (conditional)
missing module named numpy._core.result_type - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional), numpy.fft._pocketfft (top-level)
missing module named numpy._core.number - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
missing module named numpy._core.object_ - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
missing module named numpy._core.max - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
missing module named numpy._core.isnan - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
missing module named numpy._core.inf - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
missing module named numpy._core.errstate - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
missing module named numpy._core.array2string - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
missing module named numpy._core.all - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
missing module named numpy._core.signbit - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
missing module named numpy._core.isscalar - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy.lib._polynomial_impl (top-level), numpy (conditional)
missing module named win32pdh - imported by numpy.testing._private.utils (delayed, conditional)
missing module named numpy._core.ndarray - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy.lib._utils_impl (top-level), numpy (conditional)
missing module named numpy._core.isnat - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
missing module named numpy._core.intp - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy._array_api_info (top-level)
missing module named numpy._core.float32 - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy._array_api_info (top-level)
missing module named numpy._core.empty - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy.fft._helper (top-level)
missing module named numpy._core.array_repr - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
missing module named numpy._core.array - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
missing module named numpy._core.arange - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy.fft._helper (top-level)
missing module named numpy._core.void - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.vecmat - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.ushort - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.unsignedinteger - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.ulonglong - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.ulong - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.uintp - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.uintc - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.uint64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
missing module named numpy._core.uint32 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
missing module named numpy._core.uint16 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
missing module named numpy._core.uint - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.ubyte - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.trunc - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.true_divide - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.timedelta64 - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.tanh - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.tan - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.subtract - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.str_ - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.square - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.spacing - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.sinh - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.signedinteger - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.short - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.rint - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.right_shift - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.remainder - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.radians - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.rad2deg - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.power - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.positive - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.pi - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.not_equal - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.nextafter - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.negative - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.modf - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.mod - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.minimum - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.maximum - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.matvec - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.longlong - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.longdouble - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.long - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.logical_xor - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.logical_or - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.logical_not - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.logical_and - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.logaddexp2 - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.logaddexp - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.log10 - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.log2 - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.log1p - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.log - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.less_equal - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.less - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.left_shift - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.ldexp - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.lcm - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.integer - imported by numpy._core (conditional), numpy (conditional), numpy.fft._helper (top-level)
missing module named numpy._core.int64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
missing module named numpy._core.int32 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
missing module named numpy._core.int16 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
missing module named numpy._core.int8 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
missing module named numpy._core.hypot - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.heaviside - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.half - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.greater_equal - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.greater - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.gcd - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.frompyfunc - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.frexp - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.fmod - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.fmin - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.fmax - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.floor_divide - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.floor - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.floating - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.float_power - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.float16 - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.fabs - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.expm1 - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.exp2 - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.exp - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.euler_gamma - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.equal - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.e - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.divmod - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.degrees - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.deg2rad - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.datetime64 - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.cosh - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.cos - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.copysign - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.conjugate - imported by numpy._core (conditional), numpy (conditional), numpy.fft._pocketfft (top-level)
missing module named numpy._core.conj - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.complex64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
missing module named numpy._core.clongdouble - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.character - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.ceil - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.cbrt - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.bytes_ - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.byte - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.bool_ - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.bitwise_xor - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.bitwise_or - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.bitwise_count - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.bitwise_and - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.arctanh - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.arctan2 - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.arctan - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.arcsinh - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.arcsin - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.arccosh - imported by numpy._core (conditional), numpy (conditional)
missing module named numpy._core.arccos - imported by numpy._core (conditional), numpy (conditional)
missing module named _dummy_thread - imported by numpy._core.arrayprint (optional)
missing module named threadpoolctl - imported by numpy.lib._utils_impl (delayed, optional)
missing module named numpy._core.vstack - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), numpy (conditional)
missing module named numpy._core.atleast_3d - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), numpy (conditional)
missing module named numpy._core.ones - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
missing module named numpy._core.hstack - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
missing module named numpy._core.atleast_1d - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
missing module named numpy._core.linspace - imported by numpy._core (top-level), numpy.lib._index_tricks_impl (top-level), numpy (conditional)
missing module named numpy._core.iinfo - imported by numpy._core (top-level), numpy.lib._twodim_base_impl (top-level), numpy (conditional)
missing module named numpy._core.zeros - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.vecdot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.transpose - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._function_base_impl (top-level), numpy (conditional)
missing module named numpy._core.trace - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.tensordot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.swapaxes - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.sum - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.sqrt - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
missing module named numpy._core.sort - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.single - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.sign - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.reciprocal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
missing module named numpy._core.prod - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.outer - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.newaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.multiply - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.moveaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.matrix_transpose - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.matmul - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.isfinite - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.intc - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.inexact - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.finfo - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
missing module named numpy._core.empty_like - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
missing module named numpy._core.double - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.dot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
missing module named numpy._core.divide - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.diagonal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.csingle - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.cross - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.count_nonzero - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.complexfloating - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.cdouble - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.atleast_2d - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.asarray - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._array_utils_impl (top-level), numpy (conditional), numpy.fft._helper (top-level), numpy.fft._pocketfft (top-level)
missing module named numpy._core.asanyarray - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.argsort - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.amin - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.amax - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named numpy._core.add - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
missing module named 'scipy.stats' - imported by pandas.core.nanops (delayed, conditional)
missing module named scipy - imported by pandas.core.dtypes.common (delayed, conditional, optional), pandas.core.missing (delayed)
missing module named 'yapf.yapflib' - imported by IPython.terminal.interactiveshell (delayed)
missing module named yapf - imported by IPython.terminal.interactiveshell (delayed)
missing module named black - imported by IPython.terminal.interactiveshell (delayed)
missing module named jupyter_ai - imported by IPython.terminal.shortcuts.auto_suggest (delayed, optional)
missing module named jupyter_ai_magics - imported by IPython.terminal.shortcuts.auto_suggest (delayed, optional)
missing module named prompt_toolkit.filters.vi_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.document (top-level), prompt_toolkit.widgets.toolbars (top-level), prompt_toolkit.key_binding.bindings.page_navigation (top-level), IPython.terminal.shortcuts.filters (top-level)
missing module named prompt_toolkit.filters.control_is_searchable - imported by prompt_toolkit.filters (top-level), prompt_toolkit.key_binding.bindings.search (top-level)
missing module named prompt_toolkit.filters.vi_insert_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.layout.containers (top-level), prompt_toolkit.key_binding.bindings.basic (top-level), IPython.terminal.shortcuts.filters (top-level)
missing module named prompt_toolkit.filters.emacs_insert_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.layout.containers (top-level), prompt_toolkit.key_binding.bindings.basic (top-level), prompt_toolkit.key_binding.bindings.emacs (top-level), IPython.terminal.shortcuts.filters (top-level)
missing module named prompt_toolkit.filters.is_done - imported by prompt_toolkit.filters (top-level), prompt_toolkit.shortcuts.choice_input (top-level), prompt_toolkit.widgets.base (top-level), prompt_toolkit.shortcuts.progress_bar.base (top-level), prompt_toolkit.shortcuts.prompt (top-level), prompt_toolkit.layout.menus (top-level)
missing module named prompt_toolkit.filters.has_completions - imported by prompt_toolkit.filters (top-level), prompt_toolkit.widgets.toolbars (top-level), prompt_toolkit.widgets.dialogs (top-level), prompt_toolkit.layout.menus (top-level), IPython.terminal.shortcuts.filters (top-level)
missing module named prompt_toolkit.filters.is_searching - imported by prompt_toolkit.filters (top-level), prompt_toolkit.key_binding.bindings.vi (top-level), prompt_toolkit.search (top-level), prompt_toolkit.key_binding.bindings.search (top-level)
missing module named prompt_toolkit.filters.is_read_only - imported by prompt_toolkit.filters (top-level), prompt_toolkit.key_binding.bindings.vi (top-level), prompt_toolkit.key_binding.bindings.emacs (top-level)
missing module named prompt_toolkit.filters.has_arg - imported by prompt_toolkit.filters (top-level), prompt_toolkit.key_binding.bindings.vi (top-level), prompt_toolkit.widgets.toolbars (top-level), prompt_toolkit.key_binding.bindings.emacs (top-level), prompt_toolkit.shortcuts.prompt (top-level)
missing module named prompt_toolkit.filters.vi_search_direction_reversed - imported by prompt_toolkit.filters (top-level), prompt_toolkit.key_binding.bindings.emacs (top-level)
missing module named prompt_toolkit.filters.shift_selection_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.key_binding.bindings.emacs (top-level)
missing module named prompt_toolkit.filters.is_multiline - imported by prompt_toolkit.filters (top-level), prompt_toolkit.key_binding.bindings.basic (top-level), prompt_toolkit.key_binding.bindings.emacs (top-level)
missing module named prompt_toolkit.filters.in_paste_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.key_binding.bindings.basic (top-level), prompt_toolkit.key_binding.bindings.emacs (top-level)
missing module named prompt_toolkit.filters.has_selection - imported by prompt_toolkit.filters (top-level), prompt_toolkit.key_binding.bindings.basic (top-level), prompt_toolkit.key_binding.bindings.emacs (top-level), prompt_toolkit.key_binding.bindings.open_in_editor (top-level), IPython.terminal.shortcuts.filters (top-level)
missing module named prompt_toolkit.filters.emacs_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.widgets.toolbars (top-level), prompt_toolkit.key_binding.bindings.emacs (top-level), prompt_toolkit.key_binding.bindings.auto_suggest (top-level), prompt_toolkit.key_binding.bindings.open_in_editor (top-level), prompt_toolkit.key_binding.bindings.page_navigation (top-level)
missing module named prompt_toolkit.filters.buffer_has_focus - imported by prompt_toolkit.filters (top-level), prompt_toolkit.key_binding.defaults (top-level), prompt_toolkit.key_binding.bindings.page_navigation (top-level)
missing module named prompt_toolkit.filters.vi_navigation_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.widgets.toolbars (top-level), prompt_toolkit.key_binding.bindings.open_in_editor (top-level)
missing module named prompt_toolkit.filters.has_validation_error - imported by prompt_toolkit.filters (top-level), prompt_toolkit.widgets.toolbars (top-level)
missing module named pygments.lexers.PrologLexer - imported by pygments.lexers (top-level), pygments.lexers.cplint (top-level)
missing module named PIL - imported by matplotlib_inline.config (delayed, optional), openpyxl.drawing.image (optional), pygments.formatters.img (optional)
missing module named ctags - imported by pygments.formatters.html (optional)
missing module named pygments.formatters.LatexFormatter - imported by pygments.formatters (delayed), IPython.lib.display (delayed)
missing module named pygments.formatters.HtmlFormatter - imported by pygments.formatters (delayed), IPython.lib.display (delayed), IPython.core.oinspect (top-level), stack_data.core (delayed)
missing module named pygments.lexers.PythonLexer - imported by pygments.lexers (top-level), IPython.core.oinspect (top-level)
missing module named prompt_toolkit.filters.renderer_height_is_known - imported by prompt_toolkit.filters (top-level), prompt_toolkit.shortcuts.choice_input (top-level), prompt_toolkit.shortcuts.progress_bar.base (top-level), prompt_toolkit.shortcuts.prompt (top-level)
missing module named prompt_toolkit.filters.has_focus - imported by prompt_toolkit.filters (top-level), prompt_toolkit.widgets.base (top-level), prompt_toolkit.widgets.toolbars (top-level), prompt_toolkit.widgets.dialogs (top-level), prompt_toolkit.shortcuts.prompt (top-level), IPython.terminal.shortcuts.filters (top-level)
missing module named win32clipboard - imported by IPython.lib.clipboard (delayed, optional)
missing module named numpydoc - imported by jedi.inference.docstrings (delayed)
missing module named sqlite3.OperationalError - imported by sqlite3 (optional), IPython.core.history (optional)
missing module named sqlite3.DatabaseError - imported by sqlite3 (optional), IPython.core.history (optional)
missing module named 'IPython.config' - imported by IPython.core.history (conditional)
missing module named sip - imported by IPython.external.qt_loaders (delayed, optional)
missing module named 'nbformat.sign' - imported by IPython.core.magics.basic (delayed)
missing module named nbformat - imported by IPython.core.magics.basic (delayed), IPython.core.interactiveshell (delayed, conditional)
missing module named traitlets.config.Application - imported by traitlets.config (delayed, conditional), traitlets.log (delayed, conditional), ipykernel.kernelspec (top-level)
missing module named argcomplete - imported by traitlets.config.loader (delayed, optional), traitlets.config.argcomplete_config (optional), IPython.core.tips (optional)
missing module named win32evtlog - imported by logging.handlers (delayed, optional)
missing module named win32evtlogutil - imported by logging.handlers (delayed, optional)
missing module named prompt_toolkit.filters.vi_insert_multiple_mode - imported by prompt_toolkit.filters (top-level), prompt_toolkit.layout.processors (top-level)
missing module named pexpect - imported by IPython.utils._process_posix (delayed, conditional), jupyter_client.ssh.tunnel (optional)
missing module named System - imported by IPython.utils._process_cli (top-level)
missing module named clr - imported by IPython.utils._process_cli (top-level)
missing module named trio - imported by IPython.core.async_helpers (delayed), ipykernel.trio_runner (top-level)
missing module named curio - imported by IPython.core.async_helpers (delayed)
missing module named pytest - imported by executing._pytest_utils (delayed, optional), pandas._testing._io (delayed), pandas._testing (delayed)
missing module named 'astroid.node_classes' - imported by asttokens.astroid_compat (optional)
missing module named 'astroid.nodes' - imported by asttokens.astroid_compat (optional), asttokens.util (optional)
missing module named astroid - imported by asttokens.astroid_compat (optional)
missing module named _curses - imported by curses (top-level), curses.has_key (top-level)
missing module named 'matplotlib.figure' - imported by matplotlib_inline.backend_inline (top-level), pandas.plotting._misc (conditional)
missing module named 'matplotlib.backends' - imported by matplotlib_inline.backend_inline (top-level)
missing module named 'matplotlib._pylab_helpers' - imported by matplotlib_inline.backend_inline (top-level)
missing module named matplotlib - imported by matplotlib_inline.backend_inline (top-level), pandas.io.formats.style (optional)
missing module named docrepr - imported by IPython.core.interactiveshell (optional)
missing module named cPickle - imported by IPython.external.pickleshare (optional)
missing module named netifaces - imported by jupyter_client.localinterfaces (delayed)
missing module named msgpack - imported by jupyter_client.session (optional)
missing module named orjson - imported by jupyter_client.session (optional)
missing module named gevent - imported by zmq.green.core (top-level), zmq.green.poll (top-level)
missing module named 'gevent.core' - imported by zmq.green.core (delayed, optional)
missing module named 'gevent.hub' - imported by zmq.green.core (top-level)
missing module named 'gevent.event' - imported by zmq.green.core (top-level)
missing module named zmq.backend.zmq_version_info - imported by zmq.backend (top-level), zmq.sugar.version (top-level)
missing module named zmq.backend.Frame - imported by zmq.backend (top-level), zmq.sugar.frame (top-level), zmq.sugar.tracker (top-level)
missing module named cffi - imported by zmq.utils.interop (delayed, optional)
missing module named zmq.backend.Socket - imported by zmq.backend (top-level), zmq.sugar.socket (top-level)
missing module named zmq.backend.zmq_poll - imported by zmq.backend (top-level), zmq.sugar.poll (top-level)
missing module named pyczmq - imported by zmq.sugar.context (delayed)
missing module named zmq.backend.Context - imported by zmq.backend (top-level), zmq.sugar.context (top-level)
missing module named zmq.backend.proxy - imported by zmq.backend (top-level), zmq.sugar (top-level)
missing module named zmq.ZMQError - imported by zmq (delayed, optional), zmq.sugar.attrsettr (delayed, optional)
missing module named zmq.backend.zmq_errno - imported by zmq.backend (delayed), zmq.error (delayed, conditional)
missing module named zmq.backend.strerror - imported by zmq.backend (delayed), zmq.error (delayed)
missing module named zmq.zmq_version_info - imported by zmq (delayed, conditional), zmq.error (delayed, conditional)
missing module named zmq.zmq_version - imported by zmq (delayed, conditional), zmq.error (delayed, conditional)
missing module named _subprocess - imported by jupyter_client.launcher (delayed, conditional, optional), ipykernel.parentpoller (delayed, optional)
missing module named paramiko - imported by jupyter_client.ssh.tunnel (optional)
missing module named win32security - imported by jupyter_core.paths (delayed)
missing module named ntsecuritycon - imported by jupyter_core.paths (delayed)
missing module named win32api - imported by jupyter_core.paths (delayed, optional)
missing module named ipykernel.get_connection_info - imported by ipykernel (top-level), ipykernel.zmqshell (top-level)
missing module named ipykernel.get_connection_file - imported by ipykernel (top-level), ipykernel.zmqshell (top-level)
missing module named ipykernel.connect_qtconsole - imported by ipykernel (top-level), ipykernel.zmqshell (top-level)
missing module named PySide6 - imported by ipykernel.eventloops (delayed, conditional, optional)
missing module named PyQt6 - imported by ipykernel.eventloops (delayed, conditional, optional)
missing module named PySide2 - imported by ipykernel.eventloops (delayed, conditional, optional)
missing module named PyQt5 - imported by ipykernel.eventloops (delayed, conditional, optional)
missing module named 'gi.repository' - imported by ipykernel.gui.gtk3embed (top-level)
missing module named gi - imported by ipykernel.gui.gtk3embed (top-level)
missing module named gtk - imported by ipykernel.gui.gtkembed (top-level)
missing module named gobject - imported by ipykernel.gui.gtkembed (top-level)
missing module named wx - imported by ipykernel.eventloops (delayed), IPython.lib.guisupport (delayed)
missing module named ipykernel.serialize - imported by ipykernel.ipkernel (delayed, optional)
missing module named ipyparallel - imported by ipykernel.ipkernel (delayed, optional)
missing module named appnope - imported by ipykernel.ipkernel (delayed, conditional)
missing module named '_pydevd_bundle.pydevd_api' - imported by ipykernel.debugger (delayed)
missing module named '_pydevd_bundle.pydevd_suspended_frames' - imported by ipykernel.debugger (optional)
missing module named _pydevd_bundle - imported by debugpy._vendored.force_pydevd (top-level), debugpy.server.cli (top-level), ipykernel.debugger (optional)
missing module named pydevd_file_utils - imported by debugpy.server.api (top-level)
missing module named '_pydevd_bundle.pydevd_constants' - imported by debugpy.server.api (top-level)
missing module named add_code_to_python_process - imported by debugpy.server.cli (delayed, optional)
missing module named pydevd - imported by debugpy._vendored.force_pydevd (top-level), debugpy.server.api (top-level), debugpy.server.cli (top-level)
missing module named xlsxwriter - imported by pandas.io.excel._xlsxwriter (delayed)
missing module named defusedxml - imported by openpyxl.xml (delayed, optional)
missing module named 'defusedxml.ElementTree' - imported by openpyxl.xml.functions (conditional)
missing module named openpyxl.tests - imported by openpyxl.reader.excel (optional)
missing module named 'odf.config' - imported by pandas.io.excel._odswriter (delayed)
missing module named 'odf.style' - imported by pandas.io.excel._odswriter (delayed)
missing module named 'odf.text' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
missing module named 'odf.table' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
missing module named 'odf.opendocument' - imported by pandas.io.excel._odfreader (delayed), pandas.io.excel._odswriter (delayed)
missing module named xlrd - imported by pandas.io.excel._xlrd (delayed, conditional), pandas.io.excel._base (delayed, conditional)
missing module named pyxlsb - imported by pandas.io.excel._pyxlsb (delayed, conditional)
missing module named 'odf.office' - imported by pandas.io.excel._odfreader (delayed)
missing module named 'odf.element' - imported by pandas.io.excel._odfreader (delayed)
missing module named 'odf.namespaces' - imported by pandas.io.excel._odfreader (delayed)
missing module named odf - imported by pandas.io.excel._odfreader (conditional)
missing module named python_calamine - imported by pandas.io.excel._calamine (delayed, conditional)
missing module named 'matplotlib.pyplot' - imported by pandas.io.formats.style (optional)
missing module named 'matplotlib.colors' - imported by pandas.plotting._misc (conditional), pandas.io.formats.style (conditional)
missing module named markupsafe - imported by pandas.io.formats.style_render (top-level)
missing module named botocore - imported by pandas.io.common (delayed, conditional, optional)
missing module named sets - imported by pytz.tzinfo (optional)
missing module named UserDict - imported by pytz.lazy (optional)
missing module named 'scipy.sparse' - imported by pandas.core.arrays.sparse.array (conditional), pandas.core.arrays.sparse.scipy_sparse (delayed, conditional), pandas.core.arrays.sparse.accessor (delayed)
missing module named pandas.core.internals.Block - imported by pandas.core.internals (conditional), pandas.io.pytables (conditional)
missing module named Foundation - imported by pandas.io.clipboard (delayed, conditional, optional)
missing module named AppKit - imported by pandas.io.clipboard (delayed, conditional, optional)
missing module named PyQt4 - imported by pandas.io.clipboard (delayed, conditional, optional)
missing module named qtpy - imported by pandas.io.clipboard (delayed, conditional, optional)
missing module named 'sqlalchemy.engine' - imported by pandas.io.sql (delayed)
missing module named 'sqlalchemy.types' - imported by pandas.io.sql (delayed, conditional)
missing module named 'sqlalchemy.schema' - imported by pandas.io.sql (delayed)
missing module named 'sqlalchemy.sql' - imported by pandas.io.sql (conditional)
missing module named sqlalchemy - imported by pandas.io.sql (delayed, conditional)
missing module named tables - imported by pandas.io.pytables (delayed, conditional)
missing module named 'pyarrow.fs' - imported by pandas.io.orc (conditional)
missing module named fsspec - imported by pandas.io.orc (conditional)
missing module named 'pyarrow.parquet' - imported by pandas.io.parquet (delayed)
missing module named google - imported by pandas.io.gbq (conditional)
missing module named 'numpy_distutils.cpuinfo' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
missing module named 'numpy_distutils.fcompiler' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
missing module named 'numpy_distutils.command' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
missing module named numpy_distutils - imported by numpy.f2py.diagnose (delayed, optional)
missing module named numpy.random.RandomState - imported by numpy.random (top-level), numpy.random._generator (top-level)
missing module named yaml - imported by numpy.__config__ (delayed)
missing module named numpy._distributor_init_local - imported by numpy (optional), numpy._distributor_init (optional)
missing module named 'matplotlib.axes' - imported by pandas.plotting._core (conditional), pandas.plotting._misc (conditional), pandas._testing.asserters (delayed)
missing module named 'matplotlib.artist' - imported by pandas._testing.asserters (delayed)
missing module named 'matplotlib.table' - imported by pandas.plotting._misc (conditional)
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.