

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 时间序列数据
<a name="clarify-processing-job-data-format-time-series"></a>

时间序列数据是指可载入三维数据框架的数据。在框架中，每个时间戳的每一行都代表一条目标记录，而每条目标记录都有一个或多个相关列。每个数据框单元格内的值可以是数字、分类或文本数据类型。

## 时间序列数据集的先决条件
<a name="clarify-processing-job-data-format-time-series-prereq"></a>

在分析之前，完成必要的预处理步骤来准备数据，如数据清理或特征工程。您可以提供一个或多个数据集。如果您提供多个数据集，请使用以下方法之一将其提供给 Clarif SageMaker y 处理作业：
+ 使用[ProcessingInput](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ProcessingInput.html)命名配置`dataset`或分析配置`dataset_uri`来指定主数据集。有关 `dataset_uri` 的更多信息，请参阅 [分析配置文件](clarify-processing-job-configure-analysis.md) 中的参数列表。
+ 使用分析配置文件中提供的 `baseline` 参数。如果存在，`static_covariates` 需要基线数据集。有关分析配置文件的更多信息（包括示例），请参阅 [分析配置文件](clarify-processing-job-configure-analysis.md)。

下表列出了支持的数据格式、其文件扩展名和 MIME 类型。


| 数据格式 | 文件扩展名 | MIME 类型 | 
| --- | --- | --- | 
|  `item_records`  |  json  |  `application/json`  | 
|  `timestamp_records`  |  json  |  `application/json`  | 
|  `columns`  |  json  |  `application/json`  | 

JSON 是一种灵活的格式，可以表示结构化数据的任何复杂程度。如表所示，Clar SageMaker ify 支持格式`item_records``timestamp_records`、和`columns`。

## 时间序列数据集配置示例
<a name="clarify-processing-job-data-format-time-series-ex"></a>

本节将向您展示如何使用 `time_series_data_config` 为 JSON 格式的时间序列数据设置分析配置。假设有一个数据集，其中包含两个项目，每个项目都有一个时间戳 (t)、目标时间序列 (x)、两个相关时间序列 (r) 和两个静态协变量 (u)，具体如下：

 t1 = [0,1,2], t2 = [2,3]

x1 = [5,6,4], x2 = [0,4]

r1 = [0,1,0], r21 = [1,1]

r12 = [0,0,0], r22 = [1,0]

u11 = -1, u21 = 0

u12 = 1, u22 = 2

根据 `dataset_format` 的不同，您可以用三种不同的方式使用 `time_series_data_config` 对数据集进行编码。下文将介绍每种方法。

### 当 `dataset_format` 为 `columns` 时的时间序列数据配置
<a name="clarify-processing-job-data-format-time-series-columns"></a>

下面的示例使用了 `dataset_format` 的 `columns` 值。下面的 JSON 文件代表了前面的数据集。

```
{
    "ids": [1, 1, 1, 2, 2],
    "timestamps": [0, 1, 2, 2, 3], # t
    "target_ts": [5, 6, 4, 0, 4], # x
    "rts1": [0, 1, 0, 1, 1], # r1
    "rts2": [0, 0, 0, 1, 0], # r2
    "scv1": [-1, -1, -1, 0, 0], # u1
    "scv2": [1, 1, 1, 2, 2], # u2
}
```

请注意，`ids` 字段中的项目 ID 是重复的。`time_series_data_config` 的正确实现如下所示：

```
"time_series_data_config": {
    "item_id": "ids",
    "timestamp": "timestamps",
    "target_time_series": "target_ts",
    "related_time_series": ["rts1", "rts2"],
    "static_covariates": ["scv1", "scv2"],
    "dataset_format": "columns"
}
```

### 当 `dataset_format` 为 `item_records` 时的时间序列数据配置
<a name="clarify-processing-job-data-format-time-series-itemrec"></a>

下面的示例使用了 `dataset_format` 的 `item_records` 值。下面的 JSON 文件代表了数据集。

```
[
    {
        "id": 1,
        "scv1": -1,
        "scv2": 1,
        "timeseries": [
            {"timestamp": 0, "target_ts": 5, "rts1": 0, "rts2": 0},
            {"timestamp": 1, "target_ts": 6, "rts1": 1, "rts2": 0},
            {"timestamp": 2, "target_ts": 4, "rts1": 0, "rts2": 0}
        ]
    },
    {
        "id": 2,
        "scv1": 0,
        "scv2": 2,
        "timeseries": [
            {"timestamp": 2, "target_ts": 0, "rts1": 1, "rts2": 1},
            {"timestamp": 3, "target_ts": 4, "rts1": 1, "rts2": 0}
        ]
    }
]
```

每个项目在 JSON 中都表示为一个单独的条目。以下片段显示了相应的`time_series_data_config`（使用 JMESPath）。

```
"time_series_data_config": {
    "item_id": "[*].id",
    "timestamp": "[*].timeseries[].timestamp",
    "target_time_series": "[*].timeseries[].target_ts",
    "related_time_series": ["[*].timeseries[].rts1", "[*].timeseries[].rts2"],
    "static_covariates": ["[*].scv1", "[*].scv2"],
    "dataset_format": "item_records"
}
```

### 当 `dataset_format` 为 `timestamp_record` 时的时间序列数据配置
<a name="clarify-processing-job-data-format-time-series-tsrec"></a>

下面的示例使用了 `dataset_format` 的 `timestamp_record` 值。下面的 JSON 文件代表了前面的数据集。

```
[
    {"id": 1, "timestamp": 0, "target_ts": 5, "rts1": 0, "rts2": 0, "svc1": -1, "svc2": 1},
    {"id": 1, "timestamp": 1, "target_ts": 6, "rts1": 1, "rts2": 0, "svc1": -1, "svc2": 1},
    {"id": 1, "timestamp": 2, "target_ts": 4, "rts1": 0, "rts2": 0, "svc1": -1, "svc2": 1},
    {"id": 2, "timestamp": 2, "target_ts": 0, "rts1": 1, "rts2": 1, "svc1": 0, "svc2": 2},
    {"id": 2, "timestamp": 3, "target_ts": 4, "rts1": 1, "rts2": 0, "svc1": 0, "svc2": 2},
]
```

JSON 的每个条目代表一个时间戳，并对应一个项目。实施 `time_series_data_config` 如下所示：

```
{
    "item_id": "[*].id",
    "timestamp": "[*].timestamp",
    "target_time_series": "[*].target_ts",
    "related_time_series": ["[*].rts1"],
    "static_covariates": ["[*].scv1"],
    "dataset_format": "timestamp_records"
}
```

# 时间序列数据的端点请求
<a name="clarify-processing-job-data-format-time-series-request-jsonlines"></a>

Cl SageMaker arify 处理任务将数据序列化为任意 JSON 结构（MIME 类型:`application/json`）。为此，必须为分析配置 `content_template` 参数提供模板字符串。Clarify 处理 SageMaker 任务使用它来构造提供给您的模型的 JSON 查询。 `content_template`包含数据集中的一条或多条记录。您还必须为 `record_template` 提供模板字符串，用于构建每条记录的 JSON 结构。然后将这些记录插入 `content_template`。有关 `content_type` 或 `dataset_type` 的更多信息，请参阅 [分析配置文件](clarify-processing-job-configure-analysis.md)。

**注意**  
由于 `content_template` 和 `record_template` 是字符串参数，所以 JSON 序列化结构中任何属于该结构的双引号字符（“）都应该在您的配置中作为转义字符来处理。例如，如果要在 Python 中转义双引号，可以为 `content_template` 输入以下值：  

```
'$record'
```

下表列出了序列化 JSON 请求有效载荷的示例，以及构建它们所需的相应 `content_template` 和 `record_template` 参数。


| 使用案例 | 端点请求负载（字符串表示形式） | content\$1template | record\$1template | 
| --- | --- | --- | --- | 
|  每次单条记录  |  `{"target": [1, 2, 3],"start": "2024-01-01 01:00:00"}`  |  `'$record'`  |  `'{"start": $start_time, "target": $target_time_series}'`  | 
|  带 `$related_time_series` 和 `$static_covariates` 的单条记录  |  `{"target": [1, 2, 3],"start": "2024-01-01 01:00:00","dynamic_feat": [[1.0, 2.0, 3.0],[1.0, 2.0, 3.0],"cat": [0,1]}`  |  `'$record'`  |  `'{"start": $start_time, "target": $target_time_series, "dynamic_feat": $related_time_series, "cat": $static_covariates}'`  | 
|  多条记录  |  `{"instances": [{"target": [1, 2, 3],"start": "2024-01-01 01:00:00"}, {"target": [1, 2, 3],"start": "2024-01-01 02:00:00"}]}`  |  `'{"instances": $records}'`  |  `'{"start": $start_time, "target": $target_time_series}'`  | 
|  带 `$related_time_series` 和 `$static_covariates` 的多条记录  |  `{"instances": [{"target": [1, 2, 3],"start": "2024-01-01 01:00:00","dynamic_feat": [[1.0, 2.0, 3.0],[1.0, 2.0, 3.0],"cat": [0,1]}, {"target": [1, 2, 3],"start": "2024-01-01 02:00:00","dynamic_feat": [[1.0, 2.0, 3.0],[1.0, 2.0, 3.0],"cat": [0,1]}]}`  |  `'{"instances": $records}'`  |  `''{"start": $start_time, "target": $target_time_series, "dynamic_feat": $related_time_series, "cat": $static_covariates}'`  | 

# 时间序列数据的端点响应
<a name="clarify-processing-job-data-format-time-series-response-json"></a>

Clar SageMaker ify 处理任务将整个有效负载反序列化为 JSON。然后，它使用分析配置中提供的 JMESPath 表达式从反序列化数据中提取预测。响应负载中的记录必须与请求负载中的记录相匹配。

下表是一个只输出平均预测值的端点响应示例。[分析配置](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-processing-job-configure-analysis.html#clarify-processing-job-configure-analysis-parameters)中`predictor`字段中`forecast`使用的值应作为 JMESPath 表达式提供，以查找处理作业的预测结果。


| 端点请求负载 | 端点响应负载（字符串表示形式） | JMESPath 分析配置中的预测表达式 | 
| --- | --- | --- | 
|  单条记录示例。配置应为 `TimeSeriesModelConfig(forecast="prediction.mean")`，以便正确提取预测结果。  |  `'{"prediction": {"mean": [1, 2, 3, 4, 5]}'`  |  `'prediction.mean'`  | 
|  多条记录。 AWS DeepAR 端点响应。  |  `'{"predictions": [{"mean": [1, 2, 3, 4, 5]}, {"mean": [1, 2, 3, 4, 5]}]}'`  |  `'predictions[*].mean'`  | 

# 预先检查时间序列数据的端点请求和响应
<a name="clarify-processing-job-data-format-time-series-precheck"></a>

建议您将模型部署到 A SageMaker I 实时推理终端节点并向该终端节点发送请求。手动检查请求和响应，确保两者都符合 [时间序列数据的端点请求](clarify-processing-job-data-format-time-series-request-jsonlines.md) 和 [时间序列数据的端点响应](clarify-processing-job-data-format-time-series-response-json.md) 部分的要求。如果您的模型容器支持批量请求，您可以从单个记录请求开始，然后尝试两个或更多记录。

以下命令演示了如何使用 AWS CLI请求响应。已预先安装在 Studio 和 SageMaker 笔记本实例中。 AWS CLI 要安装 AWS CLI，请按照[安装指南](https://aws.amazon.com//cli/)进行操作。

```
aws sagemaker-runtime invoke-endpoint \
  --endpoint-name $ENDPOINT_NAME \
  --content-type $CONTENT_TYPE \
  --accept $ACCEPT_TYPE \
  --body $REQUEST_DATA \
  $CLI_BINARY_FORMAT \
  /dev/stderr 1>/dev/null
```

参数已定义，如下所示：
+ \$1ENDPOINT NAME：端点名称。
+ \$1CONTENT\$1TYPE：请求的 MIME 类型（模型容器输入）。
+ \$1ACCEPT\$1TYPE：响应（模型容器输出）的 MIME 类型。
+ \$1REQUEST\$1DATA：请求的有效载荷字符串。
+ \$1CLI\$1BINARY\$1FORMAT：命令行界面 (CLI) 参数的格式。对于 AWS CLI v1，此参数应保留为空。对于 v2，此参数应设置为 `--cli-binary-format raw-in-base64-out`。

**注意**  
AWS CLI 默认情况下，v2 将二进制参数作为 base64 编码的字符串传递。以下往返终端节点的请求和响应示例使用 AWS CLI v1。

------
#### [ Example 1 ]

在以下代码示例中，请求由单个记录组成。

```
aws sagemaker-runtime invoke-endpoint \
  --endpoint-name test-endpoint-json \
  --content-type application/json \
  --accept application/json \
  --body '{"target": [1, 2, 3, 4, 5],
    "start": "2024-01-01 01:00:00"}' \
/dev/stderr 1>/dev/null
```

以下代码片段展示了相应的响应输出。

```
{'predictions': {'mean': [1, 2, 3, 4, 5]}
```

------
#### [ Example 2 ]

在下面的代码示例中，请求包含两条记录。

```
aws sagemaker-runtime invoke-endpoint \
  --endpoint-name test-endpoint-json-2 \
  --content-type application/json \
  --accept application/json \
  --body $'{"instances": [{"target":[1, 2, 3],
    "start":"2024-01-01 01:00:00",
    "dynamic_feat":[[1, 2, 3, 4, 5],
        [1, 2, 3, 4, 5]]}], {"target":[1, 2, 3],
    "start":"2024-01-02 01:00:00",
    "dynamic_feat":[[1, 2, 3, 4, 5],
        [1, 2, 3, 4, 5]]}]}' \
dev/stderr 1>/dev/null
```

响应输出如下：

```
{'predictions': [{'mean': [1, 2, 3, 4, 5]}, {'mean': [1, 2, 3, 4, 5]}]}
```

------