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")
posted @ 2026-06-17 11:18  王新文  阅读(6)  评论(0)    收藏  举报