从风速数据中删除异常值
此示例显示如何从公共通道读取数据、修改数据并显示选择元素。在本示例中,您将修改 MATLAB Analysis 和 MATLAB Visualizations App 提供的代码模板之一。该示例使用来自 ThingSpeak™ 通道 12397 的数据,该通道从位于马萨诸塞州内蒂克市的基于 Arduino® 的气象站收集天气数据。
从模板代码创建 MATLAB Analysis 脚本
为了检测并消除纳蒂克气象站风速数据中的离群值,您可以使用代码模板编写 MATLAB® 脚本。
转至 ThingSpeak 中的 Apps 选项卡,然后选择 MATLAB Analysis。点击 New,选择 Remove outliers from wind speed data,然后点击 Create。

分析您的数据
MATLAB Code 字段已预先填充代码,用于检测并删除过去六小时内风速数据中的离群值。
1) 设置与 ThingSpeak 通信的变量。readChannelID 是从气象站收集数据的公共通道的通道 ID。windSpeedFieldID 是通道中包含风速值的字段。仅当您从私有通道读取数据时才为 readAPIkey 分配一个值。气象站是公共的,因此对于此示例,不要设置 readAPIkey。
readChannelID = 12397;
windSpeedFieldID = 2;
readAPIKey = '';2) 使用 thingSpeakRead 函数,读取过去六小时的风速值和时间戳。
[windSpeed,timeStamp] = thingSpeakRead(readChannelID,'fields',windSpeedFieldID,'NumMinutes',360,'ReadKey',readAPIKey);
3) 使用 MATLAB isoutlier (MATLAB) 函数检查风速数据中的离群值。使用默认设置,此函数计算某个值是否与输入数据集的中位数相差超过三个缩放中位数的绝对偏差。您可以调整输入参量来自定义离群结果。识别离群数据点的索引和干净数据点的索引。使用这些索引来选择与离群数据和干净数据相对应的数据点和时间戳。
outlierDataIndex = isoutlier(windSpeed); cleanDataIndex = ~outlierDataIndex; outlierData = windSpeed(outlierDataIndex); cleanData = windSpeed(cleanDataIndex); outlierTimeStamps = timeStamp(outlierDataIndex); cleanTimeStamps = timeStamp(cleanDataIndex);
4) 使用离群数据和干净数据创建时间表,并显示离群数据点的结果。
outlierDataTable = timetable(outlierTimeStamps,outlierData);
cleanDataTable = timetable(cleanTimeStamps,cleanData);
display(outlierDataTable,'Outlier data'); 169×1 timetable
outlierTimeStamps outlierData
____________________ ___________
07-Feb-2025 02:22:24 0.1
07-Feb-2025 02:23:24 0.1
07-Feb-2025 02:25:24 0.3
07-Feb-2025 02:26:24 0.1
07-Feb-2025 02:31:24 0.7
07-Feb-2025 02:32:24 0.3
07-Feb-2025 02:33:24 0.4
07-Feb-2025 02:34:24 0.8
07-Feb-2025 02:35:24 0.1
07-Feb-2025 02:36:24 1
07-Feb-2025 02:37:24 0.4
07-Feb-2025 02:38:24 1.1
07-Feb-2025 02:39:24 1.6
07-Feb-2025 02:40:24 0.6
07-Feb-2025 02:41:24 1.9
07-Feb-2025 02:42:24 0.7
07-Feb-2025 02:43:24 0.1
07-Feb-2025 02:44:24 1.3
07-Feb-2025 02:45:24 0.4
07-Feb-2025 02:46:24 0.7
07-Feb-2025 02:47:24 1
07-Feb-2025 02:48:24 0.2
07-Feb-2025 02:49:24 0.2
07-Feb-2025 02:50:24 1.2
07-Feb-2025 02:51:24 0.5
07-Feb-2025 02:52:24 1
07-Feb-2025 02:53:24 0.2
07-Feb-2025 02:54:24 0.5
07-Feb-2025 02:55:24 0.9
07-Feb-2025 02:56:24 1.5
07-Feb-2025 02:57:24 1.3
07-Feb-2025 02:58:24 0.2
07-Feb-2025 02:59:24 0.3
07-Feb-2025 03:00:24 0.8
07-Feb-2025 03:01:24 1.7
07-Feb-2025 03:02:24 0.4
07-Feb-2025 03:03:24 0.1
07-Feb-2025 03:04:24 0.4
07-Feb-2025 03:05:24 0.5
07-Feb-2025 03:06:24 1.2
07-Feb-2025 03:07:24 1.1
07-Feb-2025 03:08:24 0.1
07-Feb-2025 03:09:24 0.1
07-Feb-2025 03:10:24 0.1
07-Feb-2025 03:11:24 0.1
07-Feb-2025 03:12:24 0.2
07-Feb-2025 03:13:24 0.3
07-Feb-2025 03:14:24 1.5
07-Feb-2025 03:15:24 0.4
07-Feb-2025 03:16:24 0.3
07-Feb-2025 03:17:24 0.1
07-Feb-2025 03:18:24 0.4
07-Feb-2025 03:19:24 1
07-Feb-2025 03:20:24 0.1
07-Feb-2025 03:21:24 0.4
07-Feb-2025 03:22:24 0.2
07-Feb-2025 03:23:24 0.2
07-Feb-2025 03:24:24 0.1
07-Feb-2025 03:26:24 0.1
07-Feb-2025 03:27:24 0.1
07-Feb-2025 03:28:24 0.1
07-Feb-2025 03:29:24 0.2
07-Feb-2025 03:32:24 0.5
07-Feb-2025 03:33:24 0.7
07-Feb-2025 03:34:24 0.4
07-Feb-2025 03:35:24 0.1
07-Feb-2025 03:36:24 0.1
07-Feb-2025 03:37:24 0.1
07-Feb-2025 03:40:24 0.2
07-Feb-2025 03:41:24 0.2
07-Feb-2025 03:42:24 0.3
07-Feb-2025 03:44:24 0.3
07-Feb-2025 03:45:24 0.2
07-Feb-2025 03:46:24 0.9
07-Feb-2025 03:47:24 0.1
07-Feb-2025 03:48:24 0.1
07-Feb-2025 03:49:24 0.1
07-Feb-2025 03:51:24 0.1
07-Feb-2025 03:52:24 0.3
07-Feb-2025 03:53:24 0.4
07-Feb-2025 03:54:24 0.4
07-Feb-2025 03:55:24 0.7
07-Feb-2025 03:58:24 0.1
07-Feb-2025 03:59:24 0.1
07-Feb-2025 04:03:24 1
07-Feb-2025 04:04:24 0.7
07-Feb-2025 04:06:24 0.1
07-Feb-2025 04:07:24 0.1
07-Feb-2025 04:11:24 0.4
07-Feb-2025 04:15:24 1.1
07-Feb-2025 04:25:24 0.1
07-Feb-2025 05:39:25 0.1
07-Feb-2025 05:40:25 0.2
07-Feb-2025 05:41:25 0.6
07-Feb-2025 05:42:25 0.3
07-Feb-2025 05:49:25 0.1
07-Feb-2025 05:56:25 0.1
07-Feb-2025 05:57:25 1.5
07-Feb-2025 06:00:25 0.2
07-Feb-2025 06:08:25 0.1
07-Feb-2025 06:09:25 1.2
07-Feb-2025 06:14:25 0.1
07-Feb-2025 06:15:25 1.8
07-Feb-2025 06:18:25 0.7
07-Feb-2025 06:19:25 1.6
07-Feb-2025 06:22:25 0.1
07-Feb-2025 06:23:25 0.5
07-Feb-2025 06:24:25 0.7
07-Feb-2025 06:26:25 0.3
07-Feb-2025 06:28:25 0.3
07-Feb-2025 06:34:25 0.3
07-Feb-2025 06:38:25 0.3
07-Feb-2025 06:42:25 0.3
07-Feb-2025 06:43:25 0.8
07-Feb-2025 06:44:25 1.9
07-Feb-2025 06:47:25 0.4
07-Feb-2025 06:50:25 2.2
07-Feb-2025 06:51:25 2.1
07-Feb-2025 06:52:25 2
07-Feb-2025 06:58:25 1.3
07-Feb-2025 07:09:25 0.2
07-Feb-2025 07:10:25 4.4
07-Feb-2025 07:11:25 1.3
07-Feb-2025 07:12:25 1.9
07-Feb-2025 07:13:25 2.2
07-Feb-2025 07:15:25 0.1
07-Feb-2025 07:16:25 0.4
07-Feb-2025 07:20:25 0.6
07-Feb-2025 07:21:25 2.3
07-Feb-2025 07:22:25 2.5
07-Feb-2025 07:23:25 0.3
07-Feb-2025 07:24:25 0.7
07-Feb-2025 07:25:25 3.3
07-Feb-2025 07:26:25 1.1
07-Feb-2025 07:27:25 0.3
07-Feb-2025 07:28:25 1
07-Feb-2025 07:29:25 0.7
07-Feb-2025 07:30:25 2.2
07-Feb-2025 07:32:25 0.5
07-Feb-2025 07:33:25 1
07-Feb-2025 07:34:25 0.1
07-Feb-2025 07:36:25 0.7
07-Feb-2025 07:37:25 5.5
07-Feb-2025 07:38:25 4.6
07-Feb-2025 07:39:25 2.4
07-Feb-2025 07:40:25 0.8
07-Feb-2025 07:41:25 1.3
07-Feb-2025 07:42:25 3.4
07-Feb-2025 07:43:25 1.7
07-Feb-2025 07:44:25 4
07-Feb-2025 07:45:25 3.2
07-Feb-2025 07:46:25 2
07-Feb-2025 07:48:25 1.5
07-Feb-2025 07:50:25 0.9
07-Feb-2025 07:51:25 3.6
07-Feb-2025 07:55:25 0.4
07-Feb-2025 07:56:25 0.4
07-Feb-2025 07:57:25 2.2
07-Feb-2025 08:01:25 0.3
07-Feb-2025 08:09:25 3.5
07-Feb-2025 08:10:25 2.9
07-Feb-2025 08:11:25 3.5
07-Feb-2025 08:13:25 0.3
07-Feb-2025 08:14:25 4.9
07-Feb-2025 08:15:25 2.2
07-Feb-2025 08:17:25 3.3
07-Feb-2025 08:18:25 3.5
07-Feb-2025 08:20:25 1.6
07-Feb-2025 08:21:25 0.1
点击 Save and Run 来执行您的代码。Output 字段显示您的结果。

将数据写入通道
1) 通过将干净的数据结果写入私有通道来存储它们。要创建 ThingSpeak 通道,转至 Channels 选项卡并选择 My Channels。点击 New Channel。选中相应的复选框,并输入这些通道设置值:
Name -
Cleaned Wind Speed MeasurementsField 1 -
Wind speed (mph)

点击 Save Channel。
2) 在 MATLAB Code 字段中,设置用于写入私有通道的变量。将 writeChannelID 和 writeAPIKey 的给定值替换为您的值。您可以在页面右侧的 Channel Info 面板中找到通道 ID 和 API 密钥。
% Replace with the ID of the channel to write data to. writeChannelID = 17504; % Enter the write API key between the ''. writeAPIKey = '23ZLGOBBU9TWHG2H';
3) 将干净的风速读数及其各自的时间戳写入您的通道。
thingSpeakWrite(writeChannelID,cleanData,'timestamp',cleanTimeStamps,'Writekey',writeAPIKey);
4) 点击 Save and Run 来执行您的代码。ThingSpeak 通道中的图填充了风速时间序列数据,但没有计算出离群值。您可以通过点击页面右侧 Channel Info 面板中的通道链接来访问您的通道。

要以 CSV 格式下载数据,请点击 Data Export 按钮或 Data Import / Export 选项卡。要清除通道中所有已保存的数据,请点击 Channel Settings 选项卡。
计算移动平均值
您可以在模板中添加代码来进一步分析风速数据。除了删除离群值之外,平滑数据集的另一种方法是计算移动平均值。在这种方法中,一组局部数据点的平均值是通过整个数据集的滑动窗口来计算的。使用 MATLAB movmean (MATLAB) 函数并设置 5 分钟的滑动窗以平滑风速数据。此部分未包含在代码模板中。您可以在调用 thingSpeakRead 之后,将其包含在您的代码中。
smoothData = movmean(windSpeed,minutes(5),'SamplePoints',timeStamp);要保存您的新数据,请将其写入您的 ThingSpeak 通道。注释掉现有的 thingSpeakWrite 函数并将新的平滑时间序列数据保存到您的通道。
thingSpeakWrite(writeChannelID,smoothData,'timestamp',timeStamp,'Writekey',writeAPIKey);
要更新结果,再次点击 Save and Run。
另请参阅
函数
thingSpeakRead|thingSpeakWrite|isoutlier(MATLAB) |movmean(MATLAB)