Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

从风速数据中删除离群值

此示例演示如何从公共通道读取数据、修改数据以及显示选择元素。在示例中,您修改 MATLAB Analysis 和 MATLAB Visualizations App 提供的代码模板之一。该示例使用来自 ThingSpeak channel 12397 的数据,该数据从位于马萨诸塞州纳蒂克的基于 Arduino® 的气象站收集天气数据。

从模板代码创建 MATLAB 分析脚本

要检测并删除 Natick 气象站风速数据中的离群值,您可以使用代码模板编写 MATLAB® 脚本。

转到 ThingSpeak 中的 App 选项卡并选择“MATLAB 分析”。点击“新建”,选择“从风速数据中删除离群值”,然后点击“创建”。

分析您的数据

“MATLAB 代码”字段预先填充了代码,用于检测并删除过去六个小时内风速数据中的离群值。

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 函数检查风速数据中的离群值。使用默认设置时,此函数计算某个值与输入数据集中位数的绝对偏差是否超过三个缩放中位数绝对偏差。您可以调整输入参数来自定义离群值结果。识别离群数据点的索引和干净数据点的索引。使用这些索引来选择与异常数据和干净数据相对应的数据点和时间戳。

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');
  3×1 timetable

     outlierTimeStamps      outlierData
    ____________________    ___________

    03-Jun-2019 10:20:54         17    
    03-Jun-2019 13:26:14       16.6    
    03-Jun-2019 13:39:33       16.8    

点击“保存并运行”来执行您的代码。“输出”字段显示您的结果。

将数据写入通道

1) 通过将干净的数据结果写入私有通道来存储它们。要创建 ThingSpeak通道,请转至“通道”选项卡并选择“我的通道”。点击“新建通道”。选择相应的复选框,然后输入以下通道设置值:

  • 名称 — Cleaned Wind Speed Measurements

  • 字段 1 — Wind speed (mph)

点击“保存通道”。

2) 在“MATLAB 代码”字段中,设置用于写入您的私有通道的变量。将 writeChannelIDwriteAPIKey 的给定值替换为您的值。您可以在页面右侧的“通道信息”面板中找到通道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) 点击“保存并运行”执行代码。ThingSpeak通道中的图表填充了风速的时间序列数据,没有计算出的离群值。您可以通过点击页面右侧“通道信息”面板中的通道链接来访问您的通道。

要以 CSV 格式下载数据,请点击“数据导出”按钮或“数据导入/导出”选项卡。要清除通道中所有已保存的数据,请点击“通道设置”选项卡。

计算移动平均值

您可以在模板中添加代码以进一步分析风速数据。除了去除离群值之外,平滑数据集的另一种方法是计算移动平均值。在这种方法中,一组局部数据点的平均值是在整个数据集的滑动窗口上计算的。使用 MATLAB movmean 函数和五分钟的滑动窗口来平滑风速数据。此部分不包含在代码模板中。您可以在调用 thingSpeakRead. 后将其包含在代码中

smoothData = movmean(windSpeed,minutes(5),'SamplePoints',timeStamp);

要保存新数据,请将其写入您的 ThingSpeak通道。注释掉现有的 thingSpeakWrite 函数并将新的平滑时间序列数据保存到您的通道中。

thingSpeakWrite(writeChannelID,smoothData,'timestamp',timeStamp,'Writekey',writeAPIKey);

要更新结果,请再次点击“保存并运行”。

另请参阅

函数

相关示例

详细信息