关于 qlik-load-script
面向编码 Agent 的 Qlik Sense 加载脚本(.qvs)编写技能,主要用于数据准备和 Qlik Predict 的 ML 实验。它强调保留现有脚本结构,并明确指出无法执行或验证脚本。
主要功能
- 01创建或扩展 .qvs 脚本
- 02生成 ML 特征与训练测试数据
- 03保留起始脚本和项目结构
- 04检查目标泄漏与字段留存
- 05标记需要验证的不确定语法
适用场景
- 01准备 Qlik Predict 训练数据
- 02为现有加载脚本添加数据转换
- 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 加载脚本。
关键规则
- 这是 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
- 切勿臆造函数。 如果不确定某个内置函数是否存在,请说明这一点,并建议一个你确认可用的替代方案。
- 不要执行脚本。 无论所处环境如何,你都无法在 Qlik Cloud 中运行或测试脚本。对于不确定的内容,请用
// TODO: verify注释标出,以便用户检查。 - 保留用户的起始脚本。 不要重写或重构用户未要求更改的脚本部分。
- 输出完整、可运行的脚本。 除非用户明确要求提供差异,否则不要输出带有“...”省略内容的不完整代码片段。能够访问文件时,将完整部分写回
.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%,请在注释中标明并建议:
- 重新定义目标时间窗口(扩大正类的定义范围)。
- 使用
Rand()对多数类进行欠采样。 - 使用
CONCATENATE对少数类进行过采样。 - 让 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 脚本编辑器中创建带名称的选项卡。可用它们将较长的脚本整理成逻辑分区。
回复格式
当用户提供起始脚本或提示词时:
- 理解任务。 重述预测目标、粒度和所需的关键转换。如果意图不明确,请提出澄清问题。
- 编写脚本。 如果你有文件访问权限(Claude Code、Cursor 等),请直接编辑或创建
.qvs文件。否则,在聊天中输出完整且可运行的 Qlik 加载脚本分区。充分使用注释。 - 标明不确定之处。 对任何无法 100% 确定的内容,使用
// TODO: verify — [reason]标记。 - 解释不明显的逻辑。 在脚本代码块之后,简要解释任何复杂的 Window() 调用、棘手的连接或特定领域的选择。
- 提出改进建议。 如果发现可以添加的功能、对空值或异常值进行更好的处理,或潜在的数据泄漏风险,请在主要输出之后说明。
示例
用户提示:
“我有
lib://DataFiles/transactions.qvd(每笔交易一行,包含CustomerID、TransactionDate、Amount、ProductCategory、Returned)和lib://DataFiles/customers.qvd(每位客户一行,包含CustomerID、SignupDate、Region)。请构建一个 ML 预处理脚本,预测客户是否会在未来 90 天内取消(CancellationDate不为空)。输出训练集和测试集 QVD。”
预期回复:
- 重述任务:目标 = 根据
CancellationDate派生的二元标记(派生目标后应删除这个会造成泄漏的字段);粒度 = 每位客户一行;数据源 = 上述两个 QVD。 - 编写脚本(遵循脚本模板),以完成以下操作:加载两个 QVD;将
transactions聚合到客户粒度(TxnCount、TotalSpend、AvgSpend、Recency_Days、Count(DISTINCT ProductCategory)、退货率——参见特征工程模式);将结果连接到customers;根据CancellationDate派生Churn_Flag,然后删除CancellationDate本身(避免数据泄漏);应用训练集/测试集划分方法中的随机 80/20 划分;并存储为training_data.qvd/testing_data.qvd。 - 使用
// TODO: verify标记任何不确定的函数调用,并在脚本之后明确指出已检查数据泄漏(已移除CancellationDate)。
参考资料
- 语法与模式参考: references/syntax-and-patterns.md — 完整的 Qlik 加载脚本语法、常见陷阱和特征工程代码模式。编写任何脚本前请先阅读此文档。
- Qlik 脚本语法与函数: https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/script-syntax-functions.htm
- Qlik Predict 文档: https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/AutoML/home-automl.htm
- 窗口函数参考: https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/window-functions.htm