eis/eqpalg/.do_not_use/data_handler/rs_mgr.cc

174 lines
5.3 KiB
C++
Raw Normal View History

#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