#include // 预定义 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("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