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


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

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

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

    首先导入表单:

    1. import pandas as pd
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. import seaborn as sns
    5. plt.rcParams['font.sans-serif']='SimHei'
    6. plt.rcParams['axes.unicode_minus']=False
    7. df_表单1 = pd.read_excel('附件.xlsx', sheet_name='表单1')
    8. df_表单2 = pd.read_excel('附件.xlsx', sheet_name='表单2')
    9. df_表单3 = pd.read_excel('附件.xlsx', sheet_name='表单3')

    画出各个属性占比图

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

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

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

    然后合并1、2表单:

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

    得到完整的合并表单:

    各成分占比:

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

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

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

    画出热力图

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

    所有属性热力图

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

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

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

  • 相关阅读:
    springcloud alibaba nacos -1
    【面试普通人VS高手系列】volatile关键字有什么用?它的实现原理是什么?
    Java 去除字符中的空格、回车符
    学之思第二天-调通登录功能
    Photographic Tone Reproduction for Digital Images
    网络爬虫--伪装浏览器
    android linkToDeath内存泄露分析
    浏览器输入URL 到页面加载过程?
    axios 基本使用与学习
    网络初始之网络协议
  • 原文地址:https://blog.csdn.net/weixin_43345535/article/details/126900089