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