KS检验
论文中对不同组的磁通密度数据做Kolmogorov-Smirnov 正态检验,本文会讲解如何将数据集转换成可以进行KS检验的格式,并用for循环对各组进行ks检验
一、加载KS检验库
import pandas as pd
import numpy as np
from scipy import stats # 内置KS检验、正态分布
二、读取数据源
file_path = "../附件一材料1.xlsx"
df = pd.read_excel(file_path)
三、自动识别数据列与分组规则
首选通过索引df.columns[4:]提取出需要进行检验的列,然后把波形类型用unique函数提取出来,这个波形类型列表可用于之后的循环作为可迭代对象;
# 磁通采样列:第5列开始(索引4),对应B0~B1023所有采样点
flux_cols = df.columns[4:]
# 自动获取所有励磁波形类型(正弦波/三角波/梯形波)
wave_groups = df["励磁波形"].unique()
# 统计检验显著性水平(通用标准α=0.05)
alpha = 0.05
# 初始化结果存储列表
ks_result_list = []
四、通过循环对各个波形类型进行KS检验
df["励磁波形"] == wave_type是一个布尔索引,再用df引用一遍就可以获得波形只属于wave_type的样本;
.stack():把多行多列的宽数据表,纵向压扁成一维带多层索引的Series,同时自动剔除空值;
.values:丢掉所有索引信息,只提取纯数值,转为 numpy 一维数组;
整体效果:将二维表格全部数据转为干净的一维数值数组,把这一个一维数组传输给stats.norm.fit()可以计算出均值和标准差;
stats.kstest检验一组一维样本是否服从某个指定的理论连续分布(如正态分布),通过 P 值判断是否符合该分布。第一个参数是数据,第二个参数是要检验的分布,第三个参数是这个分布的参数;返回值是ks检验的值和p值
for wave_type in wave_groups:
# 筛选当前波形分组的所有样本
current_group = df[df["励磁波形"] == wave_type]
# 核心:将多行×1024列的磁通数据,展平为一维单列数组(符合K-S检验输入要求)
flux_1d_array = current_group[flux_cols].stack().values.astype(float)
# 拟合该组数据专属的正态分布参数(均值μ、标准差σ)
mu, sigma = stats.norm.fit(flux_1d_array)
# 执行单样本K-S拟合优度检验
ks_statistic, p_value = stats.kstest(flux_1d_array, "norm", args=(mu, sigma))
# 结果判定
if p_value < alpha:
judge_result = "不服从正态分布"
else:
judge_result = "服从正态分布"
# 存储单组结果
ks_result_list.append({
"磁芯材料": 1,
"励磁波形": wave_type,
"K-S统计量D": round(ks_statistic, 6),
"P值": round(p_value, 8),
"检验结论": judge_result
})
五、结果输出与保存
# 转为结构化表格
ks_result_df = pd.DataFrame(ks_result_list)
# 打印结果到控制台
print("===== 附件一材料1 磁通密度K-S正态检验结果 =====")
print(ks_result_df)
# 保存结果到Excel文件
ks_result_df.to_excel("材料1_K-S正态检验结果.xlsx", index=False)
print("\n检验结果已保存至:/mnt/材料1_K-S正态检验结果.xlsx")

浙公网安备 33010602011771号