需求分析
如今越来越多的人在毕业后开始了求职和工作,但面对如此大的竞争压力和其他因素都面临的事业的可能性,本案例主要为计算请年工作者的失业率。
实验步骤
步骤一:将数据集读入内存
在这个数据集里一共有两个数据集,分别命名为"unemployment_male.csv"及"unemployment_female.csv"。由于有两个数据集,如果我们仍然一个一个分别的写"oepn…csv.reader()…for"的方式显然太麻烦,除了名字不同之外,读入数据的所有步骤是相同,所以我们将读入数据的方式模块化,用自定义函数,将这个过程包装起来。
实现步骤
1、引入模块csv
2、自定义函数read_csv(),输入参数为path,指数据集存放路径
- 以只读的方式打开文件,将文件保存为f
- 新建列表content,用于保存数据
- 对文件f用csv.reader()方法,并保存为reader
- 对reader使用for循环,提取其中每一行数据,添加到content中
- 返回content
3、用自定义函数read_csv()读取数据集,分别保存为unemploy_male及unemploy_female
4、打印unemploy_male前两行数据
代码实现
import csv
def read_csv(path):
f = open(path, "r")
content = []
reader = csv.reader(f)
for row in reader:
content.append(row)
f.close()
return content
unemploy_male = read_csv("unemployment_male.csv")
unemploy_female = read_csv("unemployment_female.csv")
print(unemploy_male[:2])
结果如下图所示。
步骤二:按名字选取数据
如果我希望通过国家的名字获得这个国家相应的数据的时候,应该怎么做呢?在类Youth中添加函数,用于抽取该国家对应的数据
实现步骤
1、新增加函数gen_by_country,输入参数为country,表示需要查找的国家名称
2、对self.dataset进行循环
3、若列表中的第一个元素等于country,则直接返回这一列表
4、若执行完所有,没有一个国家与之匹配,则打印"对不起,没有此国家!"
代码实现
class Youth_Correct:
def __init__(self, dataset):
self.dataset = dataset
def gen_by_country(self, country):
for row in self.dataset:
if row[0] == country:
return row
print("对不起,没有此国家!")
import pickle
with open("unemployment_male.pickle", "rb") as f:
unemploy_male = pickle.load(f)
with open("unemployment_female.pickle", "rb") as f:
unemploy_female = pickle.load(f)
un_male_youth = Youth(unemploy_male)
china_un_male = un_male_youth.gen_by_country("China")
print(china_un_male)
print(un_male_youth.gen_by_country("C"))
结果如下图所示。
步骤三:按时间选取数据
除了按国家名字选择数据之外,还会有按时间年份来选择;这个练习需要你继续在Youth类中添加按时间选择数据的函数。
实现步骤
和国家不同的是,年份是选择一列数,需要先找到该年份所在列表中的位置,再对整个列表中每个元素进行循环抽取
- 根据已写的类Youth,添加类内函数gen_by_time,输入参数为时间time
- 首先需要找到输入年份所在数据集中列的位置,用range函数产生与数据集第一排元素相同长度的数字列表,并对该列表进行for循环
- 抽取数据集第一行列表与此次循环数字相应位置的元素,同输入年份的字符串进行比较,若两者相同,则将此数字保存为posi_of_time,表示需要抽取年份所在列表位置
- 新建变量content,用于保存抽取的数据
- 变量posi_of_time有可能是不存在的,所以这里我们使用try…except结构来保证代码的运行正确
- 在try下,对数据集除第一个列表元素之外进行for循环,并根据变量posi_of_time来抽取每个循环元素对应的年份数据,并添加到变量content中
如果posi_of_time不存在,则会出现错误,使用try…except结构的情况下,错误会直接进入except;在excpet中,打印"对不起,没有此年份!",并直接返回,无返回内容
- 在try下,对数据集除第一个列表元素之外进行for循环,并根据变量posi_of_time来抽取每个循环元素对应的年份数据,并添加到变量content中
- 返回变量content
- 传入数据集unemploy_male初始化类Youth,并保存为un_male_youth
- 使用类内方法gen_by_time,抽取2014年的数据,并保存为un_male_2014
- 打印变量un_male_2014
代码实现
class Youth:
def __init__(self, dataset):
self.dataset = dataset
def gen_by_country(self, country):
for row in self.dataset:
if row[0] == country:
return row
print("对不起,没有此国家!")
def gen_by_time(self, time):
for i in range(len(self.dataset[0])):
if self.dataset[0][i] == str(time):
posi_of_time = i
content = []
try:
for row in self.dataset[1:]:
content.append(row[posi_of_time])
except:
print("对不起,没有此年份!")
return
return content
un_male_youth = Youth(unemploy_male)
un_male_2014 = un_male_youth.gen_by_time(2014)
print(un_male_2014)
print(un_male_youth.gen_by_time(2017))
结果如下图所示