amc-console / datos /index.html
clyxconsultingdev's picture
Deploy the site from pipeline commit 7d4731dcd0cb
b753a2f verified
Raw History Blame Contribute Delete
13.8 kB
<!doctype html>
<html lang="es" data-root="../">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Datos y acceso para IA · AMC</title>
<meta name="description" content="Cómo consultar los datos abiertos de Analíticas Mercantiles Colombianas desde un programa o un asistente de IA: la API de Hugging Face, SQL con DuckDB, cada tabla y sus columnas, y las advertencias para leer bien las cifras.">
<meta property="og:title" content="Datos y acceso para IA · AMC">
<meta property="og:description" content="El registro mercantil de Colombia, depurado y abierto: cómo consultarlo desde un programa o un asistente de IA.">
<meta property="og:type" content="article">
<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">
<meta property="og:image" content="https://amc.clyxconsulting.com/assets/og/inicio.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:site_name" content="Analíticas Mercantiles Colombianas">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://amc.clyxconsulting.com/assets/og/inicio.png">
<link rel="alternate" type="text/plain" href="../llms.txt" title="Guía para modelos de lenguaje">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../assets/amc.css">
<link rel="stylesheet" href="../assets/nav.css">
<!-- The dataset, described for Google Dataset Search and for the crawlers
behind assistants (schema.org Dataset). No figures: the live ones are in
the manifest, which this page reads. -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Dataset",
"name": "Analíticas Mercantiles Colombianas (AMC): el registro mercantil de Colombia, depurado",
"alternateName": ["AMC", "RUES depurado"],
"description": "Cada empresa del registro mercantil de Colombia (RUES), con sus matrículas reunidas en una sola empresa, si sigue viva (renovó este año), su actividad CIIU, su cámara de comercio y su historia; con estados financieros (Supersociedades, Superfinanciera, Supersolidaria), contratos con el Estado (SECOP I y II), turismo y cifras del DANE. Las personas naturales se cuentan, nunca se nombran.",
"url": "https://amc.clyxconsulting.com/datos/",
"sameAs": "https://huggingface.co/datasets/clyxconsultingdev/amc-rues",
"license": "https://creativecommons.org/licenses/by-sa/4.0/",
"isAccessibleForFree": true,
"inLanguage": "es",
"keywords": ["Colombia", "empresas", "registro mercantil", "RUES", "cámaras de comercio", "CIIU", "datos abiertos", "business registry"],
"spatialCoverage": { "@type": "Place", "name": "Colombia" },
"creator": { "@type": "Organization", "name": "Clyx Consulting", "url": "https://clyxconsulting.com/" },
"isBasedOn": "https://www.datos.gov.co/d/c82u-588k",
"distribution": [
{ "@type": "DataDownload", "name": "manifest.json: tablas, filas, sha256 y notas de columnas", "encodingFormat": "application/json",
"contentUrl": "https://huggingface.co/datasets/clyxconsultingdev/amc-rues/resolve/main/manifest.json" },
{ "@type": "DataDownload", "name": "companies", "encodingFormat": "application/vnd.apache.parquet",
"contentUrl": "https://huggingface.co/datasets/clyxconsultingdev/amc-rues/resolve/main/data/companies.parquet" }
]
}
</script>
<style>
.datos pre { margin: 0 0 1.05em; background: var(--surface-2); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px;
font: 13px/1.6 var(--mono); color: var(--ink); overflow: auto; white-space: pre; }
.datos code { font: .88em var(--mono); overflow-wrap: anywhere; }
.datos pre code { font-size: 1em; overflow-wrap: normal; }
.datos ol li, .datos ul li { margin: 0 0 .5em; }
.tables details { border-top: 1px solid var(--border); padding: 10px 0; }
.tables summary { cursor: pointer; display: flex; justify-content: space-between; gap: 12px; align-items: baseline; }
.tables summary b { font: 600 15px var(--mono); color: var(--ink); }
.tables summary span { color: var(--muted); font-size: 14px; white-space: nowrap; }
.tables dl { margin: 10px 0 4px; display: grid; grid-template-columns: minmax(0, 14em) minmax(0, 1fr); gap: 6px 14px; font-size: 15px; line-height: 1.5; }
.tables dt { font: 500 13px/1.6 var(--mono); color: var(--ink); overflow-wrap: anywhere; }
.tables dd { margin: 0; color: var(--ink-2); }
@media (max-width: 560px) { .tables dl { grid-template-columns: minmax(0, 1fr); gap: 2px; } .tables dd { margin-bottom: 8px; } }
</style>
<link rel="canonical" href="https://amc.clyxconsulting.com/datos/">
<meta property="og:url" content="https://amc.clyxconsulting.com/datos/">
<meta property="og:locale" content="es_CO">
<meta property="og:image:type" content="image/png">
<meta property="og:image:alt" content="Datos y acceso para IA · AMC">
</head>
<body>
<main class="wrap" id="app"><p class="loading">Cargando…</p></main>
<noscript><p class="wrap">Esta página necesita JavaScript para listar las tablas. La guía en texto está en <a href="../llms.txt">llms.txt</a>.</p></noscript>
<script type="module">
import * as A from "../assets/amc.js";
const { el, rich } = A;
A.chrome("datos");
const app = document.getElementById("app");
// FOR PROGRAMS AND ASSISTANTS (docs/ai-access-plan.md, step 1). The same
// ground as ../llms.txt, for people: where the files are, how to query them
// without downloading (Hugging Face's API, DuckDB), every table with the note
// the manifest carries for each column, and the caveats without which the
// figures read wrong. The methodology keeps the downloads and the citation;
// this page links there rather than repeat them. No figure is typed here.
const HF = A.HF, DS = "clyxconsultingdev/amc-rues", API = "https://datasets-server.huggingface.co";
const code = (t) => el("code", { text: t });
const pre = (t) => el("pre", { tabindex: "0" }, el("code", { text: t }));
const size = (b) => b < 1e6 ? `${A.n(Math.max(1, b / 1e3))} KB` : `${(b / 1e6).toLocaleString("es-CO", { maximumFractionDigits: 1 })} MB`;
const ext = (text, href) => el("a", { href, rel: "noopener", text });
// prose(), as amc.js has it, and elements too (code blocks, lists); a null is skipped.
const prose = (...blocks) => el("div", { class: "prose reveal" }, ...blocks.filter((b) => b != null).map((b) =>
b instanceof Node ? b : b.h2 ? el("h2", { text: b.h2 }) : Array.isArray(b) ? rich("p", {}, b) : el("p", { text: b })));
// The manifest's notes are written with `code` and **bold**: those two, as elements; nothing parsed as HTML.
const md = (s) => String(s).split(/(`[^`]+`|\*\*[^*]+\*\*)/).filter(Boolean)
.map((p) => p.startsWith("`") ? code(p.slice(1, -1)) : p.startsWith("**") ? { b: p.slice(2, -2) } : p);
try {
const [m, s] = await Promise.all([A.getJSON("manifest.json"), A.summary()]);
const corte = m.snapshot?.logical_date;
const filter = `${API}/filter?dataset=${DS}&config=name_directory&split=train&where=${encodeURIComponent(`"nit"='860025900'`)}&length=5`;
const search = `${API}/search?dataset=${DS}&config=name_directory&split=train&query=alpina&length=5`;
const rows = `${API}/rows?dataset=${DS}&config=activities&split=train&offset=0&length=10`;
const tables = el("div", { class: "tables" }, ...Object.entries(m.files).map(([file, meta]) => {
const name = file.replace(/\.parquet$/, "");
const cols = m.columns?.[name] || {};
return el("details", { id: `t-${name}` },
el("summary", {}, el("b", { text: name }), el("span", { text: `${A.n(meta.rows)} filas · ${size(meta.bytes)}` })),
el("dl", {}, ...Object.entries(cols).flatMap(([c, note]) => [el("dt", { text: c }), rich("dd", {}, md(note))])),
el("p", { class: "muted" }, ext(`${HF}/resolve/main/data/${file}`, `${HF}/resolve/main/data/${file}`)));
}));
app.replaceChildren(
el("header", { class: "story-head" },
el("p", { class: "kicker", text: "Datos abiertos" }),
el("h1", { text: "Datos y acceso para IA" }),
el("p", { class: "dek", text: "Cómo consultar el registro depurado desde un programa o un asistente de IA, sin descargar nada, y lo que hay que saber para leer bien sus cifras." })),
el("div", { class: "datos" }, prose(
["Todo lo que muestra este sitio sale de tablas abiertas, en ", { b: "Parquet" }, ", publicadas en ", ext("Hugging Face", HF),
" bajo licencia CC BY-SA 4.0. Esta página explica cómo consultarlas desde código o desde un asistente; para descargarlas o abrirlas en Excel, Power BI, Python o R, paso a paso, ve a ",
{ a: "Cómo abrir los datos", href: "abrir/index.html" }, "."],
corte ? ["La edición actual tiene corte del ", { b: A.date(corte) }, ". Cada tabla, sus filas y la nota de cada columna salen de su ",
ext("manifest.json", `${HF}/resolve/main/manifest.json`), ", que se lee primero."] : null,
{ h2: "Para asistentes de IA" },
["Los asistentes y los programas que respondan preguntas con estos datos tienen una guía en texto, ", el("a", { href: "../llms.txt" }, code("llms.txt")),
", con las tablas, las consultas y las advertencias. Si le preguntas a un asistente por una empresa colombiana o por cuántas empresas hay de algo, pídele que use AMC y que cite la fuente."],
["¿Usas Claude Desktop? Con una extensión que se instala en cinco minutos, sin programar, Claude consulta AMC directamente: ",
{ a: "Conecta AMC a tu asistente", href: "../asistente/index.html" }, "."],
{ h2: "Consultar sin descargar: la API de Hugging Face" },
["Hugging Face sirve cada tabla por una API pública, sin clave. ", code("config"), " es el nombre de la tabla y ", code("split"), " siempre ", code("train"), ". Tres ejemplos, que se pueden abrir:"],
["Es un servicio de Hugging Face, no de AMC: puede tardar decenas de segundos y a veces falla. Para algo que tenga que funcionar siempre, usa DuckDB (abajo)."],
[{ b: "Filtrar" }, " (una empresa por NIT, sin dígito de verificación): ", ext("filter", filter)],
pre(filter),
[{ b: "Buscar texto" }, " en los nombres: ", ext("search", search)],
pre(search),
[{ b: "Leer filas" }, ": ", ext("rows", rows)],
pre(rows),
{ h2: "Consultar con SQL: DuckDB" },
["DuckDB lee las tablas directamente de Hugging Face y trae solo las partes que la consulta necesita:"],
pre(`SELECT chamber, count(*) AS vivas\nFROM 'hf://datasets/${DS}/data/companies.parquet'\nWHERE is_live\nGROUP BY 1 ORDER BY 2 DESC\nLIMIT 10;`),
["En el navegador, la ", { a: "consulta SQL", href: "../consulta/index.html" }, " corre el mismo DuckDB sobre las mismas tablas, con ejercicios guiados."],
{ h2: "Recetas" },
el("ul", {},
el("li", {}, "Empresas vivas, la cifra principal del sitio: ", code("SELECT count(*) FROM companies WHERE is_live")),
el("li", {}, "Las que el registro marca «ACTIVA»: ", code("WHERE status = 'ACTIVA'")),
el("li", {}, "Personas jurídicas vivas: ", code("WHERE in_target_list")),
el("li", {}, "Una empresa por NIT: ", code("SELECT * FROM name_directory WHERE nit = '860025900'")),
el("li", {}, "Por actividad: ", code("sector_code"), " es la clase CIIU rev. 4 cuando ", code("sector_status = 'rev4'"), "; su nombre está en ", code("activities"), ".")),
{ h2: "Antes de responder con estas cifras" },
el("ol", {},
rich("li", {}, [{ b: "«Viva» no es «activa». " }, code("is_live"), " es haber renovado la matrícula este año, y es un mínimo: las renovaciones llegan todo el año. El estado del registro («ACTIVA») cuenta más del doble. ", { a: "Por qué", href: "../metodologia/index.html#activa" }]),
rich("li", {}, [{ b: "Las personas naturales se cuentan, nunca se nombran" }, " (Ley 1581 de 2012): en sus filas, nombre, NIT y matrícula vienen vacíos."]),
rich("li", {}, [code("company_id"), " cambia en cada edición: para seguir a una empresa, usa ", code("nit"), "."]),
rich("li", {}, [{ b: "La geografía es la cámara de comercio" }, ", no el municipio: el registro abierto no trae municipio, y una cámara cubre varios."]),
rich("li", {}, ["Las cancelaciones masivas son depuraciones del registro, no cierres: ", code("en_dia_masivo"), " las marca."]),
rich("li", {}, ["Los estados financieros están en ", { b: "miles de pesos" }, " y solo son de quienes reportan a Supersociedades; ", code("unidad_dudosa"), " marca los años en otra unidad."]),
rich("li", {}, ["En contratos, para sumar valores usa ", code("valor / partes"), "; ", code("valor_dudoso"), " marca valores imposibles."]),
rich("li", {}, ["Di siempre de qué corte es la cifra."])),
{ h2: "Cómo citar y enlazar" },
["La cita y las fuentes de cada tabla están en ", { a: "Licencia y cómo citar", href: "../metodologia/index.html#citar" },
". Para enlazar a una empresa: ", code("https://amc.clyxconsulting.com/historias/tu-empresa/#nit=<NIT>"),
"; a una actividad en el explorador: ", code("https://amc.clyxconsulting.com/explorar/#clase=<CIIU>&camara=<código>"), "."],
{ h2: "Las tablas y sus columnas" },
["Las ", { b: String(Object.keys(m.files).length) }, " tablas de esta edición. Abre una para ver la nota de cada columna."]),
tables));
A.reveal(app);
A.footer(s);
window.__amcReady = true;
} catch (e) { A.fail(app, e, "la lista de tablas"); }
</script>
</body>
</html>