尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
应用系统负载分析与磁盘容量预测:一套完整的Python源码实践解析
简介资源内含一份基于数据挖掘的应用系统负载分析与磁盘容量预测Python源码包面向系统运维、数据分析与机器学习初学者解决如何在历史负载数据基础上建立容量预测模型的问题。压缩包共6个文件包含4个xls格式的数据文件涵盖原始数据与预处理后的数据、1个py主程序脚本和1个txt模块导入说明整体仅20KB轻量便于快速下载和学习。已有561人学习下载适合作为数据挖掘入门实战参考。通过源码与配套数据文件读者可了解数据清洗、特征分析、模型训练与预测输出的完整流程并结合实际磁盘使用数据观察算法参数如何影响预测效果代码结构简洁、注释清晰便于二次修改为后续扩展其他系统指标预测提供可复用的框架。1. 应用系统负载分析与磁盘容量预测这套 Python 源码不是玄学周五下午 4 点监控告警弹出/data 分区使用率已到 85%按这个增长速率再过两天日志文件就会把磁盘写满应用直接进入只读状态。这类故障我处理过不止一次问题从来都不是突然发生的——磁盘使用量曲线早就给出了信号只是没人把它当成一个可预测的指标去看。这套应用系统负载分析与磁盘容量预测 Python 源码核心就是把“负载怎么看、容量怎么预测”串成一条完整流程采集系统指标和应用日志、做特征工程、训练模型、输出每个分区的剩余可用天数。它不解决容量规划里的所有问题但能让你在磁盘写满之前收到一份明确的预测报告而不是等故障发生了再扩容、再找数据、再复盘。如果你是运维工程师、后端开发或者团队里负责服务器容量的人这套源码正好卡在你们最痛的位置。它不要求你有很强的时序预测理论背景代码按采集、特征、模型、服务四层拆开照着流程跑就能拿到预测结果也适合直接接进现有监控体系。下面我从原理到实现把每一步拆开讲清楚。2. 负载分析与容量预测的原理指标口径、建模选型与源码结构拆代码之前先统一口径。“应用系统负载分析”这个说法在不同团队手里含义差别很大有人把它等同于 CPU 使用率平均值也有人把它理解为请求量、线程数、GC 停顿时间这些应用层指标。这套源码的做法是两者都接但归到两条线上系统资源线CPU、内存、磁盘 IO、网络和应用负载线请求量、错误率、平均响应时间。真正影响磁盘容量的主要落在系统资源线里的磁盘使用量以及应用负载线里会引发日志增长的写流量指标。两条线先定义清楚后面做特征和预测时才不会被口径带偏。下面从指标采集开始讲再落到建模选型和源码目录结构。2.1 指标拆解CPU、内存、磁盘 IO 与应用层负载的关系预测磁盘容量不能只采集一项 disk_used 就完事。磁盘增长往往由应用行为驱动日志轮转策略、数据库归档频率、临时文件清理机制少了任何一项曲线都会在你意想不到的时间点拐头。所以我拿到这套源码第一件事是看它的采集脚本到底覆盖了哪些指标。下面是这类工程里最常见的采集端写法用 psutil 把系统指标打成一行一行的 CSV保留原始时间戳不做任何聚合import time import csv import psutil def collect_once(interval60): # 按挂载点遍历磁盘分区避免把系统盘和数据盘混在一起 parts [] for part in psutil.disk_partitions(allFalse): usage psutil.disk_usage(part.mountpoint) parts.append({ mount: part.mountpoint, total_gb: round(usage.total / (1024 ** 3), 2), used_gb: round(usage.used / (1024 ** 3), 2), used_percent: usage.percent, }) return { ts: int(time.time()), cpu_percent: psutil.cpu_percent(interval1), mem_used_percent: psutil.virtual_memory().percent, disk_read_mb_s: psutil.disk_io_counters().read_bytes / 1024 / 1024, disk_write_mb_s: psutil.disk_io_counters().write_bytes / 1024 / 1024, parts: parts, } def write_csv(path, interval60): with open(path, a, newline) as f: writer csv.DictWriter(f, fieldnames[ts, cpu_percent, mem_used_percent, disk_read_mb_s, disk_write_mb_s, parts]) writer.writeheader() while True: row collect_once(interval) writer.writerow(row) time.sleep(interval)这段代码里有几个设计细节值得注意。disk_partitions 遍历的是分区而不是整机磁盘同一个服务器上如果 /data 是独立数据盘/home 是系统盘两个分区的增长曲线可能完全不同混在一起算一个容量池会把预测结果拉偏。代码把 mount 点单独留在各部分里就是给后续按分区建模留了接口。磁盘容量预测真正关心的指标按优先级排大致是这个顺序指标采集建议用途分区使用量 used_gb每 5-15 分钟一次核心预测目标分区总量 total_gb每 5-15 分钟一次计算剩余比例写入字节数 write_bytes每 5 分钟一次判断增长速率来源文件数 / inode 使用率每 30 分钟一次防止容量未满但 inode 耗尽我用几个项目验证过采集间隔的选择影响很大。间隔太密5 秒一次数据量大而且磁盘增长是慢变量短间隔里全是噪声模型学到的是抖动而不是趋势间隔太疏一天一次会丢失夜间清理脚本造成的下降拐点。这套源码默认 60 秒采集一次我一般会把它改成 300 秒跑一周拿到的数据量也足够训练了。2.2 预测方法选型趋势外推优先机器学习打补丁源码包的模型层分两类一类是统计方法移动平均、指数平滑、线性回归另一类是监督学习随机森林和梯度提升树。同一个预测场景维护两类模型不是冗余而是因为磁盘使用量这个序列的性质决定了模型选择空间。磁盘使用量是一个带强趋势、弱周期、偶发阶跃的序列。强趋势意味着线性模型往往已经能解释大部分变化弱周期意味着周维度上存在规律——周一早上日志量暴涨周末流量低谷——但这个规律不稳定偶发阶跃意味着清理脚本、数据迁移会让序列突然掉头统计模型对这种突变反应迟钝需要人工标记或残差监控补齐。不同方法的适用边界可以用一张表大致说明方法对趋势的适应对周期的处理实现成本适合场景移动平均滞后明显不处理极低看短期趋势不宜单独预测指数平滑能跟随趋势需加季节分量低日志量稳定的应用线性回归直接拟合斜率需加周期特征低长期线性增长的数据库随机森林能拟合非线性弱中存在突变和特征交互Prophet 式分解好显式建模中高周期明显的日活型业务这套源码的主链路是线性回归做基线、随机森林做残差修正。从工程角度看这个选型是合理的基线模型保证不会太离谱树模型弥补非线性两个结果一对比还能判断预测稳定度。如果两个模型给出的剩余天数差出 20 天以上说明历史数据里存在明显异常段这时候更该怀疑数据而不是模型。2.3 源码目录结构四个模块的职责与替换边界打开这套源码先认四个目录collect、features、models、service分别对应采集、特征、训练和对外输出。文件布局大概是这样app_system_load_analysis/ ├── collect/ │ ├── system_metrics.py # psutil 系统指标采集 │ └── app_log_parser.py # 应用日志解析生成请求量序列 ├── features/ │ ├── build_dataset.py # 特征工程滞后、差分、滑动窗口 │ └── split.py # 按时间切分训练集/验证集 ├── models/ │ ├── linear_baseline.py # 线性回归基线 │ ├── tree_model.py # 随机森林 / GBDT 模型 │ └── evaluate.py # MAE / RMSE / MAPE 评估 ├── service/ │ ├── train.py # 训练入口 │ ├── predict.py # 加载模型预测未来 N 天 │ └── capacity_report.py # 输出剩余可用天数报告 └── config/ └── disk_predict.yaml # 分区、阈值、预测天数配置每个文件都尽量独立可运行这是这类 Python 工程源码的通用组织方式。我拿到手习惯先跑 predict.py因为它只依赖一个已经训练好的模型和一份历史数据能最快看到输出长什么样train.py 才是重头戏但它依赖前面特征工程的数据格式所以我会在读完 model 目录之后再跑。配置项里最有价值的是三个参数history_days、predict_days、capacity_threshold。history_days 决定训练窗口一般 30 天起步predict_days 是预测窗口磁盘容量预测通常设 30 到 90 天capacity_threshold 是告警线0.8 表示使用率到 80% 就开始预警。这三个参数直接决定报告里的剩余天数含义改之前先想清楚自己的业务响应周期。3. 把源码跑通环境准备、数据接入与一次完整训练原理讲完接下来是最容易卡住新手的部分环境。环境问题看似琐碎但我在帮别人复现这套源码时至少一半的时间花在解决 Python 版本和 numpy 安装上。下面按我自己操作的顺序来写。3.1 Python 环境与依赖安装版本选择与 numpy 安装的常见坑第一步先确认 Python 版本。这套源码面向 Python 3.8 以上我在 CentOS 7 机器上踩过坑系统自带的 Python 是 3.6直接 pip install 一堆依赖会报语法错误。打开终端先看一眼python3 --version如果版本低于 3.8不要硬适配代码用 pyenv 或系统包管理器装一个新版本再继续。版本确认后创建虚拟环境把依赖装进去。工程里 requirements.txt 通常长这样pandas1.5.3 numpy1.23.5 scikit-learn1.2.2 psutil5.9.4 PyYAML6.0 matplotlib3.7.1安装最容易出问题的两个库是 numpy 和 scikit-learn。Python 3.11 以上环境里直接 pip install numpy有时会看到 “Could not find a version that satisfies the requirement” 的提示多半是默认源没有对应版本的预编译 wheel。解决方法是先升级 pip再指定兼容的 numpy 版本python3 -m pip install --upgrade pip pip install numpy1.23.5 pandas1.5.3 scikit-learn1.2.2装完用一条命令验证关键依赖是否就绪避免训练跑到一半才发现缺库python3 -c import pandas, numpy, sklearn, psutil; print(pandas.__version__, numpy.__version__, sklearn.__version__)能正常打印版本号说明环境这关过了。如果导入 sklearn 报缺少 libgomp 之类的底层库那是系统级依赖问题在 CentOS 上执行 yum install libgomp在 Ubuntu 上执行 apt install libgomp1 就能解决。3.2 数据接入三种方式日志、数据库与监控平台导出源码默认从 CSV 读数据但实际环境里数据源往往分散在日志、数据库和监控系统中。源码提供了三个采集入口我逐个说。第一种是解析应用日志。比如 nginx access_log统计每小时请求量生成应用负载序列。这里用 awk 就能很快出一版# 统计 access_log 每小时的请求数输出为 request_cnt_hourly.csv awk {print substr($4, 2, 13)} /var/log/nginx/access.log | sort | uniq -c request_cnt_hourly.csv这个命令把日志里形如 [10/Oct/2024:13:56:12 的时间字段截取到小时然后排序去重计数。生成的文件第一列是请求次数第二列是小时后续 build_dataset.py 只需要把这个文件和系统指标按时间合并即可。第二种是从数据库取容量数据常用于 MySQL、PostgreSQL 这类有系统表的数据库。以 PostgreSQL 为例查各表占用空间SELECT schemaname, tablename, pg_total_relation_size(schemaname || . || tablename) AS size_bytes, now() AS ts FROM pg_tables ORDER BY size_bytes DESC;把查询结果定时导出成 CSV就形成了数据库容量的历史序列。这里有个关键点这条 SQL 里的 now() 是采集时刻的时间戳必须定期执行才能积累出时间序列。只在磁盘告警时手工查一次解决不了预测问题。第三种是监控平台导出我在生产环境里最常用。从 Prometheus 查 node_filesystem_avail_bytes 这类指标用 API 拉下来存成 JSONcurl -G http://prometheus.example.com/api/v1/query_range \ --data-urlencode querynode_filesystem_avail_bytes{mountpoint/data} \ --data-urlencode start2024-10-01T00:00:00Z \ --data-urlencode end2024-10-08T00:00:00Z \ --data-urlencode step300 | python3 -m json.tool disk_usage.json注意把监控地址、挂载点、时间范围换成自己的。拿到 JSON 后写个小脚本转成 CSV字段格式要和 collect/system_metrics.py 的输出保持一致。这一步是整个接入过程最容易翻车的地方——字段名对不上后面的 build_dataset.py 直接报 KeyError而且错误信息只会告诉你缺字段不会告诉你去哪补。3.3 训练与评估两条命令跑出预测报告数据准备好之后训练入口在 service/train.py。参数通过 config/disk_predict.yaml 控制我摘一段典型配置disk: mountpoint: /data total_gb: 2000 capacity_threshold: 0.8 data: csv_path: output/system_metrics.csv history_days: 45 model: algorithm: ensemble # linear / ensemble forecast_days: 60 retrain_on_missing_data: true然后运行训练cd app_system_load_analysis python3 service/train.py --config config/disk_predict.yaml训练脚本会先读 CSV按 mountpoint 过滤出 /data 分区数据features/build_dataset.py 生成训练样本models/linear_baseline.py 和 tree_model.py 各自训练最后把评估指标和预测结果写进 output/。正常跑完output/ 下会多出三个文件evaluation.json、forecast.csv、capacity_report.csv。evaluation.json 里记录 MAE、RMSE、MAPE 三个值。我建议先看 MAPE它表示平均百分比误差5% 以内说明预测曲线贴近真实使用量超过 15% 就要怀疑数据质量或特征工程有问题。forecast.csv 是未来 60 天的逐日预测使用量capacity_report.csv 直接给出每个分区预计耗尽的天数。排错时先看 capacity_report.csv 的输出行数对不对再反推前面环节这是最快的排查路径。4. 核心代码拆解特征工程、容量预测建模与剩余天数计算训练跑通了接下来要知道模型到底在做什么。这一章我把特征构建、模型融合、剩余天数计算三段代码拆开逐行说明。4.1 特征工程把时间序列整理成模型能吃的训练样本直接拿磁盘使用量的逐日序列去训练模型效果通常很差因为模型只看得到“今天”看不到“昨天”和“上周同一时间”。特征工程要做的就是把时间序列转换成监督学习样本用过去 K 天的值预测未来某一天的值。下面是 build_dataset.py 里最核心的一段构造滞后特征、滑动统计、差分特征import pandas as pd def build_features(df, target_colused_gb, lag_steps7, forecast_horizon7): # 按时间排序避免 CSV 乱序影响滞后特征 df df.sort_values(ts).reset_index(dropTrue) df[ts] pd.to_datetime(df[ts]) sample pd.DataFrame() sample[y] df[target_col].shift(-forecast_horizon) # 未来第 7 天作为标签 # 滞后特征过去 7 天每天的磁盘使用量 for lag in range(1, lag_steps 1): sample[flag_{lag}] df[target_col].shift(lag) # 滑动统计过去 30 天的均值、标准差捕捉趋势和波动 sample[mean_30d] df[target_col].rolling(30).mean() sample[std_30d] df[target_col].rolling(30).std() # 一阶差分当天的增量用于识别增长是在加速还是减速 sample[diff_1d] df[target_col].diff() # 剩余可用空间百分比 sample[avail_percent] 1 - df[target_col] / df[total_gb] # 去掉尾部没有标签的行 sample sample.dropna().reset_index(dropTrue) return sample这里有几个设计需要说明。滞后特征 lag_1 到 lag_7 让模型知道“昨天、前天、一周前”分别用了多少这比只用当天值稳定得多mean_30d 和 std_30d 是滑动窗口统计mean 描述长期水平std 描述波动幅度两者组合能帮模型区分“稳定增长”和“波动剧烈”两种状态diff_1d 是今天和前一天的差值模型可以用它判断增长是在加速还是减速。注意 forecast_horizon 这个参数。上面代码里设成 7表示样本的标签是未来第 7 天的使用量而不是未来第 1 天。预测 60 天容量时一般会循环调用这个函数以 7 天为步长滚动生成多组样本。真实项目里horizon 越大可用的样本越少训练难度越高所以这个值不能拍脑袋定要看业务期望提前多少天收到告警。4.2 容量预测线性回归打底树模型吸收非线性特征工程之后模型层就比较标准了。线性回归在这种强趋势序列上表现并不差它能把“平均每天增长几 GB”学得比较准随机森林则能捕捉“周六日志量大导致增速变化”这类非线性关系。源码模型层的关键代码如下import numpy as np from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error, mean_squared_error def train_models(X_train, y_train, X_val, y_val): lr LinearRegression() lr.fit(X_train, y_train) lr_pred lr.predict(X_val) rf RandomForestRegressor( n_estimators200, max_depth8, min_samples_leaf5, random_state42, n_jobs-1 ) rf.fit(X_train, y_train) rf_pred rf.predict(X_val) result {} for name, pred in [(linear, lr_pred), (random_forest, rf_pred)]: mae mean_absolute_error(y_val, pred) rmse mean_squared_error(y_val, pred, squaredFalse) mape np.mean(np.abs((y_val - pred) / (y_val 1e-6))) * 100 result[name] {mae: mae, rmse: rmse, mape: mape} # 按比例融合两个模型降低单一模型误判的风险 blend 0.6 * lr_pred 0.4 * rf_pred result[blend] { mae: mean_absolute_error(y_val, blend), rmse: mean_squared_error(y_val, blend, squaredFalse), } return lr, rf, result重点看 blend 的计算。线性回归预测乘 0.6随机森林预测乘 0.4加起来作为最终输出。这个比例不是玄学是我在类似场景里的经验值磁盘使用量数据中线性趋势占六成非线性波动占四成。实际使用中你可以改成 0.5/0.5然后观察验证集 MAPE 的变化如果随机森林的 MAPE 明显更低就调大它的权重。评估指标里 mape 加了 1e-6是为了防止 y_val 为 0 时除零崩溃这是容量数据的常见保护手段。训练集和验证集的划分必须是按时间切分而不是随机切分这一点在避坑章节会专门展开因为它是我见过最多人踩的坑。4.3 剩余可用天数容量阈值与提前量怎么算模型输出的是未来每一天的预测使用量但业务人员更关心一个问题磁盘还有几天会满。源码里用 capacity_report.py 把这个计算固定下来核心逻辑是找到预测曲线第一次越过阈值的日期import pandas as pd def calculate_capacity_exhaustion(forecast_df, capacity_threshold0.8): # forecast_df 需要包含 total_gb 和 predicted_used_gb 两列 forecast_df[used_percent] forecast_df[predicted_used_gb] / forecast_df[total_gb] # 找到预测使用率第一次超过阈值的日期 over_idx forecast_df.index[forecast_df[used_percent] capacity_threshold] if len(over_idx) 0: return None, None # 预测窗口内不会触达阈值 first_over over_idx[0] exceed_date forecast_df.loc[first_over, ds] days_left (exceed_date - forecast_df.loc[forecast_df.index[0], ds]).days return exceed_date, days_left这个函数的逻辑很直白遍历预测结果找到第一个 used_percent 大于等于 0.8 的日期把它和基准日期相减得到剩余天数。如果整个预测窗口都没超阈值返回 None意思是安全期内不必处理。这里我一般会把容量阈值从 0.85 改到 0.8因为生产环境要预留运维操作时间。当报告显示剩余 15 天时实际上从收到告警到扩容、迁移数据、重启服务至少需要一周0.8 阈值相当于给团队留出缓冲。源码把阈值放在配置文件的意图就在这里——每个团队的响应速度不同阈值自然应该不同。5. 应用系统负载分析与磁盘容量预测避坑指南五个翻车现场源码本身不复杂真正坑人的永远是数据细节和操作习惯。下面五条是我在真实环境里踩过的每条按「现象 → 原因 → 解决」说明。5.1 采样间隔不一致导致预测曲线漂移现象训练结束后预测曲线在某些时段比真实值偏高 20%有些时段又偏低整体走势呈锯齿状。原因采集脚本中途被重启过或者定时任务只在工作时间运行深夜数据缺失时间序列的步长不再均匀。模型把每个样本当成等间隔处理时间间隔不一致导致趋势斜率计算错误预测自然漂移。解决在 build_dataset.py 里强制按固定周期重采样缺失的小时用前一周同时刻的值填充再检查相邻时间戳的差值import pandas as pd df pd.read_csv(output/system_metrics.csv, parse_dates[ts]).set_index(ts) df df.resample(1H).mean().interpolate(methodtime) print(df.index.to_series().diff().dropna().value_counts()) # 应该只有 1H 一个值如果输出里出现多个不同的时间差说明数据没有完全对齐把异常区间直接丢弃不要勉强保留。5.2 用平均值代替峰值漏掉磁盘水位毛刺现象预测报告显示剩余 200GB结果三天后磁盘被一个大文件写满应用直接变成只读。原因训练时用的是按天聚合的平均使用量忽略了某几个小时内的高写入峰值。磁盘增长不是匀速的大促、定时任务、日志刷盘都会在短时间内把水位抬上去均值预测对这类毛刺完全无感。解决采集端同时记录每小时的最大使用量和 95 分位使用量预测时取 p95 作为基准额外再加 10% 安全余量。容量管理里只靠平均值做预测是风险最高的做法。5.3 只盯着磁盘空间没看 inode 使用率现象df -h 显示 /data 用了 30%但应用创建文件时报 “No space left on device”。原因磁盘空间没满inode 耗尽了。小文件特别多的应用比如临时文件、缓存目录会先把 inode 吃光。如果采集脚本只记录磁盘使用量预测结果完全体现不出这个风险。解决把 inode 使用率加进采集指标并按同样流程单独做预测。生产环境里 inode 的耗尽速度往往比磁盘空间更快尤其在生成大量小文件的服务上。两个指标同时监控任何一个超过阈值都触发告警。5.4 随机切分数据集导致预测模型数据泄漏现象模型在训练集上 MAPE 只有 2%一到线上预测就偏了 20% 以上。原因用了 train_test_split 的默认随机切分。时间序列里前一天的样本和后一天的样本高度相关随机切分等于让模型在训练时就偷看了未来的数据训练分数虚高真实场景里自然打回原形。解决改成按时间顺序切分前 80% 训练、后 20% 验证并在中间留出 7 天间隔from sklearn.model_selection import train_test_split # 错误做法随机切分导致数据泄漏 # X_train, X_val, y_train, y_val train_test_split(X, y, test_size0.2) # 正确做法保持时间顺序训练集验证集之间留出空白间隔 cut int(len(X) * 0.8) X_train, X_val X.iloc[:cut], X.iloc[cut:] y_train, y_val y.iloc[:cut], y.iloc[cut:]留出的 7 天空白间隔能验证模型是否真的学会了预测未来而不是单纯拟合相邻样本。5.5 缺失数据直接补零预测曲线出现锯齿现象预测曲线中间突然掉到谷底然后又反弹像锯齿一样。原因采集停了一段时间数据缺失后直接 fillna(0)序列里出现假的“清零”。模型把这一天当成真实的容量下降趋势斜率被拉低后面只能强行反弹预测结果彻底失真。解决用时间插值代替补零缺失较长的时间段直接剔除df[used_gb] df[used_gb].interpolate(methodtime)如果缺失超过 6 小时我更倾向直接删掉这一段。宁可样本少一点也不要给模型输入假信号这是容量预测里最重要的数据伦理。6. 进阶滚动回测与监控面板对接别让模型自说自话模型训练完不能只看训练集上的分数就上线。我自己在这类容量预测项目里最后一道工序永远是跑一遍滚动回测把结果接到监控面板观察一个完整的预测周期。滚动回测的做法是用历史某一天之前的数据训练模型预测后面 30 天然后对比真实值把时间窗口往后移 7 天重新训练、预测、对比如此反复。这样验证的是模型在真实未来上的表现而不是在同一个数据集上的拟合度。import pandas as pd def walk_forward_validation(df, model_fn, train_days45, forecast_days30, step_days7): results [] df df.sort_values(ts).reset_index(dropTrue) start 0 while start train_days forecast_days len(df): train df.iloc[start:start train_days] test df.iloc[start train_days:start train_days forecast_days] model model_fn(train) pred model.predict(test) # 只比较预测窗口最后一天的误差更贴近业务真正关心的剩余天数 results.append(abs(pred.iloc[-1] - test[used_gb].iloc[-1]) / test[used_gb].iloc[-1]) start step_days return pd.Series(results).describe()这段代码会在数据上滑动多次训练输出的 describe 里50% 和 75% 分位数就是模型在多个未来窗口上的稳定性表现。我一般盯 75% 分位小于 10%说明模型在多数时间窗口上预测靠谱如果 max 很大说明总有几个窗口预测崩了要去检查那一段对应的数据是否存在日志清理、容量调整等事件。回测通过之后还有一步落地操作源码默认把预测结果写 CSV但团队监控系统通常要的是接口。我会在 service/predict.py 里加一个输出 JSON 的函数把剩余天数、预测使用率、触发阈值直接暴露给监控由监控平台负责推送告警import json def output_prediction_json(forecast_df, capacity_report): payload { predict_date: forecast_df[ds].max().strftime(%Y-%m-%d), days_left: capacity_report[days_left], threshold: capacity_report[threshold], series: [ {date: row[ds].strftime(%Y-%m-%d), predicted_gb: row[predicted_used_gb]} for _, row in forecast_df.iterrows() ] } with open(output/prediction.json, w) as f: json.dump(payload, f, ensure_asciiFalse, indent2)监控平台拿到这份 JSON 后只需要读 days_left 字段做判断。比如 days_left 小于 14 天触发预警小于 7 天呼叫值班人员。这比让各家监控系统各自解析 CSV 靠谱得多也避免了字段命名不一致带来的维护成本。从实践来看滚动回测对容量预测的效果远超单次验证尤其是多次滚动之后你会对自己数据的“脾气”有清晰的体感。从那以后我每次跑这套源码都会强制走一遍回测流程确认预测没有明显漂移再决定要不要发出告警而不是看一眼训练集分数就草率上线。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

PyQt5与YOLOv5桌面检测工具:环境搭建、线程优化与避坑指南

PyQt5与YOLOv5桌面检测工具:环境搭建、线程优化与避坑指南

简介:这份资源是一套面向PyQt5与YOLOv5初学者的多目标检测GUI实战项目,适合刚接触界面开发或YOLO算法、希望有现成工程练手的人群。项目以PyTorch为深度学习框架,将YOLOv5检测能力与PyQt5界面结合,重点演示界面设计与后端逻辑分离…

📅 2026/10/12 16:24:28
OpenLayers创建点要素全流程:从坐标系到样式与交互实战

OpenLayers创建点要素全流程:从坐标系到样式与交互实战

做WebGIS开发,接触OpenLayers的第一件事基本都是往地图上画东西。画个点、连条线、圈个面,说到底都是在做同一件事——创建要素(Feature)。我刚入行的时候,前辈丢给我一句“去看官方示例”,结果一打开示例代…

📅 2026/10/12 16:24:28
LCTFP代码实战:基于CNN与LSTM的高速公路交通流量预测

LCTFP代码实战:基于CNN与LSTM的高速公路交通流量预测

简介:基于CNN和LSTM组合的高速公路交通流量预测模型LCTFP完整Python实现,面向交通流量时空建模研究者与开发者,可用于短时交通流预测及类似时序任务。模型以1D CNN提取短时交通流空间特征,LSTM捕捉时间特征,有效融合时…

📅 2026/10/12 16:24:28
MORE NEWS

更多资讯

📰

花18999元学OpenClaw?先看TaoToken统一Key怎么把开源AI工具跑通

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

ClaudeCode配置:settings.json 里 ANTHROPIC_BASE_URL 改到 TaoToken 的完整步骤

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

AI Agent Harness Engineering 医疗资源优化:偏远地区医疗服务的AI赋能

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

迷你SQL免安装包:SQL Server 2000绿色部署与运维实战

简介:这款迷你SQL绿色工具包基于SQL Server 2000设计,主打免安装、轻量化,解压后即可使用,适合开发者在临时环境、教学演示或老旧系统中快速搭建数据库服务。压缩包共三百余个文件,整体约三十一兆,核心由运…

📰

Windows下libcurl+OpenSSL 32/64位开发库配置与HTTPS实战

简介:本资源为 libcurl 与 OpenSSL 动态开发库合集,面向 Windows 平台下从事 C/C 网络编程、HTTPS 安全通信开发的工程师与学习者,解决编译链接时缺少可用库文件、32 位与 64 位环境不兼容等问题。压缩包内共 3451 个文件,以 3244…

📰

C#上位机实战:西门子、三菱、欧姆龙PLC数据如何统一解析?

一、为什么换一台 PLC,上位机就要改一堆代码? 做过工业上位机开发的朋友,应该都遇到过类似的问题。 项目刚开始时,只需要连接一台 PLC,读取几个温度、压力和运行状态,直接调用通信库就能完成。后来客户增加…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬