- 利用技术
- 计算机图形学和图像处理技术
- 外文名
- visualization
- 提出时间
- 1987年
- 中文名
- 可视化
- 性 质
- 研究数据表示、数据处理、决策分析等一系列问题的综合技术
- 涉及领域
- 计算机图形学、图像处理、计算机视觉、计算机辅助设计等
-
Python - 编写可视化界面(Python+PyCharm+PyQt)
2018-02-11 15:19:18Python编写可视化界面 最近开始学习Python,但只限于看理论,编几行代码,觉得没有意思,就想能不能用Python编写可视化的界面。遂查找了相关资料,发现了PyQt,由于前一段时间刚看过Qt,而且对Qt的印象很好,于是...最近开始学习Python,但只限于看理论,编几行代码,觉得没有意思,就想能不能用Python编写可视化的界面。遂查找了相关资料,发现了PyQt,由于前一段时间刚看过Qt,而且对Qt的印象很好,于是觉得用PyQt应该是一个比较愉快的选择。
1、前言
PyQt的版本需要与Python的版本保持一致,在这里我用的PyQT的版本是 PyQt5-5.6-gpl-Py3.5-Qt5.6.0-x64.exe,具体下载方式,请直接搜索。由于该版本需要v3.5版本的Python,所以首先需要安装Python3.5,然后安装PyQt,为了更加方便的写代码,故安装了Pycharm,版本为pycharm-community-2017.3.2.exe。具体的下载、安装,网上有很多教程,在这里就不多做描述,请自行搜索,下面就先介绍基于Pycharm+Python3.5+PyQt5.6的Python可视化编程。文末还会介绍一下基于最新版本的Pycharm2018.3+Python3.7+PyQt5.11的Python可视化编程。
2、开始
1)、打开PyCharm并配置相关设置
打开PyCharm界面如下:
点击界面右下方的“Configure”下拉按钮,选择“Settings”,如下所示:
打开如下设置界面:
如上图所示,在“Project Interpreter”选显卡中选择本机所安装的Python版本,一般情况下,它会自动识别本机所安装的Python版本,如图所示,选择的为Python3.5;
配置完成之后,点击“OK”,返回开始界面,
选择“Create New Project”,选择工程路径和工程的名称,然后点击"Create",然后弹出如下界面:
此时,工作环境已准备完毕;
3、编写
1)、首先,创建一个.py文件,暂命名为PyQt.py
2)、其次,需要导入PyQt的文件如下所示:
import sys from PyQt5.QtWidgets import QWidget, QApplication
注意,如果提示找不到对应文件,请确保PyQt5的安装路径在环境变量中!
然后先添加主函数:
if __name__ == "__main__": app = QApplication(sys.argv) sys.exit(app.exec_())
接下来就需要添加界面相关函数:
#class Example class Example(QWidget): def __init__(self): super(Example, self).__init__() self.InitUI() def InitUI(self): self.btn = QPushButton("Dialog", self) self.btn.move(20, 20) self.btn.clicked.connect(self.ShowDialog) self.le = QLineEdit(self) self.le.move(130, 22) self.setWindowTitle("Input Dialog") self.show() def ShowDialog(self): text,ok = QInputDialog.getText(self, "Input Dialog", "Enter your name:") if ok: self.le.setText(str(text))
如上代码所示,在Python中主要是通过类来生成界面的,在类中,可以进行界面的生成,控件的创建,创建控件的响应函数,connect控件与控件响应函数。
其中函数 __init__(self) 可以理解为该类的构造函数,其中界面的初始化在该部分执行;
函数 InitUI(self) 主要是生成界面控件;
当类创建完成后,只需要在主函数中调用该类即可。如下所示:
if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在以上的代码中,主要是在界面中添加了一个按钮(btn),一个编辑框(le),一个按钮响应函数(ShowDialog),其中在ShowDialog响应函数中打开了一个标准输入窗口,并将标准输入窗口中输入的值显示到编辑框(le)中。
结果:
4、扩展
在接下来做了一个更加复杂的例子,主要是模拟汇率的解算,界面主要如下所示:
其中主要涉及了按钮、编辑框、Label、布局等 ,
与第一个例子写在了同一个文件中,可点击一下链接下载:
http://download.csdn.net/download/bailang_zhizun/10249579
5、最新版本配置方法
采用最新版本的Python、PyQt、Pycharm配置可视化编程环境。
首先先安装Python3.7,然后安装Pycharm2018.3,并配置python解释器为Python3.7的本地目录,接下来就是安装PyQt5.11。
安装PyQt5.11是采用pip+wheel文件安装的形式,下载网址:https://pypi.org/project/PyQt5/#files
关于pip的安装请参考https://blog.csdn.net/bailang_zhizun/article/details/84563095
把下载的PyQt5-5.11.3-5.11.2-cp35.cp36.cp37.cp38-none-win_amd64.whl文件放置到合适的位置。
打开CMD,按照以下形式输入安装命令:
回车,pip就会自动安装该文件了:
此时PyQt5.11就安装成功了。
可以通过以上的代码进行测试。
6、Ubuntu下python2.7安装pyqt5
上面记录的都是在windows+python3环境下pyqt5的安装。由于工作需要,需要在Ubuntu+python2.7环境下安装pyqt5,根据pyqt5的官网,pyqt5只有针对python3的安装包,而没有python2.7的,所以可以通过在线安装的方式安装,下面是Ubuntu+python2.7环境下pyqt5的安装:
在ubuntu中打开终端,直接输入:
$sudo apt-get install python-pyqt5
即可,安装完成之后,直接在代码编辑页面import PyQt5即可,亲测可用。
另外,上面这种方式好像还可以用于ubuntu+python3环境下pyqt5的安装,也是通过命令安装:
$sudo apt-get install python3-pyqt5
上面未经测试,但是应该没问题。
-
大屏数据可视化案例
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这里仔细的讲讲并且增加可视化内容 文章目录1.数据挖掘2.数据清洗3.数据可视化这里特别强调,pyecharts包千万别装新版的,我这里装的是0.5.9版的其次如果要做地理坐标图,热力图啥的,必须安装地图包,比如世界地图...之前写过篇爬取前程无忧职位信息并保存到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 绘制的部分图表如下:
-
MySQL安装及可视化工具使用
2016-09-22 17:54:38可视化工具安装及使用资源下载 MySQL数据库 mysql-5.6.19-winx64 百度云地址 可视化工具下载 安装前配置 解压文件 将下载的数据库的压缩文件解压在本地文件夹,个人解压在D:\MySQL下,如下图: 创建my.ini... -
IntelliJ IDEA 集成Redis可视化插件
2017-08-29 17:08:59IntelliJ IDEA 集成Redis可视化插件 2018年3月30日 16:56:01更新 破解Iedis教程 https://blog.csdn.net/qq_15071263/article/details/79759973 # 1. 安装插件 首先打开IDEA的设置面板,然后选择插件类目,... -
基于 Echarts 实现可视化数据大屏展示
2019-09-05 15:28:48收集了一套基于 Echarts 实现可视化数据大屏响应式展示效果的源码,共计30个页面,可以在此基础上重新开发。 实现方式:html + Echarts 贴图 有需要的可以联系我 暂时不开源,之后会考虑写教程和开源项目。 ... -
Git可视化教程——Git Gui的使用
2017-04-28 15:43:04Git可视化教程——Git Gui的使用 -
Python可视化库
2019-01-06 13:43:28现如今大数据已人尽皆知,但在这个信息大爆炸的时代里,...数据可视化将技术与艺术完美结合,借助图形化的手段,清晰有效地传达与沟通信息,直观、形象地显示海量的数据和信息,并进行交互处理。 数据可视化的应用... -
前端H5可视化拖拽布局器-Layui,Bootstrap等各种UI-可视化表单设计器
2019-05-08 17:26:39本节介绍一款前端H5可视化布局器 MagicalDrag2.1.5 由js+css+html编写而成 软件官方在线使用地址:http://layuiout.magicalcoder.com/layui 在线使用:免费 优点在于 功能强大,可以自由嵌入各种web项目,有... -
知乎人均985?Python爬50W数据,BI做出可视化后,我有了答案
2019-12-19 09:44:33使用python从网站抓取数据,并将这些数据保存到SQLite数据库中,然后对数据进行清洗,最后对数据进行数据可视化分析。 可是熟悉的人应该知道,python爬取简单,但是分析起来是很困难的,SQL语句、Pandas和... -
推荐四款可视化工具,解决99%的可视化大屏需求
2020-10-13 19:01:01小编想,要是能以图表可视化展现出来,领导就可以看到项目近几个月的走势,也知道之后要怎么决策了。小编尝试了使用excel制作图表,由于操作复杂,小编放弃了,于是小编在网上找到了以下四种可视化工具,现在我们来... -
速来围观!看小伙是如何用python可视化各城市拥堵情况的
2020-11-15 23:01:24看小伙是如何用python可视化各城市拥堵情况的前言一、爬取拥堵指数二、数据可视化三、搭建展示网站写在最后 前言 就在今天,我感受到了来自堵车的深深恶意。没有错!我今天被堵在路上近乎3个小时,美好的约会就这样... -
keras模型可视化,层可视化及kernel可视化
2017-12-02 18:39:38keras模型可视化: model: model = Sequential() # input: 100x100 images with 3 channels -> (100, 100, 3) tensors. # this applies 32 convolution filters of size 3x3 each. model.add(ZeroPadding2D((1,1), ... -
【项目实战】数据爬虫 + 数据清洗 + 数据可视化
2020-05-11 10:37:08自己亲手全手打了一套系统的代码,帮助朋友完成设计,做了贵阳市几个区的房屋价格爬取以及数据清洗和可视化操作,代码细细道来: 上图镇楼,接下来细说。 一:数据挖掘 我选用了链家网做数据爬取场所(不得不唠叨... -
基于keras的LeNet-5模型可视化、网络特征可视化及kernel可视化
2018-08-07 14:36:04卷积神经网络中模型、层中输出的特征和kernel的可视化,对卷积神经网络的设计起到很重要的帮助。在此,以最简单的LeNet-5和手写数字集为例,对LeNet-5进行模型可视化、网络中特征可视化话及kernel可视化。 -
Matplotlib 数据分析可视化
2019-08-30 15:43:53数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图... -
数据可视化概览
2017-12-07 12:08:07科学可视化(Scientific Visualization)、 信息可视化(Information Visualization)和可视分析学(Visual Analytics)三个学科方向通常被看成可视化的三个主要分支。而将这三个分支整合在一起形成的新学科 “数据... -
数据可视化视频精讲
2018-04-12 17:30:26本节人工智能视频涉及: (1)数据可视化的基本处理流程 (2)数据分析及其可视化的选择 (3)数据可视化结果的分析解读 (4)数据可视化的一些实际案例 -
Windows下通过VNC访问Linux服务器(可视化界面)
2018-09-06 16:18:34一般的工作,不需要可视化界面也能完成 可是,当我们有些操作需要显示出来,就有问题了,例如我们训练完ssd,想在图片或者视频上测试,看看效果: 没办法显示!! 所以,我就想实现服务器也能可视化! VN.... -
大数据可视化,可视化大屏,可视化报表,报表工具,BI - Rocket
2019-02-27 11:32:09大数据可视化,可视化大屏,可视化报表,报表工具,BI - RocketROCKET 零代码玩转数据可视化Rocket 致力于使数据友好并且充满活力。简单!简单!简单!重要的事情说三遍。图形化操作,布局灵活,所见即所得。通过拖、拉... -
QuickRedis 是一款 Redis 可视化管理工具
2020-05-26 12:41:46QuickRedis 是一款 Redis 可视化管理工具。它支持直连、哨兵、集群,支持亿万数量级的key,还有令人兴奋的UI。 -
数据可视化基本原理——可视化模型
2018-06-18 13:29:17我刚接触数据可视化是在 4 年前,那时候一位大学老师 S ,叫我们使用 R 对数据进行统计分析(对,哥也学过一阵统计呢),其中有部分知识点是用 R 绘制箱线图、散点图之类的可视化结果。 从此对数据可视化产生了浓厚... -
python最全画地图,可视化数据
2018-08-17 18:56:23有时我们会很希望把数据展示在地图上,来做数据可视化,使数据更加清晰明了,可谓一图胜百文。先说说我用地图做什么了:微信好友全国分布,显示票房省份数据,全国评分显示等等,我这个语言能力很是头疼啊,进入正..... -
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
2019-11-22 13:50:09大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据... -
python 递归-递归可视化
2020-07-10 13:44:54python 递归-递归可视化 文章目录python 递归-递归可视化1、实现2、递归可视化-Coding 1、实现 2、递归可视化-Coding -
数据可视化
2019-10-22 16:01:47数据可视化处理可以洞察统计分析无法发现的结构和细节。例如Anscombe的四组数据(Anscombe‘s Quartet)。 狭义上:科学可视化、信息可视化、可视分析学 科学可视化 可以分为:标量场可视化、向量场可视化、张量... -
数据可视化学习(数据可视化基本概念)
2019-03-20 09:27:41本篇文章翻译自数据可视化入门教程 数据可视化(Data Visualization)和信息可视化(Infographics)是两个相近的专业领域名词。 狭义上的数据可视化指的是数据用统计图表方式呈现,而信息可视化则是将非数字的信息... -
数据可视化、信息可视化与知识可视化
2011-11-12 21:59:44数据可视化、信息可视化与知识可视化 (2011-07-23 12:28:17) 标签: 校园 分类: 工作篇 数据可视化 简介 数据可视化是关于数据之视觉表现形式的研究;其中,这种数据的视觉...
-
Pytorch加载本地FashionMnist数据集
-
安装wampserver时出现“由于找不到MSVCR110.dll,无法继续执行代码........“
-
蓝桥杯 ALGO-1 区间k大数查询
-
ESP8266 WIFI转串口模块AD设计硬件原理图+PCB+封装库文件.zip
-
转行做IT-第10章 常用类-String、static、Array等
-
rabbitmq-stomp服务端推送技术
-
二分递归查找数值的函数
-
2021-01-27 MySQL(四)
-
算法导论二(排序和顺序统计量)——编程大牛的必经之路
-
MPC5634_BL.zip
-
量化高频交易系统tick数据采集
-
第八章-ODE的数值解.ppt
-
【Python 基础入门】
-
Excel高级图表技巧
-
Metabase从入门到精通视频教程
-
Python语言编程高级精讲课 从程序员到架构师的必修课
-
Scratch编程等级考试二级真题讲解(电子学会图形化编程)
-
DS5020因短期多次掉电控制器锁定,解锁方法.pdf
-
LoadTheDisplayBarDynamically.rar
-
图学习笔记(三):图与图学习