Python数据分析与可视化实验案例,所需数据已经绑定上传

news2025/1/16 11:02:04

大数据技术专业技能竞赛试卷

一、项目名称

农业肥料登记数据分析赛题

二、竞赛内容

赛项以大数据技术为核心内容,重点考查参赛选手数据清洗和数据分析的能力,结合Pandas和matplotlib图表展示数据。所有参赛学生在现场根据给定的项目任务,在2小时内完成赛项任务,最后以提交的截图和文档作为最终评分依据具体包括:
在这里插入图片描述

三、软件准备

基本软件

在这里插入图片描述

备注:以上软件可使用类似软件或其他版本代替,本竞赛仅保证上述软件上述版本能搭建成功,其他软件或其他版本可能存在少许差异

四、评分方式

在这里插入图片描述

五、项目步骤及实现

1.项目的搭建(10分)

(1)安装pandas,matplotlib等第三方库(5分 安装步骤的截图)
在这里插入图片描述

(3)创建项目和py文件,在文件中引用第三方库(5分 代码截图)
在这里插入图片描述

2.肥料产品的数据预处理(25分)

(1)附件 1 的产品通用名称存在不规范的情况。按照复混肥料(掺混肥料归入这一类)、有机-无机复混肥料、有机肥料和床土调酸剂这4种类别对附件1进行规范化处理(10分 代码和结果截图)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import re

# 读取Excel文件
datas = pd.read_excel('附件1.xlsx')
print(datas['产品通用名称'].value_counts().reset_index())

# 定义一个函数来清理产品名称
def clean_product_name(name):
    # 去除前后的空白字符
    name = name.strip()
    # 替换换行符和特殊字符
    name = re.sub(r'[\n\r]', '', name)
    # 统一有机-无机复混肥料的命名
    if re.search(r'有机[--]?无机', name, re.IGNORECASE):
        return '有机-无机复混肥料'
    elif re.search(r'复混肥料', name, re.IGNORECASE):
        return '复混肥料'
    elif re.search(r'掺混肥料', name, re.IGNORECASE):
        return '复混肥料'
    elif re.search(r'有机肥料', name, re.IGNORECASE):
        return '有机肥料'
    elif re.search(r'床土调酸剂', name, re.IGNORECASE):
        return '床土调酸剂'
    else:
        return '其他'

# 应用清理函数到产品通用名称列
datas['产品通用名称'] = datas['产品通用名称'].apply(clean_product_name)

# 统计每种产品出现的次数
product_counts = datas['产品通用名称'].value_counts().reset_index()

# 重命名列名
product_counts.columns = ['产品通用名称', '出现次数']

# 打印结果
print(product_counts)

          产品通用名称  count
0           复混肥料   1647
1           掺混肥料    941
2           有机肥料    180
3      有机-无机复混肥料    124
4   有机-无机   复混肥料      9
5          床土调酸剂      7
6   有机无机    复混肥料      5
7        稻苗床土调酸剂      3
8       \n有机肥料\n      3
9      有机-无机复混肥料      2
10   有机无机   复混肥料      1
11         有机肥料       1
12        有机肥料\n      1
13          掺混肥料      1
      产品通用名称  出现次数
0       复混肥料  2589
1       有机肥料   185
2  有机-无机复混肥料   141
3      床土调酸剂    10

(2)计算附件1中各肥料产品的氮、磷、钾养分百分比之和,称为总无机养分百分比。结果保留 3 位小数(例如 1.0%,即 0.010)(10分 代码和结果截图)

# (2)计算附件1中各肥料产品的氮、磷、钾养分百分比之和,称为总无机养分百分比。结果保留 3 位小数(例如 1.0%,即 0.010)(10分 代码和结果截图)
data = pd.read_excel('result1_1.xlsx')
# 计算总无机养分百分比(氮、磷、钾养分百分比之和)
data['总无机养分百分比'] = (data[['总氮百分比', 'P2O5百分比', 'K2O百分比']].sum(axis=1) * 100).round(3).astype(str) + '%'
print(data.head(10))

data.to_excel('result1_2.xlsx', index=False)

   序号          企业名称 产品通用名称 产品形态  总氮百分比  P2O5百分比  K2O百分比 含氯情况  有机质百分比  \
0   1  安徽中元化肥股份有限公司   复混肥料   颗粒   0.13     0.17    0.20   低氯     0.0   
1   2  安徽中元化肥股份有限公司   复混肥料   颗粒   0.13     0.17    0.20   中氯     0.0   
2   3  安徽中元化肥股份有限公司   复混肥料   颗粒   0.20     0.15    0.16   低氯     0.0   
3   4  安徽中元化肥股份有限公司   复混肥料   颗粒   0.26     0.13    0.12   低氯     0.0   
4   5  安徽中元化肥股份有限公司   复混肥料   颗粒   0.26     0.13    0.12   中氯     0.0   
5   6  安徽中元化肥股份有限公司   复混肥料   颗粒   0.20     0.15    0.16   中氯     0.0   
6   7  安徽中元化肥股份有限公司   复混肥料   颗粒   0.14     0.26    0.12   低氯     0.0   
7   8  安徽中元化肥股份有限公司   复混肥料   颗粒   0.14     0.26    0.12   中氯     0.0   
8   9  安徽中元化肥股份有限公司   复混肥料   颗粒   0.14     0.20    0.20   无氯     0.0   
9  10  安徽中元化肥股份有限公司   复混肥料   颗粒   0.27     0.15    0.12   中氯     0.0   

             正式登记证号        发证日期      有效期 总无机养分百分比  
0  皖农肥(2016)准字4255号  2016-01-08  2021-01    50.0%  
1  皖农肥(2016)准字4256号  2016-01-08  2021-01    50.0%  
2  皖农肥(2016)准字4257号  2016-01-08  2021-01    51.0%  
3  皖农肥(2016)准字4258号  2016-01-08  2021-01    51.0%  
4  皖农肥(2016)准字4259号  2016-01-08  2021-01    51.0%  
5  皖农肥(2016)准字4260号  2016-01-08  2021-01    51.0%  
6  皖农肥(2016)准字4261号  2016-01-08  2021-01    52.0%  
7  皖农肥(2016)准字4262号  2016-01-08  2021-01    52.0%  
8  皖农肥(2016)准字4263号  2016-01-08  2021-01    54.0%  
9  皖农肥(2016)准字4264号  2016-01-08  2021-01    54.0%  

(3)将产品通用名称规范化处理的结果保存到文件“result1_1.xlsx”中;将总无机养分百分比的计算结果保存到文件“result1_2.xlsx”中(5分 代码截图和文件)

data = pd.read_excel('result1_1.xlsx')

3.肥料产品的数据分析(40分)

(1)从附件 2 中筛选出复混肥料的产品,将所有复混肥料按照总无机养分百分比的取值等距分为10组。根据每个产品所在的分组,为其打上分组标签(标签用 1~10 表示),将完整的结果保存到文件“result2_1.xlsx”中(10分 代码截图和文件)

import pandas as pd
import numpy as np

# 读取Excel文件
data1 = pd.read_excel('附件2.xlsx')

# 筛选出复混肥料的数据
df2 = data1.query('产品通用名称=="复混肥料"')
print(df2.shape)

# 计算最大值和最小值
max_val = df2['总无机养分百分比'].max()
min_val = df2['总无机养分百分比'].min()
print('最大值和最小值')

# 生成等间隔的区间
nums = np.linspace(min_val, max_val, 11, endpoint=True)
print(nums)

# 打印前10个总无机养分百分比的值
print(df2['总无机养分百分比'].head(10))

# 定义区间标签
labels = [f'第{i+1}组' for i in range(len(nums)-1)]

# 使用pd.cut进行分组
# 1. df2['总无机养分百分比'] 是需要分割的数据
# 2. bins 自定义分割区间的边界
# 3. right: 布尔值,默认为 True。如果为 True,则右开左闭区间;
# 4. labels: 可选。用于指定每个区间的标签。如果不提供,则使用区间的字符串表示。
df2['分组'] = pd.cut(df2['总无机养分百分比'], bins=nums, labels=labels, include_lowest=True)

# 查看分组后的结果
print(df2.head(10))
# 保存结果到文件
df2.to_excel('result2_1.xlsx', index=False)
(5954, 15)
最大值和最小值
[0.    0.072 0.144 0.216 0.288 0.36  0.432 0.504 0.576 0.648 0.72 ]
1     0.41
2     0.40
3     0.44
4     0.45
5     0.36
6     0.45
7     0.48
8     0.51
9     0.35
10    0.45
Name: 总无机养分百分比, dtype: float64
    序号           企业名称 产品通用名称 产品形态  总氮百分比  P2O5百分比  K2O百分比 含氯情况  有机质百分比  \
1    2  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.17     0.17    0.07   低氯     0.0   
2    3  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.20     0.05    0.15   无氯     0.0   
3    4  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.26     0.08    0.10   中氯     0.0   
4    5    湖北澳特尔化工有限公司   复混肥料   粒状   0.15     0.15    0.15   无氯     0.0   
5    6  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.20     0.05    0.11   无氯     0.0   
6    7    湖北澳特尔化工有限公司   复混肥料   粒状   0.14     0.16    0.15   无氯     0.0   
7    8  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.24     0.10    0.14   中氯     0.0   
8    9  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.26     0.10    0.15   中氯     0.0   
9   10  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.25     0.05    0.05   中氯     0.0   
10  11  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.20     0.05    0.20   无氯     0.0   

               正式登记证号        发证日期      有效期 产品商品名称 适用作物  总无机养分百分比   分组  
1    鄂农肥(2009)准字0004号  2014-08-15  2019-08    NaN  NaN      0.41  第6组  
2    鄂农肥(2009)准字0005号  2014-08-15  2019-08    NaN  NaN      0.40  第6组  
3    鄂农肥(2009)准字0006号  2014-08-15  2019-08    NaN  NaN      0.44  第7组  
4   鄂农肥(2009)准字00079号  2014-10-25  2019-10    NaN  NaN      0.45  第7组  
5    鄂农肥(2009)准字0007号  2014-08-15  2019-08    NaN  NaN      0.36  第5组  
6   鄂农肥(2009)准字00081号  2014-10-25  2019-10    NaN  NaN      0.45  第7组  
7    鄂农肥(2009)准字0008号  2014-08-15  2019-08    NaN  NaN      0.48  第7组  
8    鄂农肥(2009)准字0009号  2014-08-15  2019-08    NaN  NaN      0.51  第8组  
9    鄂农肥(2009)准字0010号  2014-08-15  2019-08    NaN  NaN      0.35  第5组  
10   鄂农肥(2009)准字0011号  2014-08-15  2019-08    NaN  NaN      0.45  第7组  


C:\Users\admin.DESKTOP-G6CFGT8\AppData\Local\Temp\ipykernel_3424\2181290204.py:31: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df2['分组'] = pd.cut(df2['总无机养分百分比'], bins=nums, labels=labels, include_lowest=True)

(2)从附件2中筛选出复混肥料的产品,根据上一题的分组结果,按登记数量从大到小列出登记数量最大的前 3 个分组及相应的产品登记数量(10分 代码截图)
筛选出复混肥料的数据

print(df2.head(10))
# 统计出现的次数
df3 = df2['分组'].value_counts()
print(df3.head(3))
    序号           企业名称 产品通用名称 产品形态  总氮百分比  P2O5百分比  K2O百分比 含氯情况  有机质百分比  \
1    2  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.17     0.17    0.07   低氯     0.0   
2    3  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.20     0.05    0.15   无氯     0.0   
3    4  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.26     0.08    0.10   中氯     0.0   
4    5    湖北澳特尔化工有限公司   复混肥料   粒状   0.15     0.15    0.15   无氯     0.0   
5    6  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.20     0.05    0.11   无氯     0.0   
6    7    湖北澳特尔化工有限公司   复混肥料   粒状   0.14     0.16    0.15   无氯     0.0   
7    8  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.24     0.10    0.14   中氯     0.0   
8    9  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.26     0.10    0.15   中氯     0.0   
9   10  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.25     0.05    0.05   中氯     0.0   
10  11  嘉施利(应城)化肥有限公司   复混肥料   粒状   0.20     0.05    0.20   无氯     0.0   

               正式登记证号        发证日期      有效期 产品商品名称 适用作物  总无机养分百分比   分组  
1    鄂农肥(2009)准字0004号  2014-08-15  2019-08    NaN  NaN      0.41  第6组  
2    鄂农肥(2009)准字0005号  2014-08-15  2019-08    NaN  NaN      0.40  第6组  
3    鄂农肥(2009)准字0006号  2014-08-15  2019-08    NaN  NaN      0.44  第7组  
4   鄂农肥(2009)准字00079号  2014-10-25  2019-10    NaN  NaN      0.45  第7组  
5    鄂农肥(2009)准字0007号  2014-08-15  2019-08    NaN  NaN      0.36  第5组  
6   鄂农肥(2009)准字00081号  2014-10-25  2019-10    NaN  NaN      0.45  第7组  
7    鄂农肥(2009)准字0008号  2014-08-15  2019-08    NaN  NaN      0.48  第7组  
8    鄂农肥(2009)准字0009号  2014-08-15  2019-08    NaN  NaN      0.51  第8组  
9    鄂农肥(2009)准字0010号  2014-08-15  2019-08    NaN  NaN      0.35  第5组  
10   鄂农肥(2009)准字0011号  2014-08-15  2019-08    NaN  NaN      0.45  第7组  
分组
第7组    2098
第6组    1470
第5组    1154
Name: count, dtype: int64

(3)从附件2中筛选出有机肥料的产品,将产品按照总无机养分百分比和有机质百分比分别等距分为10组,并为每个产品打上分组标签 (1,1), (1,2), ⋯, (10,10),将完整的结果保存到文件“result2_2.xlsx”中。(10分 代码截图和文件)

import pandas as pd
import numpy as np

# 读取Excel文件
data1 = pd.read_excel('附件2.xlsx')

# 筛选出复混肥料的数据
df2 = data1.query('产品通用名称=="有机肥料"')
print(df2.shape)

# 计算最大值和最小值
max_val = df2['总无机养分百分比'].max()
min_val = df2['总无机养分百分比'].min()
max_val2 = df2['有机质百分比'].max()
min_val2 = df2['有机质百分比'].min()

# 生成等间隔的区间
nums = np.linspace(min_val, max_val, 11, endpoint=True)
nums2 = np.linspace(min_val2, max_val2, 11, endpoint=True)

print("nums",nums)
print("nums2",nums2)

# 打印前10个总无机养分百分比的值
print(df2['总无机养分百分比'].head(10))
print(df2['有机质百分比'].head(10))

# 确保输入数据是一维的
df2['总无机养分百分比'] = df2['总无机养分百分比'].astype(float)
df2['有机质百分比'] = df2['有机质百分比'].astype(float)


# 应用cut函数
df2['分组'] = pd.cut(df2['总无机养分百分比'].values, bins=nums, labels=np.arange(1, 11), include_lowest=True)
df2['分组2'] = pd.cut(df2['有机质百分比'].values, bins=nums2, labels=np.arange(1, 11), include_lowest=True)

# 创建一个新的列来组合这两个分组
df2['组合分组'] = list(zip(df2['分组'], df2['分组2']))
df2['组合分组'] = [str(i) for i in df2['组合分组']]

# 将组合分组映射到预定义的标签
df2['分组'] = df2['分组'].map(dict(zip(df2['分组'], df2['分组2'])))

# 查看分组后的结果
print(df2.head(10))

# 保存结果到文件
df2.to_excel('result2_2.xlsx', index=False)


(1045, 15)
nums [0.0501  0.08809 0.12608 0.16407 0.20206 0.24005 0.27804 0.31603 0.35402
 0.39201 0.43   ]
nums2 [0.   0.09 0.18 0.27 0.36 0.45 0.54 0.63 0.72 0.81 0.9 ]
230    0.0801
319    0.0501
424    0.0501
473    0.0501
538    0.0501
560    0.0501
600    0.0501
779    0.0600
846    0.0600
847    0.0501
Name: 总无机养分百分比, dtype: float64
230    0.60
319    0.45
424    0.45
473    0.45
538    0.45
560    0.45
600    0.45
779    0.45
846    0.50
847    0.45
Name: 有机质百分比, dtype: float64
      序号               企业名称 产品通用名称 产品形态   总氮百分比  P2O5百分比  K2O百分比 含氯情况  有机质百分比  \
230  231       湖北中化东方肥料有限公司   有机肥料   粉状  0.0267   0.0267  0.0267   无氯    0.60   
319  320        武汉市沃农肥业有限公司   有机肥料   粉状  0.0167   0.0167  0.0167   无氯    0.45   
424  425      湖北太阳雨三农科技有限公司   有机肥料   粉状  0.0167   0.0167  0.0167   无氯    0.45   
473  474     武汉裕龙生物科技有限责任公司   有机肥料   粒状  0.0167   0.0167  0.0167   无氯    0.45   
538  539      湖北地利奥生物科技有限公司   有机肥料   粉状  0.0167   0.0167  0.0167   无氯    0.45   
560  561       湖北田头生物科技有限公司   有机肥料   粒状  0.0167   0.0167  0.0167   无氯    0.45   
600  601       武汉市天发有机肥有限公司   有机肥料   粉状  0.0167   0.0167  0.0167   无氯    0.45   
779  780  恒发新天地生物科技(大悟)有限公司   有机肥料   粉状  0.0200   0.0200  0.0200   无氯    0.45   
846  847      宜昌市汇丰生物科技有限公司   有机肥料   粉状  0.0200   0.0200  0.0200   无氯    0.50   
847  848      宜昌市汇丰生物科技有限公司   有机肥料   粒状  0.0167   0.0167  0.0167   无氯    0.45   

               正式登记证号        发证日期      有效期 产品商品名称 适用作物  总无机养分百分比   分组 分组2  \
230  鄂农肥(2009)准字0348号  2015-01-20  2020-01    NaN  NaN    0.0801  6.0   7   
319  鄂农肥(2010)准字0595号  2015-01-20  2020-01    NaN  NaN    0.0501  6.0   6   
424  鄂农肥(2010)准字0915号  2015/11/10  2020-11    NaN  NaN    0.0501  6.0   6   
473  鄂农肥(2010)准字1116号  2015/11/20  2020-11    NaN  NaN    0.0501  6.0   6   
538  鄂农肥(2011)准字0038号  2016/03/22  2021-03    NaN  NaN    0.0501  6.0   6   
560  鄂农肥(2011)准字0143号  2016/01/19   2021-1    NaN  NaN    0.0501  6.0   6   
600  鄂农肥(2011)准字0345号  2016/06/24  2021-06    NaN  NaN    0.0501  6.0   6   
779  鄂农肥(2011)准字0873号  2016-11-18  2021-11    NaN  NaN    0.0600  6.0   6   
846  鄂农肥(2012)准字0205号     2012-01  2017-01    NaN  NaN    0.0600  6.0   6   
847  鄂农肥(2012)准字0206号  2015/07/30  2020-07    NaN  NaN    0.0501  6.0   6   

       组合分组  
230  (1, 7)  
319  (1, 6)  
424  (1, 6)  
473  (1, 6)  
538  (1, 6)  
560  (1, 6)  
600  (1, 6)  
779  (1, 6)  
846  (1, 6)  
847  (1, 6)  


C:\Users\admin.DESKTOP-G6CFGT8\AppData\Local\Temp\ipykernel_3424\4062912065.py:29: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df2['总无机养分百分比'] = df2['总无机养分百分比'].astype(float)
C:\Users\admin.DESKTOP-G6CFGT8\AppData\Local\Temp\ipykernel_3424\4062912065.py:30: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df2['有机质百分比'] = df2['有机质百分比'].astype(float)
C:\Users\admin.DESKTOP-G6CFGT8\AppData\Local\Temp\ipykernel_3424\4062912065.py:34: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df2['分组'] = pd.cut(df2['总无机养分百分比'].values, bins=nums, labels=np.arange(1, 11), include_lowest=True)
C:\Users\admin.DESKTOP-G6CFGT8\AppData\Local\Temp\ipykernel_3424\4062912065.py:35: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df2['分组2'] = pd.cut(df2['有机质百分比'].values, bins=nums2, labels=np.arange(1, 11), include_lowest=True)
C:\Users\admin.DESKTOP-G6CFGT8\AppData\Local\Temp\ipykernel_3424\4062912065.py:38: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df2['组合分组'] = list(zip(df2['分组'], df2['分组2']))
C:\Users\admin.DESKTOP-G6CFGT8\AppData\Local\Temp\ipykernel_3424\4062912065.py:39: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df2['组合分组'] = [str(i) for i in df2['组合分组']]
C:\Users\admin.DESKTOP-G6CFGT8\AppData\Local\Temp\ipykernel_3424\4062912065.py:42: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df2['分组'] = df2['分组'].map(dict(zip(df2['分组'], df2['分组2'])))

(4)从附件2中筛选出有机肥料的产品,根据上一题的分组结果,按登记数量从大到小列出登记数量最大的前3个分组及相应的产品登记数量。(10分 代码截图)

df4 = df2['组合分组'].value_counts()
print(df4.head(3))
组合分组
(1, 6)    840
(1, 7)     68
(2, 6)     57
Name: count, dtype: int64

4.肥料产品的可视化(20分)

(1)读取“result2_1.xlsx”文件,分析复混肥料产品的分布特点,绘制产品登记数量的直方图。(10分 代码截图和直方图)

# 肥料产品的可视化(20分)

import  pandas as pd
import  numpy as np 
import matplotlib.pyplot as plt
# 设置中文字体和负号显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df5 = pd.read_excel('result2_1.xlsx')
data2 = df5['分组'].value_counts()
print(data2.values)
print(data2.keys())
# 对索引(分组)进行排序
sorted_index = sorted(data2.index, key=lambda x: int(x.replace('第', '').replace('组', '')))
# 重新排序后的值
sorted_values = data2[sorted_index].values
# 创建x轴标签
x_labels = [f'第{i+1}组' for i in range(len(sorted_index))]
# 绘制条形图
plt.figure(figsize=(10, 6))
plt.bar(x_labels, sorted_values, color='skyblue')
# plt.xlabel('分组')
# plt.ylabel('数量')
plt.title('复混肥料产品的各组登记数量直方图')
plt.show()
[2098 1470 1154  841  373   14    3    1]
Index(['第7组', '第6组', '第5组', '第8组', '第4组', '第9组', '第1组', '第10组'], dtype='object', name='分组')

在这里插入图片描述

(2)从文件“result2_1.xlsx”中提取发证日期中的年份,分析比较复混肥料中各组别不同年份产品登记数量的变化趋势。根据分析结果绘制折线图(10分 代码截图和折线图)

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt

# 设置中文字体和负号显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 读取Excel文件
df6 = pd.read_excel('result2_1.xlsx')

# 提取发证日期中的年份(通过取前4个字符)
df6['年份'] = df6['发证日期'].str[:4].astype(int)

# 按年份和分组统计每个组别的产品登记数量
grouped = df6.groupby(['年份', '分组']).size().unstack(fill_value=0)

# 绘制折线图
plt.figure(figsize=(10, 6))
for group in grouped.columns:
    plt.plot(grouped.index, grouped[group], marker='o', label=group)

plt.xlabel('年份')
plt.ylabel('产品登记数量')
plt.title('复混肥料中各组别不同年份产品登记数量的变化趋势')
plt.legend()
plt.grid(True)
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2244035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【竞技宝】LOL-传奇杯:姿态飞机TP绕后一锤定音

北京时间2024年11月19日,英雄联盟第二届传奇杯正在如火如荼的进行之中。昨天迎来小组赛第四个比赛日,本日一共进行了七场小组赛的对决,那么在昨日上半场的四场比赛中,登场的各支队伍都取得了什么样的表现呢?接下来小宝为大家带来小组赛day4上半场的比赛战报。 OP(宁王队) 0-1 …

qt之telnet连接目标设备在线调试功能

一、前言 在QT下使用telnet连接目标设备,进行在线命令调试,也可配合ftp或ssh使用。 telnet某些库在qt5下不可用,无法获取登录信息,只能获取到连接信息,这里我用自己的方式判断是否成功登录 二、环境 window qt5.7…

Android中常见内存泄漏的场景和解决方案

本文讲解Android 开发中常见内存泄漏场景及其解决方案,内容包括代码示例、原因分析以及最佳实践建议。 1. 静态变量导致的内存泄漏 静态变量的生命周期与应用进程一致,如果静态变量持有了对 Activity 或其他大对象的引用,就可能导致内存泄漏…

红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机 在之前的文章中红外相机和RGB相机标定:实现两种模态数据融合_红外相机标定-CSDN博客 ,介绍了如何利用标定板实现外参标定;但实测下来发现2个问题: (1)红外标定板尺寸问题,由于标定板小…

即插即用篇 | YOLOv11 引入高效的直方图Transformer模块 | 突破天气障碍:Histoformer引领高效图像修复新路径

本改进已同步到YOLO-Magic框架! 摘要:摘要。基于Transformer的恶劣天气图像修复方法取得了显著进展。大多数方法通过沿通道维度或在空间上固定范围的块内使用自注意力,以减少计算负担。然而,这种折中方式在捕获长距离空间特征方面…

ITSS服务经理: 山西科技学院智能铸造现代产业学院揭牌

记者从山西科技学院传来喜讯,近日,在该院工程训练中心与智能铸造现代产业学院于山西省晋城市泽州县绿色智能铸造创新产业园隆重举行的揭牌启动仪式上,标志着学院迈入崭新篇章。应用型本科高校,作为孕育高素质应用人才的摇篮&#…

AI时代:弯道超车的新思维与实践路径

文章目录 一、AI时代的机遇与挑战二、重新认识AI三、弯道超车的新思维四、实践路径与案例分享五、AI技术的未来发展趋势六、个人与企业如何适应AI时代《AI时代:弯道超车新思维》内容简介作者简介目录 在科技日新月异的今天,人工智能(AI&#…

‘视’不可挡:OAK相机助力无人机智控飞行!

南京邮电大学通达学院的刘同学用我们的oak-d-lite实现精确打击无人机的避障和目标识别定位功能,取得了比赛冠军。我们盼望着更多的朋友们能够加入到我们OAK的队伍中来,参与到各式各样的比赛中去。我们相信,有了我们相机的助力,大家…

网页抓取API,让数据获取更简单

网页抓取的过程通常分为以下步骤,尤其是在面对静态网页时: 获取页面 HTML:使用 HTTP 客户端下载目标页面的 HTML 内容。解析 HTML:将下载的 HTML 输入解析器,准备提取内容。提取数据:利用解析器功能&#…

Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找

一,数组翻转 1.概述:数组对称索引位置上的元素互换,最大值数组序号是数组长度减一 创建跳板temp,进行min和max的互换,然后min自增,max自减,当min>max的时候停止互换,代表到中间值 用代码实…

Office-Tab-for-Mac Office 窗口标签化,Office 多文件标签化管理

Office Tab:让操作更高效,给微软 Office 添加多标签页功能 Office 可以说是大家装机必备的软件,无论学习还是工作都少不了。其中最强大、用的最多的,还是微软的 Microsoft Office。 遗憾的是,微软的 Office 不支持多…

游戏引擎学习第12天

视频参考:https://www.bilibili.com/video/BV1yom9YnEWY 这节没讲什么东西,主要是改了一下音频的代码 后面有介绍一些alloc 和malloc,VirtualAlloc 的东西 _alloca 函数(或 alloca)分配的是栈内存,它的特点是: 生命周…

delphi fmx android 离线人脸识别

搜遍全网都没有找到delphi android 能用的 离线人脸识别,无需注册什么开发者 有这方面需求的可以用fsdk 这边用的luxand.FSDK8.0 android下的注册号要自己找下 1,用老猫的工具将android 下的sdk,FSDK.java 编译成FSDK.jar 老猫的工具 2,用上面的工具将FSDK.jar 生成de…

Java基础夯实——2.4 线程的生命周期

Java线程生命周期 Java线程的生命周期分为:新建(New)、就绪(Runnable)、阻塞(Blocked)、等待 (Waiting) 、计时等待(Timed_Waiting)、终止(Terminated&#…

实现简易计算器 网格布局 QT环境 纯代码C++实现

问题:通过代码完成一个10以内加减法计算器。不需要自适应,界面固定360*350。 ""按钮90*140,其它按钮90*70。 参考样式 #define DEFULT_BUTTON_STYLE "\ QPushButton{\color:#000000;\border:1px solid #AAAAAA;\border-radi…

RNN公式解释:实现记忆功能;RNN的状态向量

目录 RNN公式解释:实现记忆功能 一、词向量 二、RNN的状态向量 三、词向量变为状态向量的过程 四、总结 RNN公式解释:实现记忆功能 在RNN(递归神经网络)中,词向量变为状态向量的过程,实际上是RNN处理时序数据的一个核心环节。以下是对这一过程的详细解释: 一、词向…

【Linux】基础02

Linux编译和调试 VI编辑文件 vi : 进入文件编辑 是命令行模式 i :从光标处进入插入模式 dd : 删除光标所在行 n dd 删除指定行数 Esc : 退出插入模式 : 冒号进入末行模式 :wq : 保存退出 :q : 未修改文件可以退出 :q! …

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…

未来已来:少儿编程竞赛聚焦物联网,激发创新潜力

随着人工智能与物联网技术(IoT)的快速发展,少儿编程教育正在迎来新的变革浪潮。近年来,各类少儿编程竞赛纷纷增加了物联网相关主题,要求学生结合编程知识和硬件设备设计智能家居、智慧城市等创新项目。这一趋势不仅丰富…

布局设计器

介绍 最近遇到一个设计器的需求,要求拖拽布局,图层管理,自定义组件预览,分辨率等等功能。说白了就是先用设计器布局然后在屏幕上播放你布局好的内容 所以不多说了直接上代码 代码地址 这里大概说下有哪些功能吧 图层与属性框的值关…