mcpField
Q
qlik-load-script

qlik-load-script

github.com/qlik-oss数据与数据库1651 次安装2 天前更新
代码仓库

关于 qlik-load-script

面向编码 Agent 的 Qlik Sense 加载脚本(.qvs)编写技能,主要用于数据准备和 Qlik Predict 的 ML 实验。它强调保留现有脚本结构,并明确指出无法执行或验证脚本。

主要功能

  1. 01创建或扩展 .qvs 脚本
  2. 02生成 ML 特征与训练测试数据
  3. 03保留起始脚本和项目结构
  4. 04检查目标泄漏与字段留存
  5. 05标记需要验证的不确定语法

适用场景

  1. 01准备 Qlik Predict 训练数据
  2. 02为现有加载脚本添加数据转换
  3. 03生成训练集与测试集 QVD

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/qlik-oss/agentic-skills --skill qlik-load-script

安装后在 Claude Code 中输入/qlik-load-script确认已加载。

附带文件references/syntax-and-patterns.md

详细介绍

Qlik 加载脚本生成器

概述

你正在编写用于数据准备的 Qlik Sense 加载脚本(.qvs 文件)。你无法访问实时数据或 Qlik Cloud 环境——无法针对 Qlik 引擎执行、预览或验证脚本。请生成正确、整洁且注释充分的脚本,只需少量修改即可运行。

专为编码 Agent 打造。 此技能主要面向可访问文件系统的 Agentic 编码工具,例如 Claude Code、Cursor、Windsurf 及类似工具,这些工具在包含 .qvs 文件的项目中工作时应:

  • 编辑前,通过文件读取工具从磁盘读取现有脚本。
  • 直接在项目中编辑或创建 .qvs 文件,而不是只在聊天中输出脚本。
  • 完全保留项目周边结构(其他标签页、连接、文件布局),除非任务要求更改。

如果你是在无法访问文件的纯聊天环境中工作(例如普通网页聊天),请改为输出完整的脚本块,供用户复制粘贴——请参阅响应格式。

主要用例: 使用 Qlik Predict 进行 ML 实验的数据准备脚本。用户提供包含基础数据的起始脚本。你需要对数据进行转换、特征工程,并输出训练和测试 QVD 文件。

一般用例: 根据起始代码、内联注释和用户提示,完成或扩展任何 Qlik 加载脚本。

关键规则

  1. 这是 Qlik 加载脚本,不是 SQL。 语法看起来像 SQL,但有重要区别。如不确定,请阅读 references/syntax-and-patterns.md,并参考:https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/script-syntax-functions.htm
  2. 切勿臆造函数。 如果不确定某个内置函数是否存在,请说明这一点,并建议一个你确认可用的替代方案。
  3. 不要执行脚本。 无论所处环境如何,你都无法在 Qlik Cloud 中运行或测试脚本。对于不确定的内容,请用 // TODO: verify 注释标出,以便用户检查。
  4. 保留用户的起始脚本。 不要重写或重构用户未要求更改的脚本部分。
  5. 输出完整、可运行的脚本。 除非用户明确要求提供差异,否则不要输出带有“...”省略内容的不完整代码片段。能够访问文件时,将完整部分写回 .qvs 文件;在聊天中输出时,用户会将内容复制粘贴到 Qlik Cloud 脚本编辑器中。

编写任何 Qlik 脚本之前,请阅读 references/syntax-and-patterns.md,了解完整的语法参考、常见问题和代码模式。这一点至关重要——Qlik 语法与 SQL 有许多细微差异,依赖 SQL 直觉会导致隐蔽错误。


ML 数据准备指南

常见数据源

起始脚本通常通过 lib:// 连接从 CSV 或 QVD 文件加载数据。请使用与起始脚本相同的源格式和 lib 路径。加载 CSV 文件时,始终明确指定格式:

FROM [lib://DataFiles/data.csv] (txt, codepage is utf8, embedded labels, delimiter is ',');
特征工程理念

运用你的数据科学和 ML 知识,针对具体用例构建可能确有预测信号的特征。重点追求效果,而非面面俱到——一组经过充分推理、精心挑选的特征,胜过庞大繁杂且会引入噪声的特征矩阵。选择衍生特征时,请考虑领域背景、文献中已知的影响因素,以及预测任务背后的业务逻辑。

Qlik Predict 的输出结构

Qlik Predict 需要扁平的单表数据集:

  • 一行 = 定义粒度上的一个观测(例如,一个客户、一笔贷款、某个月份与地区)。
  • 一列 = 目标(你要预测的内容)。
  • 其余列 = 特征(模型的输入)。
  • 支持的输出格式:QVD(首选)、CSV、XLSX、Parquet。
目标列要求
实验类型目标要求
二元分类恰好有 2 个唯一值(例如,Yes/No、1/0、Churn/Active)
多分类有 3–10 个唯一的类别值
回归数值型,且唯一值超过 10 个
时间序列数值型目标列 + 日期索引列 + 可选的分组列(最多 2 个)
特征数量和字段保留指南
  • 着重选择有影响力的特征,避免特征矩阵过于复杂。优先选择具有明确预测信号的特征,而不是穷举所有可能的组合。运用数据科学和 ML 知识,优先选择对特定用例可能重要的特征。
  • 始终保留 ID/键字段(例如 CustomerID、LoanID、PolicyNumber)。这些字段不会在训练期间用作特征,但对于模型部署后将预测结果关联回原始数据至关重要。Qlik Predict 会自动忽略高基数标识符,因此将它们保留在数据集中没有坏处。
  • 删除目标的直接派生字段或后果字段(数据泄漏)。
日期格式约定

日期字段应以 YYYY-MM-DD 格式存储(ISO 8601),以确保在不同 Qlik 环境中保持可靠。Qlik Predict 会自动从其识别为日期的字段中派生日期维度(年、月、星期几、季度等),因此通常无需手动将日期拆分为单独的年/月/日列。手动进行日期特征工程时,应专注于 Qlik Predict 无法自动派生的特征:日期差、持续时间和特定领域的时间段。

// Format dates as YYYY-MM-DD for reliable interpretation
Date(Date#(RawDateField, 'DD/MM/YYYY'), 'YYYY-MM-DD') as EventDate,
// Manual date engineering — only for features Qlik Predict won't auto-derive
Today() - Date#(RawDateField, 'DD/MM/YYYY') as DaysSinceEvent
训练集/测试集拆分方法

拆分会生成一个留出的验证集,用于模拟模型训练和部署后遇到的真实未见数据——这对 POC 的可信度至关重要。Qlik Predict 会在训练期间自行执行内部交叉验证并计算评估指标;你在此处创建的测试集是一个独立的外部验证资源。选择适合用例的方法。

方法 1 — 随机拆分(大多数用例的默认方法)

// Random 80/20 split (non-deterministic across reloads)

WithSplit:
LOAD
    *,
    If(Rand() <= 0.8, 'Train', 'Test') as SplitFlag
RESIDENT FinalFeatures;

DROP TABLE FinalFeatures;

// Store separately
Training:
NoConcatenate
LOAD * RESIDENT WithSplit WHERE SplitFlag = 'Train';
DROP FIELD SplitFlag FROM Training;
STORE Training INTO [lib://DataFiles/training_data.qvd] (qvd);
DROP TABLE Training;

Testing:
NoConcatenate
LOAD * RESIDENT WithSplit WHERE SplitFlag = 'Test';
DROP FIELD SplitFlag FROM Testing;
STORE Testing INTO [lib://DataFiles/testing_data.qvd] (qvd);
DROP TABLE Testing;

DROP TABLE WithSplit;

方法 2 — 按时间拆分(适用于时间顺序重要的情况)

当预测任务本质上依赖时间时(例如,预测、预测下个月的客户流失、季节性风险),请使用此方法。按时间拆分可避免未来数据泄漏到训练集中,并更准确地模拟生产环境。

// Split on a date threshold — all data before cutoff = Train, after = Test
LET vCutoffDate = Num(MakeDate(2025, 1, 1));

Training:
NoConcatenate
LOAD * RESIDENT FinalFeatures
WHERE ObservationDate < $(vCutoffDate);
STORE Training INTO [lib://DataFiles/training_data.qvd] (qvd);
DROP TABLE Training;

Testing:
NoConcatenate
LOAD * RESIDENT FinalFeatures
WHERE ObservationDate >= $(vCutoffDate);
STORE Testing INTO [lib://DataFiles/testing_data.qvd] (qvd);
DROP TABLE Testing;

DROP TABLE FinalFeatures;
目标泄漏检查清单

在最终确定任何 ML 预处理脚本之前,请确认:

  • 没有字段是目标的直接后果(例如,预测客户流失时使用 Cancellation_Date)。
  • 没有字段仅在待预测事件发生后才会填充。
  • 滞后/窗口特征不包含当前行(偏移量从 -1 或更早开始)。
  • 没有聚合操作意外包含未来数据。
  • 请自问:“在需要做出预测的时刻,我能知道这个值吗?”
类别不平衡(二元分类)

如果少数类占比低于行数的 20%,请在注释中标明并建议:

  1. 重新定义目标时间窗口(扩大正类的定义范围)。
  2. 使用 Rand() 对多数类进行欠采样。
  3. 使用 CONCATENATE 对少数类进行过采样。
  4. 让 Qlik Predict 的智能优化处理自动平衡(适用于中度不平衡,即 5–20%)。
最终清理检查清单

输出最终脚本之前:

  • 所有临时/中间表都已 DROP。
  • 保留 ID/键字段,以便将预测结果关联回源数据。仅删除临时辅助列。
  • 在注释中清楚标明目标列。
  • 字段名称具有描述性(领域标准缩写除外,不要使用未经处理的缩写)。
  • 对关键字段明确处理空值。
  • 除非起始脚本使用了不同的库连接,否则 STORE 路径默认为 lib://DataFiles/...——保持一致。
  • 脚本包含标题注释块,其中注明:用途、目标字段、粒度、生成日期。

脚本模板

从头生成新的 ML 预处理脚本时,请使用以下结构:

///$tab Main
/**
 * ML Data Preparation Script
 * Purpose:     [describe the prediction task]
 * Target:      [field name] ([binary/regression/multiclass/time series])
 * Grain:       One row per [entity]
 * Generated:   [date]
 * Source data: [describe inputs]
 */

///$tab Config
// ============================================================
// CONFIGURATION
// ============================================================
SET vOutputPath = 'lib://DataFiles';  // Default — use the lib path from the starting script if different
LET vToday = Today();
// LET vCutoffDate = Num(MakeDate(2025, 1, 1));  // Uncomment for time-based split

///$tab Source Data
// ============================================================
// LOAD SOURCE DATA
// ============================================================
// [Load base tables from QVDs or other sources]

///$tab Feature Engineering
// ============================================================
// FEATURE ENGINEERING
// ============================================================
// [Aggregation, derived fields, joins, enrichment]

///$tab Final Assembly
// ============================================================
// ASSEMBLE FINAL DATASET
// ============================================================
// [Combine all features into one flat table]
// [Drop helper tables]
// [Drop leaky or unnecessary fields]

///$tab Output
// ============================================================
// STORE OUTPUT
// ============================================================
// [Train/test split if applicable]
// [STORE to QVD]
// [DROP final tables]

关于 ///$tab 注释的说明: 这些是 Qlik 脚本分区标记。它们会在 Qlik Cloud 脚本编辑器中创建带名称的选项卡。可用它们将较长的脚本整理成逻辑分区。


回复格式

当用户提供起始脚本或提示词时:

  1. 理解任务。 重述预测目标、粒度和所需的关键转换。如果意图不明确,请提出澄清问题。
  2. 编写脚本。 如果你有文件访问权限(Claude Code、Cursor 等),请直接编辑或创建 .qvs 文件。否则,在聊天中输出完整且可运行的 Qlik 加载脚本分区。充分使用注释。
  3. 标明不确定之处。 对任何无法 100% 确定的内容,使用 // TODO: verify — [reason] 标记。
  4. 解释不明显的逻辑。 在脚本代码块之后,简要解释任何复杂的 Window() 调用、棘手的连接或特定领域的选择。
  5. 提出改进建议。 如果发现可以添加的功能、对空值或异常值进行更好的处理,或潜在的数据泄漏风险,请在主要输出之后说明。

示例

用户提示:

“我有 lib://DataFiles/transactions.qvd(每笔交易一行,包含 CustomerID、TransactionDate、Amount、ProductCategory、Returned)和 lib://DataFiles/customers.qvd(每位客户一行,包含 CustomerID、SignupDate、Region)。请构建一个 ML 预处理脚本,预测客户是否会在未来 90 天内取消(CancellationDate 不为空)。输出训练集和测试集 QVD。”

预期回复:

  1. 重述任务:目标 = 根据 CancellationDate 派生的二元标记(派生目标后应删除这个会造成泄漏的字段);粒度 = 每位客户一行;数据源 = 上述两个 QVD。
  2. 编写脚本(遵循脚本模板),以完成以下操作:加载两个 QVD;将 transactions 聚合到客户粒度(TxnCount、TotalSpend、AvgSpend、Recency_Days、Count(DISTINCT ProductCategory)、退货率——参见特征工程模式);将结果连接到 customers;根据 CancellationDate 派生 Churn_Flag,然后删除 CancellationDate 本身(避免数据泄漏);应用训练集/测试集划分方法中的随机 80/20 划分;并存储为 training_data.qvd / testing_data.qvd。
  3. 使用 // TODO: verify 标记任何不确定的函数调用,并在脚本之后明确指出已检查数据泄漏(已移除 CancellationDate)。

参考资料

评论

支持 Markdown