nshiab/simple-data-analysis

Fast DuckDB-powered TypeScript library for tabular analysis, geospatial analysis, network graph analysis, vector similarity search, AI, Google Sheets, and data visualization.

是什么: 一个用 TypeScript 编写的库,用于表格、地理空间和 AI 辅助数据分析,可在 Deno、Node.js 和 Bun 上运行。它在受 Pandas/Tidyverse 启发的可链式 API 背后封装了 DuckDB(一种进程内分析数据库),并添加了可选的 AI 功能,如逐行 LLM 处理、嵌入和 RAG。它由 CBC 新闻的一位计算记者创建,他希望完全使用 JavaScript 进行数据分析和可视化,而不是在 Python、R 和 JS 之间切换。

为何重要: 在严肃的数据工作(pandas、tidyverse、GeoPandas)方面,JavaScript 历来落后于 Python 和 R。SDA 通过以下方式缩小了这一差距:

  • 通过 DuckDB 实现高性能 – README 中的基准测试(2200 万条温度记录、33.5 万个地理空间点)显示,SDA 的运行速度接近原始 DuckDB,同时优于 pandas/tidyverse/GeoPandas,且内存占用更低。
  • 整个流水线只用一种语言 – 分析、地理空间连接、图表、地图和 AI 增强都在 TypeScript 中完成,无需切换生态系统。
  • 延迟加载和查询融合 – 核心转换会排队并融合为单个 SQL 语句,减少往返次数。AI/Google/图表依赖项仅在调用这些特定方法时加载,因此仅使用核心功能的用户无需承担启动成本。
  • 内置 AI 功能(在扩展包中):aiRowByRow() 将列值发送给 LLM 并存储结构化响应(例如,从城市名称中提取国家和大陆),aiEmbeddings() 将文本转换为向量,并支持聚类(HDBSCAN)、混合搜索、RAG 式问答和自然语言查询。Google Gemini、Vertex AI 或本地 Ollama 模型可通过 .env 配置。
  • 公共数据源 – 为加拿大统计局表和 OpenStreetMap(本地文件或 Overpass 查询)提供直接加载器,并带有本地缓存以保证可复现性。

工作原理: SDA 通过 duckdb-node-neo 在 DuckDB 中执行 SQL,并使用 DuckDB 扩展(用于地理空间操作的空间扩展,以及模糊匹配、全文搜索、向量索引)进行延迟加载。API 是同步且可链式的,用于转换;您只需 await 最终的观察者方法(如 .log()、.writeData() 或获取结果)。

示例(来自 README): 加载加拿大气象站的 CSV,重命名列,删除缺失值,计算每个站点的平均温度,排序,打印并导出:

const sdb = new SimpleDB();

const data = await sdb
  .newTable("temperatures")
  .loadData(".../dailyTemperatures.csv")
  .renameColumns({ t: "temperature", id: "station" })
  .removeMissing({ columns: "temperature" })
  .summarize({
    columns: "temperature", by: "station", stats: "mean", decimals: 2,
  })
  .sort({ mean: "desc" })
  .log();

await data.writeData("output/averageTemperatures.csv");
await sdb.close();

适用人群: 数据记者、分析师和开发者,他们更喜欢 JavaScript/TypeScript,并且需要处理大型数据集、进行地理空间连接、生成图表/地图,或使用 LLM 增强数据,而无需学习第二种数据语言。

README 中的注意事项: 这是一个真实且功能丰富的库,但它并不能完全替代所有 Python 用例的 dataframe;AI 功能需要 API 密钥(Gemini/Vertex/Ollama),而且 README 指出 JSR 文档目前省略了继承方法(这是一个已知的上游限制)。安装可通过 JSR 或 npm 进行,适用于 Node/Bun/Deno,并且有一个配套的脚手架工具(setup-data-project)可用于启动新项目。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目