▍『1』熟悉 python 基本知识
前面几篇文章分别讲述了 python 基本语法、数据类型、if 和循环语句以及模块。现在我们来巩固前边的知识,用 《数!据!分!析!告诉你:老板眼中的数据分析》 作为例子进行实战。
这篇文章主要是熟悉 python 基本知识,所以不采用 python 的模块进行数据处理。代码略显繁琐,实际数据分析过程中会采用 python 的模块,很多功能都无需自己写代码。
▍『2』 实战
数据为爬取的数据分析相关的职业信息,具体文件可留言公众号后台索取。数据如下图所示。
每一行为一条职业信息,包含职位id、地区、学历要求、公司发展阶段、领域、名称、工资、公司规模和工作年限要求信息。
♢ 「2.1」数据读取
首先我们编写读取数据的代码,在 python 中,我们可以用 open 打开文件,并读取文件内容。
读取内容的方式有三种:read
readline
readlines
read 会将整个文件读取为字符串,最终得到一个字符串;readline读取文件的一行,得到一行的字符串;readlines按行读取文件,得到一个由每行的字符串组成的列表。根据我们的需求,每一行为一条职业信息,采用 readlines 读取数据。
读写文件是最常见的IO操作。Python内置了读写文件的函数,用法与其他语言是一致的。如打开 clean_lagou.csv 文件并读取。
# 打开文件
f = open('clean_lagou.csv')
# 读取文件内容
lines = f.readlines()
# 关闭文件
f.close()
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源。由于文件读写时都有可能产生错误,一旦出错,后面的f.close()就不会调用。Python 引入了 with 语句,离开 with 语句代码块时文件自动关闭。所以,我们读取文件建议采取的写法为:
with open('clean_lagou.csv') as f:
lines = f.readlines()
♢ 「2.2」数据数据预处理
现在,lines 为包含我们内容的列表,列表中的每一个元素为一条职位信息,而且它是一个字符串,如 '4021708,浦东新区,硕士,不需要融资,"移动互联网,金融",上海数禾信息科技有限公司,8k-12k,150-500人,不限'。很明显的,我们需要对其进行分割,将每条信息分离开来,根据内容, , 号将各条信息分离,所以我们可以根据 , 分割字符串。如果你仔细观察,你会注意到有些 , 并不是各条信息的分离点,如 "移动互联网,金融" 中的逗号。所以,我们写一个函数,它可以根据逗号分割字符串,但是引号中的逗号不分割字符串。
def splitString(str):
ss = ""
is_quote = False
lstStr = []
# 循环字符串中的每一个字符
for s in str:
# 如果不是逗号也不是引号内
# 将字符连接
if s != ',' and s != "\"":
ss = ss + s
# 如果是逗号且不是引号内的内容
# 将子字符串加入 lstStr 列表
elif s == ',' and is_quote == False:
lstStr.append(ss)
ss = ""
# 如果是引号且没标记为引号内
# 引号开始
# 标记为引号内并跳出该次循环
elif s == "\"" and is_quote == False:
is_quote = True
continue
# 如果是引号且标记为引号内
# 引号结束
# 标记为引号外
elif s == "\"" and is_quote == True:
is_quote = False
continue
# 如果是逗号是引用内的
# 连接字符
# 而不是将子字符串加入 lstStr
elif s == ',' and is_quote == True:
ss = ss + s
return lstStr
上面的函数可以达到我们的目的,现在我们创建一个 data 列表,保存我们分隔后的数据。
data = []
for line in lines:
data.append(splitString(line))
同时,第一行为文件头,我们将文件头删除。
data.pop(0)
♢ 「2.3」数据薪酬分布
我们以薪酬分布为例,说明操作过程,其他相关内容可自己动手。
首先,将薪酬数据从 data 中提取出来。
salary = []
for i in data:
salary.append(i[6])
实际上,我们可以采用 python 列表推导式,这样代码更加简洁,历表推导式的具体说明可网上查看。
salary = [i[6] for i in data]
现在我们统计每个薪酬水平的数量,采用 set 列出所有薪酬水平,并利用 count 方法统计 salary 中每个薪酬水平的个数。最后,将薪酬水平及其个数写入字典 salary_count。
num = []
for c in set(salary):
num.append(salary.count(c))
salary_count = dict(zip(set(salary), num))
上面同样可以写成列表推导式,请自行试试。
根据薪酬水平的个数排序。
salary_sort = sorted(salary_count.items(), key=lambda kv: kv[1], reverse=True)
如果你还有印象的话,count_items() 返回的是由键和值组成的列表,我们告诉 sorted 函数,需要采用值来排序,这里采用了 lambda 表达式。lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。上式 lambda 函数等价于:
def func(x):
return x[1]
这样,我们就得到了一个数量从高到底的排序列表,列表中的元素为薪酬水平及其个数。
最后,采用 matplotlib 包中的 pyplot 模块进行画图,一般来说,python 都是默认安装了 matplotlib ,如果没有安装,请采用 pip install matplotlib 安装。
同样地,我们采用列表推导式将薪酬水平赋值为 x ,个数赋值为 y。这里仅采用数量最大的 10 个值。
x = [i[0] for i in salary_sort[:10]]
y = [i[1] for i in salary_sort[:10]]
导入模块及画图。
import matplotlib.pyplot as plt
plt.bar(x,y)
plt.xticks(rotation=70)
▍『3』结语
该篇主要目的为熟悉 python 基本知识,所以代码稍微繁琐。若是采用模块进行上述处理,可能 10 多行代码可以搞定。在之后的文章中,将对 python 数据分析模块进行介绍和实战。
从零单排06:实战之巩固 python 基础知识mp.weixin.qq.com
搜索 ”data2nb“ 关注公众号 ”从零单排数据分析“,获取源码和数据,共同学习,一起努力鸭。