Bootstrap

2024华为杯研赛C题原创python代码+结果表(1-2问)|全部可运行|精美可视化

2024华为杯研赛C题原创python代码+结果表(1-2问)|全部可运行|精美可视化

以下均为python代码,推荐用anaconda中的notebook当作编译环境

第一问:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

data = pd.read_excel('附件一(训练集).xlsx', sheet_name='材料1')
data
import matplotlib.font_manager as fm

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负数显示问题

def plot_magnetic_flux_density(sample_id):
    """根据样本ID绘制磁通密度随时间变化的曲线"""
    sample = data.iloc[sample_id, 4:].values  
    time = np.linspace(0, 1, len(sample))     
    plt.figure(figsize=(8, 4))
    plt.plot(time, sample)
    plt.title(f"磁通密度随时间的变化 - 样本 {sample_id}")
    plt.xlabel("时间 (周期内归一化)")
    plt.ylabel("磁通密度 (T)")
    plt.grid(True)
    plt.show()


plot_magnetic_flux_density(0)  
plot_magnetic_flux_density(50)  
plot_magnetic_flux_density(100) 

from scipy.stats import kurtosis, skew
from scipy.fft import fft

def extract_features(sample):
    """从磁通密度中提取特征"""
    features = {}

     # 确保样本为数值类型
    sample = sample.astype(float)  # 将样本数据转换为浮点数
    sample = sample[~np.isnan(sample)]  # 如果有 NaN 值,则移除
    
    # 时间域特征
    features['mean'] = np.mean(sample)
    features['std'] = np.std(sample)
    features['max'] = np.max(sample)
    features['min'] = np.min(sample)
    features['kurtosis'] = kurtosis(sample)  # 峰度
    features['skew'] = skew(sample)          # 偏度
    
    # 频域特征 (取前几个主要频率成分的绝对值)
    fft_values = np.abs(fft(sample))
    features['fft_1'] = fft_values[1]  # 第一频率成分
    features['fft_2'] = fft_values[2]  # 第二频率成分
    features['fft_3'] = fft_values[3]  # 第三频率成分
    
    return features

# 对所有样本提取特征
features = []
for i in range(len(data)):
    sample = data.iloc[i, 4:].values  # 提取磁通密度数据
    feature_dict = extract_features(sample)
    feature_dict['label'] = data.iloc[i, 3]  # 标签是励磁波形
    features.append(feature_dict)

# 转换为DataFrame
features_df = pd.DataFrame(features)

# 查看提取的特征
features_df.head()

features_df.replace({'label': {'正弦波': 1, '三角波': 2,'梯形波': 3}}, inplace=True)
features_df.head()

这里省略一步关键代码,继续:

# 对所有样本提取特征
test_data_features = []
for i in range(len(test_data)):
    sample = test_data.iloc[i, 4:].values  # 提取磁通密度数据
    test_data_feature_dict = extract_features(sample)
    test_data_features.append(test_data_feature_dict)

# 转换为DataFrame
test_data_features_df = pd.DataFrame(test_data_features)

# 查看提取的特征
test_data_features_df.head()

y_pred = gbdt.predict(test_data_features_df)
y_pred

然后:

unique, counts = np.unique(y_pred, return_counts=True)
waveform_counts = dict(zip(unique, counts))

print("三种波形的数量统计:")
print(f"正弦波 (1) 数量: {waveform_counts.get(1, 0)}")
print(f"三角波 (2) 数量: {waveform_counts.get(2, 0)}")
print(f"梯形波 (3) 数量: {waveform_counts.get(3, 0)}")

以上仅为部分。其中更详细的思路、各题目思路、代码、讲解视频、成品论文及其他相关内容,可以看下面的群名片哦!

;