前言
超好玩的广东省计算机设计大赛已经结束啦,看起来好像没有任何资料,本着贡献的态度,开源资料~
样题1
整体要求
本题需要在Linux操作系统中完成Flume的安装配置。请根据下列任务完成相关配置,具体要求如下。
在Linux终端执行命令 "initnetwork",或双击桌面上名称为“初始化网络”的图标,初始化实训平台网络,启动基础环境。
【数据获取】
使用wget命令获取数据(运行引号中的所有代码可将数据上传到实训平台)。
Flume安装包:“wget -P /data http://house.tipdm.com/JS-Competition/software/apache-flume-1.11.0-bin.tar.gz”。
【说明】
① 登录平台后需先在Linux终端执行命令"initnetwork",或双击桌面上名称为“初始化网络”的图标,初始化实训平台网络。
② 通过"$JAVA_HOME"指令可返回JAVA的安装目录;通过"$HADOOP_HOME"指令可返回Hadoop的安装目录。
③ 通过 wget 命令可将安装包下载至“/data”目录下,完整数据路径为“/data/apache-flume-1.11.0-bin.tar.gz”。
【答案提交】
整理赛题的最终答案的代码与成果,并按照以下要求提交完整答案。
代码提交:将每道小题的完整代码(非图片)填入相应小题的答题框,注意代码的缩进、格式。5分
第一题
要求
将master节点的/data目录下的Flume安装包解压到/opt/module目录下(若无/opt/module目录需自行创建),查看/opt/module目录结构并将查看结果截图。
代码答案
tar -zxvf /data/apache-flume-1.11.0-bin.tar.gz -c /opt/module
解析
tar -zxvf example.tar.gz
#-z: 表示要使用 gzip 解压归档文件。
#-x: 表示解压操作。
#-v: 表示详细输出,列出被解压的文件。
#-f example.tar.gz: 指定要解压的归档文件的名称为 example.tar.gz。
第二题
要求
进入Flume安装目录的conf目录,将flume-env.sh.template重命名为flume-env.sh,将JAVA的安装目录添加至flume-env.sh文件中。
代码答案
cd /opt/module/apache-flume-1.11.0-bin/conf
mv flume-env.sh.template flume-env.sh
vim flume-env.sh
#JAVA_HOME=修改为目标路径
解析
解压后重命名文件并修改即可
第三题
要求
删除Flume安装目录的lib目录下的guava-11.0.2.jar包,之后将Hadoop类库中的guava-27.0-jre.jar复制至Flume安装目录的lib目录,最后查看Flume安装目录的lib目录下的内容,验证guava的Jar包版本并截图。
代码答案
ls -al | grep guava
rm guava-11.0.2.jar
cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar \
/opt/module/apache-flume-1.11.0-bin/lib
解析
- 寻找原来的guava包,删除
- 复制hadoop 的guava包到flume的目录
第四题
要求
在master节点的/etc/profile文件中配置Flume环境变量(FLUME_HOME)和PATH的值,并使配置文件立即生效,最后查看Flume版本,检测Flume是否安装成功,并将结果截图。
代码答案
vim /etc/profile
#添加以下内容
#export FLUME_HOME = /opt/module/apache-flume-1.11.0-bin
#export PATH=$FLUME_HOME/bin
source /etc/profile
flume-ng version
解析
记得重启或应用环境变量
样题2
整体要求
本题需要在Linux操作系统中完成Spark的安装配置。请根据下列任务完成相关配置,具体要求如下。
在Linux终端执行命令“initnetwork”,或双击桌面上名称为“初始化网络”的图标,初始化实训平台网络,启动基础环境。
【数据获取】
使用wget命令获取数据(运行引号中的所有代码可将数据上传到实训平台)。
① Spark安装包:“wget -P /data http://house.tipdm.com/JS-Competition/software/spark-3.2.1-bin-hadoop3.2.tgz”。
② 2016-2020年空气质量数据:“wget -P /data http://house.tipdm.com/JS-Competition/data/2016年空气质量数据.csv”。
“wget -P /data http://house.tipdm.com/JS-Competition/data/2017年空气质量数据.csv”。
“wget -P /data http://house.tipdm.com/JS-Competition/data/2018年空气质量数据.csv”。
“wget -P /data http://house.tipdm.com/JS-Competition/data/2019年空气质量数据.csv”。
“wget -P /data http://house.tipdm.com/JS-Competition/data/2020年空气质量数据.csv”。
【说明】
① 登录平台后需先在Linux终端执行命令“initnetwork”,或双击桌面上名称为“初始化网络”的图标,初始化实训平台网络。
② 通过“$JAVA_HOME”指令可返回JAVA的安装目录;通过“$HADOOP_HOME”指令可返回Hadoop的安装目录。
③ 通过 wget 命令可将安装包下载至“/data”目录下,完整数据路径为“/data/spark-3.2.1-bin-hadoop3.2.tgz”。
第一题
要求
在master节点将/data目录下的spark-3.2.1-bin-hadoop3.2.tgz安装包解压到/opt/module目录下(需自行创建/opt/module目录),查看/opt/module目录结构。
代码答案
mkdir -p /opt/module && tar -zxvf /data/spark-3.2.1-bin-hadoop3.2.tgz -C /opt/module
解析
创建目录并解压到目标目录即可
第二题
要求
在master节点上将/opt/module/spark-3.2.1-bin-hadoop3.2/conf目录下的spark-env.sh.template文件更名为spark-env.sh,workers.template文件名更名为workers,查看/opt/module/spark-3.2.1-bin-hadoop3.2/conf目录下的内容。
代码答案
cd /opt/module/spark-3.2.1-bin-hadoop3.2/conf
mv spark-env.sh.template spark-env.sh
mv workers.template workers
ls -al /opt/module/spark-3.2.1-bin-hadoop3.2/conf
解析
打开到spark的目标目录,对文件进行重命名即可
第三题
要求
在spark-env.sh文件中进行修改,需要配置JAVA_HOME安装目录及Hadoop的配置文件目录,指定standalone模式运行时的Master进程运行在master节点上,指定Master进程内部通信端口号及SPARK的WEB UI端口。workers文件中进行修改,指定standalone模式运行时Worker进程需要分别在master、slave1、slave2节点上运行。
代码答案
cd /opt/module/spark-3.2.1-bin-hadoop3.2/conf
vim spark-env.sh
# 之后修改JAVA_HOME,WEBUI, MASTER_PORT
vim workers
# 修改为master
# slave1
# slave2
解析
略
第四题
要求
在master节点上将Spark安装目录远程拷贝到slave1、slave2节点的/opt/module路径下,之后查看slave1和slave2的/opt/module目录结构。
代码答案
scp -r /opt/module/spark-3.2.1-bin-hadoop3.2 root@slave1:/opt/module
scp -r /opt/module/spark-3.2.1-bin-hadoop3.2 root@slave2:/opt/module
ssh slave1
ls -l /opt/module
exit
ssh slave2
ls -l /opt/module
解析
scp [选项] [源文件] [目标路径]
-r:递归复制整个目录。
-P:指定远程主机的 SSH 端口号(默认是 22)。
-p:保留文件的修改时间、访问时间和权限。
-v:显示详细的调试信息,有助于排查问题。
-C:启用压缩,可以加快传输速度。
第五题
要求
在master节点修改/etc/profile文件,设置Spark环境变量(SPARK_HOME)和PATH的值,并使环境变量生效。
代码答案
vim /etc/profile
#SPARK_HOME
export SPARK_HOME=/opt/module/spark-3.2.1-bin-hadoop3.2
export PATH=$SPARK_HOME/bin:$PATH
scp -r /etc/profile root@slave1:/etc/profile
scp -r /etc/profile root@slave2:/etc/profile
解析
注意同步其他节点的变量
第六题
要求
启动Spark集群,使用jps查看master节点、slave1节点、slave2节点的进程(启动Spark集群前需先启动Hadoop集群)
代码答案
$HADOOP_HOME/sbin/start-all.sh
/opt/module/spark-3.2.1-bin-hadoop3.2/sbin/start-all.sh
解析
略
第七题
要求
在HDFS中创建/air目录,并将master节点的/data目录下2016年-2020年空气质量数据共5份csv文件上传至HDFS的/air目录下。
代码答案
hdfs dfs -mkdir /air
hdfs dfs -put /data/2016年空气质量数据.csv /air/
hdfs dfs -put /data/2017年空气质量数据.csv /air/
hdfs dfs -put /data/2018年空气质量数据.csv /air/
hdfs dfs -put /data/2019年空气质量数据.csv /air/
hdfs dfs -put /data/2020年空气质量数据.csv /air/
hdfs dfs -ls /air
解析
使用hdfs API将文件发送到指定目录
第八题
要求
使用Spark SQL分别读取/air目录下的5份csv数据文件并转为DataFrame数据,合并5年的空气质量数据,并保存为新的DataFrame,命名为airdata,打印数据的记录数及列名。
代码答案
var df1 = spark.read.option("header","true")
.option("sep",",")
.csv("hdfs://master:8020/air/2016年空气质量数据.csv")
var df2 = spark.read.option("header","true")
.option("sep",",")
.csv("hdfs://master:8020/air/2017年空气质量数据.csv")
var df3 = spark.read.option("header","true")
.option("sep",",")
.csv("hdfs://master:8020/air/2018年空气质量数据.csv")
var df4 = spark.read.option("header","true") //读入数据
.option("sep",",")
.csv("hdfs://master:8020/air/2019年空气质量数据.csv")
var df5 = spark.read.option("header","true") //读入数据
.option("sep",",")
.csv("hdfs://master:8020/air/2020年空气质量数据.csv")
var unionedDF = df1.union(df2).union(df3).union(df4)
解析
使用spark.read.option读入数据后,再用union合并表
第九题
要求
对airdata数据进行去重,并打印输出去重后的数据记录数。
代码答案
var airdata = unionedDF.distinct()
airdata.describe()
解析
使用distinct()方法对数据进行去重,用describe()方法查看数据。
第十题
要求
将去重后的数据保存到HDFS的/air/airdata.csv文件中
代码答案
airdata.coalesce(1) //写入数据
.write.option("header","true")
.csv("hdfs://master:8020/air/airdata.csv")
//后续重命名生成的csv并移动到/air目录
解析
使用write.option回写csv文件
样题3
整体要求
针对某地区的居民幸福度,从气候、经济、人口等方面进行综合分析。其中,气候数据来源于气象站采集的“地面逐小时常规观测数据.csv”,但该文件存在数据质量问题,请根据以下任务编写Python代码,完成数据的获取与清洗。
【数据获取】
使用wget命令获取数据(右键打开终端,运行引号中的所有代码可将数据上传到实训平台)。
地面逐小时常规观测数据:wget -P /data http://house.tipdm.com/JS-Competition/data/地面逐小时常规观测数据.csv。
【说明】
平台的数据路径为“/data/地面逐小时常规观测数据.csv”
【答案提交】
整理赛题的最终答案的代码按照以下要求提交完整答案。
代码提交:将每道小题的完整代码(非图片)填入相应小题的答题框,注意代码的缩进、格式。
第一题
要求
使用Pandas库读取“地面逐小时常规观测数据.csv”,并赋值给变量data1。
代码答案
import pandas as pd
data1 = pd.read_csv('data/地面逐小时常规观测数据.csv')
解析
使用pandas库读入数据
第二题
要求
根据“观测时间”字段,删除数据的重复值,要求保留最后一条重复数据。
代码答案
data1 = data1.drop_duplicates(subset="观测时间",keep="last")
解析
使用drop_duplicates方法对数据去重,注意保留最后一条数据
第三题
要求
对于数据存在的缺失值,使用“前向填充”方法填充缺失值。
代码答案
data1.fillna(method="pad",inplace=True)
data1.isna().sum()
解析
对数据集使用fillna方法,参数method为pad,作用前向填充。使用inplace=True替换缺失值。
第四题
要求
删除“气压”和“气温”字段的数值单位,并将数值类型转为浮点型,如气压“1023hPa”改为“1023.0”。
代码答案
data1['气温'] = data1['气温'].str.strip('℃').astype(float)
data1['气压'] = data1['气压'].str.strip('hPa').astype(float)
data1['气压']
解析
使用字符串分割法替换即可并使用astype对类型进行转换
第五题
要求
通过描述性统计分析查看数据的最大值、最小值、平均值与四分位数,并查看数据的字段类型。
代码答案
print(data1.describe())
print(data1.info())
解析
使用.info和.describe分别查看
第六题
要求
在气象业务中,2分钟与10分钟的风向与风速数值相差不大,删除数据中2分钟风向与风速数据。
代码答案
data1.drop(['2分钟平均风速','2分钟平均风向'],axis=1,inplace=True)
data1.info()
解析
使用drop删除数据即可,注意删除的是列数据。
第七题
要求
“观测时间”字段转为datetime时间类型,并通过重采样的方法,按照下面的统计方式,将逐小时数据转化为逐日数据,获取逐日平均数据。
| 统计方式 | 数据字段 |
| 平均值 | 气压、气温、相对湿度、 10 分钟平均风向、 10 分钟平均风速 |
| 总和 | 过去一小时的降水量 |
代码答案
data1['观测时间'] = pd.to_datetime(data1['观测时间'])
data1 = data1.set_index("观测时间")
group_data = data1.resample("D").agg({
'气压':'mean',
'气温':'mean',
'相对湿度':'mean',
'过去一小时降水量':'sum',
'10分钟平均风向':'mean',
'10分钟平均风速':'mean'
})
解析
使用datetime对数据进行转换,使用set_index将列设置为索引,之后使用重采样,对所有的数据进行聚类重采样。
第八题
要求
修改逐日平均数据的字段名称:观测时间、气压、气温、相对湿度、日降水量、平均风向、平均风速。
代码答案
group_data = data1.rename(columns={
'观测时间':'观测时间',
'气压':'气压',
'气温':'气温',
'相对湿度':'相对湿度',
'过去一小时降水量':'日降水量',
'10分钟平均风向':'平均风向',
'10分钟平均风速':'平均风速'
})
group_data
解析
使用rename方法对所有数据进行重命名,之后查看数据即可。
第九题
要求
将处理后的逐日平均数据保存至“result2.csv”文件中。
代码答案
group_data.to_csv('data/result2.csv',index=False)
解析
使用to_csv方法对处理好的数据进行保存即可。
样题4
整体要求
基于处理后的“地面气候数据.csv”,完成下列任务的Python代码编写,统计并计算气候属性指标,分析该地区的居住气候。
【数据获取】
使用wget命令获取数据(右键打开终端,运行引号中的所有代码可将数据上传到实训平台)。
地面气候数据:wget -P /data http://house.tipdm.com/JS-Competition/data/地面气候数据.csv。
【说明】
平台的数据路径为“/data/地面气候数据.csv”
【答案提交】
整理赛题的最终答案的代码与成果,根据赛供的“问题4答案报告.docx”文档,按文档要求将其整理入文档,并以“准考证号+问题4答案报告”命名并提交。
第一题
要求
从“观测时间”列提取年份,如“2016/1/5”提取数值“2016”,将结果保存至“年份”字段,并展示提取结果。
代码答案
import pandas as pd
import numpy as np
data = pd.read_csv('data/地面气候数据.csv')
data['年份'] = data['观测时间'].str.split('/').str[0]
data.head(10)
解析
读取数据后使用字符串分割并保存就好。
第二题
要求
降水指标:统计并展示2016~2020年的总降水量。
代码答案
group_data = data.groupby(by='年份')
group_data.agg({'降水量':'sum'})
解析
对数据按照年份分组,然后,聚类求和
第三题
要求
根据下面的公式,计算风效指数、温湿指数,并将计算结果保存至相应的字段。
| 指标 | 计算公式 |
| 风效指数 | $ -(10\sqrt{风速}+10.45-风速)\times (33-气温)+8.55\times 日照指数 $ |
| 温湿指数 | $ 1.8\times 气温+ 32- 0.55\times (1- 相对湿度)\times (1.8\times 气温-26) $ |
代码答案
data['风效指数'] = -(10*np.sqrt(data['平均风速'])-data['平均风速'])*
(33-data['气温'])+(8.55*data['日照时数'])
data['温湿指数'] = (1.8*data['气温'])+32-0.55*(1-data['相对湿度'])*
(1.8*data['气温']-26)
data.head(10)
解析
按照公式进行暴力计算,另起一列保存数值
第四题
要求
气候舒适指标:根据不同的环境条件,通过风效指数、温湿指数,筛选气候舒适的数据,并统计每年气候舒适的累计天数。
| 序号 | 属于气候舒适的环境条件 |
| 1 | 10℃ ≤ 气温 ≤ 16℃ -600 < 风效增效 ≤ -50 |
| 2 | 气温 < 10℃ 且 相对湿度 < 0.85 且 -600 < 风效指数 ≤ -50 |
| 3 | 气温>16℃ 且 55 ≤ 温湿指数 < 70 |
| 4 | 气温<10℃ 且 相对湿度 > 0.85 且 55 ≤温湿指数 < 70 |
代码答案
def is_comfortable(df):
if 10 <= df['气温'] <= 16 and -600 <= df['风效指数'] <= -50:
return True
if df['气温'] < 10 and -600 <= df['风效指数'] <= -50 and df['相对湿度'] < 85:
return True
if df['气温'] > 16 and 55 <= df['温湿指数'] < 70:
return True
if df['气温'] < 10 and df['相对湿度'] > 85 and 55 <= df['温湿指数'] < 70:
return True
return False
data['是否舒适'] = data.apply(is_comfortable,axis=1)
data.head(10)
print(data.groupby(by= '年份')['是否舒适'].sum())
解析
通过构建一个函数,对数据进行自定义函数处理即可
第五题
要求
气温指标:筛选日平均气温不小于15℃且不大于25℃的数据作为适宜气温数据,统计并展示每年适宜气温的累计天数。
代码答案
temp = data.loc[(data['气温'] >= 15) & (data['气温'] <= 25)]
print(temp.groupby('年份').size())
解析
对数据进行条件切片,直接计算大小
第六题
要求
合并降水指标、气候舒适指标和气温指标,并将合并结果保存至“result3.csv”文件中
代码答案
data.to_csv('data/result3.csv',index=False)
样题5
整体要求
基于“空气质量数据.csv”,完成下列任务的Python代码编写,从多个维度统计并分析该地区的环境质量。
【数据获取】
使用wget命令获取数据(右键打开终端,运行引号中的所有代码可将数据上传到实训平台)。
空气质量数据:wget -P /data http://house.tipdm.com/JS-Competition/data/空气质量数据.csv。
【说明】
平台的数据路径为/data/空气质量数据.csv
【答案提交】
整理赛题的最终答案的代码与成果,根据赛供的“问题5答案报告.docx”文档,按文档要求将其整理入文档,并以“准考证号+问题5答案报告”命名并提交。
第一题
要求
从“日期”列提取年份,如“2016年1月1日”提取数值“2016”,将结果保存至“年份”字段,并展示提取结果。
代码答案
import pandas as pd
df =pd.read_csv("data/空气质量数据.csv")
df.head(5)
year = df["日期"].str[:4]
df["年份"]= year
df.head(10)
解析
读取完数据后,对字符串进行分割,之后保存即可
第二题
要求
根据空气质量指数(AQI)对照下表的空气质量等级标准,划分空气质量类别,将分类结果保存至“空气质量等级”字段,并展示分类结果。
代码答案
def AQI_level(AQI):
if 0< AQI <=50:
return "优"
elif 51< AQI <=100:
return "良"
elif 101< AQI <=150:
return "轻度污染"
elif 151< AQI <=200:
return "中度污染"
elif 201< AQI <=300:
return "重度污染"
else:
return "严重污染"
df["AQI等级"]=df["AQI"].apply(AQI_level)
df.head(10)
解析
通过构建一个函数,对数据进行自定义函数处理即可。
第三题
要求
统计不同空气质量等级的天数,并按升序排序。
代码答案
df["AQI等级"].value_counts(ascending=True)
解析
使用value_counts统计天数,参数为asceding=True(升序排序)
第四题
要求
通过透视表,统计并展示2016~2020年不同空气质量等级的天数,以“年份”作为透视表的索引。
代码答案
# 创建透视表
pivot_table = pd.pivot_table(df,
values="AQI",
index="年份",
columns="AQI等级",
aggfunc='count',
fill_value=0)
# 展示透视表
pivot_table
解析
使用pivot_table方法,对数据做透视表,注意聚类函数和空值填充。
第五题
要求
统计2016~2020年空气污染物(PM10、PM2.5、NO2、SO2、CO)的最大值与最小值。
代码答案
result = df.groupby(["年份"])[['PM10','PM2.5','NO2','SO2','CO']].agg(['max','min'])
result
解析
对年份进行分组,分别使用聚类函数进行聚类
样题6
整体要求
基于“居民收入数据.csv”,完成下列任务的Python代码编写,对该地区居民收入进行分析,挖掘其中隐藏的城市经济趋势,并对未来两年的居民收入进行预测。
【数据获取】
使用wget命令获取数据(右键打开终端,运行引号中的所有代码可将数据上传到实训平台)。
居民收入数据:wget -P /data http://house.tipdm.com/JS-Competition/data/居民收入数据.csv。
【说明】
① 平台的数据路径为/data/居民收入数据.csv
② 在可视化图表中,中文字体可设置为WenQuanYi Zen Hei。
【答案提交】
整理赛题的最终答案的代码按照以下要求提交完整答案。
代码提交:将每道小题的完整代码(非图片)填入相应小题的答题框,注意代码的缩进、格式。
第一题
要求
计算各特征(x1~x13,y)之间的Pearson相关系数,并以DataFrame数据结构展示。
代码答案
data = pd.read_csv('data/居民收入数据.csv')
no_year = data.drop("year",axis=1)
data_cor = np.round(no_year.corr(method='pearson'),2)
data_cor
解析
注意删除year字段的数据,会干扰计算结果。
第二题
要求
提取“x1”至“x13”字段作为特征,赋值给feature变量;提取“y”字段作为标签,赋值给label变量。
代码答案
features = data.iloc[:,1:14]
label = data["y"]
解析
按题目要求对数据进行切片即可
第三题
要求
构建Lasso()函数,设置λ的值为1000,使用特征与标签训练模型,并对训练完成后的模型,获取并输出每个特征的相关系数值。
代码答案
model = Lasso(alpha=1000)
model.fit(features,label)
print("Lasso回归系数:", np.round(model.coef_,5))
解析
通过sklearn库,对数据集构建模型,进行训练。注意alpha参数
第四题
要求
对特征数据feature抽取强相关特征,赋值给new_feature变量。
| 强相关特征 | x1 ,x3, x4 , x5 , x6 , x7 , x8 , x13 |
代码答案
new_features = features[['x1','x3','x4','x5','x6','x7','x8','x13']]
解析
将特征列保存为新的变量即可
第五题
要求
将特征数据new_feature和标签数据label进行标准差标准化,输出并查看标准化后的结果。
代码答案
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
scaler_feature=scaler.fit_transform(new_features)
scaler_label = scaler.fit_transform(label.values.reshape(-1,1))
scaler_feature_df = pd.DataFrame(scaler_feature,
columns=new_features.columns)
scaler_label_df = pd.DataFrame(scaler_label)
scaler_feature_df

Comments NOTHING