
- 外文名
- Data visualization
- 研究起源
- 二十世纪50年代
- 中文名
- 数据可视化
- 发展阶段
- 科学可视、信息可视、数据可视
-
数据可视化
2018-06-11 19:01:02我们本篇文章讲的数据可视化是面向开发人员的,是利用python中一些可视化库如:matplotlib或是seaborn通过对数据可视化,来分析数据表格中各维度间的关系或是数据分布的特性,从而有助于我们更好的理解数据,帮助...作者:Walker
我们本篇文章讲的数据可视化是面向开发人员的,是利用python中一些可视化库如:matplotlib或是seaborn通过对数据可视化,来分析数据表格中各维度间的关系或是数据分布的特性,从而有助于我们更好的理解数据,帮助我们进行下一步数据分析或是为数据建模提供方向。本篇文章的方法并非是面向用户做数据展示或面向企业做数据可视化,这种情况下大家可以尝试使用Echarts或Tableau等数据展示工具。本文将分为matplotlib可视化和seaborn可视化两个部分。
一、Matplotlib数据可视化:
Matplotlib是一个Python的2D绘图库,开发者使用Matplotlib仅需要几行代码便可以轻松绘图,生成柱状图、散点图、折线图、盒图、琴图等。
首先,matplotlib的安装非常的简单,Windows环境下我们可以通过pip install matplotlib直接完成安装,而Linux环境可以使用sudo pip install matplotlib完成安装。接着我们使用import matplotlib.pyplot as plt导入matplotlib库,便可以开始绘图了。
完整的绘图程序如下所示,包括图例、坐标轴、取值范围、刻度值、标题、注解等内容。
程序1:
import numpy as np
import matplotlib.pyplot as plt
from pylab import *定义数据部分
x = np.arange(0., 10, 0.2)
y1 = np.cos(x)
y2 = np.sin(x)
y3 = np.sqrt(x)绘制 3 条函数曲线
plt.plot(x, y1, color=’blue’, linewidth=1.5, linestyle=’-‘, marker=’.’, label=r’’)
plt.plot(x, y2, color=’green’, linewidth=1.5, linestyle=’-‘, marker=’*’, label=r’’)
plt.plot(x, y3, color=’m’, linewidth=1.5, linestyle=’-‘, marker=’x’, label=r’’)坐标轴上移
ax = plt.subplot(111)
ax.spines[‘right’].set_color(‘none’) # 去掉右边的边框线
ax.spines[‘top’].set_color(‘none’) # 去掉上边的边框线移动下边边框线,相当于移动 X 轴
ax.xaxis.set_ticks_position(‘bottom’)
ax.spines[‘bottom’].set_position((‘data’, 0))移动左边边框线,相当于移动 y 轴
ax.yaxis.set_ticks_position(‘left’)
ax.spines[‘left’].set_position((‘data’, 0))设置 x, y 轴的取值范围
plt.xlim(x.min()*1.1, x.max()*1.1)
plt.ylim(-1.5, 4.0)设置 x, y 轴的刻度值
plt.xticks([2, 4, 6, 8, 10], [r’2’, r’4’, r’6’, r’8’, r’10’])
plt.yticks([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],
[r’-1.0’, r’0.0’, r’1.0’, r’2.0’, r’3.0’, r’4.0’])添加文字
plt.text(4, 1.68, r’’, color=’k’, fontsize=15)
plt.text(4, 1.38, r’’, color=’k’, fontsize=15)特殊点添加注解
plt.scatter([8,],[np.sqrt(8),], 50, color =’m’) # 使用散点图放大当前点
plt.annotate(r’’, xy=(8, np.sqrt(8)), xytext=(8.5, 2.2), fontsize=16, color=’#090909’, arrowprops=dict(arrowstyle=’->’, connectionstyle=’arc3, rad=0.1’, color=’#090909’))设置标题、x轴、y轴
plt.title(r’’, fontsize=19)
plt.xlabel(r’’, fontsize=18, labelpad=88.8)
plt.ylabel(r’’, fontsize=18, labelpad=12.5)设置图例及位置
plt.legend(loc=’up right’)
plt.legend([‘cos(x)’, ‘sin(x)’, ‘sqrt(x)’], loc=’up right’)
显示网格线
plt.grid(True)
显示绘图
plt.show()
散点图、曲线图、折线图、灰度图、饼状图、箱图、琴图等常用图形的绘制,也非常的简单,程序如下所示:
程序2:
散点图,是用来展示两个维度间的相关性
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)
plt.scatter(x,y)
程序3:
曲线图,观察某个变量的走势
x = np.arange(-5,5,0.1)
y = x ** 2
plt.plot(x,y)y = np.random.normal(size=1000)
程序4:
灰度图,查看某个维度的数据状况
x = np.random.normal(size=1000)
plt.hist(x, bins=100)
程序5:
饼图,显示一个系列中各项的大小以及各项所占总和的比例
import numpy as np
import matplotlib.pyplot as pltx为数据, 根据数据在所有数据中所占的比例显示结果
labels设置每个数据的标签
autoper 设置每一块所占的百分比
explode 设置某一块或者很多块突出显示出来, 由上面定义的explode数组决定
shadow 设置阴影,这样显示的效果更好
labels = [“SH”, “BI”, “SZ”, “GD”]
facts = [20, 10, 30, 40]
explode = [0, 0, 0.02, 0]
plt.axes(aspect = 1)
plt.pie(x = facts, labels = labels, explode= explode, shadow= True)
plt.show()
程序6:
箱图
上边缘(Q3+1.5IQR)、下边缘(Q1-1.5IQR)、IQR=Q3-Q1
上四分位数(Q3)、下四分位数(Q1)
中位数
异常值
处理异常值时与3σσ标准的异同:统计边界是否受异常值影响、容忍度的大小
plt.boxplot(y)
二、Seaborn数据可视化:
Seaborn相较于matplotlib更加的方便、简单。因为Seaborn中自带了一些统计的包,它在画图的同时,会完成统计的拟合。而且Seaborn画图时的参数也更多,这样matplotlib可能很多行的代码,seaborn仅仅需要间的几行就能实现同样的效果。
Seaborn的安装也非常的简单,使用pip install seaborn直接安装即可,首先我们来介绍一些Seaborn中的基本绘图函数:折线图:plot()、散点图:lmplot()、柱状图:barplot()、联合分布图:jointplot()、琴图:violinplot()、箱式图:boxplot()、比较图:pairplot()等。常用的属性有hue:对数据按照不同的类型先做分组,再分别对每组数据绘图;col:用于多列数据都出现分组时;markers:用哪种符号对数据进行标注,Ci:是否开启置信区间;color、data、x、y等。
接下来我们通过两个案例来直观的比较一下seaborn和matplotlib的不同。
案例一:给定数据集航班乘客变化分析data = sns.load_dataset(“flights”),利用柱状图分析乘客在一年中各月份的分布情况。
Matplotlib版本:
per_month_distribute = data.groupby(‘month’).agg([np.mean, np.std])[‘passengers’]
_,axe=plt.subplots()
plt.rcParams[“figure.figsize”] = (12,8)
print(per_month_distribute)
plt.bar(range(12), per_month_distribute[‘mean’],color=’cadetblue’,label=’average’)yerr:y坐标对应误差的正负值,ls=linestyle,lw=linewidth
plt.errorbar(range(12), per_month_distribute[‘mean’],yerr=per_month_distribute[‘std’],ls=’none’,color=’darkslategray’, lw=5, label=’error’)
plt.xticks(range(12),per_month_distribute.index,fontsize=15,rotation=45)#把X轴上的字体旋转45度,以免重叠
plt.xlabel(‘Month of Year’,fontsize=20)
plt.ylabel(‘Passengers’,fontsize=20)
plt.legend([u”乘客量均值”, u”乘客量标准差”],fontsize=15) #把label标注的内容显示出来
plt.title(u’乘客在一年中各月份的分布’,fontsize=25)
axe.spines[‘top’].set_color(None)
axe.spines[‘right’].set_color(None)
plt.scatter(x,y)
Seaborn版本:
import seaborn as sns
sns.factorplot(x='month',y='passengers',data=data, kind='bar',size=8)
效果图:
案例二:给定数据集餐厅收取小费的情况:data = sns.load_dataset(“tips”),绘制分组柱状图分析性别+抽烟的组合因素对慷慨度的影响。
Matplotlib版本:
tmp_data=data.groupby([‘sex’,’smoker’])[‘tip’].agg([np.mean,np.std])
width = 0.2
_,axe=plt.subplots()
plt.bar([1,2],tmp_data[‘mean’].loc[‘Male’],width=width, label=’Male’)
plt.errorbar([1,2],tmp_data[‘mean’].loc[‘Male’],
yerr = tmp_data[‘std’].loc[‘Male’], ls =’none’,lw=4,color=’darkblue’,label=None)画女性抽烟柱状图,X+0.2
plt.bar([x+width for x in [1,2]],tmp_data[‘mean’].loc[‘Female’],width=width,label=’Female’,color=’salmon’)
plt.errorbar([x+width for x in [1,2]],tmp_data[‘mean’].loc[‘Female’],
yerr=tmp_data[‘std’].loc[‘Female’],ls=’none’,lw=4,color=’darkred’,label=None)
plt.setp(axe, xticks=[1.1,2.1], xticklabels=[‘Yes’,’No’]) #设置横坐标参数
plt.legend(fontsize=15)
plt.xlabel(‘Smoker’,fontsize=15)
plt.ylabel(‘Tip’,fontsize=15)
plt.axis([0.7,2.7,0,5]) #移动坐标轴,[left,right,bottom,top],距离左右,上下边框的距离
plt.title(u’性别+抽烟的组合因素对慷慨度的影响’)
Seaborn版本:
sns.barplot(x='smoker',y='tip',data=tips,hue='sex')
效果图:总结:通过上边的案例我们分别通过matplotlib和seaborn完成了数据可视化的操作,我么可以看到Seaborn封装的更好,使用起来更简单;但Matplotlib灵活性更高、功能也更加强大。学习Matplotlib和Seaborn更多的函数、图形的绘制,欢迎大家学习它们的官方手册,这里小编只是做了一个简单的常用整理。Matplotlib官方文档:http://www.matplotlib.org;
Seaborn官方手册:http://seaborn.pydata.org。
-
大屏数据可视化案例
2018-06-25 18:07:38数据可视化:把相对复杂的、抽象的数据通过可视的、交互的方式进行展示,从而形象直观地表达数据蕴含的信息和规律。 数据可视化是数据空间到图形空间的映射,是抽象数据的具象表达。 数据可视化交互的基本原则:总...数据可视化:把相对复杂的、抽象的数据通过可视的、交互的方式进行展示,从而形象直观地表达数据蕴含的信息和规律。
数据可视化是数据空间到图形空间的映射,是抽象数据的具象表达。
数据可视化交互的基本原则:总览为先,缩放过滤按需查看细节。大屏数据可视化是当前可视化领域的一项热门应用,通常可以分为信息展示类、数据分析类及监控预警类。
大屏数据可视化应用的难点并不在于图表类型的多样化,而在于如何能在简单的一页之内让用户读懂数据之间的层次与关联,这就关系到布局、色彩、图表、动效的综合运用。如排版布局应服务于业务,避免为展示而展示;配色一般以深色调为主,注重整体背景和单个视觉元素背景的一致性。
制作可视化大屏,最便捷有效的方式是使用DataV、帆软等报表工具,而本示例项目则使用ECharts自行开发。项目案例 - 上市公司全景概览
地图数据可视化 - 基于ECharts Geo
3D图表展示 - 基于ECharts GL
热力图展示 - 基于ECharts & 百度地图
ECharts扩展示例
旭日图 - 基于ECharts V4.2
地理信息数据 - ECharts & Baidu Map
项目Git地址:https://github.com/yyhsong/iDataV
演示地址:https://yyhsong.github.io/iDataV后记:
除自行开发可视化大屏外,还可以通过第三方服务来快速实现,如阿里云DataV、腾讯云图、百度Sugar等,具体可参考:https://blog.csdn.net/hwhsong/article/details/83097924。 -
Python爬虫与数据可视化
2019-06-12 20:57:09数据可视化这里特别强调,pyecharts包千万别装新版的,我这里装的是0.5.9版的其次如果要做地理坐标图,热力图啥的,必须安装地图包,比如世界地图包,中国地图包,城市地图包啥的 1.数据挖掘 代码所需包 # -*- ...之前写过篇爬取前程无忧职位信息并保存到Excel的博客,
这里仔细的讲讲并且增加可视化内容文章目录
1.数据挖掘
代码所需包
import urllib.request import xlwt import re import urllib.parse import time
进入前程无忧官网
我这里以搜索大数据职位信息
打开开发者模式
Request Headers 里面是我们用浏览器访问网站的信息,有了信息后就能模拟浏览器访问
这也是为了防止网站封禁IP,不过前程无忧一般是不会封IP的。
模拟浏览器header={ 'Host':'search.51job.com', 'Upgrade-Insecure-Requests':'1', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' }
这些基本数据都可以爬取:
为了实现交互型爬取,我写了一个能够实现输入想了解的职位就能爬取相关内容的函数def getfront(page,item): #page是页数,item是输入的字符串,见后文 result = urllib.parse.quote(item) #先把字符串转成十六进制编码 ur1 = result+',2,'+ str(page)+'.html' ur2 = 'https://search.51job.com/list/000000,000000,0000,00,9,99,' res = ur2+ur1 #拼接网址 a = urllib.request.urlopen(res) html = a.read().decode('gbk') # 读取源代码并转为unicode return html
def getInformation(html): reg = re.compile(r'class="t1 ">.*? <a target="_blank" title="(.*?)" href="(.*?)".*? <span class="t2"><a target="_blank" title="(.*?)" href="(.*?)".*?<span class="t3">(.*?)</span>.*?<span class="t4">(.*?)</span>.*?<span class="t5">(.*?)</span>.*?',re.S)#匹配换行符 items=re.findall(reg,html) return items
这里我除了爬取图上信息外,还把职位超链接后的网址,以及公司超链接的网址爬取下来了。
这里先不讲,后面后面会说到,
接下来就需要储存信息,这里使用Excel,虽然比较麻烦,不过胜在清晰直观#新建表格空间 excel1 = xlwt.Workbook() # 设置单元格格式 sheet1 = excel1.add_sheet('Job', cell_overwrite_ok=True) sheet1.write(0, 0, '序号') sheet1.write(0, 1, '职位') sheet1.write(0, 2, '公司名称') sheet1.write(0, 3, '公司地点') sheet1.write(0, 4, '公司性质') sheet1.write(0, 5, '薪资') sheet1.write(0, 6, '学历要求') sheet1.write(0, 7, '工作经验') sheet1.write(0, 8, '公司规模') sheet1.write(0, 9, '公司类型') sheet1.write(0, 10,'公司福利') sheet1.write(0, 11,'发布时间')
爬取代码如下,这里就能利用双层循环来实现换页爬取与换行输出
我这里为了获得大量数据所以爬取了1000页,调试时可以只爬取几页number = 1 item = input() for j in range(1,10000): #页数自己随便改 try: print("正在爬取第"+str(j)+"页数据...") html = getfront(j,item) #调用获取网页原码 for i in getInformation(html): try: url1 = i[1] #职位网址 res1 = urllib.request.urlopen(url1).read().decode('gbk') company = re.findall(re.compile(r'<div class="com_tag">.*?<p class="at" title="(.*?)"><span class="i_flag">.*?<p class="at" title="(.*?)">.*?<p class="at" title="(.*?)">.*?',re.S),res1) job_need = re.findall(re.compile(r'<p class="msg ltype".*?>.*? <span>|</span> (.*?) <span>|</span> (.*?) <span>|</span> .*?</p>',re.S),res1) welfare = re.findall(re.compile(r'<span class="sp4">(.*?)</span>',re.S),res1) print(i[0],i[2],i[4],i[5],company[0][0],job_need[2][0],job_need[1][0],company[0][1],company[0][2],welfare,i[6]) sheet1.write(number,0,number) sheet1.write(number,1,i[0]) sheet1.write(number,2,i[2]) sheet1.write(number,3,i[4]) sheet1.write(number,4,company[0][0]) sheet1.write(number,5,i[5]) sheet1.write(number,6,job_need[1][0]) sheet1.write(number,7,job_need[2][0]) sheet1.write(number,8,company[0][1]) sheet1.write(number,9,company[0][2]) sheet1.write(number,10,(" ".join(str(i) for i in welfare))) sheet1.write(number,11,i[6]) number+=1 excel1.save("51job.xls") time.sleep(0.3) #休息间隔,避免爬取海量数据时被误判为攻击,IP遭到封禁 except: pass except: pass
结果如下:
2.数据清洗
首先要打开文件
#coding:utf-8 import pandas as pd import re #除此之外还要安装xlrd包 data = pd.read_excel(r'51job.xls',sheet_name='Job') result = pd.DataFrame(data)
清洗思路:
1、出现有空值(NAN)得信息,直接删除整行a = result.dropna(axis=0,how='any') pd.set_option('display.max_rows',None) #输出全部行,不省略
2、职位出错(很多职位都是与大数据无关的职业)
b = u'数据' number = 1 li = a['职位'] for i in range(0,len(li)): try: if b in li[i]: #print(number,li[i]) number+=1 else: a = a.drop(i,axis=0) except: pass
3、其他地方出现的信息错位,比如在学历里出现 ‘招多少人’
b2= u'人' li2 = a['学历要求'] for i in range(0,len(li2)): try: if b2 in li2[i]: #print(number,li2[i]) number+=1 a = a.drop(i,axis=0) except: pass
4、转换薪资单位
如上图就出现单位不一致的情况b3 =u'万/年' b4 =u'千/月' li3 = a['薪资'] #注释部分的print都是为了调试用的 for i in range(0,len(li3)): try: if b3 in li3[i]: x = re.findall(r'\d*\.?\d+',li3[i]) #print(x) min_ = format(float(x[0])/12,'.2f') #转换成浮点型并保留两位小数 max_ = format(float(x[1])/12,'.2f') li3[i][1] = min_+'-'+max_+u'万/月' if b4 in li3[i]: x = re.findall(r'\d*\.?\d+',li3[i]) #print(x) #input() min_ = format(float(x[0])/10,'.2f') max_ = format(float(x[1])/10,'.2f') li3[i][1] = str(min_+'-'+max_+'万/月') print(i,li3[i]) except: pass
保存到另一个Excel文件
a.to_excel('51job2.xls', sheet_name='Job', index=False)
这里只是简单的介绍了一些数据清理的思路,并不是说只要清理这些就行了
有时候有的公司网页并不是前程无忧类型的,而是他们公司自己做的网页,这也很容易出错
不过只要有了基本思路,这些都不难清理3.数据可视化
数据可视化可以说是很重要的环节,如果只是爬取数据而不去可视化处理,那么可以说数据的价值根本没有发挥
可视化处理能使数据更加直观,更有利于分析
甚至可以说可视化是数据挖掘最重要的内容同样的我们先看代码需要的包
# -*- coding: utf-8 -*- import pandas as pd import re from pyecharts import Funnel,Pie,Geo import matplotlib.pyplot as plt
这里特别强调,pyecharts包千万别装新版的,我这里装的是0.5.9版的
其次如果要做地理坐标图,热力图啥的,必须安装地图包,比如世界地图包,中国地图包,城市地图包啥的
接下来就是正戏
一样的先要打开文件file = pd.read_excel(r'51job2.xls',sheet_name='Job') f = pd.DataFrame(file) pd.set_option('display.max_rows',None)
1、创建多个列表来单独存放【‘薪资’】【‘工作经验’】【‘学历要求’】【‘公司地点’】等信息
add = f['公司地点'] sly = f['薪资'] edu = f['学历要求'] exp = f['工作经验'] address =[] salary = [] education = [] experience = [] for i in range(0,len(f)): try: a = add[i].split('-') address.append(a[0]) #print(address[i]) s = re.findall(r'\d*\.?\d+',sly[i]) s1= float(s[0]) s2 =float(s[1]) salary.append([s1,s2]) #print(salary[i]) education.append(edu[i]) #print(education[i]) experience.append(exp[i]) #print(experience[i]) except: pass
2、matploblib库生成 工作经验—薪资图 与 学历—薪资图
min_s=[] #定义存放最低薪资的列表 max_s=[] #定义存放最高薪资的列表 for i in range(0,len(experience)): min_s.append(salary[i][0]) max_s.append(salary[i][0]) my_df = pd.DataFrame({'experience':experience, 'min_salay' : min_s, 'max_salay' : max_s}) #关联工作经验与薪资 data1 = my_df.groupby('experience').mean()['min_salay'].plot(kind='line') plt.show() my_df2 = pd.DataFrame({'education':education, 'min_salay' : min_s, 'max_salay' : max_s}) #关联学历与薪资 data2 = my_df2.groupby('education').mean()['min_salay'].plot(kind='line') plt.show()
3、学历要求圆环图def get_edu(list): education2 = {} for i in set(list): education2[i] = list.count(i) return education2 dir1 = get_edu(education) # print(dir1) attr= dir1.keys() value = dir1.values() pie = Pie("学历要求") pie.add("", attr, value, center=[50, 50], is_random=False, radius=[30, 75], rosetype='radius', is_legend_show=False, is_label_show=True,legend_orient='vertical') pie.render('学历要求玫瑰图.html')
4、大数据城市需求地理位置分布图def get_address(list): address2 = {} for i in set(list): address2[i] = list.count(i) address2.pop('异地招聘') # 有些地名可能不合法或者地图包里没有可以自行删除,之前以下名称都会报错,现在好像更新了 #address2.pop('山东') #address2.pop('怒江') #address2.pop('池州') return address2 dir2 = get_address(address) #print(dir2) geo = Geo("大数据人才需求分布图", title_color="#2E2E2E", title_text_size=24,title_top=20,title_pos="center", width=1300,height=600) attr2 = dir2.keys() value2 = dir2.values() geo.add("",attr2, value2, type="effectScatter", is_random=True, visual_range=[0, 1000], maptype='china',symbol_size=8, effect_scale=5, is_visualmap=True) geo.render('大数据城市需求分布图.html')
5、工作经验要求漏斗图def get_experience(list): experience2 = {} for i in set(list): experience2[i] = list.count(i) return experience2 dir3 = get_experience(experience) #print(dir3) attr3= dir3.keys() value3 = dir3.values() funnel = Funnel("工作经验漏斗图",title_pos='center') funnel.add("", attr3, value3,is_label_show=True,label_pos="inside", label_text_color="#fff",legend_orient='vertical',legend_pos='left') funnel.render('工作经验要求漏斗图.html')
当然,pyecharts里面的图还有很多种,就靠大家去自己发掘了。【反馈】
接到部分人反应的乱码情况,主要可能是因为网站规则变动。我去重新更新了一下代码,并且改进了一些地方,如果遇到爬取过程中途停下的情况,可能是网络问题或者陷入阻塞,可以重新运行一次代码
所有代码如下:
# -*- coding:utf-8 -*- import urllib.request import xlwt import re import urllib.parse import time header={ 'Host':'search.51job.com', 'Upgrade-Insecure-Requests':'1', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' } def getfront(page,item): #page是页数,item是输入的字符串 result = urllib.parse.quote(item) #先把字符串转成十六进制编码 ur1 = result+',2,'+ str(page)+'.html' ur2 = 'https://search.51job.com/list/000000,000000,0000,00,9,99,' res = ur2+ur1 #拼接网址 a = urllib.request.urlopen(res) html = a.read().decode('gbk') # 读取源代码并转为unicode return html def getInformation(html): reg = re.compile(r'class="t1 ">.*? <a target="_blank" title="(.*?)" href="(.*?)".*? <span class="t2"><a target="_blank" title="(.*?)" href="(.*?)".*?<span class="t3">(.*?)</span>.*?<span class="t4">(.*?)</span>.*?<span class="t5">(.*?)</span>.*?',re.S)#匹配换行符 items=re.findall(reg,html) return items #新建表格空间 excel1 = xlwt.Workbook() # 设置单元格格式 sheet1 = excel1.add_sheet('Job', cell_overwrite_ok=True) sheet1.write(0, 0, '序号') sheet1.write(0, 1, '职位') sheet1.write(0, 2, '公司名称') sheet1.write(0, 3, '公司地点') sheet1.write(0, 4, '公司性质') sheet1.write(0, 5, '薪资') sheet1.write(0, 6, '学历要求') sheet1.write(0, 7, '工作经验') sheet1.write(0, 8, '公司规模') sheet1.write(0, 9, '公司类型') sheet1.write(0, 10,'公司福利') sheet1.write(0, 11,'发布时间') number = 1 item = input() for j in range(1,10000): #页数自己随便改 try: print("正在爬取第"+str(j)+"页数据...") html = getfront(j,item) #调用获取网页原码 for i in getInformation(html): try: url1 = i[1] #职位网址 res1 = urllib.request.urlopen(url1).read().decode('gbk') company = re.findall(re.compile(r'<div class="com_tag">.*?<p class="at" title="(.*?)"><span class="i_flag">.*?<p class="at" title="(.*?)">.*?<p class="at" title="(.*?)">.*?',re.S),res1) job_need = re.findall(re.compile(r'<p class="msg ltype".*?>.*? <span>|</span> (.*?) <span>|</span> (.*?) <span>|</span> .*?</p>',re.S),res1) welfare = re.findall(re.compile(r'<span class="sp4">(.*?)</span>',re.S),res1) print(i[0],i[2],i[4],i[5],company[0][0],job_need[2][0],job_need[1][0],company[0][1],company[0][2],welfare,i[6]) sheet1.write(number,0,number) sheet1.write(number,1,i[0]) sheet1.write(number,2,i[2]) sheet1.write(number,3,i[4]) sheet1.write(number,4,company[0][0]) sheet1.write(number,5,i[5]) sheet1.write(number,6,job_need[2][0]) sheet1.write(number,7,job_need[1][0]) sheet1.write(number,8,company[0][1]) sheet1.write(number,9,company[0][2]) sheet1.write(number,10,(" ".join(str(i) for i in welfare))) sheet1.write(number,11,i[6]) number+=1 excel1.save("51job.xls") time.sleep(0.3) #休息间隔,避免爬取海量数据时被误判为攻击,IP遭到封禁 except: pass except: pass
#coding:utf-8 import pandas as pd import re data = pd.read_excel(r'51job.xls',sheet_name='Job') result = pd.DataFrame(data) a = result.dropna(axis=0,how='any') pd.set_option('display.max_rows',None) #输出全部行,不省略 b = u'数据' number = 1 li = a['职位'] for i in range(0,len(li)): try: if b in li[i]: #print(number,li[i]) number+=1 else: a = a.drop(i,axis=0) #删除整行 except: pass b2 = '人' li2 = a['学历要求'] for i in range(0,len(li2)): try: if b2 in li2[i]: # print(number,li2[i]) number += 1 a = a.drop(i, axis=0) except: pass b3 =u'万/年' b4 =u'千/月' li3 = a['薪资'] #注释部分的print都是为了调试用的 for i in range(0,len(li3)): try: if b3 in li3[i]: x = re.findall(r'\d*\.?\d+',li3[i]) #print(x) min_ = format(float(x[0])/12,'.2f') #转换成浮点型并保留两位小数 max_ = format(float(x[1])/12,'.2f') li3[i][1] = min_+'-'+max_+u'万/月' if b4 in li3[i]: x = re.findall(r'\d*\.?\d+',li3[i]) #print(x) #input() min_ = format(float(x[0])/10,'.2f') max_ = format(float(x[1])/10,'.2f') li3[i][1] = str(min_+'-'+max_+'万/月') print(i,li3[i]) except: pass a.to_excel('51job2.xls', sheet_name='Job', index=False) ############################################################################################# import pandas as pd import re from pyecharts import Funnel,Pie,Geo import matplotlib.pyplot as plt file = pd.read_excel(r'51job2.xls',sheet_name='Job') f = pd.DataFrame(file) pd.set_option('display.max_rows',None) add = f['公司地点'] sly = f['薪资'] edu = f['学历要求'] exp = f['工作经验'] address =[] salary = [] education = [] experience = [] for i in range(0,len(f)): try: a = add[i].split('-') address.append(a[0]) #print(address[i]) s = re.findall(r'\d*\.?\d+',sly[i]) s1= float(s[0]) s2 =float(s[1]) salary.append([s1,s2]) #print(salary[i]) education.append(edu[i]) #print(education[i]) experience.append(exp[i]) #print(experience[i]) except: pass min_s=[] #定义存放最低薪资的列表 max_s=[] #定义存放最高薪资的列表 for i in range(0,len(experience)): min_s.append(salary[i][0]) max_s.append(salary[i][0]) #matplotlib模块如果显示不了中文字符串可以用以下代码。 plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体 plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 my_df = pd.DataFrame({'experience':experience, 'min_salay' : min_s, 'max_salay' : max_s}) #关联工作经验与薪资 data1 = my_df.groupby('experience').mean()['min_salay'].plot(kind='line') plt.show() my_df2 = pd.DataFrame({'education':education, 'min_salay' : min_s, 'max_salay' : max_s}) #关联学历与薪资 data2 = my_df2.groupby('education').mean()['min_salay'].plot(kind='line') plt.show() def get_edu(list): education2 = {} for i in set(list): education2[i] = list.count(i) return education2 dir1 = get_edu(education) # print(dir1) attr= dir1.keys() value = dir1.values() pie = Pie("学历要求") pie.add("", attr, value, center=[50, 50], is_random=False, radius=[30, 75], rosetype='radius', is_legend_show=False, is_label_show=True,legend_orient='vertical') pie.render('学历要求玫瑰图.html') def get_address(list): address2 = {} for i in set(list): address2[i] = list.count(i) address2.pop('异地招聘') # 有些地名可能不合法或者地图包里没有可以自行删除,之前以下名称都会报错,现在好像更新了 #address2.pop('山东') #address2.pop('怒江') #address2.pop('池州') return address2 dir2 = get_address(address) #print(dir2) geo = Geo("大数据人才需求分布图", title_color="#2E2E2E", title_text_size=24,title_top=20,title_pos="center", width=1300,height=600) attr2 = dir2.keys() value2 = dir2.values() geo.add("",attr2, value2, type="effectScatter", is_random=True, visual_range=[0, 1000], maptype='china',symbol_size=8, effect_scale=5, is_visualmap=True) geo.render('大数据城市需求分布图.html') def get_experience(list): experience2 = {} for i in set(list): experience2[i] = list.count(i) return experience2 dir3 = get_experience(experience) #print(dir3) attr3= dir3.keys() value3 = dir3.values() funnel = Funnel("工作经验漏斗图",title_pos='center') funnel.add("", attr3, value3,is_label_show=True,label_pos="inside", label_text_color="#fff",legend_orient='vertical',legend_pos='left') funnel.render('工作经验要求漏斗图.html')
HTML文件最好用谷歌浏览器打开,如果点开没反应可以在文件夹里找到该文件然后打开
最近比较多人说爬取数据没有动静,我去看了下,其实不是什么问题,就是网页源码有更改,之前python爬取到的信息是用HTML写的,而现在数据那里是JavaScript写的,这样的话正则肯定就不匹配了。我也花时间改了改。有些东西也去的去,加的加,不过不影响后面数据可视化。
# -*- coding:utf-8 -*- import urllib.request import xlwt import re import urllib.parse import time header={ 'Host':'search.51job.com', 'Upgrade-Insecure-Requests':'1', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' } def getfront(page,item): #page是页数,item是输入的字符串 result = urllib.parse.quote(item) #先把字符串转成十六进制编码 ur1 = result+',2,'+ str(page)+'.html' ur2 = 'https://search.51job.com/list/000000,000000,0000,00,9,99,' res = ur2+ur1 #拼接网址 a = urllib.request.urlopen(res) html = a.read().decode('gbk') # 读取源代码并转为unicode html = html.replace('\\','') # 将用于转义的"\"替换为空 html = html.replace('[', '') html = html.replace(']', '') #print(html) return html def getInformation(html): reg = re.compile(r'\{"type":"engine_search_result","jt":"0".*?"job_href":"(.*?)","job_name":"(.*?)".*?"company_href":"(.*?)","company_name":"(.*?)","providesalary_text":"(.*?)".*?"updatedate":"(.*?)".*?,' r'"companytype_text":"(.*?)".*?"jobwelf":"(.*?)".*?"attribute_text":"(.*?)","(.*?)","(.*?)","(.*?)","companysize_text":"(.*?)","companyind_text":"(.*?)","adid":""},',re.S)#匹配换行符 items=re.findall(reg,html) print(items) return items #新建表格空间 excel1 = xlwt.Workbook() # 设置单元格格式 sheet1 = excel1.add_sheet('Job', cell_overwrite_ok=True) sheet1.write(0, 0, '序号') sheet1.write(0, 1, '职位') sheet1.write(0, 2, '公司名称') sheet1.write(0, 3, '公司地点') sheet1.write(0, 4, '公司性质') sheet1.write(0, 5, '薪资') sheet1.write(0, 6, '学历要求') sheet1.write(0, 7, '工作经验') sheet1.write(0, 8, '公司规模') #sheet1.write(0, 9, '公司类型') sheet1.write(0, 9,'公司福利') sheet1.write(0, 10,'发布时间') number = 1 item = input() for j in range(1,10): #页数自己随便改 try: print("正在爬取第"+str(j)+"页数据...") html = getfront(j,item) #调用获取网页原码 for i in getInformation(html): try: #url1 = i[1] #职位网址 #res1 = urllib.request.urlopen(url1).read().decode('gbk') #company = re.findall(re.compile(r'<div class="com_tag">.*?<p class="at" title="(.*?)"><span class="i_flag">.*?<p class="at" title="(.*?)">.*?<p class="at" title="(.*?)">.*?',re.S),res1) #job_need = re.findall(re.compile(r'<p class="msg ltype".*?>.*? <span>|</span> (.*?) <span>|</span> (.*?) <span>|</span> .*?</p>',re.S),res1) #welfare = re.findall(re.compile(r'<span class="sp4">(.*?)</span>',re.S),res1) #print(i[0],i[2],i[4],i[5],company[0][0],job_need[2][0],job_need[1][0],company[0][1],company[0][2],welfare,i[6]) sheet1.write(number,0,number) sheet1.write(number,1,i[1]) sheet1.write(number,2,i[3]) sheet1.write(number,3,i[8]) sheet1.write(number,4,i[6]) sheet1.write(number,5,i[4]) sheet1.write(number,6,i[10]) sheet1.write(number,7,i[9]) sheet1.write(number,8,i[12]) #sheet1.write(number,9,i[7]) sheet1.write(number,9,i[7]) sheet1.write(number,10,i[5]) number+=1 excel1.save("51job.xls") time.sleep(0.3) #休息间隔,避免爬取海量数据时被误判为攻击,IP遭到封禁 except: pass except: pass
-
Python数据可视化教程:基于Plotly的动态可视化绘图
2019-06-13 15:27:44Plotly是一个非常著名且强大的开源数据可视化框架,它通过构建基于浏览器显示的web形式的可交互图表来展示信息,可创建多达数十种精美的图表和地图, 下面我们以jupyter notebook为开发工具数据分析。Matplotlib存在...1. plotly 介绍
Plotly是一个非常著名且强大的开源数据可视化框架,它通过构建基于浏览器显示的web形式的可交互图表来展示信息,可创建多达数十种精美的图表和地图,
下面我们以jupyter notebook为开发工具数据分析。Matplotlib存在不够美观、静态性、不易分享等缺点,限制了Python在数据可视化中的发展。为了解决这个问题,新型的动态可视化开源模块Plotly应运而生。
由于Plotly具有动态、美观、易用、种类丰富等特性。
可以说,plotly 在Python 绘制图表的时候,是一种顶层的绘制方式。我们首先通过plotly官方网站看看数据可视化效果图,这里截取了一部分的效果,发现真是无比强大,并且还支持数据/图片在线编辑
2. plotly 两种方式绘制图表
Plotly是集成了在线通过菜单操作绘图与离线通过代码绘图多种绘图方式的绘图系统。如果使用在线方式,在使用plotly的时候,需要在官网注册一个个人账号,设置个人密码。
在线:将你的可视化图像保存到网站上,便于共享和保存。
离线:直接在本地生成可视化图像,便于使用。(推荐使用离线方式,方便查看和阅读)
下面主要从Python的角度来分析plotly的绘图原理及方法:
3. plotly绘图
基本图表:20种
统计和海运方式图:12种
科学图表:21种
财务图表:2种
地图:8种
3D图表:19种
报告生成:4种
连接数据库:7种
拟合工具:3种
流动图表:4种
JavaScript添加自定义控件:13种
4. 第一个Python 的plotly ,带你入门
import matplotlib.pyplot as plt %matplotlib inline import plotly import plotly.graph_objs as go from plotly.offline import init_notebook_mode,iplot init_notebook_mode(connected=True) import warnings warnings.filterwarnings('ignore') import numpy as np import pandas as pd plotly.__version__
接下来我们可以绘制一个plotly的程序,看看到底是什么效果
x = [1,2,3,4] y = [10,15,13,17] trace0 = go.Scatter( x = x, y = y ) print(trace0) data = [trace0] print(data) iplot(data)
5. 可视化图表数据案例本案例使用的数据介绍: 泰坦尼克号数据、鸢尾花数据、航班数据、金融类数据。 通过这些实际数据分析,可以快速 让大家掌握plotly 在实际工作中是如何进行数据分析的。
6. 金融数据 时序图案例
通过可以通过时序图 每个时间点的变化,例如: 金融领域,可以通过该方法来了解一下股价 变了的趋势
统计金融数据每天股价的变化趋势进行分析data = [ go.Scatter( x=finance['Date'], y=finance['AAPL.High'], name = 'AAPL.High' ), go.Scatter( x=finance['Date'], y=finance['AAPL.Low'], name = 'AAPL.Low' ) ] layout = go.Layout( title = '金融股价的变化趋势' ) fig = go.Figure(data = data,layout=layout) iplot(fig)
我们来看看绘制的图形
专注于使用Plotly 进行动态的数据分析,进一步的数据分析,如果大家有兴趣,可以参考一下内容学习:
欢迎关注,一起交流讨论!
Python 数据可视化库Plotly 主要知识点如下:
针对使用Python plotly 绘制的部分图表如下:
-
【Python数据可视化】超星学习通助手后台数据的可视化处理
2020-04-28 09:19:42Python数据可视化。 -
『数据可视化』基于Python的数据可视化工具
2017-10-27 09:58:13如何做Python 的数据可视化? pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。主要用于数据可视化。 一、安装 pyecharts 兼容 Python2 和 Python3。目前版本为 ... -
数据可视化视频精讲
2018-04-12 17:30:26本节人工智能视频涉及: (1)数据可视化的基本处理流程 (2)数据分析及其可视化的选择 (3)数据可视化结果的分析解读 (4)数据可视化的一些实际案例 -
数据可视化学习(数据可视化基本概念)
2019-03-20 09:27:41本篇文章翻译自数据可视化入门教程 数据可视化(Data Visualization)和信息可视化(Infographics)是两个相近的专业领域名词。 狭义上的数据可视化指的是数据用统计图表方式呈现,而信息可视化则是将非数字的信息... -
【项目实战】数据爬虫 + 数据清洗 + 数据可视化
2020-05-11 10:37:08自己亲手全手打了一套系统的代码,帮助朋友完成设计,做了贵阳市几个区的房屋价格爬取以及数据清洗和可视化操作,代码细细道来: 上图镇楼,接下来细说。 一:数据挖掘 我选用了链家网做数据爬取场所(不得不唠叨... -
Python数据可视化库Seaborn
2019-05-20 15:45:24Python数据可视化库Seaborn,通过学习本教程,可以快速掌握Seaborn可视化操作。本案例中结合泰坦尼克号,鸢尾花数据,国际航班飞行数据 Python数据可视化库Seaborn,通过学习本教程,可以快速掌握Seaborn可视化操作... -
数据可视化概览
2017-12-07 12:08:07科学可视化(Scientific Visualization)、 信息可视化(Information Visualization)和可视分析学(Visual Analytics)三个...而将这三个分支整合在一起形成的新学科 “数据可视化”,这是可视化研究领域的新起点。 -
python数据可视化毕业设计题目_基于Python的数据可视化
2020-12-03 13:03:59基于Python的数据可视化杨凯利[1];山美娟[2]【期刊名称】《《现代信息科技》》【年(卷),期】2019(000)005【摘要】在大数据快速发展的今天,Python丰富的工具包在科学计算、文件处理、数据可视化等领域越来越凸显其... -
大屏数据可视化模板
2019-04-30 17:20:52在开发大屏数据可视化项目时,除了各类报表的开发外,大屏的风格设计也是一项十分重要且耗时的工作。 本文推荐的几款大屏模板,旨在帮助那些有大屏数据可视化开发需求的同学能够快速上手,把更多的时间、精力放在... -
数据可视化概述
2019-08-04 17:25:22数据可视化是什么 经典案例 数据可视化价值 数据可视化工具 数据可视化是什么 借助图形化手段,清晰有效传达与沟通信息 信息可视化、科学可视化、可视化分析 经典案例 数据可视化价值 ... -
大屏数据可视化设计指南
2019-01-03 14:25:31把相对复杂、抽象的数据通过可视的方式以人们更易理解的形式展示出来的一系列手段叫做数据可视化,数据可视化是为了更形象地表达数据内在的信息和规律,促进数据信息的传播和应用。 在当前新技术支持下,数据可视化... -
如何用数据可视化工具报表进行数据可视化分析?
2018-09-05 11:09:37独立的数据毫无意义,能...使用数据可视化工具进行数据可视化分析非常简单,经过简单的配置,使用者只需在B/S端简单拖拽目标数据及相关维度,即可得到从不同维度分析的结果,提升数据可视化程度,帮助决策层做出准... -
【数据可视化】数据可视化分类
2015-06-01 22:03:10数据可视化分为:科学可视化、信息可视化,可视化分析学这三个主要分支。 科学可视化,处理科学数据,面向科学和工程领域的科学可视化,研究带有空间坐标和几何信息的三维空间测量数据、计算模拟数据和医疗影像... -
数据可视化是什么,数据可视化怎么做最好?
2019-02-21 22:11:07数据可视化都有一个共同的目的,那就是准确而高效、精简而全面地传递信息和知识。可视化能将不可见的数据现象转化为可见的图形符号,能将错综复杂、看起来没法解释和关联的数据,建立起联系和关联,发现规律和特征,... -
数据可视化技术:python数据可视化工具库汇总(共21个)
2019-12-23 12:00:22Python数据可视化库 在数据分析中最好展示数据的方式就是形象地绘制对应的图像,让人能够更好地理解数据。什么样的数据、什么样的场景用什么样的图表都是有一定的规定的。(这个以后写一篇博客来记录一下。当然我... -
python pyecharts地理数据可视化 绘制地理图表
2020-08-20 07:53:15介绍了Pyecharts及其安装,然后利用pyecharts实现世界地图数据可视化,国家地图数据可视化(涟漪散点图,动态轨迹图),省市地图数据可视化(包括绘制热力图,添加地址、经纬度信息,地理数据可视化在地图上)。 -
python数据爬取及数据可视化分析
2021-01-06 21:54:47本博客是一篇集数据爬取,存储为excel表格,将数据可视化为一体的博文,数据爬取采用request等方法,数据可视化会使用图表进行展示,有改进的地方还请大家多多指教。 目录电影网站数据分析及可视化研究数据爬取环境... -
开发数据可视化,有哪些数据可视化表现形式?
2019-05-02 08:38:35数据可视化是什么? 数据图形可视化,就是用富有色彩、图形的形式来表现数据,让人一眼望去就能概览数据,让数据更直观,让审查数据的工作更人性化。 为什么要用视觉图形来表现数据? 因为数据是无形的,而目前... -
为什么我们要用数据可视化?数据可视化的4个优势
2017-12-11 12:07:55数据可视化的意义是帮助人更好的分析数据,信息的质量很大程度上依赖于其表达方式。对数字罗列所组成的数据中所包含的意义进行分析,使分析结果可视化。 其实数据可视化的本质就是视觉对话。数据可视化将技术与艺术... -
大数据进阶(二):22个免费的数据可视化和分析工具推荐
2018-08-05 16:56:0422个免费的数据可视化和分析工具推荐 本文总结推荐22个免费的数据可视化和分析工具。列表如下: 数据清理(Data cleaning) 当你分析和可视化数据前,常需要“清理”...
-
朱老师c++课程第3部分-3.5STL的其他容器讲解
-
PAT甲级题解1005
-
实现 MySQL 读写分离的利器 mysql-proxy
-
vue返回上一页并不刷新
-
driver.back() 、driver.close() 、driver.quit()三者的区别
-
NFS 网络文件系统
-
我的Hexo的Butterfly模板个人博客
-
【视频编解码-05】预测编码详解-帧间预测
-
Newtonsoft.Json.dll文件
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)
-
AI服务器是什么?应用场景有哪些?与普通服务器有何区别?
-
数据挖掘算法R语言实现之决策树.doc
-
工控培训-基于C语言Modbus通信协议源代码.pdf
-
wireguard服务器配置
-
收款码三合一制作生成系统源码
-
音乐彩灯的设计.pdf
-
零基础一小时极简以太坊智能合约开发环境搭建并开发部署
-
PDF合并工具.zip
-
C++代码规范和Doxygen根据注释自动生成手册
-
Java基础学习(十八)多线程