Compare commits
4 Commits
2bd94c4441
...
209b5fb1aa
| Author | SHA1 | Date | |
|---|---|---|---|
| 209b5fb1aa | |||
| 904356f4e8 | |||
| 7203a81af7 | |||
| dd3b9bd59d |
@@ -48,6 +48,7 @@ __all__ = [
|
|||||||
# Shared chrome / pickup
|
# Shared chrome / pickup
|
||||||
"back_to_home_link",
|
"back_to_home_link",
|
||||||
"render_sticky_footer",
|
"render_sticky_footer",
|
||||||
|
"render_tool_header",
|
||||||
"hide_streamlit_chrome",
|
"hide_streamlit_chrome",
|
||||||
"html_download_button",
|
"html_download_button",
|
||||||
"local_download_button",
|
"local_download_button",
|
||||||
|
|||||||
@@ -335,6 +335,55 @@ body, .stApp {
|
|||||||
box-shadow: none !important;
|
box-shadow: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ---------- Section header expand indicator ----------
|
||||||
|
Swap Streamlit's default ``expand_more`` chevron in each sidebar
|
||||||
|
section header for a soft ``+`` / ``−`` pair. ``+`` when collapsed,
|
||||||
|
``−`` (U+2212, visually balanced with +) when expanded.
|
||||||
|
|
||||||
|
We hide any built-in icon Streamlit injects (svg or Material
|
||||||
|
Symbols span — exact element differs by Streamlit version) and
|
||||||
|
render our own glyph as a right-aligned pseudo-element keyed off
|
||||||
|
``aria-expanded``. The button itself gets a touch of right padding
|
||||||
|
so the label doesn't run into the indicator. */
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button {
|
||||||
|
width: 100% !important;
|
||||||
|
padding-right: 22px !important;
|
||||||
|
background: transparent !important;
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button svg,
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button [data-testid="stIconMaterial"],
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button span.material-symbols-rounded,
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button span.material-symbols-outlined,
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button span.material-icons,
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button span.material-icons-outlined {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button[aria-expanded]::after {
|
||||||
|
position: absolute;
|
||||||
|
right: 8px;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 1;
|
||||||
|
color: var(--ink-tertiary);
|
||||||
|
transition: color 0.15s ease;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button[aria-expanded="false"]::after {
|
||||||
|
content: "+";
|
||||||
|
}
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button[aria-expanded="true"]::after {
|
||||||
|
content: "\2212";
|
||||||
|
}
|
||||||
|
[data-testid="stSidebarNavSectionHeader"] button:hover::after {
|
||||||
|
color: var(--ink) !important;
|
||||||
|
}
|
||||||
|
|
||||||
/* Inline + block code → mono with subtle accent chip. theme.py owns
|
/* Inline + block code → mono with subtle accent chip. theme.py owns
|
||||||
the family + size; this layer adds the warm-fill background. */
|
the family + size; this layer adds the warm-fill background. */
|
||||||
[data-testid="stMarkdownContainer"] code {
|
[data-testid="stMarkdownContainer"] code {
|
||||||
@@ -2042,6 +2091,40 @@ a[data-testid="stPageLink-NavLink"][href*="close"] {
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def render_tool_header(tool_id: str) -> None:
|
||||||
|
"""Title row with an inline Help popover anchored to the right.
|
||||||
|
|
||||||
|
Replaces the bare ``st.title(...)`` + ``st.caption(...)`` block on
|
||||||
|
each tool page. Help content is one markdown blob per tool in the
|
||||||
|
i18n pack (``tools.<id>.help_md``) so editors can tweak copy without
|
||||||
|
touching Python. The popover is anchored next to the title rather
|
||||||
|
than the caption so it reads as part of the page header.
|
||||||
|
|
||||||
|
Layout: ``[title | help button]`` over ``[caption]``. The help
|
||||||
|
column is narrow; the title gets the rest. Vertical alignment is
|
||||||
|
left to Streamlit's column default (top) — works on 1.35+ without
|
||||||
|
the ``vertical_alignment`` kwarg that landed later.
|
||||||
|
"""
|
||||||
|
col_title, col_help = st.columns([10, 1])
|
||||||
|
with col_title:
|
||||||
|
st.title(_t(f"tools.{tool_id}.page_title"))
|
||||||
|
with col_help:
|
||||||
|
# Spacer pushes the popover button down so it sits closer to
|
||||||
|
# the title's baseline than to its top — without the spacer the
|
||||||
|
# button floats above the big title text.
|
||||||
|
st.write("")
|
||||||
|
body = _t(f"tools.{tool_id}.help_md")
|
||||||
|
if body.startswith("tools."):
|
||||||
|
body = _t("help.missing_body")
|
||||||
|
with st.popover(
|
||||||
|
_t("help.button_label"),
|
||||||
|
icon=":material/help_outline:",
|
||||||
|
use_container_width=True,
|
||||||
|
):
|
||||||
|
st.markdown(body)
|
||||||
|
st.caption(_t(f"tools.{tool_id}.page_caption"))
|
||||||
|
|
||||||
|
|
||||||
def _render_sticky_footer_DISABLED() -> None:
|
def _render_sticky_footer_DISABLED() -> None:
|
||||||
"""Slim fixed-position footer at the bottom of the viewport.
|
"""Slim fixed-position footer at the bottom of the viewport.
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ from src.gui.components import (
|
|||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
html_download_button,
|
html_download_button,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
)
|
)
|
||||||
from src.pdf_extract import (
|
from src.pdf_extract import (
|
||||||
PdfDependencyMissing,
|
PdfDependencyMissing,
|
||||||
@@ -103,13 +104,7 @@ def _format_size(n_bytes: int) -> str:
|
|||||||
# Header + dep guard
|
# Header + dep guard
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.markdown("# PDF to CSV")
|
render_tool_header("10_pdf_extractor")
|
||||||
st.caption(
|
|
||||||
"Scan bank-statement PDFs for transaction rows "
|
|
||||||
"(``[date] [description] [amount]``). Review the table, uncheck "
|
|
||||||
"rows you don't want, edit any cell that needs fixing, then "
|
|
||||||
"download as CSV. No per-bank setup."
|
|
||||||
)
|
|
||||||
|
|
||||||
_pdf_ok, _pdf_missing = _pdf_deps_status()
|
_pdf_ok, _pdf_missing = _pdf_deps_status()
|
||||||
if not _pdf_ok:
|
if not _pdf_ok:
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ from src.gui.components import (
|
|||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
html_download_button,
|
html_download_button,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
)
|
)
|
||||||
from src.core.reconcile import ReconcileOptions, reconcile
|
from src.core.reconcile import ReconcileOptions, reconcile
|
||||||
|
|
||||||
@@ -38,12 +39,7 @@ log_page_open("11_Reconciler")
|
|||||||
# Header
|
# Header
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.title("Reconcile Two Files")
|
render_tool_header("11_reconciler")
|
||||||
st.caption(
|
|
||||||
"Match transactions between two sources (e.g. bank feed vs. ledger). "
|
|
||||||
"Outputs four buckets: matched, unmatched-left, unmatched-right, and "
|
|
||||||
"ambiguous-for-review."
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ from src.gui.components import (
|
|||||||
apply_review_decisions,
|
apply_review_decisions,
|
||||||
back_to_home_link,
|
back_to_home_link,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
config_panel,
|
config_panel,
|
||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
html_download_button,
|
html_download_button,
|
||||||
@@ -60,8 +61,7 @@ for key, default in _DEFAULTS.items():
|
|||||||
# Header
|
# Header
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.title(t("tools.01_deduplicator.page_title"))
|
render_tool_header("01_deduplicator")
|
||||||
st.caption(t("tools.01_deduplicator.page_caption"))
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ if str(_project_root) not in sys.path:
|
|||||||
from src.gui.components import (
|
from src.gui.components import (
|
||||||
back_to_home_link,
|
back_to_home_link,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
html_download_button,
|
html_download_button,
|
||||||
pickup_or_upload,
|
pickup_or_upload,
|
||||||
@@ -45,8 +46,7 @@ require_feature_or_render_upgrade(FeatureFlag.TEXT_CLEANER)
|
|||||||
# Header
|
# Header
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.title(t("tools.02_text_cleaner.page_title"))
|
render_tool_header("02_text_cleaner")
|
||||||
st.caption(t("tools.02_text_cleaner.page_caption"))
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# File upload
|
# File upload
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ if str(_project_root) not in sys.path:
|
|||||||
from src.gui.components import (
|
from src.gui.components import (
|
||||||
back_to_home_link,
|
back_to_home_link,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
html_download_button,
|
html_download_button,
|
||||||
pickup_or_upload,
|
pickup_or_upload,
|
||||||
@@ -43,8 +44,7 @@ require_feature_or_render_upgrade(FeatureFlag.FORMAT_STANDARDIZER)
|
|||||||
# Header
|
# Header
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.title(t("tools.03_format_standardizer.page_title"))
|
render_tool_header("03_format_standardizer")
|
||||||
st.caption(t("tools.03_format_standardizer.page_caption"))
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ if str(_project_root) not in sys.path:
|
|||||||
from src.gui.components import (
|
from src.gui.components import (
|
||||||
back_to_home_link,
|
back_to_home_link,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
html_download_button,
|
html_download_button,
|
||||||
pickup_or_upload,
|
pickup_or_upload,
|
||||||
@@ -44,8 +45,7 @@ require_feature_or_render_upgrade(FeatureFlag.MISSING_HANDLER)
|
|||||||
# Header
|
# Header
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.title(t("tools.04_missing_handler.page_title"))
|
render_tool_header("04_missing_handler")
|
||||||
st.caption(t("tools.04_missing_handler.page_caption"))
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ if str(_project_root) not in sys.path:
|
|||||||
from src.gui.components import (
|
from src.gui.components import (
|
||||||
back_to_home_link,
|
back_to_home_link,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
html_download_button,
|
html_download_button,
|
||||||
pickup_or_upload,
|
pickup_or_upload,
|
||||||
@@ -45,8 +46,7 @@ require_feature_or_render_upgrade(FeatureFlag.COLUMN_MAPPER)
|
|||||||
# Header
|
# Header
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.title(t("tools.05_column_mapper.page_title"))
|
render_tool_header("05_column_mapper")
|
||||||
st.caption(t("tools.05_column_mapper.page_caption"))
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ if str(_project_root) not in sys.path:
|
|||||||
from src.gui.components import (
|
from src.gui.components import (
|
||||||
back_to_home_link,
|
back_to_home_link,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
require_feature_or_render_upgrade,
|
require_feature_or_render_upgrade,
|
||||||
)
|
)
|
||||||
@@ -31,8 +32,7 @@ require_feature_or_render_upgrade(FeatureFlag.OUTLIER_DETECTOR)
|
|||||||
# Header
|
# Header
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.title(t("tools.06_outlier_detector.page_title"))
|
render_tool_header("06_outlier_detector")
|
||||||
st.caption(t("tools.06_outlier_detector.page_caption"))
|
|
||||||
|
|
||||||
st.info("This tool is under development.")
|
st.info("This tool is under development.")
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ if str(_project_root) not in sys.path:
|
|||||||
from src.gui.components import (
|
from src.gui.components import (
|
||||||
back_to_home_link,
|
back_to_home_link,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
require_feature_or_render_upgrade,
|
require_feature_or_render_upgrade,
|
||||||
)
|
)
|
||||||
@@ -31,8 +32,7 @@ require_feature_or_render_upgrade(FeatureFlag.MULTI_FILE_MERGER)
|
|||||||
# Header
|
# Header
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.title(t("tools.07_multi_file_merger.page_title"))
|
render_tool_header("07_multi_file_merger")
|
||||||
st.caption(t("tools.07_multi_file_merger.page_caption"))
|
|
||||||
|
|
||||||
st.info("This tool is under development.")
|
st.info("This tool is under development.")
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ if str(_project_root) not in sys.path:
|
|||||||
from src.gui.components import (
|
from src.gui.components import (
|
||||||
back_to_home_link,
|
back_to_home_link,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
require_feature_or_render_upgrade,
|
require_feature_or_render_upgrade,
|
||||||
)
|
)
|
||||||
@@ -31,8 +32,7 @@ require_feature_or_render_upgrade(FeatureFlag.VALIDATOR_REPORTER)
|
|||||||
# Header
|
# Header
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.title(t("tools.08_validator_reporter.page_title"))
|
render_tool_header("08_validator_reporter")
|
||||||
st.caption(t("tools.08_validator_reporter.page_caption"))
|
|
||||||
|
|
||||||
st.info("This tool is under development.")
|
st.info("This tool is under development.")
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ if str(_project_root) not in sys.path:
|
|||||||
from src.gui.components import (
|
from src.gui.components import (
|
||||||
back_to_home_link,
|
back_to_home_link,
|
||||||
render_sticky_footer,
|
render_sticky_footer,
|
||||||
|
render_tool_header,
|
||||||
hide_streamlit_chrome,
|
hide_streamlit_chrome,
|
||||||
html_download_button,
|
html_download_button,
|
||||||
pickup_or_upload,
|
pickup_or_upload,
|
||||||
@@ -46,8 +47,7 @@ require_feature_or_render_upgrade(FeatureFlag.PIPELINE_RUNNER)
|
|||||||
# Header
|
# Header
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
st.title(t("tools.09_pipeline_runner.page_title"))
|
render_tool_header("09_pipeline_runner")
|
||||||
st.caption(t("tools.09_pipeline_runner.page_caption"))
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -52,7 +52,8 @@ TOOLS: list[Tool] = [
|
|||||||
icon=":material/help_outline:",
|
icon=":material/help_outline:",
|
||||||
name="Fix Missing Values",
|
name="Fix Missing Values",
|
||||||
description=(
|
description=(
|
||||||
"Detect disguised nulls, missingness analysis, and imputation strategies."
|
"Find blank cells (even ones written as 'N/A' or '?') and fill "
|
||||||
|
"them in or remove them."
|
||||||
),
|
),
|
||||||
page_slug="4_Missing_Values",
|
page_slug="4_Missing_Values",
|
||||||
status="Ready",
|
status="Ready",
|
||||||
@@ -63,8 +64,8 @@ TOOLS: list[Tool] = [
|
|||||||
icon=":material/insights:",
|
icon=":material/insights:",
|
||||||
name="Find Unusual Values",
|
name="Find Unusual Values",
|
||||||
description=(
|
description=(
|
||||||
"Z-score, IQR, and MAD detection with domain-rule violations and "
|
"Spot values that look wrong — way too high, way too low, or "
|
||||||
"winsorization."
|
"breaking your rules."
|
||||||
),
|
),
|
||||||
page_slug="6_Outlier_Detector",
|
page_slug="6_Outlier_Detector",
|
||||||
status="Coming Soon",
|
status="Coming Soon",
|
||||||
@@ -75,8 +76,8 @@ TOOLS: list[Tool] = [
|
|||||||
icon=":material/text_format:",
|
icon=":material/text_format:",
|
||||||
name="Clean Text",
|
name="Clean Text",
|
||||||
description=(
|
description=(
|
||||||
"Whitespace trim, multi-space collapse, Unicode normalization, "
|
"Trim extra spaces and strip out odd characters that copy-paste "
|
||||||
"BOM and line-ending handling."
|
"leaves behind."
|
||||||
),
|
),
|
||||||
page_slug="2_Text_Cleaner",
|
page_slug="2_Text_Cleaner",
|
||||||
status="Ready",
|
status="Ready",
|
||||||
@@ -87,7 +88,8 @@ TOOLS: list[Tool] = [
|
|||||||
icon=":material/format_list_bulleted:",
|
icon=":material/format_list_bulleted:",
|
||||||
name="Standardize Formats",
|
name="Standardize Formats",
|
||||||
description=(
|
description=(
|
||||||
"Standardize dates, currencies, names, phone numbers, and addresses."
|
"Make dates, phone numbers, currency, names, and addresses look "
|
||||||
|
"the same throughout."
|
||||||
),
|
),
|
||||||
page_slug="3_Format_Standardizer",
|
page_slug="3_Format_Standardizer",
|
||||||
status="Ready",
|
status="Ready",
|
||||||
@@ -98,8 +100,7 @@ TOOLS: list[Tool] = [
|
|||||||
icon=":material/search:",
|
icon=":material/search:",
|
||||||
name="Find Duplicates",
|
name="Find Duplicates",
|
||||||
description=(
|
description=(
|
||||||
"Fuzzy matching, normalization, survivor selection, and "
|
"Find rows that repeat — exact and similar — and remove the extras."
|
||||||
"interactive review."
|
|
||||||
),
|
),
|
||||||
page_slug="1_Deduplicator",
|
page_slug="1_Deduplicator",
|
||||||
status="Ready",
|
status="Ready",
|
||||||
@@ -110,7 +111,8 @@ TOOLS: list[Tool] = [
|
|||||||
icon=":material/check_circle:",
|
icon=":material/check_circle:",
|
||||||
name="Quality Check",
|
name="Quality Check",
|
||||||
description=(
|
description=(
|
||||||
"Validate against rules and generate PDF/Excel quality reports."
|
"Check your file against rules you set, and export a PDF or "
|
||||||
|
"Excel report."
|
||||||
),
|
),
|
||||||
page_slug="8_Validator_Reporter",
|
page_slug="8_Validator_Reporter",
|
||||||
status="Coming Soon",
|
status="Coming Soon",
|
||||||
@@ -120,7 +122,10 @@ TOOLS: list[Tool] = [
|
|||||||
tool_id="05_column_mapper",
|
tool_id="05_column_mapper",
|
||||||
icon=":material/view_column:",
|
icon=":material/view_column:",
|
||||||
name="Map Columns",
|
name="Map Columns",
|
||||||
description="Rename columns, enforce a target schema, and coerce types.",
|
description=(
|
||||||
|
"Rename columns, change their order, and set each one as text, "
|
||||||
|
"number, or date."
|
||||||
|
),
|
||||||
page_slug="5_Column_Mapper",
|
page_slug="5_Column_Mapper",
|
||||||
status="Ready",
|
status="Ready",
|
||||||
section="transformations",
|
section="transformations",
|
||||||
@@ -129,7 +134,10 @@ TOOLS: list[Tool] = [
|
|||||||
tool_id="07_multi_file_merger",
|
tool_id="07_multi_file_merger",
|
||||||
icon=":material/account_tree:",
|
icon=":material/account_tree:",
|
||||||
name="Combine Files",
|
name="Combine Files",
|
||||||
description="Combine multiple CSV/Excel files with schema alignment.",
|
description=(
|
||||||
|
"Combine several CSV or Excel files into one — even if their "
|
||||||
|
"columns don't match."
|
||||||
|
),
|
||||||
page_slug="7_Multi_File_Merger",
|
page_slug="7_Multi_File_Merger",
|
||||||
status="Coming Soon",
|
status="Coming Soon",
|
||||||
section="transformations",
|
section="transformations",
|
||||||
@@ -139,7 +147,8 @@ TOOLS: list[Tool] = [
|
|||||||
icon=":material/auto_awesome:",
|
icon=":material/auto_awesome:",
|
||||||
name="Automated Workflows",
|
name="Automated Workflows",
|
||||||
description=(
|
description=(
|
||||||
"Chain tools in recommended order and pass output between steps."
|
"Run several tools in a row — save the steps once, reuse them "
|
||||||
|
"anytime."
|
||||||
),
|
),
|
||||||
page_slug="9_Pipeline_Runner",
|
page_slug="9_Pipeline_Runner",
|
||||||
status="Ready",
|
status="Ready",
|
||||||
@@ -150,8 +159,7 @@ TOOLS: list[Tool] = [
|
|||||||
icon=":material/picture_as_pdf:",
|
icon=":material/picture_as_pdf:",
|
||||||
name="PDF to CSV",
|
name="PDF to CSV",
|
||||||
description=(
|
description=(
|
||||||
"Extract bank-statement transactions from PDFs using reusable "
|
"Pull transactions out of bank-statement PDFs into a clean CSV file."
|
||||||
"per-source templates."
|
|
||||||
),
|
),
|
||||||
page_slug="10_PDF_Extractor",
|
page_slug="10_PDF_Extractor",
|
||||||
status="Ready",
|
status="Ready",
|
||||||
@@ -162,8 +170,8 @@ TOOLS: list[Tool] = [
|
|||||||
icon=":material/compare_arrows:",
|
icon=":material/compare_arrows:",
|
||||||
name="Reconcile Two Files",
|
name="Reconcile Two Files",
|
||||||
description=(
|
description=(
|
||||||
"Match transactions between two sources (e.g. bank feed vs. "
|
"Compare two lists of transactions (e.g. bank vs. ledger) and "
|
||||||
"ledger) with amount and date tolerance."
|
"flag what doesn't match."
|
||||||
),
|
),
|
||||||
page_slug="11_Reconciler",
|
page_slug="11_Reconciler",
|
||||||
status="Ready",
|
status="Ready",
|
||||||
|
|||||||
@@ -15,6 +15,10 @@
|
|||||||
"ready": "Ready",
|
"ready": "Ready",
|
||||||
"coming_soon": "Coming Soon"
|
"coming_soon": "Coming Soon"
|
||||||
},
|
},
|
||||||
|
"help": {
|
||||||
|
"button_label": "Help",
|
||||||
|
"missing_body": "No help written yet for this tool."
|
||||||
|
},
|
||||||
"upload": {
|
"upload": {
|
||||||
"heading": "Import one or more files to start",
|
"heading": "Import one or more files to start",
|
||||||
"intro": "Optional: scan an imported file for data quality issues and see which tools can fix each one. Skip if you already know what you need.",
|
"intro": "Optional: scan an imported file for data quality issues and see which tools can fix each one. Skip if you already know what you need.",
|
||||||
@@ -107,63 +111,80 @@
|
|||||||
"tools": {
|
"tools": {
|
||||||
"01_deduplicator": {
|
"01_deduplicator": {
|
||||||
"name": "Find Duplicates",
|
"name": "Find Duplicates",
|
||||||
"description": "Fuzzy matching, normalization, survivor selection, and interactive review.",
|
"description": "Find rows that repeat — exact and similar — and remove the extras.",
|
||||||
"page_title": "Find Duplicates",
|
"page_title": "Find Duplicates",
|
||||||
"page_caption": "Find and remove duplicate rows in CSV, delimited text, and Excel files."
|
"page_caption": "Find rows that repeat, then keep one and remove the extras.",
|
||||||
|
"help_md": "**When to use**\n- Customer or contact lists\n- Mailing lists from multiple sources\n- Product catalogs that may overlap\n\n**Steps**\n1. Upload your file\n2. Pick the column(s) that identify a row (email, phone, name+zip)\n3. Choose **Exact** or **Similar** matching\n4. Pick which row to keep (newest, longest, first)\n5. Preview, then export\n\n**Examples**\n- `John Smith` + `JOHN SMITH` → same person\n- `jane@co.com` + `jane@co.com ` → same email (trailing space)\n- `555-1234` + `(555) 1234` → same phone\n\n**Tip** Start with Exact; add Similar if you suspect typos."
|
||||||
},
|
},
|
||||||
"02_text_cleaner": {
|
"02_text_cleaner": {
|
||||||
"name": "Clean Text",
|
"name": "Clean Text",
|
||||||
"description": "Whitespace trim, multi-space collapse, Unicode normalization, BOM and line-ending handling.",
|
"description": "Trim extra spaces and strip out odd characters that copy-paste leaves behind.",
|
||||||
"page_title": "Clean Text",
|
"page_title": "Clean Text",
|
||||||
"page_caption": "Trim whitespace, fold smart quotes, strip invisible characters, and normalize line endings. Runs locally — your data never leaves this computer."
|
"page_caption": "Trim extra spaces and strip out odd characters.",
|
||||||
|
"help_md": "**When to use**\n- Text copied from web pages, PDFs, or older systems\n- Files with inconsistent spacing\n- Data with hidden or special characters\n\n**Steps**\n1. Upload your file\n2. Pick the text columns to clean\n3. Choose options: trim spaces, remove invisible characters, normalize quotes\n4. Preview the changes\n5. Export\n\n**Examples**\n- ` hello world ` → `hello world`\n- `“smart quotes”` → `\"normal quotes\"`\n- `datawithhidden` → `datawithhidden`\n\n**Tip** Always preview — text changes can affect later steps like duplicate detection."
|
||||||
},
|
},
|
||||||
"03_format_standardizer": {
|
"03_format_standardizer": {
|
||||||
"name": "Standardize Formats",
|
"name": "Standardize Formats",
|
||||||
"description": "Standardize dates, currencies, names, phone numbers, and addresses.",
|
"description": "Make dates, phone numbers, currency, names, and addresses look the same throughout.",
|
||||||
"page_title": "Standardize Formats",
|
"page_title": "Standardize Formats",
|
||||||
"page_caption": "Canonicalize dates, phone numbers, currency, names, addresses, and booleans on a per-column basis. Runs locally — your data never leaves this computer."
|
"page_caption": "Make dates, phones, currency, and names look the same throughout.",
|
||||||
|
"help_md": "**When to use**\n- Data from multiple sources that wrote dates/phones differently\n- Before sending to a system that wants one format\n- Preparing data for analysis or charts\n\n**Steps**\n1. Upload your file\n2. Pick a column (date, phone, currency, etc.)\n3. Choose the target format\n4. Preview\n5. Repeat for other columns, then export\n\n**Examples**\n- `Jan 5, 2025` / `01/05/2025` / `5-Jan-25` → `2025-01-05`\n- `(555) 123-4567` / `555.123.4567` → `+1 555-123-4567`\n- `$1,234.50` / `1234.5 USD` → `1234.50`\n\n**Tip** Run on several columns in one session — each column remembers its chosen format."
|
||||||
},
|
},
|
||||||
"04_missing_handler": {
|
"04_missing_handler": {
|
||||||
"name": "Fix Missing Values",
|
"name": "Fix Missing Values",
|
||||||
"description": "Detect disguised nulls, missingness analysis, and imputation strategies.",
|
"description": "Find blank cells (even ones written as 'N/A' or '?') and fill them in or remove them.",
|
||||||
"page_title": "Fix Missing Values",
|
"page_title": "Fix Missing Values",
|
||||||
"page_caption": "Detect disguised nulls, profile missingness, and apply imputation or drop strategies. Runs locally — your data never leaves this computer."
|
"page_caption": "Find blank cells (even hidden ones) and fill them in or remove them.",
|
||||||
|
"help_md": "**When to use**\n- Spreadsheets with gaps\n- Files where someone typed `N/A` or `-` instead of leaving a cell blank\n- Before importing into a system that rejects blanks\n\n**Steps**\n1. Upload your file\n2. Review which columns have blanks\n3. Pick a strategy per column: **fill**, **drop the row**, or **leave alone**\n4. For numbers, pick a fill value: average, median, zero, or your own\n5. Preview, then export\n\n**Examples**\n- `N/A`, `-`, ` ` → treated as blank\n- Blank salary → filled with the column average\n- Row with no email → dropped\n\n**Tip** Don't fill the row's identifier (email, ID) — drop the row instead."
|
||||||
},
|
},
|
||||||
"05_column_mapper": {
|
"05_column_mapper": {
|
||||||
"name": "Map Columns",
|
"name": "Map Columns",
|
||||||
"description": "Rename columns, enforce a target schema, and coerce types.",
|
"description": "Rename columns, change their order, and set each one as text, number, or date.",
|
||||||
"page_title": "Map Columns",
|
"page_title": "Map Columns",
|
||||||
"page_caption": "Rename columns, enforce a target schema, and coerce types. Runs locally — your data never leaves this computer."
|
"page_caption": "Rename columns, change their order, and set each one as text, number, or date.",
|
||||||
|
"help_md": "**When to use**\n- Combining files from vendors with different column names\n- Forcing the layout your system expects\n- Cleaning up exports with extra or weirdly-named columns\n\n**Steps**\n1. Upload your file\n2. Match each incoming column to your standard name\n3. Set each column's type: text, number, or date\n4. Reorder or drop columns\n5. Export with the new layout\n\n**Examples**\n- `cust_email` → `Customer Email`\n- `amt` → `Amount` (set as number)\n- `notes_internal` → drop\n\n**Tip** Save the mapping if you'll get the same file format again next month."
|
||||||
},
|
},
|
||||||
"06_outlier_detector": {
|
"06_outlier_detector": {
|
||||||
"name": "Find Unusual Values",
|
"name": "Find Unusual Values",
|
||||||
"description": "Z-score, IQR, and MAD detection with domain-rule violations and winsorization.",
|
"description": "Spot values that look wrong — way too high, way too low, or breaking your rules.",
|
||||||
"page_title": "Find Unusual Values",
|
"page_title": "Find Unusual Values",
|
||||||
"page_caption": "Detect and handle outliers in numeric columns."
|
"page_caption": "Spot values that look wrong — way too high, too low, or breaking your rules.",
|
||||||
|
"help_md": "**When to use**\n- Spotting typos, fraud, or bad imports in numeric data\n- Cleaning sensor or transaction data\n- Before reporting numbers to leadership\n\n**Steps**\n1. Upload your file\n2. Pick the numeric column to check\n3. Set a normal range (or use auto-detect)\n4. Review the flagged rows\n5. Choose: keep, remove, or cap to the limit\n\n**Examples**\n- Salary column with one row at `$9,999,999` → flagged\n- Age column with `250` → flagged\n- Rule: `price must be > 0` → flags negatives\n\n**Tip** Review flagged rows by hand — a real outlier is sometimes the most important data point."
|
||||||
},
|
},
|
||||||
"07_multi_file_merger": {
|
"07_multi_file_merger": {
|
||||||
"name": "Combine Files",
|
"name": "Combine Files",
|
||||||
"description": "Combine multiple CSV/Excel files with schema alignment.",
|
"description": "Combine several CSV or Excel files into one — even if their columns don't match.",
|
||||||
"page_title": "Combine Files",
|
"page_title": "Combine Files",
|
||||||
"page_caption": "Combine multiple CSV and Excel files into one dataset."
|
"page_caption": "Combine several CSV or Excel files into one — even if columns differ.",
|
||||||
|
"help_md": "**When to use**\n- Monthly reports across the year\n- Exports from different stores or branches\n- Multi-system data that needs to be in one file\n\n**Steps**\n1. Upload two or more files\n2. Confirm column matches (auto-detected; override if needed)\n3. Pick how to handle missing columns (skip, blank, default value)\n4. Preview the combined result\n5. Export the single file\n\n**Examples**\n- `January.csv` + `February.csv` → `2025.csv`\n- `NY-store.xlsx` + `LA-store.xlsx` → `all-stores.csv`\n- File A has `Email`, file B has `email_addr` → matched automatically\n\n**Tip** Add a `source` column so you can tell which file each row came from."
|
||||||
},
|
},
|
||||||
"08_validator_reporter": {
|
"08_validator_reporter": {
|
||||||
"name": "Quality Check",
|
"name": "Quality Check",
|
||||||
"description": "Validate against rules and generate PDF/Excel quality reports.",
|
"description": "Check your file against rules you set, and export a PDF or Excel report.",
|
||||||
"page_title": "Quality Check",
|
"page_title": "Quality Check",
|
||||||
"page_caption": "Validate data against rules and generate quality reports."
|
"page_caption": "Check your file against rules and export a PDF or Excel report.",
|
||||||
|
"help_md": "**When to use**\n- Before handing data off to a client or partner\n- Before a strict system import\n- Routine quality audits\n\n**Steps**\n1. Upload your file\n2. Pick the rules to check (required columns, valid emails, no duplicates)\n3. Run the check\n4. Review the score and findings\n5. Export the report as PDF or Excel\n\n**Examples**\n- Rule: `email column must look like an email` → 12 rows fail\n- Rule: `amount must be > 0` → 3 rows fail\n- Rule: `no duplicate customer IDs` → 5 duplicates found\n\n**Tip** Run this last in your cleanup, then keep the PDF as proof of quality."
|
||||||
},
|
},
|
||||||
"09_pipeline_runner": {
|
"09_pipeline_runner": {
|
||||||
"name": "Automated Workflows",
|
"name": "Automated Workflows",
|
||||||
"description": "Chain tools in recommended order and pass output between steps.",
|
"description": "Run several tools in a row — save the steps once, reuse them anytime.",
|
||||||
"page_title": "Automated Workflows",
|
"page_title": "Automated Workflows",
|
||||||
"page_caption": "Chain DataTools cleaning steps into one repeatable workflow. The pipeline recommends an order; you stay in control."
|
"page_caption": "Run several tools in a row — save the steps and reuse them anytime.",
|
||||||
|
"help_md": "**When to use**\n- A cleanup you do every week or month\n- Multi-step processes you keep repeating\n- Onboarding teammates to your data routine\n\n**Steps**\n1. Pick the tools you want to run, in order\n2. Configure each step\n3. Save the workflow as a JSON file\n4. Next time, load the workflow and upload a fresh file\n5. Get the cleaned output in one click\n\n**Examples**\n- `Clean Text` → `Standardize Formats` → `Find Duplicates` → export\n- Saved as `weekly-customer-cleanup.json`\n- Shared with a teammate so they get the same result\n\n**Tip** Start with two or three tools. You can always edit and add more later."
|
||||||
},
|
},
|
||||||
"10_pdf_extractor": {
|
"10_pdf_extractor": {
|
||||||
"name": "PDF to CSV",
|
"name": "PDF to CSV",
|
||||||
"description": "Extract bank-statement transactions from PDFs using reusable per-source templates.",
|
"description": "Pull transactions out of bank-statement PDFs into a clean CSV file.",
|
||||||
"page_title": "PDF to CSV",
|
"page_title": "PDF to CSV",
|
||||||
"page_caption": "Extract transaction tables from bank-statement PDFs. Build one template per source and reuse it for every statement that follows the same layout. Runs locally — your data never leaves this computer."
|
"page_caption": "Pull transactions out of bank-statement PDFs into a clean CSV file.",
|
||||||
|
"help_md": "**When to use**\n- Bank or credit-card statements\n- Vendor invoices with line-item tables\n- Any PDF with a transaction table\n\n**Steps**\n1. Upload a PDF\n2. Draw a box around the table (once per source)\n3. Save the template (e.g. `Chase Checking`)\n4. Reuse the template on every future statement of that type\n5. Export the CSV\n\n**Examples**\n- Chase March statement → 87 transactions extracted\n- Same template auto-runs on April, May, June\n- Batch mode: process 12 months at once\n\n**Tip** Templates are per source (Chase, Wells Fargo, …). Build one per source you receive regularly."
|
||||||
|
},
|
||||||
|
"11_reconciler": {
|
||||||
|
"name": "Reconcile Two Files",
|
||||||
|
"description": "Compare two lists of transactions (e.g. bank vs. ledger) and flag what doesn't match.",
|
||||||
|
"page_title": "Reconcile Two Files",
|
||||||
|
"page_caption": "Compare two lists of transactions (e.g. bank vs. ledger) and flag what doesn't match.",
|
||||||
|
"help_md": "**When to use**\n- Matching your bank statement to your books\n- Vendor invoices vs. payments sent\n- Inventory receipts vs. orders placed\n\n**Steps**\n1. Upload both files (e.g. bank export + accounting export)\n2. Pick the columns to match on (date, amount, reference)\n3. Set tolerances (e.g. date ±2 days, amount exact)\n4. Review four buckets: **matched**, **only in left**, **only in right**, **needs review**\n5. Export the results\n\n**Examples**\n- Bank `2025-03-15 $99.50` ↔ Books `2025-03-16 $99.50` → matched\n- Bank charge with no books entry → only in left\n- Same amount on the same day twice → flagged for review\n\n**Tip** Tighten the date tolerance once you trust the match — fewer ambiguous cases to review."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nav": {
|
"nav": {
|
||||||
|
|||||||
@@ -15,6 +15,10 @@
|
|||||||
"ready": "Listo",
|
"ready": "Listo",
|
||||||
"coming_soon": "Próximamente"
|
"coming_soon": "Próximamente"
|
||||||
},
|
},
|
||||||
|
"help": {
|
||||||
|
"button_label": "Ayuda",
|
||||||
|
"missing_body": "Aún no hay ayuda para esta herramienta."
|
||||||
|
},
|
||||||
"upload": {
|
"upload": {
|
||||||
"heading": "Importa uno o más archivos para empezar",
|
"heading": "Importa uno o más archivos para empezar",
|
||||||
"intro": "Opcional: analiza un archivo para detectar problemas de calidad de datos y ver qué herramientas pueden corregir cada uno. Sáltalo si ya sabes lo que necesitas.",
|
"intro": "Opcional: analiza un archivo para detectar problemas de calidad de datos y ver qué herramientas pueden corregir cada uno. Sáltalo si ya sabes lo que necesitas.",
|
||||||
@@ -107,63 +111,80 @@
|
|||||||
"tools": {
|
"tools": {
|
||||||
"01_deduplicator": {
|
"01_deduplicator": {
|
||||||
"name": "Buscar duplicados",
|
"name": "Buscar duplicados",
|
||||||
"description": "Coincidencia difusa, normalización, selección de superviviente y revisión interactiva.",
|
"description": "Encuentra filas que se repiten — exactas y similares — y elimina las extras.",
|
||||||
"page_title": "Buscar duplicados",
|
"page_title": "Buscar duplicados",
|
||||||
"page_caption": "Encuentra y elimina filas duplicadas en archivos CSV, texto delimitado y Excel."
|
"page_caption": "Encuentra filas que se repiten, conserva una y elimina las extras.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Listas de clientes o contactos\n- Listas de correo de varias fuentes\n- Catálogos de productos que pueden solaparse\n\n**Pasos**\n1. Sube tu archivo\n2. Elige la(s) columna(s) que identifican una fila (email, teléfono, nombre+CP)\n3. Elige coincidencia **Exacta** o **Similar**\n4. Elige qué fila conservar (más reciente, más larga, primera)\n5. Previsualiza y exporta\n\n**Ejemplos**\n- `John Smith` + `JOHN SMITH` → misma persona\n- `jane@co.com` + `jane@co.com ` → mismo email (espacio al final)\n- `555-1234` + `(555) 1234` → mismo teléfono\n\n**Consejo** Empieza con Exacta; añade Similar si sospechas erratas."
|
||||||
},
|
},
|
||||||
"02_text_cleaner": {
|
"02_text_cleaner": {
|
||||||
"name": "Limpiar texto",
|
"name": "Limpiar texto",
|
||||||
"description": "Recorte de espacios, colapso de espacios múltiples, normalización Unicode, manejo de BOM y de finales de línea.",
|
"description": "Quita espacios extra y caracteres raros que deja el copiar y pegar.",
|
||||||
"page_title": "Limpiar texto",
|
"page_title": "Limpiar texto",
|
||||||
"page_caption": "Recorta espacios, normaliza comillas tipográficas, elimina caracteres invisibles y unifica saltos de línea. Se ejecuta localmente — tus datos nunca salen de este equipo."
|
"page_caption": "Quita espacios extra y caracteres raros.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Texto copiado de páginas web, PDFs o sistemas antiguos\n- Archivos con espaciado inconsistente\n- Datos con caracteres ocultos o especiales\n\n**Pasos**\n1. Sube tu archivo\n2. Elige las columnas de texto a limpiar\n3. Elige opciones: recortar espacios, eliminar caracteres invisibles, normalizar comillas\n4. Previsualiza los cambios\n5. Exporta\n\n**Ejemplos**\n- ` hola mundo ` → `hola mundo`\n- `“comillas tipográficas”` → `\"comillas normales\"`\n- `datoconoculto` → `datoconoculto`\n\n**Consejo** Siempre previsualiza — los cambios pueden afectar pasos posteriores como duplicados."
|
||||||
},
|
},
|
||||||
"03_format_standardizer": {
|
"03_format_standardizer": {
|
||||||
"name": "Estandarizar formatos",
|
"name": "Estandarizar formatos",
|
||||||
"description": "Estandariza fechas, monedas, nombres, números de teléfono y direcciones.",
|
"description": "Haz que fechas, teléfonos, monedas, nombres y direcciones se vean iguales en todo el archivo.",
|
||||||
"page_title": "Estandarizar formatos",
|
"page_title": "Estandarizar formatos",
|
||||||
"page_caption": "Canoniza fechas, números de teléfono, monedas, nombres, direcciones y booleanos columna por columna. Se ejecuta localmente — tus datos nunca salen de este equipo."
|
"page_caption": "Haz que fechas, teléfonos, monedas y nombres se vean iguales en todo el archivo.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Datos de varias fuentes con fechas/teléfonos en formatos distintos\n- Antes de enviar a un sistema que exige un formato\n- Preparando datos para análisis o gráficos\n\n**Pasos**\n1. Sube tu archivo\n2. Elige una columna (fecha, teléfono, moneda, etc.)\n3. Elige el formato destino\n4. Previsualiza\n5. Repite con otras columnas y exporta\n\n**Ejemplos**\n- `5 Ene 2025` / `01/05/2025` / `5-Ene-25` → `2025-01-05`\n- `(555) 123-4567` / `555.123.4567` → `+1 555-123-4567`\n- `$1.234,50` / `1234.5 USD` → `1234.50`\n\n**Consejo** Trabaja varias columnas en una sesión — cada una recuerda su formato."
|
||||||
},
|
},
|
||||||
"04_missing_handler": {
|
"04_missing_handler": {
|
||||||
"name": "Corregir valores faltantes",
|
"name": "Corregir valores faltantes",
|
||||||
"description": "Detecta nulos disfrazados, analiza la ausencia de datos y aplica estrategias de imputación.",
|
"description": "Encuentra celdas vacías (incluso escritas como «N/A» o «?») y rellénalas o elimínalas.",
|
||||||
"page_title": "Corregir valores faltantes",
|
"page_title": "Corregir valores faltantes",
|
||||||
"page_caption": "Detecta nulos disfrazados, perfila la ausencia de datos y aplica imputación o estrategias de descarte. Se ejecuta localmente — tus datos nunca salen de este equipo."
|
"page_caption": "Encuentra celdas vacías (incluso ocultas) y rellénalas o elimínalas.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Hojas con huecos\n- Archivos donde alguien escribió `N/A` o `-` en vez de dejar la celda vacía\n- Antes de importar a un sistema que rechaza celdas vacías\n\n**Pasos**\n1. Sube tu archivo\n2. Revisa qué columnas tienen celdas vacías\n3. Elige una estrategia por columna: **rellenar**, **eliminar la fila** o **dejar igual**\n4. Para números, elige el valor: media, mediana, cero o uno propio\n5. Previsualiza y exporta\n\n**Ejemplos**\n- `N/A`, `-`, ` ` → tratados como vacíos\n- Salario vacío → relleno con la media de la columna\n- Fila sin email → eliminada\n\n**Consejo** No rellenes el identificador (email, ID) — mejor elimina la fila."
|
||||||
},
|
},
|
||||||
"05_column_mapper": {
|
"05_column_mapper": {
|
||||||
"name": "Mapear columnas",
|
"name": "Mapear columnas",
|
||||||
"description": "Renombra columnas, aplica un esquema objetivo y fuerza tipos de datos.",
|
"description": "Renombra columnas, cambia su orden y define cada una como texto, número o fecha.",
|
||||||
"page_title": "Mapear columnas",
|
"page_title": "Mapear columnas",
|
||||||
"page_caption": "Renombra columnas, aplica un esquema objetivo y fuerza tipos. Se ejecuta localmente — tus datos nunca salen de este equipo."
|
"page_caption": "Renombra columnas, cambia su orden y define cada una como texto, número o fecha.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Combinando archivos de proveedores con nombres de columna distintos\n- Forzando el esquema que tu sistema espera\n- Limpiando exportes con columnas raras o de más\n\n**Pasos**\n1. Sube tu archivo\n2. Empareja cada columna entrante con tu nombre estándar\n3. Define el tipo de cada columna: texto, número o fecha\n4. Reordena o elimina columnas\n5. Exporta con la nueva disposición\n\n**Ejemplos**\n- `cust_email` → `Email Cliente`\n- `amt` → `Importe` (definido como número)\n- `notes_internal` → eliminar\n\n**Consejo** Guarda el mapeo si recibirás el mismo formato el próximo mes."
|
||||||
},
|
},
|
||||||
"06_outlier_detector": {
|
"06_outlier_detector": {
|
||||||
"name": "Detectar valores atípicos",
|
"name": "Detectar valores atípicos",
|
||||||
"description": "Detección por Z-score, IQR y MAD con reglas de dominio y winsorización.",
|
"description": "Detecta valores que parecen incorrectos — demasiado altos, demasiado bajos o fuera de regla.",
|
||||||
"page_title": "Detectar valores atípicos",
|
"page_title": "Detectar valores atípicos",
|
||||||
"page_caption": "Detecta y trata valores atípicos en columnas numéricas."
|
"page_caption": "Detecta valores que parecen incorrectos — demasiado altos, bajos o fuera de regla.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Detectar erratas, fraude o imports mal hechos en datos numéricos\n- Limpiar datos de sensores o transacciones\n- Antes de reportar números a dirección\n\n**Pasos**\n1. Sube tu archivo\n2. Elige la columna numérica a revisar\n3. Define un rango normal (o usa auto-detección)\n4. Revisa las filas marcadas\n5. Elige: conservar, eliminar o limitar al borde\n\n**Ejemplos**\n- Columna de salarios con una fila de `$9.999.999` → marcada\n- Columna de edad con `250` → marcada\n- Regla: `precio debe ser > 0` → marca los negativos\n\n**Consejo** Revisa a mano las filas marcadas — a veces un atípico real es el dato más importante."
|
||||||
},
|
},
|
||||||
"07_multi_file_merger": {
|
"07_multi_file_merger": {
|
||||||
"name": "Combinar archivos",
|
"name": "Combinar archivos",
|
||||||
"description": "Combina varios archivos CSV/Excel alineando sus esquemas.",
|
"description": "Combina varios archivos CSV o Excel en uno — aunque sus columnas no coincidan.",
|
||||||
"page_title": "Combinar archivos",
|
"page_title": "Combinar archivos",
|
||||||
"page_caption": "Combina varios archivos CSV y Excel en un único conjunto de datos."
|
"page_caption": "Combina varios CSV o Excel en uno — aunque las columnas no coincidan.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Informes mensuales a lo largo del año\n- Exportes de varias tiendas o sucursales\n- Datos de varios sistemas que deben quedar en un archivo\n\n**Pasos**\n1. Sube dos o más archivos\n2. Confirma las coincidencias de columna (auto-detectadas; modifica si hace falta)\n3. Decide cómo tratar columnas que falten (omitir, vacío, valor por defecto)\n4. Previsualiza el resultado combinado\n5. Exporta el archivo único\n\n**Ejemplos**\n- `Enero.csv` + `Febrero.csv` → `2025.csv`\n- `NY-store.xlsx` + `LA-store.xlsx` → `todas-las-tiendas.csv`\n- Archivo A tiene `Email`, archivo B tiene `email_addr` → emparejados automáticamente\n\n**Consejo** Añade una columna `origen` para saber de qué archivo viene cada fila."
|
||||||
},
|
},
|
||||||
"08_validator_reporter": {
|
"08_validator_reporter": {
|
||||||
"name": "Verificación de calidad",
|
"name": "Verificación de calidad",
|
||||||
"description": "Valida contra reglas y genera informes de calidad en PDF/Excel.",
|
"description": "Comprueba tu archivo según reglas que tú definas y exporta un informe PDF o Excel.",
|
||||||
"page_title": "Verificación de calidad",
|
"page_title": "Verificación de calidad",
|
||||||
"page_caption": "Valida datos contra reglas y genera informes de calidad."
|
"page_caption": "Comprueba tu archivo según reglas y exporta un informe PDF o Excel.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Antes de entregar datos a un cliente o socio\n- Antes de un import estricto a otro sistema\n- Auditorías rutinarias de calidad\n\n**Pasos**\n1. Sube tu archivo\n2. Elige las reglas (columnas requeridas, emails válidos, sin duplicados)\n3. Ejecuta la comprobación\n4. Revisa la puntuación y los hallazgos\n5. Exporta el informe como PDF o Excel\n\n**Ejemplos**\n- Regla: `email debe parecerse a un email` → 12 filas fallan\n- Regla: `importe debe ser > 0` → 3 filas fallan\n- Regla: `sin ID de cliente duplicados` → 5 duplicados encontrados\n\n**Consejo** Ejecuta esto al final, y guarda el PDF como prueba de calidad."
|
||||||
},
|
},
|
||||||
"09_pipeline_runner": {
|
"09_pipeline_runner": {
|
||||||
"name": "Flujos automatizados",
|
"name": "Flujos automatizados",
|
||||||
"description": "Encadena herramientas en el orden recomendado y pasa la salida entre pasos.",
|
"description": "Ejecuta varias herramientas seguidas — guarda los pasos una vez y reutilízalos.",
|
||||||
"page_title": "Flujos automatizados",
|
"page_title": "Flujos automatizados",
|
||||||
"page_caption": "Encadena pasos de limpieza de DataTools en un flujo repetible. La canalización recomienda un orden; tú mantienes el control."
|
"page_caption": "Ejecuta varias herramientas seguidas — guarda los pasos y reutilízalos.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Una limpieza que haces cada semana o mes\n- Procesos de varios pasos que repites\n- Cuando entrenas a un compañero en tu rutina de datos\n\n**Pasos**\n1. Elige las herramientas a ejecutar, en orden\n2. Configura cada paso\n3. Guarda el flujo como archivo JSON\n4. La próxima vez, carga el flujo y sube un archivo nuevo\n5. Obtén la salida limpia con un clic\n\n**Ejemplos**\n- `Limpiar texto` → `Estandarizar formatos` → `Buscar duplicados` → exportar\n- Guardado como `limpieza-clientes-semanal.json`\n- Compartido con un compañero para obtener el mismo resultado\n\n**Consejo** Empieza con dos o tres herramientas. Siempre puedes editar y añadir más."
|
||||||
},
|
},
|
||||||
"10_pdf_extractor": {
|
"10_pdf_extractor": {
|
||||||
"name": "PDF a CSV",
|
"name": "PDF a CSV",
|
||||||
"description": "Extrae transacciones de extractos bancarios en PDF usando plantillas reutilizables por origen.",
|
"description": "Extrae transacciones de extractos bancarios en PDF a un archivo CSV limpio.",
|
||||||
"page_title": "PDF a CSV",
|
"page_title": "PDF a CSV",
|
||||||
"page_caption": "Extrae tablas de transacciones de extractos bancarios en PDF. Crea una plantilla por origen y reutilízala para cada extracto que siga el mismo formato. Se ejecuta localmente — tus datos no salen de este equipo."
|
"page_caption": "Extrae transacciones de extractos bancarios en PDF a un archivo CSV limpio.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Extractos bancarios o de tarjeta\n- Facturas de proveedor con tablas\n- Cualquier PDF con tabla de transacciones\n\n**Pasos**\n1. Sube un PDF\n2. Dibuja un recuadro alrededor de la tabla (una vez por fuente)\n3. Guarda la plantilla (p. ej. `Chase Cuenta`)\n4. Reutiliza la plantilla en los siguientes extractos del mismo tipo\n5. Exporta el CSV\n\n**Ejemplos**\n- Extracto Chase de marzo → 87 transacciones extraídas\n- La misma plantilla se ejecuta sola en abril, mayo, junio\n- Modo lote: procesa 12 meses de una vez\n\n**Consejo** Las plantillas son por fuente (Chase, Wells Fargo…). Crea una por cada banco que recibas con regularidad."
|
||||||
|
},
|
||||||
|
"11_reconciler": {
|
||||||
|
"name": "Reconciliar dos archivos",
|
||||||
|
"description": "Compara dos listas de transacciones (p. ej. banco vs. libro mayor) y señala lo que no coincide.",
|
||||||
|
"page_title": "Reconciliar dos archivos",
|
||||||
|
"page_caption": "Compara dos listas de transacciones (p. ej. banco vs. libro mayor) y señala lo que no coincide.",
|
||||||
|
"help_md": "**Cuándo usarlo**\n- Cuadrar el extracto del banco con tus libros\n- Facturas de proveedor vs. pagos enviados\n- Recepciones de inventario vs. pedidos realizados\n\n**Pasos**\n1. Sube ambos archivos (p. ej. exporte del banco + exporte contable)\n2. Elige las columnas para emparejar (fecha, importe, referencia)\n3. Define tolerancias (p. ej. fecha ±2 días, importe exacto)\n4. Revisa cuatro grupos: **emparejados**, **solo en izquierda**, **solo en derecha**, **necesita revisión**\n5. Exporta los resultados\n\n**Ejemplos**\n- Banco `2025-03-15 $99.50` ↔ Libros `2025-03-16 $99.50` → emparejado\n- Cargo bancario sin entrada en libros → solo en izquierda\n- Mismo importe el mismo día dos veces → marcado para revisión\n\n**Consejo** Estrecha la tolerancia de fecha cuando confíes en el emparejamiento — menos casos ambiguos."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nav": {
|
"nav": {
|
||||||
|
|||||||
Reference in New Issue
Block a user