ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第四届“泰迪杯”数据分析——本科及以上组B题(源代码)

2022-02-28 23:33:36  阅读:562  来源: 互联网

标签:数据分析 xlsx 泰迪杯 分组 pd 源代码 data d3 data2


任务1

import pandas as pd
# 任务 1.1 附件 1 的产品通用名称存在不规范的情况。
# 请按照复混肥料(掺混肥料归入这一类)、有机-无机复混肥料、有机肥料和床土调酸剂这 4 种类别
# 对附件 1 进行规范化处理
# 读取数据
data1 = pd.DataFrame(pd.read_excel('./附件1.xlsx'))
# 检查缺失值
data1.isnull().sum()
data1.columns
data1['产品通用名称'].value_counts()
def get_name(df):
    df = df.astype('str')
    for i in range(len(df)):
        str1 = df[i]
        if ((str1.find("复混肥料") != -1 or str1.find("掺混肥料") != -1) and str1.find("无机") ==-1):
            df[i] = '复混肥料'
        elif (str1.find("无机") != -1 ):
            df[i] = '有机-无机复混肥料'
        elif (str1.find("有机肥料") != -1 ):
            df[i] = '有机肥料'
        elif (str1.find("床土调酸剂") != -1):
            df[i] = '床土调酸剂'
    return df
data1['产品通用名称'] = get_name(data1['产品通用名称'])
data1['产品通用名称'].value_counts()
data1.to_excel('./data/result1_1.xlsx')
# 任务 1.2 计算附件 1 中各肥料产品的氮、磷、钾养分百分比之和,称为总
# 无机养分百分比。请在报告中给出处理思路、过程及必要的结果,同时将完整的
# 结果保存到文件“result1_2.xlsx”中,结果保留 3 位小数(例如 1.0%,即 0.010)。
data1['总无机养分百分比'] = (data1['总氮百分比'] + data1['P2O5百分比'] + data1 ['K2O百分比'])\
                        .map(lambda x:('%.3f')%x)
data1[['序号','正式登记证号','总无机养分百分比']].to_excel('./data/result1_2.xlsx',index=None)

任务2

 

# 任务 2.1 从附件 2 中筛选出复混肥料的产品,将所有复混肥料按照总无机
# 养分百分比的取值等距分为 10 组。根据每个产品所在的分组,为其打上分组标
# 签(标签用 1~10 表示),将完整的结果保存到文件“result2_1.xlsx”中。分析复
# 混肥料产品的分布特点,在报告中绘制产品登记数量的直方图,给出处理思路及
# 过程,并按登记数量从大到小列出登记数量最大的前 3 个分组及相应的产品登记
# 数量。
import numpy as np
import pandas as pd
data2 = pd.DataFrame(pd.read_excel('./附件2.xlsx'))
# 检查缺失值
data2.isnull().sum()
data2.columns
data2['产品通用名称'].value_counts()
d = data2[data2['产品通用名称'] == '复混肥料'][['产品通用名称','总无机养分百分比']]
d['总无机养分百分比'].describe()
d['等距取值'] = pd.cut(d['总无机养分百分比'],10)
label_dict = {'(-0.00072, 0.072]':1, '(0.072, 0.144]':2,' (0.144, 0.216]':3,
        '(0.216, 0.288]':4,'(0.288, 0.36]':5,'(0.36 , 0.432]':6,
        '(0.432, 0.504]':7,'(0.504, 0.576]':8,'(0.576, 0.648]':9, '(0.648, 0.72]':10}
d['分组'] = d['等距取值'].astype(str).map(label_dict)
d['分组'] = d['分组'].fillna(6)
d['分组'] = d['分组'].astype(int)
d2 = data2[data2['产品通用名称'] == '复混肥料']
d2['总无机养分分组标签'] = d['分组']
d2.to_excel('./data/result2_1.xlsx',index=None)
d2.columns
d2['总无机养分分组标签'].value_counts()


# 任务 2.2 从附件 2 中筛选出有机肥料的产品,将产品按照总无机养分百分
# 比和有机质百分比分别等距分为 10 组,并为每个产品打上分组标签 (1,1), (1,2),
# ⋯, (10,10),将完整的结果保存到文件“result2_2.xlsx”中。请在报告中给出处理
# 思路及过程,并根据分组情况绘制有机肥料产品的分布热力图,其中横轴代表总
# 无机养分分组,纵轴代表有机质分组。在此基础上,分析有机肥料产品的分布特
# 点,并按登记数量从大到小列出登记数量最大的前 3 个分组及相应的产品登记数
# 量。
d3 = data2[data2['产品通用名称'] == '有机肥料'][['总无机养分百分比','有机质百分比']]
d3.isnull().sum()
d3.value_counts()
d3['等距取值'] = pd.cut(d3['总无机养分百分比'],10)
d3['等距取值'].value_counts().sort_index()
label_dict2 = {'(0.0497, 0.0881]':1, '(0.0881, 0.126]':2,'(0.126, 0.164]':3,
        '(0.164, 0.202]':4,'(0.202, 0.24]':5,'(0.24 , 0.278]':6,
        '(0.278, 0.316]':7,'(0.316, 0.354]':8,'(0.354, 0.392]':9, '(0.392, 0.43]':10}
d3['分组'] = d3['等距取值'].astype(str).map(label_dict2)

d3['等距取值2'] = pd.cut(d3['有机质百分比'],10)
d3['等距取值2'].value_counts().sort_index()
label_dict2 = {'(-0.0009, 0.09]':1, '(0.09, 0.18]':2,'(0.18, 0.27]':3,
        '(0.27, 0.36]':4,'(0.36, 0.45]':5,'(0.45, 0.54]':6,
        '(0.54, 0.63]':7,'(0.63, 0.72]':8,'(0.72, 0.81]':9, '(0.81, 0.9]':10}
d3['分组2'] = d3['等距取值2'].astype(str).map(label_dict2)

# 提出组号
a = np.array(d3[['分组','分组2']].astype(int).values)
d3['分组标签'] = None
for i in range(len(a)-1):
        d3['分组标签'].iloc[i:i+1] = str(tuple(a[i]))

d3['分组标签'].value_counts()
d4 = data2[data2['产品通用名称'] == '有机肥料']
d4['分组标签'] = d3['分组标签']
d4.to_excel('./data/result2_2.xlsx',index=None)

# 按登记数量从大到小列出登记数量最大的前 3 个分组
dd = pd.DataFrame(pd.read_excel('./data/result2_2.xlsx'))
dd.columns
dd['count'] = 1
dd2 = pd.DataFrame(dd.groupby(by=['分组标签'],as_index=0)['count'].sum())
dd2.sort_values(by='count',ascending=False,inplace=True,ignore_index=True)

# 任务 2.3 从附件 2 中筛选出复混肥料的产品,按照氮、磷、钾养分的百分
# 比,使用聚类算法将这些产品分为 4 类。根据聚类结果为每个产品打上聚类标签
# (标签用 1~4 表示),并将完整的结果保存到文件“result2_3.xlsx”中。请在报
# 告中给出处理思路及过程,根据聚类标签绘制肥料产品的三维散点图和散点图矩
# 阵,并通过绘制聚类结果的雷达图分析每个聚类的特征。

data2.columns
d5 = data2[data2['产品通用名称'] == '复混肥料'][['总氮百分比', 'P2O5百分比', 'K2O百分比']]
#基于聚类分析的方法
from sklearn.cluster import KMeans  # 引入KMeans
kmodel = KMeans(n_clusters = 4, n_jobs = 4)  # 建立模型,n_jobs是并行数,一般等于CPU数较好
kmodel.fit(np.array(d5).reshape((len(d5), 3)))  # 训练模型
pd.DataFrame(kmodel.cluster_centers_).sort_values(0)  # 输出聚类中心,并且排序(默认是随机序的)
k = kmodel.predict(d5) # 聚类标签
d5['聚类标签'] = k
d5['聚类标签'].value_counts()
d6 = data2[data2['产品通用名称'] == '复混肥料']
d6['聚类标签'] = d5['聚类标签']
d6.to_excel('./data/result2_3.xlsx',index=None)

任务3

# 任务 3.1 从文件“result2_1.xlsx”中提取发证日期中的年份,分析比较复混
# 肥料中各组别不同年份产品登记数量的变化趋势。请在报告中给出处理思路及分
# 析过程,使用合适的图表对结果进行可视化。import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.DataFrame(pd.read_excel('./data/result2_1.xlsx'))
data.columns
data['发证日期'] = pd.to_datetime(data['发证日期'])
data['年份'] = data['发证日期'].dt.year
d = data[data['产品通用名称'] == '复混肥料']
d['count'] = 1
d2 = d.groupby(by=['总无机养分分组标签', '年份'],as_index=0)['count'].sum()
x = np.array(d2['总无机养分分组标签'])
y = np.array(d2['年份'])
s = np.array(d2['count'])
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.scatter(x,y,s)
plt.xticks([1,2,3,4,5,6,7,8,9,10])
plt.xlabel("组号")
plt.ylabel("年份")
plt.title("各组别不同年份产品登记数量气泡图")
plt.show()

# 任务 3.2 从文件“result2_2.xlsx”中提取 2021 年 9 月 30 日仍有效的有机
# 肥料产品,将完整的结果保存到文件“result3_2.xlsx”中。从有效产品中分别筛
# 选出广西和湖北(根据正式登记证号区分)产品登记数量在前 5 的组别,分析两
# 个省份上述组别的分布差异。请在报告中给出处理过程及分析结果。
data2 = pd.DataFrame(pd.read_excel('./data/result2_2.xlsx'))
data2.columns
data2['有效期'].value_counts()
d2 = data2[data2['有效期'] >= '2021-9-30']
d2.to_excel('./data/result3_2.xlsx',index=None)
def get_province(row):
    str = row[0]
    if ( str == '鄂' ):
        return 1
    elif ( str == '桂'):
        return 0
d2['省份类别'] = d2['正式登记证号'].apply(get_province)
d2['count'] = 1
d3 = d2.groupby(by=['省份类别','分组标签'],as_index=0)['count'].sum()
# 广西
d4 = pd.DataFrame(d3[d3['省份类别'] == 0])
d4 = d4.sort_values(by='count',ascending=False)
d4.head(5)
# 湖北
d5 = pd.DataFrame(d3[d3['省份类别'] == 1])
d5 = d5.sort_values(by='count',ascending=False)
d5.head(5)

# 任务 3.3 从附件 3 中提取产品登记数量大于 10 的肥料企业,给出这些企业
# 所用到的原料集合(发酵菌剂除外)。以各企业用到的原料作为特征,计算企业
# 之间的杰卡德相似系数矩阵,并将结果(保留4位小数)保存到文件“result3_3.xlsx”
# 中(不提供模板文件,格式见表 1)。请在报告中给出处理思路、过程及相似系数矩阵。
data3 = pd.DataFrame(pd.read_excel('./附件3.xlsx'))
data3.isnull().sum()
data3.columns

任务4

# 任务 4.1 设计算法或处理流程,从附件 4 技术指标中提取出氮、磷、钾养
# 分和有机质的百分比,以及肥料含氯的程度。请在报告中给出处理思路及过程,
# 并将结果保存到文件“result4_1.xlsx”中。
import pandas as pd
data = pd.DataFrame(pd.read_excel('./附件4.xlsx'))
data.columns
data['原料与占比']

def get_values(row):
    r = row
    s1 = r.split(',')
    s_name = []
    s_percent = []
    for i in s1:
        if( i != '' ):
            s2 = i.split(' ')
            if(len(s2) >= 2):
                s_name.append(s2[0])
                s_p = s2[1]
                if( s_p.find('占0%') != -1):
                    s_percent.append('0%')
                else:
                    s_percent.append(s_p[s_p.find('占')+1:s_p.find('%')+1])
    return s_name,s_percent
a= data['原料与占比'].apply(get_values)

a2 = pd.DataFrame(list(a))
a3 = pd.DataFrame(a2[0].tolist())
a4 = pd.DataFrame(a2[1].tolist())
# 按要求对数据进行交叉排列
def df_insert(a3,a4,):
    j = 0
    for i in range(1,401,2):
        d1 = a3[:i]
        d2 = a3[i:]
        d3 = a4[j:j+1]
        a3 = d1.append(d3).append(d2)
        j += 1
    return a3
a5 = df_insert(a3,a4)
a6 = a5.T
def get_shape(a6):
    for i in range(200,2):
        a7 = a6[i]
        a8 = a6[i+1]
        a9 = a7.append(a8)
        print(a9)
get_shape(a6)

a6.dropna(axis=0,how='all')

a6.to_excel('./data/result4.2.xlsx',index=None)

标签:数据分析,xlsx,泰迪杯,分组,pd,源代码,data,d3,data2
来源: https://blog.csdn.net/zero_20220228/article/details/123194978

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有