174 lines
5.3 KiB
C++
174 lines
5.3 KiB
C++
|
|
#include <eqpalg/data_handler/rs_mgr.h>
|
|||
|
|
|
|||
|
|
// 预定义 RunningState的最大size
|
|||
|
|
// #define RS_MAX_SIZE 100000
|
|||
|
|
|
|||
|
|
namespace data_handler {
|
|||
|
|
|
|||
|
|
RsMgr::RsMgr(std::string rule_id_, size_t dims)
|
|||
|
|
: rule_id_(rule_id_),
|
|||
|
|
dims_(dims),
|
|||
|
|
logger_(std::make_unique<LOG>("RsMgr[" + rule_id_ + "]")) {
|
|||
|
|
running_stats_.resize(dims);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 载入统计信息
|
|||
|
|
* @return true 获取数据特征成功
|
|||
|
|
* @return false 获取数据特征成功
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
bool RsMgr::load() {
|
|||
|
|
is_first_sampling_ = false;
|
|||
|
|
if (make_sure_stat_data_exist()) {
|
|||
|
|
for (size_t i = 0; i < dims_; i++) {
|
|||
|
|
auto tmp_rs_optional = get_rs(rule_id_, i, get_total_rs_path);
|
|||
|
|
if (!tmp_rs_optional.has_value()) {
|
|||
|
|
this->is_first_sampling_ = true; ///<如果本地文件不存在,则为第一次采样
|
|||
|
|
break;
|
|||
|
|
} else {
|
|||
|
|
running_stats_[i] = tmp_rs_optional.value(); ///< 取特征值
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
logger_->Debug() << "数据特征目录(/users/dsc/stat_data)不存在且创建失败"
|
|||
|
|
<< std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return (!is_first_sampling_);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int RsMgr::first_sampling(const SampleWindow& data_load) {
|
|||
|
|
if (data_load.empty()) {
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
for (const auto& x : data_load) {
|
|||
|
|
store(x);
|
|||
|
|
}
|
|||
|
|
this->commit();
|
|||
|
|
this->is_first_sampling_ = false;
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool RsMgr::is_first_sampling() { return this->is_first_sampling_; }
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 得到统计信息,如果程序内没有载入,则会尝试载入
|
|||
|
|
* @return RunningStats
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
RsMgr::RunningStats RsMgr::get_running_stats() { return this->running_stats_; }
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 把统计信息存储在实例中
|
|||
|
|
* @param value My Param doc
|
|||
|
|
* @return true
|
|||
|
|
* @return false
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
bool RsMgr::store(const SamplePoint& value) {
|
|||
|
|
for (size_t i = 0; i < value.size(); i++) {
|
|||
|
|
running_stats_[i].add(value.at(i));
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 把统计信息写入到文件
|
|||
|
|
* @return true
|
|||
|
|
* @return false
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
bool RsMgr::commit() {
|
|||
|
|
bool ret = true;
|
|||
|
|
for (size_t i = 0; i < dims_; i++) {
|
|||
|
|
try {
|
|||
|
|
// 保存总的历史信息
|
|||
|
|
{
|
|||
|
|
std::ofstream ofs(get_total_rs_path(rule_id_, i),
|
|||
|
|
ios::binary | ios::trunc);
|
|||
|
|
dlib::serialize(this->running_stats_[i], ofs);
|
|||
|
|
ofs.close();
|
|||
|
|
ofs.clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 保存本周的数据统计信息
|
|||
|
|
// {
|
|||
|
|
// std::ofstream ofs(get_this_rs_path(rule_id_, i),
|
|||
|
|
// ios::binary | ios::trunc);
|
|||
|
|
// dlib::serialize(this->weekly_running_stats_[i], ofs);
|
|||
|
|
// ofs.close();
|
|||
|
|
// ofs.clear();
|
|||
|
|
// }
|
|||
|
|
} catch (const std::exception& e) {
|
|||
|
|
ret = false;
|
|||
|
|
logger_->Error() << "运行统计存储异常:" << e.what() << std::endl;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// int RsMgr::weekly_organize_data() {
|
|||
|
|
// for (size_t i = 0; i < dims_; i++) {
|
|||
|
|
// rs_count_ = get_rs_count(rule_id_, i);
|
|||
|
|
// // 总统计量为3且为周末,则得到每周报告,之后删除老数据
|
|||
|
|
// if (this->rs_count_ == 3 &&
|
|||
|
|
// second_clock::local_time().date().day_of_week() == 7) {
|
|||
|
|
// auto data = this->normal_dist_shift_alarm();
|
|||
|
|
// // 移除老数据,使得总的统计量为2, 避免再次进入该分支
|
|||
|
|
// remove_old_rs(rule_id_, i);
|
|||
|
|
// // 把rs_count 设置为2
|
|||
|
|
// this->rs_count_--;
|
|||
|
|
// return data;
|
|||
|
|
// }
|
|||
|
|
// // 总统计量为2且为周一,则把上周数据归档
|
|||
|
|
// if (this->rs_count_ == 2 &&
|
|||
|
|
// second_clock::local_time().date().day_of_week() == 1) {
|
|||
|
|
// move_this_rs_to_old(rule_id_, i);
|
|||
|
|
// this->rs_count_++;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// return 0;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
int RsMgr::normal_dist_shift_alarm() {
|
|||
|
|
mix_cc::json ss;
|
|||
|
|
// 得到每周劣化总结信息
|
|||
|
|
// bool alarmed = false;
|
|||
|
|
// ss["本周运行情况"] = get_running_stats_format(weekly_running_stats_);
|
|||
|
|
// ss["上周运行情况"] = get_running_stats_format(prev_rs_);
|
|||
|
|
// ss["总体运行情况"] = get_running_stats_format(running_stats_);
|
|||
|
|
// if (std::abs(this_rs_.skewness() - prev_rs_.skewness()) > 0.5) {
|
|||
|
|
// alarmed = true;
|
|||
|
|
// ss["偏度异常"].emplace_back(mix_cc::json(
|
|||
|
|
// {{"原因", "数据峰值相对于上一周发生了明显的偏移"},
|
|||
|
|
// {"偏差值", this_rs_.skewness() - prev_rs_.skewness()}}));
|
|||
|
|
// }
|
|||
|
|
// if (std::abs(this_rs_.skewness() - full_rs_.skewness()) > 0.5) {
|
|||
|
|
// alarmed = true;
|
|||
|
|
// ss["偏度异常"].emplace_back(mix_cc::json(
|
|||
|
|
// {{"原因", "数据峰值相对于总体样本发生了明显的偏移"},
|
|||
|
|
// {"偏差值", this_rs_.skewness() - full_rs_.skewness()}}));
|
|||
|
|
// }
|
|||
|
|
// if (std::abs(this_rs_.ex_kurtosis() - prev_rs_.ex_kurtosis()) > 1) {
|
|||
|
|
// alarmed = true;
|
|||
|
|
// ss["峰度异常"].emplace_back(mix_cc::json(
|
|||
|
|
// {{"原因", "数据离散程度相对于上一周发生了明显的变化"},
|
|||
|
|
// {"偏差值", this_rs_.ex_kurtosis() - prev_rs_.ex_kurtosis()}}));
|
|||
|
|
// }
|
|||
|
|
// if (std::abs(this_rs_.ex_kurtosis() - full_rs_.ex_kurtosis()) > 1) {
|
|||
|
|
// alarmed = true;
|
|||
|
|
// ss["峰度异常"].emplace_back(mix_cc::json(
|
|||
|
|
// {{"原因", "数据离散程度相对于总体发生了明显的变化"},
|
|||
|
|
// {"偏差值", this_rs_.ex_kurtosis() - full_rs_.ex_kurtosis()}}));
|
|||
|
|
// }
|
|||
|
|
// if (alarmed == false) {
|
|||
|
|
// ss["运行总结"] = "设备运行平稳良好";
|
|||
|
|
// }
|
|||
|
|
// if (alarmed) {
|
|||
|
|
// ss["运行总结"] = "设备运行可能出现劣化";
|
|||
|
|
// }
|
|||
|
|
return ss;
|
|||
|
|
}
|
|||
|
|
} // namespace data_handler
|