第四届“泰迪杯”数据分析——本科及以上组B题(源代码)
作者:互联网
任务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