当前位置: 首页 > news >正文

2022高教社杯数学建模国赛C题思路代码实现

1.比赛报名与思路解析(持续更新750967193)

2.比赛时间:2022年9月15日18点到2022年9月18日20点

如下为C题思路的配套代码:

首先导入表单:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False

df_表单1 = pd.read_excel('附件.xlsx', sheet_name='表单1')
df_表单2 = pd.read_excel('附件.xlsx', sheet_name='表单2')
df_表单3 = pd.read_excel('附件.xlsx', sheet_name='表单3')

画出各个属性占比图

fig=plt.figure(figsize=(10,10))
i=1
for column in df_表单1.columns[1:]:
    data ={elem:np.sum(df_表单1[column]==elem) for elem in df_表单1[column].unique()}
    ax=fig.add_subplot(2,2,i)
    i+=1
    ax.pie(data.values(), labels=data.keys(), autopct='%1.2lf%%', pctdistance=0.5)
    ax.set_title(column+'占比图')
plt.savefig('各属性数量占比图.png')
plt.show()

可以对数据采用如下方式处理:

  1. 空白处表示未检测到该成分,即该成分的含量为0,所以对于表单2中所用的控制用0进行填充;
  2. 对于‘文物采样点’进行分开处理,分开为‘文物编号’,采样点;
  3. 将成分之和不在区间[85,105]范围内的删除;
  4. 各成分含量之和应为100%,但因检测手段等原因加和并非100%,所以对各成分进行归一化处理,使其成分含量和为100%
df_表单2 = pd.read_excel('附件.xlsx', sheet_name='表单2')
df_表单2['采样点']=df_表单2['文物采样点'].apply(lambda x:x[2:])
df_表单2['文物编号']=df_表单2['文物采样点'].apply(lambda x:x[:2])
df_表单2=df_表单2.fillna(0)
print(df_表单2.shape)
df_表单2['总含量']=df_表单2[df_表单2.columns[1:15]].sum(axis=1)
index = df_表单2[df_表单2['总含量']<85].index
df_表单2=df_表单2.drop(index=index)
print(df_表单2.shape)
index = df_表单2[df_表单2['总含量']>105].index
df_表单2=df_表单2.drop(index=index)
print(df_表单2.shape)
for column in df_表单2.columns[1:15]:
    df_表单2[column]=df_表单2[column]/df_表单2['总含量']*100
df_表单2.head()

然后合并1、2表单:

df_表单1['文物编号']=df_表单1['文物编号'].astype('str')
df_表单1['文物编号']=df_表单1['文物编号'].apply(lambda x:'0'*(2-len(x))+x)
df_表单1.index=df_表单1['文物编号']
columns = ['纹饰', '类型', '颜色', '表面风化']
df_表单2[columns]=''
for i in df_表单2.index:
    index = df_表单2['文物编号'][i]
    for column in columns:
        df_表单2.loc[i,column]=df_表单1[column][index]
df_表单2['颜色'].unique()
dic = {'风化':1,'无风化':0,
       'A':1,'C':0,  # 这里未对B进行转换,不过在apriori的地方使用的是汉字不影响,后续也没有使用
       '高钾':1,'铅钡':0,  
      '蓝绿':0, '浅蓝':1, '紫':2, '深绿':3, '深蓝':4, '浅绿':5, '黑':6, '绿':7}
df_表单2['是否风化']=df_表单2['表面风化'].apply(lambda x:dic.get(x))
df_表单2['类型是否高钾']=df_表单2['类型'].apply(lambda x:dic.get(x))
df_表单2['纹饰A']=df_表单2['纹饰'].apply(lambda x:dic.get(x))
df_表单2['颜色编号']=df_表单2['颜色'].apply(lambda x:dic.get(x))
columns = ['文物编号','采样点','是否风化','类型是否高钾','纹饰A','颜色编号']
columns.extend(df_表单2.columns[1:15])
df = df_表单2[columns]
df.to_excel('表单1-2合并.xlsx')
df

得到完整的合并表单:

各成分占比:

plt.figure(figsize=(10,10))
data = df[df.columns[5:]].mean()
print(data[data<=1].index)
value = list(data[data>1].values)+[sum(data[data<=1].values)]
labels = list(data[data>1].index)+['其他']
plt.pie(value, labels=labels, autopct='%1.2lf%%')
plt.savefig('各成分平均占比图.png')
plt.show()

df1 = df[df['类型是否高钾']==1]
plt.figure(figsize=(10,10))
data = df1[df1.columns[5:]].mean()
print(data[data<=1].index)
value = list(data[data>1].values)+[sum(data[data<=1].values)]
labels = list(data[data>1].index)+['其他']
plt.pie(value, labels=labels, autopct='%1.2lf%%')
plt.savefig('类型为高钾的成分占比图.png')
plt.show()

此图为:类型为高钾的成分占比图

画出热力图:

sns.heatmap(df[df.columns[1:5]].corr())
plt.savefig('风化,纹饰,颜色,类型相关性热力图.png')
plt.show()

所有属性热力图

以上仅为部分数据预处理内容,第二问小部分内容摘选:

df['亚类']=''
高钾亚类 = ['高钾亚类'+str(i) for i in 高钾kmeans[1]]
铅钡亚类 = ['铅钡亚类'+str(i) for i in 铅钡kmeans[1]]
df.loc[高钾_df.index,'亚类']=高钾亚类
df.loc[铅钡_df.index,'亚类']=铅钡亚类
df.to_excel('所有文物分别按亚类分类表.xlsx')

以上仅为部分数据预处理内容和摘选的第二问的小部分内容

相关文章:

  • [acwing周赛复盘] 第 69 场周赛20220917
  • CSDN编程竞赛-第六期(上)
  • 基于 V2X 的车联网安全互信体系架构分析
  • 【图像检测】基于 AlexNet 和 SVM 实现异常螺母检测附matlab代码
  • vue开发-从源码开始解读一个智慧园区项目
  • 接入Twitter和Facebook分享踩坑记录
  • 这次主要的配置
  • 工作5年,没接触过高并发编程,这正常吗?
  • 【微信小程序】带你进入小程序的世界
  • 机器学习-线性回归 二维问题
  • 分享从零开始学习网络设备配置--2.1 交换机基本配置
  • 大数据ClickHouse进阶(九):ClickHouse的From和Sample子句
  • vue3 | HighCharts实战自定义封装之径向条形图
  • Web前端系列技术之Web APIs基础(从基础开始)③
  • 线段树基本操作——建树+单点修改+区间查询
  • ----------
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • create-react-app做的留言板
  • Fabric架构演变之路
  • JavaScript DOM 10 - 滚动
  • PaddlePaddle-GitHub的正确打开姿势
  • PAT A1050
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Zsh 开发指南(第十四篇 文件读写)
  • 安卓应用性能调试和优化经验分享
  • 大快搜索数据爬虫技术实例安装教学篇
  • 给新手的新浪微博 SDK 集成教程【一】
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 排序算法学习笔记
  • 区块链分支循环
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 通过npm或yarn自动生成vue组件
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 关于Android全面屏虚拟导航栏的适配总结
  • "无招胜有招"nbsp;史上最全的互…
  • # 安徽锐锋科技IDMS系统简介
  • #1014 : Trie树
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (动态规划)5. 最长回文子串 java解决
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (转)可以带来幸福的一本书
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .gitignore文件设置了忽略但不生效
  • .java 9 找不到符号_java找不到符号
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net 6.0 处理跨域的方式
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .Net中的设计模式——Factory Method模式
  • @Autowired标签与 @Resource标签 的区别
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法