tplink无线路由器设置寿命一般有多久

爬虫与数据分析 - 知乎专栏
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"title":"大数据时代,哪些课程最受欢迎?","author":"zhou-yong-7-54","content":"大数据时代,数据的体量结构、获取方式、挖掘处理、分析呈现等等方面都发生了变化,由此衍生出大数据技术,包括数据的采集、存取、清洗、挖掘、可视化等等,产生了新的人才需
求,并且处于紧缺状态,来自麦肯锡全球研究所的另一项调查显示,预计到2018年,美国将面临大约150万大数据专家的短缺,据国内大数据权威专家估算,5年内,大数据人才缺口也将高达130万左右。巨大的人才需求、仍处于上升阶段的职业前景也导致了大数据培训的火热,目前在在线课堂、论坛、线下机构纷纷开设大数据方向的培训课程,且应者如云。那么哪些课程或者哪些方向最受欢迎呢?本文以ppv课(国内领先的大数据学习社区)网站为例,该网站的免费课程频道有着较为齐全课程分类(见图1),并且积累了一定的用户学习数据。通过python软件(3.X版本)爬取所有课程的学习人数、时长、类别等网络数据(见图2),可以一窥当前大数据时代学习群体的培训需求。图1 ppv课免费课程图2 每个课程的信息
采用p ython的xpath查询和处理 HTML / XML 文档,针对网页链接与翻页特点,构建函数以及数据清洗等,最终获取如下数据:图3 最终获取的数据形式再通过数据截取、封装、可视化处理,得到了每一课程类目下的平均学习人数(类目下所有课程学习人数相加/该类目课程数量),见下图:图4 每一课程类目的平均学习人数
如图,概率与统计课程的平均学习人数最多,达到3000以上,这说明学习者对大数据的基础统计理论的学习需求较大;其次是R语言、Mysql、SPSS等,说明了大数据常用的软件与数据库的学习需求也较高。
分类比较,比如在大数据统计软件方面的平均学习人数上,由上图可以看出,R语言&SPSS&Python&SAS&Excel&Matlab,后三者在大数据统计技术上已稍显落后(spss在开发出数据挖掘模块),且R、Python是目前大数据分析下最火的两大统计软件,相应的学习需求也高;数据库方面:Mysql&Nosql&Sql&Oracle,Mysql平均学习人数最多且远远超过其他数据库,作为大数据目前最常用的数据库存储工具,因此会获得如此高的关注度;理论方面:概率统计&机器学习&数据挖掘,说明学习者对基础理论的需求还是比较高,由于大数据技术是计算机与数据统计等内容的结合,很多计算机从业者缺乏统计理论知识以及初学者也要从最基础的理论学起,这导致概率与统计的学习需求遥遥领先,从侧面也说明了在大数据领域统计理论的缺失或不足较为明显。对于大数据里较火的软件平台——Hadoop,平均学习人数处于不高不低的状态,这是由于大多数大数据学习者还处于初级水平,对Hadoop这一高级应用技术还缺乏了解,所以学习需求没那么高。
我们还可以获取到每一课程类目下的所有课程的学习人数,如SAS类目所有的课程学习人数:图5 SAS类目所有的课程学习人数
从上图可以看出,关于初级、入门类的课程需求还是最高。
那么,课程学习人数与课程时长有无关联?构造所有课程学习人数与学习时长的散点图:图6 课程学习人数与学习时长的散点图
可以看到二者并无明显的相关关系。
我们还可以将所有课程按照职业方向、难以程度来分类,获取相关信息,如不同职业方向平均课程学习人数的占比情况:图7 不同职业方向平均课程学习人数的占比情况
数据分析师、大数据工程师、数据挖掘工程师三大方向的学习需求并无明显差异,其中数据分析师略占优势,说明对于数据分析的学习需求较高。
综合看来,大数据时代学习者对于初级、入门课程的关注度还是比较高,对于常用的软件R、Python以及统计、数据分析的学习需求相对集中。附:对网页抓取的流程与代码:(1)导入相关库并构建网页解析函数装入网页解析、多线程、数值计算、数据可视化等python安装库,并构造网页解析函数,在函数中设置模仿浏览器登录的head方式:import urllib.requestfrom lxml import\netreeimport pandas as pdfrom multiprocessing.dummy import Pool\nas threadspoolimport urllib,re,timeimport numpy as npimport matplotlib.pyplot as plt\nstart_url=''url_host = ''def url_open(url):#构建网页解析函数\n
req = urllib.request.Request(url)\n
req.add_header('User-Agent','Mozilla/5.0\n(Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22\nSafari/537.36 SE 2.X MetaSr 1.0')\n
page = urllib.request.urlopen(req)#模仿浏览器登录\n
txt = page.read().decode('utf-8')\n
htm = etree.HTML(txt)return htm(2)构建每一类目链接获取函数获取每个类目的链接,也就是图1中机器学习、数据挖掘等14个类目的链接,构建每个类目链接获取的函数:def get_class_link(url):#获取每个类目的链接\n
htm = url_open(url)\n
class_topics = htm.xpath('/html/body/div[2]/div[1]/div[1]/dl[1]/dd/a/text()')[1:-1]#对课程类目的网址进行解析,并且去除一头一尾“全部”与“会员课程”\n
class_link =[]\n
for class_topic in class_topics:\n
class_link.append(url_host + urllib.parse.quote(class_topic))#主要解决部分网址包含中文字符无法解码的问题\n
return class_link
在免费课程主页:,点击对应的课程类目右键审查元素就可以获取相应的链接,该网站课程类目链接采取这样的方式:,即在主页的基础上加入topicid=的形式。在这里需要注意,部分类目包含中文字符,如机器学习、数据挖掘、R语言等,在python网页解析中会出现“ASCII码无法识别的问题”,导致程序运行不出,这时需要加入urllib.parse.quote命令进行编码,使得中文字符识别出来,(英文字符在此命令下不受影响)。(3)构建全部链接获取函数,解决翻页问题
再次,构建全部链接抓取函数。由于部分课程类目不止一页,需要对翻页的链接进行抓取,这时候我们需要解决两个问题:一是每个类目有多少翻页?二是翻页链接的形式是什么样的,有无规律可循?在课程的底端可以看到每个类目的页数:对于多页的课程类目链接形式为(以Excel为例):
可以看到在课程类目的链接上加入了“&job=&grade=&page=&page=”这种形式。根据这两个问题的表现形式我们找到了解决方案,对于每个类目的页数问题,通过抓取“上一页”、“下一页”这个框中的列表长度来判断,如只有第一页保持原有链接不变,如有2个以上页面,则在原始链接的列表中加入page=2/3….的链接形式。最后封装成一个列表。def get_all_links(class_link):#每个课程类目有不止一页,因此链接也有多个,因此基于类目链接构建全部链接函数\n
htm = url_open(class_link)\n
page_num=htm.xpath('/html/body/div[2]/div[1]/div[2]/div[3]/div/a/text()')\n
urls = [class_link]\n
if len(page_num)&2:\n
for i in range(2,len(page_num)):\n
urls.append(class_link + '&job=&grade=&page=&page='+str(i))#将翻页链接依次加入类目链接中\n
return urls(4)构建抓取信息函数接下来就开始抓取每个页面的信息,并采用pandas.DataFrame的数据框,采用Xpath方式抓取。def get_info(url):#抓取每个链接的信息,包括课程名称、时长、学习人数、类目\n
htm = url_open(url)\n
titles = htm.xpath('/html/body/div[2]/div[1]/div[2]/div[2]/ul/li/h3/a/text()')\n
times= htm.xpath('/html/body/div[2]/div[1]/div[2]/div[2]/ul/li/p[1]/text()')\n
numbers = htm.xpath('/html/body/div[2]/div[1]/div[2]/div[2]/ul/li/p[1]/span/text()')\n
topic = htm.xpath('/html/body/div[2]/div[1]/div[1]/dl[1]/dd[@class=\"cur\"]/a/text()')\n
topics = topic * len(titles) #获取每个课程的类目变量,并且与每个课程一一对应,最好与其他变量在同一页面一起抓取\n
frame = pd.DataFrame([topics,titles,times,numbers], index=['topics','titles','times','numbers'])#转入数据列表DataFrame\n
frame = frame.T\n
return frame(5)导入网页,爬取信息构造完相关函数后,将参数代入,爬取所有类目下所有课程的数据信息:if __name__ == '__main__':\n
time.sleep(2)\n
class_links = get_class_link(start_url)#获取类目链接\n
pool = threadspool(2)\n
urls = list(map(get_all_links,class_links))#多线程抓取每个类目的所有链接\n
url_links = []\n
for x in urls:\n
url_links.extend(x) #将所有链接装进一个list\n
frame_list = list(map(get_info,url_links))#数据框列表\n
a,b,c,d = [], [], [], []\n
[(a.extend(x['topics'])) for x in frame_list]\n
[(b.extend(x['titles'])) for x in frame_list]\n
[(c.extend(x['times'])) for x in frame_list]\n
[(d.extend(x['numbers'])) for x in frame_list]\n
c1 = [int(re.findall(r\"\\d+\" ,txt)[0]) for txt in c]\n
d1 = [int(re.findall(r\"\\d+\" ,txt)[0]) for txt in d] #采用正则表达式提取数字,并转化为整型,也算是数据清洗\n
frame = pd.DataFrame([a,b,c1,d1], index=['topics','titles','times','numbers'])#将数据整合\n
frame = frame.T(6)数据截取、分组及可视化通过数据截取、分组计算、画图就可以得到每个类目平均的学习人数:ppv = frame.loc[:,['topics','numbers']]#获取部分数据,即数据切片\nppv1 = ppv.groupby('topics').sum()\nprint(ppv1)\nppv2 = ppv.groupby('topics').count()\nppv3 = ppv1/ppv2\nprint(ppv3)\nppv3.plot(kind='bar')#直方图,注意中文变量刚开始无法在图形中显示,需要设置python的输入法库\nplt.show()\nframe1 = frame.set_index('topics')\nax = frame1.loc['SAS', ['titles', 'numbers']]\nbx = ax.plot(kind='barh')\nbx.set_yticklabels(ax['titles'], rotation=0)\nplt.show()\nframe.plot(x='times', y='numbers', kind='scatter', color='g')\nplt.show() 与上面类似,我们也可以抓取大数据职业方向方面课程的学习情况:job_urls = []\nfor job in [1,3,8]:\n
for page in range(1,14):\n
list_view = '/class/select?topicid=&job={}&grade=&page={}'.format(str(job),str(page))\n
page = urllib.request.urlopen(list_view)\n
txt = page.read().decode('utf-8')\n
if txt.find('暂无课程') == -1:#直接设置一定的页面链接,通过页面显示的信息有误来筛选链接\n
job_urls.append(list_view)\n
pass\n\ndef get_info1(url):\n
page = urllib.request.urlopen(url)\n
txt = page.read().decode('utf-8')\n
htm = etree.HTML(txt)\n
titles = htm.xpath('/html/body/div[2]/div[1]/div[2]/div[2]/ul/li/h3/a/text()')\n
times = htm.xpath('/html/body/div[2]/div[1]/div[2]/div[2]/ul/li/p[1]/text()')\n
numbers = htm.xpath('/html/body/div[2]/div[1]/div[2]/div[2]/ul/li/p[1]/span/text()')\n
topic = htm.xpath('/html/body/div[2]/div[1]/div[1]/dl[2]/dd[@class=\"cur\"]/a/text()')\n
topics = topic * len(titles)\n
frame = pd.DataFrame([topics, titles, times, numbers], index=['topics', 'titles', 'times', 'numbers'])\n
frame = frame.T\n
time.sleep(2)\n
return frame在这里与前边不同的是,在抓取全部页面的时候,没有采用上面以页面底端的“上一页”、“下一页”信息来判断页面数量并构造链接,而是输入一个能涵盖每一类别最大页数的数字(如14,这里是翻遍类目最后页数确定下来的),再通过解析页面信息是否存在课程数据来筛选,采用了if txt.find('暂无课程') == -1:的条件循环。frame_list = list(map(get_info1,job_urls))\na,b,c,d = [], [], [], []\n[(a.extend(x['topics'])) for x in frame_list]\n[(b.extend(x['titles'])) for x in frame_list]\n[(c.extend(x['times'])) for x in frame_list]\n[(d.extend(x['numbers'])) for x in frame_list]\nc1 = [int(re.findall(r\"\\d+\" ,txt)[0]) for txt in c]\nd1 = [int(re.findall(r\"\\d+\" ,txt)[0]) for txt in d] #采用正则表达式提取数字,并转化为整型\nframe = pd.DataFrame([a,b,c1,d1], index=['topics','titles','times','numbers'])\nframe = frame.T\njob_study = frame.loc[:, ['topics', 'numbers']]\njob_study1 = job_study.groupby('topics').sum()\njob_study2 = job_study.groupby('topics').count()\njob_study3 = job_study1/job_study2\nprint(job_study2)\nprint(job_study3)\njob_study = frame.loc[:, ['topics', 'numbers']]\njob_study1 = job_study.groupby('topics').sum()\njob_study2 = job_study.groupby('topics').count()\njob_study3 = job_study1/job_study2\nprint(job_study2)\nprint(job_study3)\njob_study3.plot(subplots=True,kind = 'pie',colors=['r', 'g', 'b'],autopct='%.2f',fontsize=10, figsize=(5,5))\nplt.legend(loc ='lower left')\nplt.show()","updated":"T11:04:23.000Z","canComment":false,"commentPermission":"anyone","commentCount":0,"likeCount":1,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T19:04:23+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":0,"likesCount":1},"":{"title":"双十一预售战下的电商风云","author":"zhou-yong-7-54","content":"
又是一年“双11”,随着时间的临近,憋在心中的洪荒之力不断发酵,买!买!买!以“天猫”为代表的各大电商平台也纷纷出击,大打宣传战勾起“剁手党”们的欲望。百度指数显示,在11月11日愈来愈近的情况下,从10月初开始,“双11”这一概念就不断掀起网络热潮,热度逐步攀升。
这其中,代表“双十一”购物狂欢的先行战斗——双十一预售,早已在网络打响,以预售的先驱者天猫为代表的各大电商平台,以及一些线上线下企业纷纷加入这一战役,从10月开始,酝酿着“剁手”气息的双十一预售战就在电商江湖上掀起一片风雨。2016年的双11仍以天猫为主,苏宁、国美也加入进来,京东则是部分商品进行预售。由于各电商平台的网页结构不同且数量繁多,很难统一抓取。本文以“值不值得买网站”提供的各电商平台双11预售商品信息(在该网站搜索栏输入“双11预售”就会列出不同电商平台提供的商品信息,双11预售&p=1),在统一的网页格式下用python3.5软件抓取商品信息,并且包含对预售商品值、不值的评价数据等等,进行数据分析。由于该网站双11预售搜索下还包括2015年、2014年的信息,因此对相应商品发布的时间也抓取,后期通过数据清理将往年信息去除(数据截止到日),该网站还包括商品分类信息,也一并抓取并在后面进行分析。(1)双十一预售商品数目:天猫全方位铺开根据抓取数据分析,阿里巴巴旗下一系列电商网站双十一预售提供的商品占主力,包括天猫精选有1930件,远远超过其他电商网站,接着是天猫国际(280件)、聚划算(248件)、飞猪(50件)、阿里旅游(43件,10月27日升级为飞猪,二者属于一个平台),其它非阿里系电商网站中,苏宁易购44件、京东32件、国美在线13件、美的商城10件、亚马逊中国8件,剩下的就在10件以内(见下图,由于数据太大,天猫精选商品数未在下图中显示)。从中可以看出,天猫在双十一预售中的主力位置,并辅以聚划算、跨境电商、旅游电商等旗下其他网站多形态全面展开,非阿里系之外,苏宁也是主打预售的商家之一,但难以在商品数量上与天猫抗衡,京东由于并未将重点放在预售战略上,也落后于天猫。(2)双十一预售不同商品类目的数量分析奇怪的是,该网站发布的双十一预售商品数量,按照不同商品类目统计,运动户外超过传统热门服饰鞋包,数量最多(499件,其中天猫精选就有419件),剩下的依次是个护化妆、食品保健、日用百货、家居家装等等,最少的是图书音像、礼品钟表等,侧面反映了大家对双十一预售商品的关注程度。其中,天猫精选的商品数量在大部分商品类目中占主要地位,除了个护化妆、家用电器、金融旅游外,但是在这些类目里又有聚划算、天猫国际,特别是阿里旅游与飞猪的旅游产品,所以还是以天猫商品为主。(3)双十一预售商品发布趋势:10月下旬开始掀起高潮根据网站发布商品的时间,得到了双十一预售商品发布时间趋势图(如下),可以看到双十一预售从进入10月份开始酝酿,在10月下旬突然掀起高潮,在11月之前,每日都有上百件的商品发布,但在进入11月之后,数量开始滑落,由于11月11日即将到来,商品预售战也进入尾声,11月3日开始下滑,11月5日降到日发布数量50件以下。(4)双十一预售的促销手段:主打“包邮+定金+尾款”对发布商品下面的包邮、付定金等营销方式的文字信息进行抓取,并制作成词云,可以发现尾款、定金、包邮出现次数最多,这是预售的主要方式,其次是定金翻倍、膨胀(X元抵X元)、需用劵、优惠劵叠加等等手段。(5)双十一预售的商品评价:天猫类、图书音像等商品值得预定对该网站商品下浏览者对商品的评价数据(值、不值得买)进行抓取,后期通过数据清洗将值得买+不值得买总点击数低于10的商品数据去掉,结合商品类目、电商网站的分类数据分析。从不同电商平台角度分析,由于易车网、要买车网等大多数网站总体商品数量较少,甚至低于5以内,虽然部分网站值得买、不值得买的平均评价数较高,但样本数太少,因此不能作为分析对象。在商品数量较多的几家网站中,天猫精选、天猫国际、聚划算虽然商品数量巨大,但值得买的平均评价并非领先,反倒是京东、苏宁易购的值得买平均评价数最多,其次是阿里旅游、飞猪,另外京东、苏宁易购不值得买的平均评价数也较高,这说明了两家电商预售商品值不值得买有较大争议,而天猫精选、天猫国际、聚划算、阿里旅游、飞猪等阿里系以及国美在线、亚马逊中国等的值得买平均评价的占比高于不值得买,说明消费者对这几家网站商品预售方式评价较好。从不同商品类目来看,将同一商品值得买除以(值得买+不值得买),得到值得买的好评率,在对各商品类目平均,图书音像、金融旅游、玩模乐器、家用电器等商品好评率稍高一些,食品保健、礼品钟表则相对较低,前者由于质量要求较高,后者则是特殊用途要求较高,因此好评率略低于其他商品。综合看来,天猫在此次预售战中占据主力地位,以其较高的商品数量,辅以阿里系多元化网站形态遥遥领先,非阿里系中苏宁易购、京东占主要;预售商品类目中,运动户外、服饰鞋包最多,图书音像、礼品钟表等最少;双十一预售战从10月初逐步酝酿,在10月下旬掀起高潮,进入11月,随着双11逐渐来临则慢慢回落;双十一预售的促销手段以“包邮+预付定金+尾款”为主,辅以定金翻倍、膨胀、优惠券等手段;在预售商品评价中,天猫为主的阿里系值得买的平均好评率较好,京东、苏宁易购虽然平均好评数较高,但值不值得买存在争议,商品类目中,图书音像、金融旅游好评率较高,食品保健、礼品钟表则相对较低。本文代码见github:","updated":"T12:59:29.000Z","canComment":false,"commentPermission":"anyone","commentCount":0,"likeCount":3,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T20:59:29+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":0,"likesCount":3},"":{"title":"matplotlib可视化之如何给图形添加数据标签?","author":"zhou-yong-7-54","content":"当我们获取完数据之后,一般来说数据可视化呈现的最基础图形就是:柱状图、水平条形图、折线图等等,在python的matplotlib库中分别可用bar、barh、plot函数来构建它们,再使用xticks与yticks(设置坐标轴刻度)、xlabel与ylabel(设置坐标轴标签)、title(标题)、legend(图例)、xlim与ylim(设置坐标轴数据范围)、grid(设置网格线)等命令来装饰图形,让它更明晰与美观,但是对于数据标签(即在图形中的每一个点或条形位置上标注出相应数值),却没有直接的命令导出。我们看很多python可视化做出的柱状图等等,在柱子数量不多的条件下,没有数据标签,只有光秃秃的一个个柱子,这样就使得图形缺了些什么。
事实上,在python的matplotlib中有在图形中添加文字说明的命令——text,我们就可以利用这个命令,在图中每个单位要素中添加相应文字,来构造数字标签。
以本人专栏写的《大数据时代,哪些课程最受欢迎?》所爬取数据为例,经过numpy得到了不同课程类别下的平均学习人数,如图:
该数据是dataframe格式的数据架构(名为ppv3),建立柱状图来展示该数据,步骤与代码如下:plt.figure(figsize=(10,6))\n\n#设置x轴柱子的个数\n\nx=np.arange(14)+1 #课程品类数量已知为14,也可以用len(ppv3.index)\n\n#设置y轴的数值,需将numbers列的数据先转化为数列,再转化为矩阵格式\n\ny=np.array(list(ppv3['numbers']))\n\nxticks1=list(ppv3.index) #构造不同课程类目的数列\n\n#画出柱状图\n\nplt.bar(x,y,width = 0.35,align='center',color = 'c',alpha=0.8)\n\n#设置x轴的刻度,将构建的xticks代入,同时由于课程类目文字较多,在一块会比较拥挤和重叠,因此设置字体和对齐方式\n\nplt.xticks(x,xticks1,size='small',rotation=30)\n\n#x、y轴标签与图形标题\n\nplt.xlabel('课程主题类别')\n\nplt.ylabel('number')\n\nplt.title('不同课程类别的平均学习人数')\n\n#设置数字标签\n\nfor a,b in zip(x,y):\n\nplt.text(a, b+0.05, '%.0f' % b, ha='center', va= 'bottom',fontsize=7)\n\n#设置y轴的范围\n\nplt.ylim(0,3700)\n\nplt.show()\n最终得到的图形为:着重讲一下如何设置数字标签for a,b in zip(x,y):\n\n
plt.text(a, b+0.05, '%.0f' % b, ha='center', va= 'bottom',fontsize=7)\n首先,前边设置的x、y值其实就代表了不同柱子在图形中的位置(坐标),通过for循环找到每一个x、y值的相应坐标——a、b,再使用plt.text在对应位置添文字说明来生成相应的数字标签,而for循环也保证了每一个柱子都有标签。
其中,a, b+0.05表示在每一柱子对应x值、y值上方0.05处标注文字说明, '%.0f' % b,代表标注的文字,即每个柱子对应的y值, ha='center', va= 'bottom'代表horizontalalignment(水平对齐)、verticalalignment(垂直对齐)的方式,fontsize则是文字大小。
条形图、折线图也是如此设置,饼图则在pie命令中有数据标签的对应参数。对于累积柱状图、双轴柱状图则需要用两个for循环,同时通过a与b的不同加减来设置数据标签位置,比如在本文另一文章《双十一预售战下的电商风云》,如图:其命令为:","updated":"T15:02:26.000Z","canComment":false,"commentPermission":"anyone","commentCount":1,"likeCount":4,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T23:02:26+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":1,"likesCount":4},"":{"title":"Python-matplotlib统计图之箱线图漫谈","author":"zhou-yong-7-54","content":"(1)箱线图,又称箱形图(boxplot)或盒式图,不同于一般的折线图、柱状图或饼图等传统图表,只是数据大小、占比、趋势等等的呈现,其包含一些统计学的均值、分位数、极值等等统计量,因此,该图信息量较大,不仅能够分析不同类别数据平均水平差异(需在箱线图中加入均值点),还能揭示数据间离散程度、异常值、分布差异等等。在python中常用matplotlib的boxplot来绘制,最简单绘制的如下:import numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\nnp.random.seed(2)
#设置随机种子\ndf = pd.DataFrame(np.random.rand(5,4), columns=['A', 'B', 'C', 'D'])#先生成0-1之间的5*4维度数据,再装入4列DataFrame中\ndf.boxplot() #也可用plot.box()\nplt.show()从图形可以看出,A、B、C、D四组数A、D数据较集中(大部分在上下四分位箱体内),但都有异常值,C的离散程度最大(最大值与最小值之间距离),以均值为中心,B分布都有明显右偏(即较多的值分布在均值的右侧),A、C则有明显左偏。(2)从分析的角度来说,上面boxplot最初始图形已经够用,但是在matplotlib库下boxplot函数中包含n多参数,涉及到对框的颜色及形状、线段线型、均值线、异常点的形状大小等等设置,由于大多并不常用,用了几个常用参数,作图如下:df.boxplot(sym='r*',vert=False,patch_artist=True,meanline=False,showmeans=True)\nplt.show()\n其中,sym='r*',表示异常点的形状,vert=False,表示横向还是竖向(True),,patch_artist=True,(上下四分位框内是否填充,True为填充)meanline=False,showmeans=True,是否有均值线及其形状,meanline=True时,均值线也像中位数线一样是条红色线段,这样容易与中位数线混淆。另外,还有其他参数,比如notch表示中间箱体是否缺口,whis为设置数据的范围,showcaps、showbox是否显示边框,可以参见[matplot](),如该网页中图形:左上图是默认图形,中上、右上是显示均值点及形状,左下是是否显示箱体边框,中下是带缺口的箱体,右下是是否显示异常值。(3)前边说过,很多参数使用很少,但对于图形来说,可能还能用到的就是美化,比如各条线的颜色,粗细程度等等。这里可用for循环来构造。f=df.boxplot(sym='r*',patch_artist=True)\nfor box in f['boxes']:\n
# 箱体边框颜色\n
box.set( color='#7570b3', linewidth=2)\n
# 箱体内部填充颜色\n
box.set( facecolor = '#1b9e77' )\nfor whisker in f['whiskers']:\n
whisker.set(color='r', linewidth=2)\nfor cap in f['caps']:\n
cap.set(color='g', linewidth=3)\n\nfor median in f['medians']:\n\n
median.set(color='DarkBlue', linewidth=3)\nfor flier in f['fliers']:\n
flier.set(marker='o', color='y', alpha=0.5)\nplt.show()其中,boxes, 是25分位值和75分位值构成的box,medians, 是中位值的横线, 每个median是一个Line2D对象 ;whiskers, 是指从box 到error bar之间的竖线. ;fliers, 是指error bar线之外的离散点. ;caps, 是指error bar横线. ;means, 是均值的横线,(4)还可以做子图,如我们在最开始的DataFrame数据中加入分类数据列:df['E'] = np.random.choice(['X', 'Y'], size=20)#加入以X、Y随机分类的E列\nprint(df)\nplt.figure()\ndf.boxplot(by='E')\nplt.show()\n这样我们就可以比较,不同类别X、Y在同一列下的数据分布情况及其差异。","updated":"T06:24:28.000Z","canComment":false,"commentPermission":"anyone","commentCount":0,"likeCount":4,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T14:24:28+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":0,"likesCount":4},"":{"title":"python爬虫之单纯用find()函数来爬取数据","author":"zhou-yong-7-54","content":"对于python软件爬取网页数据,一般采用BeautifulSoup库或者Xpath技术来解析html,然后寻找爬取对象的网页路径来定位所需数据,进而利用循环条件来不断获取数据。另外,也可以使用Scrapy框架来爬取。对于上述软件包或库,在进行网页爬虫时需要安装相关库并导入,而Scrapy框架目前windows系统下python3软件还不一定安装不了。
在这里介绍一种单纯使用find()函数来爬取数据的方法,它不需要安装和导入上述Python库,仅仅依靠读取网页之后形成的代码文档,通过定位爬取对象的位置及范围,来获得所需数据。在这里为了简单介绍一下这一方法,本文以最近上映大片——张艺谋导演的《长城》电影,其豆瓣短评的第一页为例(),爬取每一个短评。
首先,导入urllib库,打开url网址并读取为utf-8格式import urllib.request\nreq = urllib.request.urlopen('/subject/6982558/comments?sort=new_score&status=P')\ntxt = req.read().decode('utf-8')\nprint(txt)\n
通过打印txt,可以看到每个短评处于&p class=\"\"&
&/p&之间,那么就可以使用find函数来找到这两个参数第一次出现的开头位置。words = txt.find(r'p class=\"\"')\nwordsend = txt.find(r'/p',words) #缩小范围,在words位置范围内寻找/p\n
其中,wordsend就在从第一个words出现的位置,这也能做可以缩小搜寻范围。
接下来就是存储第一个短评,并形成循环将该网页的其他短评也依次找到并存储。com=[]\ni =0\nwhile words !=-1 and wordsend !=-1 :\n
com1 = txt[words +11:wordsend-1].split('
')[0].strip()#将第一个评论储存起来\n
com.append(com1)\n
words = txt.find(r'p class=\"\"',wordsend) #从上一个wordsend开始寻找下一个p class\n
wordsend = txt.find(r'/p', words)\n
i = i + 1\nelse:\n
print('the end!')\nprint(com)\n在这里需要特别说明的就是,com1 = txt[words +11:wordsend-1].split('
')[0].strip(),其中txt[words +11:wordsend-1]就是网页txt文档中第一条短评的前后位置范围找到再提取出来,其中短评最开始的位置就是words变量中p class=\"\"的p开始数字符串,第11位,结束位置则是wordsend中/p往前一位,如图:但是如果单纯依靠strip()来去除标点符号等,还会出现错误,比如有人用手机发帖,在&p class=\"\"&
&/p&之间还会有如下字符:
因此,在这里先用split截取第一个字段,再strip().
最终打印,得到第一页所有短评文字。对于多网页的抓取则可以再使用while循环,结合每个网页的特点,运用page = page + 1来不断抓取。在此基础上,设置一定的停止条件,就爬到了对《长城》这一电影所有短评。然后我们就可以进行分析大家对《长城》这部电影的关注点、吐糟点等等,采用词频分析,文本挖掘以及词云等来进行数据分析。
最后,说一下,这种方法需要对爬取对象的精准定位,否则定位不准或者网页中有其他数据类似定位的话,就会导致失败。因此,不像BeautifulSoup库或者Xpath技术在定位上这么清晰明白。","updated":"T13:34:30.000Z","canComment":false,"commentPermission":"anyone","commentCount":2,"likeCount":0,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T21:34:30+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":2,"likesCount":0},"":{"title":"Python爬取网页Utf-8解码错误及gzip压缩问题的解决办法","author":"zhou-yong-7-54","content":"
在我们用python3爬取一些网站时,获取网页url后进行解析,在采用decode('utf-8')解码时有时候会出现utf-8无法解码的问题,比如结果会提示:Unicode Decode Error: 'utf8' codec can't decode byte 0xb2 in position 0: invalid start byte
这是因为有些网站进行了gzip压缩,最典型的就是sina,进行网页爬虫经常出现这个问题,那么为什么要压缩呢?搜狗百科解释为:HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的。
我们在打开某个新浪网页,点击右键选择“检查”,然后Network》All》Headers下的“Request Headers”中就会发现这个字样:Accept-Encoding:gzip, deflate, sdch这个问题有的建议:“看一下设置的header是否存在 'Accept-Encoding':' gzip, deflate',这一句话,如果存在,删除即可解决。”,但是有时候header不存在这个代码,怎么删除?如下,我们以打开某个新浪新闻网页为例:import urllib.request\n\nfrom bs4 import BeautifulSoup\n\nurl=’.cn/c/nd//doc-ifyafcyw0237672.shtml’\n\nreq = urllib.request.Request(url)\n\nreq.add_header('User-Agent',\n\n
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0')\n\npage = urllib.request.urlopen(req)
# 模仿浏览器登录\n\ntxt = page.read().decode('utf-8')\n\nsoup = BeautifulSoup(txt, 'lxml')\n\ntitle =soup.select('#artibodyTitle')[0].text\n\nprint(title)
在run之后仍会出现问题,当把decode('utf-8')去掉后得到的页面是乱码的。因此,解决的办法不是如此。
在这里有两种解决办法:(1)采用gzip库解压网页再解码;(2)使用requests库解析网页而不是urllib。(1)的解决办法为:在“txt = page.read()”页面读取之后,再加入下面这个命令:txt=gzip.decompress(txt).decode('utf-8')(2)的解决办法为:import requests\nimport gzip\nurl=\".cn/c/nd//doc-ifyafcyw0237672.shtml\"\nreq = requests.get(url)\nreq.encoding= 'utf-8'\n这是对网页用设置为‘utf-8’的格式,但是这里模拟浏览器登录需采用这种方式:headers = {\n
'Host': 'blog.csdn.net',\n
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/ Firefox/43.0',\n
'Accept': 'text/html,application/xhtml+xml,application/q=0.9,*/*;q=0.8',\n
'Accept-Language': 'zh-CN,q=0.8,en-US;q=0.5,q=0.3',\n
….\n}\n综合以上,我们看一下结果:错误的方式Gzip解压方式Requests的读取网页方式","updated":"T10:50:02.000Z","canComment":false,"commentPermission":"anyone","commentCount":0,"likeCount":3,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T18:50:02+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":0,"likesCount":3},"":{"title":"python调用百度地图API实现经纬度换算、热力地图全流程指南","author":"zhou-yong-7-54","content":"
基于地图的数据可视化应用愈来愈广泛,目前,有很多方法来实现地图可视化,包括excel的power map包、各种数据分析软件的地图库以及在线交互地图可视化操作工具,如Echarts、Tableau Public、polyMaps等等。另外还有一种手段就是通过软件调用百度、google或者其他地图的api,自己DIY可视化地图,但是这种办法需要操作者本身既要对相关软件的编程熟悉,又要熟悉不同地图api的具体用法。本文就是用这种手段,以一个简单的表格文件出发,在不知道相关地点经纬度的情况下,通过python调用百度地图API实现热力地图,这其中需要申请密钥、批量经纬度换算、转换成js数据、百度热力地图api相关参数的调整等等。 (1)初始数据:csv格式的数据表格
初始数据为个大中城市新建住宅价格指数同比值,直接从国家统计局网站公布的数据copy过来(下图),数据已整理好,为两列(城市city、房价指数price),并保存为csv格式。在实际中,我们常常通过爬取网站上万条地区数据并存为csv格式来分析,在这里为简化流程,初始数据来源直接copy已有数据。(2)城市转换成经纬度第一步:注册密钥
在百度地图api上相关位置的展现是以经纬度为基础的(这里暂不介绍百度地图坐标体系与其他地图的区别),如北京,其经度(longitude)为:116.395645,纬度(latitude)为:39.929986,在这里既需要通过百度的Geocoding API来获取不同城市的经纬度坐标,又要求将csv数据文件导入python,批量获取这70个城市的坐标信息。在做这些之前,需要注册百度地图api(首先你要用百度的账号)以获取免费的密钥,才能完全使用该api。
登录网址:,首页点击申请密钥按钮,经过填写个人信息、邮箱注册等,成功之后在开放平台上点击“创建应用”,填写相关信息,在这里特别说明的是,在IP白名单框里,如果不清楚自己的IP地址,最好设置为:0.0.0.0/0,虽然百度提醒它会有泄露使用的风险,但是有时候你把你自己的IP地址输进去可能也不行。提交后,在你创建应用的访问应用(AK)那一栏就是你的密钥。(3)城市转换成经纬度第二步:构造经纬度获取函数
注册密钥后就可以在百度Web服务API下的Geocoding\nAPI接口来获取你所需要地址的经纬度坐标并转化为json结构的数据,其网址为:,网页中有相关说明,根据示例URL,采用python3软件,写出如下函数:import json\nfrom urllib.request import urlopen, quote\nimport requests,csv\nimport pandas as pd #导入这些库后边都要用到\n\ndef getlnglat(address):\n
url = 'http://api./geocoder/v2/'\n
output = 'json'\n
ak = '你申请的密钥***'\n
add = quote(address) #由于本文城市变量为中文,为防止乱码,先用quote进行编码\n
uri = url + '?' + 'address=' + add
+ '&output=' + output + '&ak=' + ak\n
req = urlopen(uri)\n
res = req.read().decode() #将其他编码的字符串解码成unicode\n
temp = json.loads(res) #对json数据进行解析\n
return temp \n (4)城市转换成经纬度第三步:批量获取城市经纬度坐标
在构造完获取坐标函数后,我们就需要用python读取csv文件的数据,并将city列单独读出来,批量获取经度、纬度坐标,并生成json的数据文件,其代码如下:file = open(r'E:\\\\爬虫数据分析\\调用百度地图api\\point.json','w') #建立json数据文件\nwith open(r'E:\\\\爬虫数据分析\\调用百度地图api\\各区域房价.csv', 'r') as csvfile: #打开csv\n
reader = csv.reader(csvfile)\n
for line in reader: #读取csv里的数据\n
# 忽略第一行\n
if reader.line_num == 1: #由于第一行为变量名称,故忽略掉\n
continue\n
# line是个list,取得所有需要的值\n
b = line[0].strip() #将第一列city读取出来并清除不需要字符\n
c= line[1].strip()#将第二列price读取出来并清除不需要字符\n
lng = getlnglat(b)['result']['location']['lng'] #采用构造的函数来获取经度\n
lat = getlnglat(b)['result']['location']['lat'] #获取纬度\n
str_temp = '{\"lat\":' + str(lat) + ',\"lng\":' + str(lng) + ',\"count\":' + str(c) +'},'\n
#print(str_temp) #也可以通过打印出来,把数据copy到百度热力地图api的相应位置上\n
file.write(str_temp) #写入文档\nfile.close() #保存\n\n在这里特别要注意str_temp =\n'{\"lat\":' + str(lat) + ',\"lng\":' + str(lng) +\n',\"count\":' + str(c) +'},',这一行的命令,这是参照百度地图JavaScript\nAPI热力图制作的相应格式而生成的,生成的json数据格式为:{\"lat\":39.24,\"lng\":116.67,\"count\":124.7},如下图所示,来自于网址:。(5)生成热力地图
接下来就比较简单,我们先建立一个html文件,将\n网址中源代码复制过来,首先将代码中的ak换成你自己的密钥;
然后将生成的point.json文件里的数据复制出来,在替换掉var points =[ ]里的内容,即可。
这里要注意的是,由于百度地图JavaScript API热力图默认的是以天安门为中心的北京区域地图,而我们的数据是全国性的,所以这里还需要对热力图中“设置中心点坐标和地图级别”的部分进行修改(见下图),具体设置可以参考百度创建地图api中:,自己可以去调试出合适的中心点与地图级别。
最后,由于我们的大部分price数据(也就是points里的count)都超过了100(默认最大为100),还需要对热点图代码中的点最大值进行设定(这里设为140)。
保存后,用浏览器打开,即得到了个大中城市新建住宅价格指数同比的热力地图:
图形可以看出,2017年1月房价上涨的热点地区主要是合肥、南京、杭州一带,福州、厦门一带以及广州一带。","updated":"T00:42:46.000Z","canComment":false,"commentPermission":"anyone","commentCount":10,"likeCount":7,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T08:42:46+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-2afeb0ab2bca2790b9bab_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":10,"likesCount":7},"":{"title":"用python-pandas作图矩阵","author":"zhou-yong-7-54","content":"注:本文为一篇翻译文章,来自于,原文标题是Visualize\nMachine Learning Data in Python With Pandas(在Python里使用pandas对机器学习的数据进行可视化分析),作者的意思是我们在采用机器学习算法对数据进行分析时,首先要对数据进行了解,而了解数据最快速的方式就是可视化。但是作者可视化采用的方法对很多data都通用,且采用的是各种图形的图矩阵,如直方图、散点图矩阵等等。本文就根据作者的分析来介绍如何运用pandas作各种矩阵图。(1)数据
数据为Pima\nIndians dataset,在作者的代码中包含该数据来源网址,即皮马印第安人糖尿病数据集,样本个数有768个,包含变量有:Preg:怀孕次数Plas:口服葡萄糖耐量试验中血浆葡萄糖浓度为2小时Pres:舒张压(mm Hg)Skin:三头肌皮褶厚度(mm)test :2小时血清胰岛素(μU/\nml)mass:体重指数(kg /(身高(m))^ 2)pedi:糖尿病血统功能age:年龄(岁)class:类变量(0或1),估计是性别。\n\n(2)Histograms(直方图矩阵)url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data\"\nnames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] #设置变量名\ndata = pandas.read_csv(url, names=names)
#采用pandas读取csv数据\ndata.hist()\nplt.show()\n但是,我们看到图形并不协调,存在变量与坐标重叠的情况,我们可以调整hist()的参数来解决,包括对x轴、y轴标签大小的调节((xlabelsize,ylabelsize),整个图形布局大小的调节figsize:data.hist(xlabelsize=7,ylabelsize=7,figsize=(8,6)) #\n\nplt.show()\n可以看到每一个变量的分布情况,其中mass、plas、pres呈现一定的正态分布,其他除了class之外,基本上左偏。(3)Density Plots(密度图矩阵)data.plot(kind='density', subplots=True, layout=(3,3), sharex=False,fontsize=8,figsize=(8,6))\nplt.show()\n原始代码输出后仍然存在重叠的地方,在这里加入了对图中坐标文字fontsize,以及整体布局大小figsize。(4)箱线图矩阵(Box and Whisker Plots)data.plot(kind='box', subplots=True, layout=(3,3), sharex=False, sharey=False, fontsize=8,figsize=(8,6))\nplt.show()\n与(3)类似,在这里注意可以共享x轴和y轴,用了sharex=False, sharey=False的命令。(5)相关系数矩阵图(Correlation Matrix Plot)import numpy\ncorrelations = data.corr()
#计算变量之间的相关系数矩阵\n# plot correlation matrix\nfig = plt.figure() #调用figure创建一个绘图对象\nax = fig.add_subplot(111)\ncax = ax.matshow(correlations, vmin=-1, vmax=1)
#绘制热力图,从-1到1\nfig.colorbar(cax)
#将matshow生成热力图设置为颜色渐变条\nticks = numpy.arange(0,9,1) #生成0-9,步长为1\nax.set_xticks(ticks)
#生成刻度\nax.set_yticks(ticks)\nax.set_xticklabels(names) #生成x轴标签\nax.set_yticklabels(names)\nplt.show()\n颜色越深表明二者相关性越强。(6)散布图矩阵(Scatterplot Matrix)from pandas.tools.plotting import scatter_matrix\nscatter_matrix(data,figsize=(10,10))
\nplt.show()\n","updated":"T14:13:28.000Z","canComment":false,"commentPermission":"anyone","commentCount":0,"likeCount":1,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T22:13:28+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":0,"likesCount":1},"":{"title":"Python文本分析初探:《人民的名义》知乎网友都关注啥?","author":"zhou-yong-7-54","content":"文本分析是在机器学习数据挖掘中经常要用到的一种方法,主要是指对文本处理,并对文本建模取得有用的信息。目前,文本分析使用愈来愈广泛,包括对新闻、电视剧、书籍、评论等等方面的文本挖掘并进行分析,可以深入找到表面文字看不到的细节。\n\n介于《人民的名义》这部剧这么火,本人以此为基础,通过对知乎上网友提出的问题进行爬取,并搜集到每一问题的关注、浏览数,进行分析。在未登录的情况下,找到知乎——《人民的名义》主题网页下的等待回答——全部问题(见下图),时间截止到日,地址为:\n。(在登录状态下,可以显示更多信息,但是需要设置知乎登录函数,同时登录之后可能反爬虫机制会严格)。每一个问题对应一个链接,点击进去会有该问题的关注者、浏览者等相关信息,如果有人回答还会有回答人数等等,如图。(1)抓取问题信息\n\n\n\n\n\n基于上述构造,本文编写爬虫函数来爬取这些信息,第一步先通过《人民的名义》主题网页抓取每一个问题的链接,第二步再通过每一个链接,抓取每一个问题的内容、关注者、浏览者信息。from bs4 import BeautifulSoup\nimport urllib.request\nimport time,re\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom multiprocessing.dummy import Pool as threadspool\nimport socket\n\nsocket.setdefaulttimeout(20)\n\ndef url_open(url):\n
req = urllib.request.Request(url)\n
req.add_header('User-Agent',\n
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0')\n
page = urllib.request.urlopen(req)
# 模仿浏览器登录\n
txt = page.read().decode('utf-8')\n
soup = BeautifulSoup(txt, 'lxml')\n
return soup\n\n\npage_url = []\nfor
num in range(1,45):\n
url = '/topic//questions?page={}'.format(num)\n
soup = url_open(url)\n
urllist = soup.find_all(attrs={'class': 'question-item-title'})\n
time.sleep(10)\n
for i in urllist:\n
page =i.a['href']\n
page_url.append('/' + page)\n\n\ndef get_info(page_url):\n
soup = url_open(page_url)\n
titles= soup.find_all(attrs= {'class':'QuestionHeader-title'})[0].get_text()\n
focus = soup.select('div.NumberBoard-value')[0].get_text()\n
reviews = soup.select('div.NumberBoard-value')[1].get_text()\n
if soup.find('List-headerText'):\n
answers = soup.select('h4.List-headerText')[0].get_text().split(' ')[0]\n
answers =0\n
frame = pd.DataFrame([titles, focus, reviews, answers],\n
index=['titles', 'focus', 'reviews', 'answers'])
# 转入数据列表DataFrame\n
frame = frame.T\n
return frame\n(2)将信息转入dataframe数据结构,并进行统计分析\n\n在构建get_info(page_url)的基础上,采用map抓取信息,并装入dataframe数据结构中。socket.setdefaulttimeout(20)\nframe_list = list(map(get_info,page_url))\ntime.sleep(10)\ni, j, k, l = [], [], [], []\n[(i.extend(x['titles'])) for x in frame_list]\n[(j.extend(x['focus'])) for x in frame_list]\n[(k.extend(x['reviews'])) for x in frame_list]\n[(l.extend(x['answers'])) for x in frame_list]\ndf = pd.DataFrame([i, j, k, l], index=['titles', 'focus', 'reviews', 'answers'])\ndf1 = df.T\nprint(df1)\n最终抓取到了800多条问题,首先对df1数据按照关注者的数量“focus”进行排序,并筛选出关注者最高的前10个问题。#统计关注前10的知乎问题\ndf1['focus'] = df1['focus'].astype('int')\ndf1['reviews'] = df1['reviews'].astype('int')\ndf2 = df1.sort(columns='focus',ascending=False)\ndf3=df2.iloc[0:10,0:2] #loc通过标签选择数据,iloc通过位置选择数据\ndf3\n得到结果为:可以看到,知乎网友关注较多的还是剧中的角色,特别是达康书记——该剧目前最火也最有话题性的人物,其次该剧一些争议性的话题,包括穿帮与硬伤等,对陆毅扮演侯亮平的演技,以及比较令人讨厌的角色(郑氏父子、林华华等)的讨论,赵东来撩妹作为近期比较火的一个话题也上了top10.\n\n(3)浏览者最多的问题对df1数据按照浏览者的数量“reviews”进行排序,并筛选出关注者最高的前10个问题。df4 = df1.sort(columns='reviews',ascending=False)\ndf5=df2.iloc[0:10,[0,2]] \ndf5\n可以看到浏览者的top10与关注者基本一致。(4)对问题的文本分析\n\n\n\n\n\n对这800多个问题进行分本分析与挖掘,以便深入分析网友提问的关注角度.titles=list(df1['titles']) #将titles列专门提取出来,并转化为列表形式\ntitles1=''.join(titles) #将列表形式转化为文本\ntitles1\nimport jieba #使用jieba进行分词\nblacklist = [u'如何', u'评价', u'人民的名义', u'应',u'是', u'也', u'上', u'后', u'前', u'为什么', u'再', u',',\n
u'以及', u'因为', u'从而', u'但', u'像',u'更', u'用', u'“', u'这', u'有', u'在', u'什么', u'都',u'是否',u'一个',u'是不是',\n
u'”', u'还', u'使', u',', u'把', u'向',u'中', u'新', u'对', u' ', u' ', u')', u'、', u'。', u';',\n
u'%', u':', u'?', u'(', u'的',u'和', u'了', u'湖南卫视', u'将', u'到', u'',u'人民',u'名义',u'电视剧',u'怎么', \n
u'从', u'年', u'今天', u'要', u'并', u'n', u'《', u'为', u'月', u'号',
u'日', u'大',u'如果',u'哪些',\n
u'看待', u'怎样', u'还是', u'应该',u'这个', u'这么',u'没有',u'这部',u'哪个', u'可以',u'有没有']\n#设置blacklist黑名单过滤无关词语\nhist = {} #将词语转入字典\nfor word in jieba.cut(titles1): #jieba分词\n
if word in blacklist: #采用黑名单过滤\n
continue\n
if len(word)&2: #去除单个字的词语\n
continue\n
hist[word] = hist.get(word, 0) + 1 #相同词语进行汇总统计\nhist\n\n根据分词结果,排序找到知乎网友提问问题中使用较多的词,这是从另一个角度分析知乎网友对《人民的名义》关注的相关点。#词频统计直方图\nzhfont = matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/msyh.ttf')\n# 对词频排序\nhist_sorted = sorted(hist.items(), key=lambda d: d[1], reverse=True)\n# 取频率最高10个词绘制曲线图\nx = range(15)\ny = [hist_sorted[i][1] for i in range(15)]\nplt.bar(x, y, width = 0.35,align='center',color = 'c',alpha=0.8)\nplt.xticks(x, [hist_sorted[i][0] for i in range(15)],fontproperties=zhfont,size='small',rotation=30)\nfor a,b in zip(x,y):\n
plt.text(a, b+0.05, '%.0f' % b, ha='center', va= 'bottom',fontsize=10)\nplt.title(u\"《人民的名义》词频分析\",fontproperties=zhfont)\nplt.ylim(0,70)\nplt.xlim(0.5,14.5)\nplt.grid()
#网格线\nplt.show()得到图形:从上图来看,书记、达康这个最火的话题仍然是提问者比较关注的,但与前边关注者统计不同的是,提问者对祁同伟的关注度较高,其次蔡成功(成功)、高育良、欧阳菁、丁义珍等人也有一定的关注度,大风集团也有一定的关注度。另外,问题中提到“现实”这个词语的有这样一些:现实中有像易学习这样的领导干部吗?现实里有几个人可以做到像李达康一样不为自己人谋福利?现实中有没有像易学习一样的基层干部?现实之中真的有像李达康这样的书记吗?现实中李达康这样的领导是否值得追随?如何看待最高检拍摄&人民的正义&取得巨大得成功?现实情况如确实如此,是否应该怒其不争?侯亮平如果在现实官场中,际遇会如何?……基本上都是将剧中人物、事件与现实对照,探究该剧现实的可能性。\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n在过滤无关词语的基础上,绘制词云图如下:#过滤不相关词,并绘制词云图\ntext = []\nfor word in jieba.cut(titles1):\n
if word in blacklist:\n
continue\n
text.append(word)\ntext1=''.join(text)\ntext1\n# 创建词云\nwordcloud = WordCloud(font_path=\"C:/Windows/Fonts/msyh.ttf\", background_color=\"black\").generate(text1)\nplt.imshow(wordcloud)\nplt.axis(\"off\")\nplt.show()\n可以看到,侯亮平、李达康等关注度较高,其次对拍摄方面有一些关注,比如镜头、手法、拍摄、好看,对受贿、贪官、行贿、利益等腐败问题关注度也比较高。另外,由于送审样片的流出,对送审的关注度也较高。(5)总结综合看来,从知乎问题关注者、浏览者的角度来看,所关注的问题基本上是目前网友也比较关心的问题,比如达康书记、陆毅的演技、讨厌的角色(郑氏父子、林华华)、赵东来撩妹、豆瓣刷一星等等。从提问者关注的角度来看,对更多的角色有所关注,比如祁同伟、高育良、蔡成功等等,另外还关注拍摄技巧、腐败问题、与现实的对照性等等。无论是关注者的角度还是提问者的角度,达康书记是最高的关注点。同时,从上述文本分析来看,由于jieba分词的精确性,在初步的文本挖掘中,还是存在着欠缺的地方,比如部分词语不完整或遗漏,这需要更精确的文本挖掘方式,比如设置《人民的名义》词库,或者采用机器学习算法来智能地深入分析。","updated":"T09:51:28.000Z","canComment":false,"commentPermission":"anyone","commentCount":2,"likeCount":7,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T17:51:28+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-4cfa29e6e1c3c5a06bf5634e7fee08f4_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":2,"likesCount":7},"":{"title":"6个套路入门ML:用鸢尾花data建立python机器学习的初步印象(一)","author":"zhou-yong-7-54","content":"注:这是一篇翻译文章,来自于\n\n\n,标题为《Your First Machine Learning Project in Python\nStep-By-Step》;即一步步带你入门第一个python机器学习项目;包括的内容有:1、python的机器学习需要哪些准备?2、导入数据3、数据的统计描述4、数据的可视化5、用一些算法进行估计6、进行一些预测。\n\n就像作者在文后说的,通过用python做这个项目,不需要知道关于机器学习的专业性内容,只需要按照python代码把结果做出来,能够分析就行。\n\n但是,我认为以机器学习之博大精深,这个项目只是管中窥豹,之所以把这篇文章拿出来,我认为它帮我们初步感受到了python机器学习的一整套基本流程,以及对机器学习的基本印象。\n\n\n\n(一)事前的准备(本教程假定Python版本为2.7或3.5。)\n\n在做机器学习之前,要安装5个库:scipy、numpy、matplotlib、pandas、sklearn\n\n这5个库主要是用来进行数值运算、计算、绘图、数据分析以及数据挖掘的库,具体每个库作用及其安装可以去网上搜索就知道了,这点作者也在文中说了一下。\n\n值得注意的是python3版本在windows系统下安装scipy,需要去网站:\n\n,下载whl文件,然后再去安装。\n\n但是,在这之前,由于Scipy的安装需要依赖MKL库,官方的Numpy不包含MKL,故从 下载合适版本的包含MKL库的第三方Numpy+mkl库,然后在cmd下进入到Python安装目录下的scripts文件下使用 pip\ninstall 路径+whl文件来安装(具体可以去搜索一下)。\n\n对于sklearn库的安装,如果你已经安装了scipy、numpy库,直接在cmd下采用升级的方式安装,这是因为sklearn建立在NumPy,SciPy和matplotlib模块之上:\n\npip install -U scikit-learn\n\n检查安装的库是否成功及其版本# Check the versions of libraries\n# Python version\nimport sys\nprint('Python: {}'.format(sys.version))\n# scipy\nimport scipy\nprint('scipy: {}'.format(scipy.__version__))\n# numpy\nimport numpy\nprint('numpy: {}'.format(numpy.__version__))\n# matplotlib\nimport matplotlib\nprint('matplotlib: {}'.format(matplotlib.__version__))\n# pandas\nimport pandas\nprint('pandas: {}'.format(pandas.__version__))\n# scikit-learn\nimport sklearn\nprint('sklearn: {}'.format(sklearn.__version__))\n(二)导入数据导入库# Load libraries\nimport pandas\nfrom pandas.tools.plotting import scatter_matrix #导入散点图矩阵包\nimport matplotlib.pyplot as plt
\nfrom sklearn import model_selection
#模型比较和选择包\nfrom sklearn.metrics import classification_report
#将主要分类指标以文本输出\nfrom sklearn.metrics import confusion_matrix #计算混淆矩阵,主要来评估分类的准确性\nfrom sklearn.metrics import accuracy_score #计算精度得分\nfrom sklearn.linear_model import LogisticRegression #线性模型中的逻辑回归\nfrom sklearn.tree import DecisionTreeClassifier #树算法中的决策树分类包\nfrom sklearn.neighbors import KNeighborsClassifier #导入最近邻算法中的KNN最近邻分类包\nfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis #判别分析算法中的线性判别分析包\nfrom sklearn.naive_bayes import GaussianNB #朴素贝叶斯中的高斯朴素贝叶斯包\nfrom sklearn.svm import SVC
#支持向量机算法中的支持向量分类包\n上述导入各种程序包主要来自于sklearn的包,具体可以参见\n对python机器学习中sklearn各种包的介绍。接下来再导入数据。# Load dataset\nurl = \"https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data\"\nnames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']\ndataset = pandas.read_csv(url, names=names) #读取csv数据\n注:这里是从某一网页导入数据,但是如果网页打不开很可能就导入不了,事实上,在python的sklearn数据库中自带鸢尾花数据集,在这里可以通过sklearn导入。from sklearn import\ndatasetsiris = datasets.load_iris()(三)数据的描述性统计这一步主要是对数据的结构、变量等进行初步了解,包括对数据的维度(样本量、变量个数等)进行了解、详细考察数据本身、所有属性的描述性统计、按照不同类别对数据进行细分。\n\n\n\n\n\n首先是对数据的维度(样本量、变量个数等)进行了解。# shape\nprint(dataset.shape)\n\n输出结果为:(150, 5),即该数据有150个样本值以及5个变量(属性)。\n\n其次是详细考察数据本身。# head\nprint(dataset.head(20))\n你将会看到前20行数据:通过数据信息简单介绍一下注明的“鸢尾花数据集”:鸢尾花(iris)是数据挖掘常用到的一个数据集,包含150种鸢尾花的信息,每50种取自三个鸢尾花种之一(setosa,versicolour或virginica)。每个花的特征用下面的5种属性描述萼片长度(Sepal.Length)、萼片宽度(Sepal.Width)、花瓣长度(Petal.Length)、花瓣宽度(Petal.Width)、类(Species)。\n\n\n\n第三是,数据所有属性的描述性统计。# descriptions\nprint(dataset.describe())\n可以看到如下结果,分别表示4个属性的样本值、均值、标准误、最小值、25%分位数、中位数、75%分位数、最大值。第四是,不同类别的数据细分。# class distribution\nprint(dataset.groupby('class').size())\n可以看到,Iris-setosa、Iris-versicolor、Iris-virginica三大类样本值均有50个。(四)数据的可视化数据可视化可以更好地了解数据。在这里通过两种图形类型:单变量图来更好了解每个属性;多变量图来更好了解每个属性间关系。4.1 单变量图首先是盒须图(箱形图)# box and whisker plots\ndataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)\nplt.show()\n在这里注意各个箱形图的纵坐标(y轴)的刻度是不同的,有明显的区分,因此可以看到,各变量表示的属性是有区分的。然后是直方图# histograms\ndataset.hist()\nplt.show()\n在这里横坐标的坐标轴是有区分的。4.2 多变量图(也就是图矩阵)\n\n\n\n散点图矩阵,这有助于发现变量之间的结构化关系,在这里特别要注意观察两变量间(变量对)基于对角线的关系,这表明变量之间的相关性与可预测关系(散点图代表了两变量的相关程度,如果呈现出沿着对角线分布的趋势,说明它们的相关性较高)。# scatter plot matrix\nscatter_matrix(dataset)\nplt.show()\n未完待续。。。","updated":"T08:13:09.000Z","canComment":false,"commentPermission":"anyone","commentCount":1,"likeCount":3,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T16:13:09+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-2b4475cabd_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":1,"likesCount":3},"":{"title":"6个套路入门ML:用鸢尾花data建立python机器学习的初步印象(二)","author":"zhou-yong-7-54","content":"(五)用一些算法进行估计\n\n重点地方到了,机器学习开始发挥作用了。\n\n这部分包括:1、对数据集进行分离(分为训练集、验证集等);2、采用10倍交叉验证设置测试机制;3、根据鸢尾花测量维度构建5种不同模型来预测其种类;4、选择最佳模型\n\n5.1 建立验证数据集\n\n建立验证数据集的目的是寻找我们所建立的模型中最优者,因此我们需要一部分与机器学习算法独立的数据集,从而采用一些统计方法对这部分未知数据进行评估,以判断我们使用的估计模型的准确性,我们将把加载的数据集分为两部分,其中80%将用于训练我们的模型,20%将被用作验证数据集。# Split-out validation dataset\narray = dataset.values #将数据库转换成数组形式\nX = array[:,0:4] #取前四列,即属性数值\nY = array[:,4] #取最后一列,种类\nvalidation_size = 0.20 #验证集规模\nseed = 7\nX_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed) #分割数据集\nX_train and Y_train就是训练集,X_validation and\nY_validation就是验证集。5.2 测试机制采用10倍交叉验证来评估模型的准确性。通过把我们的数据集分为10份,其中9份用于训练,1份用于验证,并重复训练分组的所有组合。# Test options and evaluation metric\nseed = 7\nscoring = 'accuracy'\n我们设置scoring变量对所构建的每个模型进行评估,其中accuracy用以评估模型的一个度量值,它等于模型正确预测实际数据的数量/数据集中所有数据总数,这一比率乘以100%(比如95%的精确度)。5.3 构建模型在不知道哪种算法最好的条件下,根据图形可以看到某些类在某些方面是部分可线性分离的,因此,我们期望一般意义上的好结果。\n\n\n\n\n\n在这里采用6种算法:逻辑回归(LR)、线性判别分析(LDA)、K最近邻(KNN)、分类和回归树(CART)、高斯朴素贝叶斯(NB)、支持向量机(SVM)。这里综合了简单线性(LR和LDA),非线性(KNN,CART,NB和SVM)算法,我们在每次运行之前重置随机数种子,以确保使用完全相同的数据隔离来执行每个算法的评估,以确保结果直接可以比较。# Spot Check Algorithms\nmodels = [] #建立列表\nmodels.append(('LR', LogisticRegression())) #往maodels添加元组(算法名称,算法函数)\nmodels.append(('LDA', LinearDiscriminantAnalysis()))\nmodels.append(('KNN', KNeighborsClassifier()))\nmodels.append(('CART', DecisionTreeClassifier()))\nmodels.append(('NB', GaussianNB()))\nmodels.append(('SVM', SVC()))\n# evaluate each model in turn\nresults = []\nnames = []\nfor name, model in models: #将算法名称与函数分别读取\n\tkfold = model_selection.KFold(n_splits=10, random_state=seed) #建立10倍交叉验证\n\tcv_results = model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring) #每一个算法模型作为其中的参数,计算每一模型的精度得分\n\tresults.append(cv_results)\n\tnames.append(name)\n\tmsg = \"%s: %f (%f)\" % (name, cv_results.mean(), cv_results.std()) \n\tprint(msg) \n5.4 选择最优模型通过运行,得到每个模型的评估精度:LR: 0..040825)LDA: 0..038188)KNN: 0..033333)CART: 0..038188)NB: 0..053359)SVM: 0..025000)可以看到KNN的估计精度最高,括号内为估计结果的标准误。我们还可以绘制模型评估结果的图形,并比较每个模型的差异和平均精度。\n每个算法有一个精确度量的群体,因为每个算法被评估10次(10次交叉验证)。# Compare Algorithms\nfig = plt.figure()\nfig.suptitle('Algorithm Comparison')\nax = fig.add_subplot(111)\nplt.boxplot(results)\nax.set_xticklabels(names)\nplt.show()\n得到:算法比较的箱形图,可以看到每个算法精度的上沿基本贴着1,表明模型估计精度较高。6、预测在得到KNN算法为测试中最佳模型的基础上,现在我们想了解验证集上模型的准确性。我们将对该算法进行独立性的终极检验,在这里设置验证集的作用体现出来了,以防止训练过程中的失误,比如训练集体过度拟合或者数据遗漏,两者都将导致过于乐观的结果。我们可以直接在验证集上运行KNN模型,并将结果总结为最终准确度得分,混淆矩阵和分类报告。我们可以看到准确度是0.9或90%。 混淆矩阵提供了三个错误的指示。 最后,分类报告通过精确度,召回率,f1得分和支持显示出优异的结果(授予验证数据集很小)提供每个类别的细目。# Make predictions on validation dataset\nknn = KNeighborsClassifier()\nknn.fit(X_train, Y_train) #knn拟合序列集\npredictions = knn.predict(X_validation) #预测验证集\nprint(accuracy_score(Y_validation, predictions)) #验证集精度得分\nprint(confusion_matrix(Y_validation, predictions)) #混淆矩阵\nprint(classification_report(Y_validation, predictions)) #分类预测报告\n输出以下结果:0.9[[ 7
9]](混淆矩阵每一行代表实际类别,每一列代表预测的类别,因此有三个类别,第一行表明类别1的7个被全部预测准确,第二行类别2的12个有11个预测准确,另一个被预测到了类3中;第三行则是11个有9个预测准确,2个杯预测到了类别2,基于此,下边就计算了分类预测精度的报告)
recall \nf1-score
supportIris-setosa
7Iris-versicolor
12Iris-virginica
11avg / total
30简单介绍一下混淆矩阵:混淆矩阵(confusion matrix),又称为可能性表格或是错误矩阵。它是一种特定的矩阵用来呈现算法性能的可视化效果,通常是监督学习(非监督学习,通常用匹配矩阵:matching matrix)。其每一列代表预测值,每一行代表的是实际的类别。这个名字来源于它可以非常容易的表明多个类别是否有混淆。最后一行是用support 加权平均算出来的,如0.90= (7*1.00+12*0.85+11*0.86)/ 30总结:通过本文你就可以使用python进行机器学习,基于上面教程,最多需要5到10分钟。根据上面初步的python机器学习,,笔者认为,完成上面的内容,并不需要你掌握关于编程、机器学习的一切内容:你不需要了解一切。(至少不是现在)你只需按照教程输入代码并运行,得到结果,你暂时并不需要了解一切,大量使用Python中的帮助(“FunctionName”)来了解您正在使用的所有功能。你不需要知道算法如何工作。了解选取和如何配置机器学习算法很重要。但是学习算法可以稍后再来。您需要在很长一段时间内慢慢地建立这个算法知识。今天,从平台开始吧。你不需要是Python程序员。如果您是新手,Python语言的语法比较直观的。就像其他语言一样,这样可以让你大部分时间专注于函数调用(例如函数())和赋值(例如a =“b”)。若你是一个开发人员,你知道如何真正快速地掌握语言的基础知识。稍后开始深入细节。您不需要成为机器学习专家。您可以稍后了解各种算法的优点和局限性,还有很多帖子可以以后阅读,以了解机器学习项目的步骤,以及使用交叉验证评估准确性的重要性。机器学习项目中的其他步骤如何。我们没有涵盖机器学习项目中的所有步骤,因为这是您的第一个项目,我们需要关注关键步骤。即,加载数据,查看数据,评估一些算法并做出一些预测。在后面的教程中,我们可以查看其他数据准备和结果改进任务。\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n这也是本文的初衷。本文完整代码见:","updated":"T08:31:15.000Z","canComment":false,"commentPermission":"anyone","commentCount":0,"likeCount":1,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T16:31:15+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-2b4475cabd_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":0,"likesCount":1},"":{"title":"为什么plotly被称为“有史以来最牛逼”可视化神器?","author":"zhou-yong-7-54","content":"Plotly,一个用于做分析和可视化的在线平台,曾被网友称为“有史以来最牛逼”可视化神器(具体无从考据,只是在搜索资料时看到的),为何有如此称号?因为它功能强大,功能强大,功能强大!重要的事情说三遍!\n\n
其功能强大到不仅与多个主流绘图软件的对接,而且还可以像Excel那样实现交互式制图,而且图表种类齐全,并可以实现在线分享以及开源,等等;这种功能强大到还没有一个人能够完全掌握其全部应用,甚至国内对它的介绍使用也仅仅只是其中一部分。接下来笔者对plotly的一些隐藏功能进行介绍,并部分以python的使用来简单说明。\n\n\n\n(一)关于Plotly的功能\n\n
关于Plotly的功能介绍,有的从图表类型上:基本图表:20种;统计和海运方式图:12种;科学图表:21种;财务图表:2种;地图:8种;3D图表:19种;拟合工具:3种;流动图表:4种。。。。。\n\n有的从交互性上:可以与R、python、matlab等软件对接,并且是开源免费的,对于Python,Plotly与Python中matplotlib、numpy、pandas等库可以无缝地集成,可以做出很多非常丰富,互动的图表,并且文档非常健全,创建图形相对简单,另外申请了API密钥后,可以在线一键将统计图形同步到云端。。。。\n\n有的从制图的美观上:基于现代的配色组合、图表形式,比matpltloa、R语言的图表,更加现代、绚丽。。。。\n\n即便如此,尚不能完全概括其功能,比如在图表类型上,除以上所说,由于其开源性,plotly上还有很多网友上传的自制图表,在plotly主页( )点击try free\nedition,在不登录的情况下(出来的log in 对话框点X),就会看到很多网友分享的图表,并且可以看到其代码,如下图:图1这是一个不同国家回答“人类是否早期动物物种”的“yes”回答数量,但它不属于基本图形,因为其中一个柱子进行了颜色标注。我们点击该图形,在不登陆的情况下,就可以看到制作该类图形的api接口,根据它我们就可以模仿做出来该图形。如图,其中data是该图形的数据表格,code则是不同软件api接口代码。另外,plotly可以像excel那样进行交互式制图,在 点击make a plot,就会进入plotly在线绘图编辑工作台,如图:图2在Grid1下边的表格中可以输入数据,在左边可以进行图形类型、变量选取,以及图形修饰等等工作,其中style就是对图形的图层、图例、标题、坐标轴等等内容的互动式美化;analysis则是对图形进行一些统计检验与分析,比如描述性统计、t检验、卡方检验、线性拟合、移动平均等等;JSON则是一些图形要素的json数据展示。在登陆的情况下,将绘制图形保存后,可以进行导出与分享,分享之后你就可以看到不同软件api的代码。下图就是使用style的功能对绘制完成的图形进行(trace、title等方面)美化。另外\n,可以看到图中有个上方一行import按钮,点击进入,可以从这个按钮中导入excel、csv、SQL、URL等储存方式的数据。图3(二)关于Plotly的python使用在Plotly网站,点击Python软件类型选择件就可以进入专门使用python的主页( ):图4
左侧一列是导航,包含如何开始使用,使用说明,离线使用以及于其他库结合使用,还有例子,正文中下边就是各种图形,需要用哪种图形就可以点击进去寻找代码。特别说明的是:Plotly需要注册之后,并将注册名与密码放入代码里才能使用。在Python使用plotly,首先要安装plotly库,在Plotly——getting\nstart里有说明:安装方法pip install\nplotly
sudo pip install plotly需要升级的话,可以输入:pip install\nplotly –upgrade注册,在python交互环境下运行以下初始化命令,生成认证的安全文件 .plotly/.credentials。py =\nplotly.plotly(\"Username\", \"API-Key\")(三)Plotly for python 的案例\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Plotly for python 的案例,目前网上已有很多人分享,在这里不再赘述。在这里只是以一个简单案例介绍Plotly for python 的一些隐藏功能。以散点图为例:import plotly.plotly as py\nimport plotly.graph_objs as go\n\n# Create random data with numpy\nimport numpy as np\nN = 100\nrandom_x = np.linspace(0, 1, N) #建立0与1之间的等差数,1\nrandom_y0 = np.random.randn(N)+5 #均值为5的正态分布随机数\nrandom_y1 = np.random.randn(N)\nrandom_y2 = np.random.randn(N)-5#均值为-5的正态分布随机数\n# Create traces\ntrace0 = go.Scatter(\n
x = random_x,\n
y = random_y0,\n
mode = 'markers',\n
name = 'markers') #构造散点图线条1\ntrace1 = go.Scatter(\n
x = random_x,\n
y = random_y1,\n
mode = 'lines+markers',\n
name = 'lines+markers')\ntrace2 = go.Scatter(\n
x = random_x,\n
y = random_y2,\n
mode = 'lines',\nname = 'lines')\ndata = [trace0, trace1, trace2]\npy.iplot(data, filename='scatter-mode') \n生成图形如下:图5 这就是三条不同的线条,一条是点,一条是点+线,一条是线;从这个案例我们可以看出:(1)plotly是以图中每一个元素作为一个函数进行设置的,而不是像matplotlib放在一个大函数下统一进行参数设置;如本例中的trace0、trace1、trace2,在里边也可以设置其图形形状(mode)、图例(name)的值;(2)出来的图形是交互式的,还可以进行选择以及再编辑,如图右上角是图形范围操作的一些按钮,右下角是进入在线编辑工作台的按钮;(3)进入在线编辑工作台后,出现如图2类似的界面,这时候可以对图形进一步美化,比如加背景,标题、坐标轴等等,有很多类似的操作,但在这里要注意有的操作是免费的,有的操作是要付费才能使用的。(4)再做一些修改之后,在登陆的情况下,保存修改后的图形,然后在个人主页上的my profile中点击view就可以预览你所制作的图形,此时你所手动操作的一些修饰也会以代码的形式展示出来,并且是以不同R、python、matlab等软件展示出来,当你不会以输入代码的形式进行图形美化的时候,这种方式会给你以提示!!(5)可以将你的图形以pdf、ppt、png等等格式下载下来,可以将数据下载到csv、sql等储存中,也可以将你的图形在facebook、推特、github等等地方分享,如果你有账号的话。。。如图,我在plotly工作台上给图形加了一个大标题以及背景之后;图6在code-python下会自动看到我的手动操作对应的python代码:data = Data([trace1, trace2, trace3])\nlayout = {\n
\"font\": {\"size\": 13}, \n
\"paper_bgcolor\": \"rgb(188, 189, 34)\", \n
\"plot_bgcolor\": \"rgb(255, 255, 255)\", \n
\"title\": \"zjying scatter\", \n
\"titlefont\": {\n
\"color\": \"rgb(68, 68, 68)\", \n
\"size\": 21\n
\"xaxis\": {\n
\"autorange\": True, \n
\"range\": [-0., 1.], \n
\"type\": \"linear\"\n
\"yaxis\": {\n
\"autorange\": True, \n
\"range\": [-9., 8.], \n
\"type\": \"linear\"\n
}\n}\nfig = Figure(data=data, layout=layout)\nplot_url = py.plot(fig)\n另外,plotly还可以对接pandas包,可以通过pandas的pd.read_csv()命令导入csv格式数据。总之,从以上一个小小案例,可以看到plotly的强大之处,在于无时无刻不交互——对接各种绘图软件、数据库,可以像excel一样对图形进行编辑,可以线上分享也可以学习各种各样的个人定制图表,可以下载成各种常用的输出形式。不过由于plotly是国外网站,网站打开速度有时候会慢,另外,免费版本的potly功能有的地方一些限制,但是能满足一般需求。","updated":"T11:46:28.000Z","canComment":false,"commentPermission":"anyone","commentCount":1,"likeCount":1,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T19:46:28+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":1,"likesCount":1},"":{"title":"学爬虫先学什么?写给小白的python爬虫入门方法论","author":"zhou-yong-7-54","content":"编者注:这是笔者基于自身在入门python爬虫一些感悟,而写作的——入门小参考或建议。本文没有过多讲述学习爬虫需要哪些库或代码,而是期望为初学者提供一些爬虫思维或方法论,从而快速入门。不过,每个人的基础不同,这仅是一家之言,希望大家能有所收获。\n\n (1)我们并不缺少python爬虫的各类教程\n\n学爬虫先学什么?有人说是编程,对也不对。对的是爬虫也是以一定的编程语言为基础的,对于连编程都不是很熟悉的纯小白来说,建议你去从编程学起。\n\n不对,是因为对于已经有些编程基础的爬虫小白来说,学习到python爬虫的编程套路,你也不一定会真正了解爬虫,灵活运用。\n\n事实上,我们并不缺少python爬虫的各类教程,在网络上搜索,文章、视频,比比皆是。什么“十分钟教会你用python爬取网页”,“**行代码就能让你学会爬虫”,“零基础爬虫速成指南”,还有scrapy框架的爬取策略,甚至根本不需要懂代码的爬虫工具等等。\n\n各种爬虫实战的文章、案例、全程代码等等,也如漫天星斗,数不胜数,有的爬豆瓣、知乎、大众点评,有的爬淘宝、京东、58同城,有的爬微信、博客、论坛等等。。\n\n在基础教材足够的条件下,貌似我们分分钟就可以学会爬虫,但是,事实如此吗?\n\n(2)我曾经的学习困惑:会模仿但不会应用\n\n编程最好的一个学习方式就是模仿。\n\n我也曾经基于案例或实战去学习python爬虫,比如Urllib库、模拟浏览器、正则表达式、Beautiful Soup的用法等等。\n\n但是,我学过n个案例之后还是很困惑,我学会了爬豆瓣,但我只能爬豆瓣,我学会了爬百度贴吧,也只会爬百度贴吧,我只能会一个案例就只会爬一个网站,世上网站千千万,换了一个陌生网站,我却不知道如何抓取信息。\n\n我只会模仿别人的程序模式,却不会融会贯通。\n\n我知道Urllib库是用来向网页发出请求,并实现解析,我知道增加headers以及一些代理来应对反爬机制,使用Beautiful Soup、Xpath以及正则表达式来在解析文本中搜索、抓取具体信息…..但我不知道,换了另一个网页,在茫茫的文本中,我所需要的信息(名称、标签)等等,如何定位到,如何去掉多余信息,精准抓取出来?\n\n就像下面两个图,左边是淘宝某件服装的信息(非广告,仅是举例),右边是该网页的编码,我们在解析完网页之后,如何把139.00的价格抓取出来?即便我们可以用简单的find()函数把它找出来,那万一这个网页中还有另外一个139.00元的商

我要回帖

更多关于 tplink无线路由器升级 的文章

 

随机推荐