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

174 lines
5.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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