辽宁职业学校crp有crp了是否还需要数据中心

(window.slotbydup=window.slotbydup || []).push({
id: '4016718',
container: s,
size: '800,80',
display: 'inlay-fix'
从单机房到多单元,“同城双机房”、“异地双活”,再到“异地多活”(第三个点距离1000公里以上)。阿里巴巴技术保障部毕玄详解面对距离带来的延时和数据一致性的挑战,以及没有先例可以学习交流时,如何来突破?
来源:CSDN
毕玄,2007年加入阿里,到现在已经8年时间。其中,年在淘宝平台架构部负责HSF的设计和实现,2011年在数据平台部负责Hbase改进和落地,2012年在核心系统部负责淘宝虚拟化产品和技术,2013年到技术保障部,专注于应用可维护性、稳定性、软硬结合,主要负责能容量架构、异地多活项目(以确保当故障出现时快速恢复)和研究如何通过软件来降低总体成本(硬件是另外一位保障部门同事负责)。
在他看来,当阿里集团的双十一规模越来越大,与平时量差距越来越多时;当因双十一而产生的投入成本越来越高,且不可控因素提升时;当数据已经积累到绝对的时&&,如何减掉双十一的峰值投入成本?如何计算出更多的数据价值?是技术保障部门所要重点考虑和实践的。而实践成果已有很多,其中最夺目的是&三活&。
记者:2015天猫双十一指挥部将移师北京,但作战部还在杭州。对技术保障部有影响么?你在其中会负责什么?
毕玄:影响不大。我现在负责技术保障性能架构团队,今年负责的最重要的项目就是多活,去年我们做到了异地双活(详见阿里超大&异地双活&实践),今年是异地三活。和去年双活相比,今年最大变化是去年两个点相隔的距离比较近,今年第三个点距离非常远(1000公里以上)。我们真正从比较近的异地,走到了更远的异地,也证明我们在全国范围内已经可以选任意点部署阿里交易系统。从技术来看,2到3是质的变化,挑战极大。而未来从3到4,相信就会比较顺畅了。
记者:从&两地三中心&、&同城双活&到&异地双活&,这方面的尝试很多企业都在做。但&三活&很少。分享下其中遇到的困难和挑战?
毕玄:除了我们,确实还没有看到国内其他企业做出&三活&。挑战很多,也很大。第一大问题就是距离带来的延时问题,去年双活的情况下两点的延时是在10毫秒以内,今年的距离物理延时会比去年多好几倍。我们的系统是一个巨大的分布式系统,访问任何一个淘宝的页面,其实背后的交互都在上百次,单点延时再乘上这个倍数,如果不能很好的解决延时问题,说不定用户连页面都打不开,更不要说双十一那么高的访问量的情况下。所以延时问题是多活中一定要解决的核心问题。因为随着距离越远这个问题会越大,去年的距离不算太远,有些问题没有足够的暴露出来。而在今年在建设另外一个较远的点的时候,就已经看到去年忽视的某些问题被再次放大出来,必须解决。
第二大问题是数据一致性。活和以前金融行业的冷备做法不一样,冷备其实只有一个数据库是可写的,因为只有一个点是可以写的,保证了数据不会错乱。多活以后则变成多个点都可以写,如果两个点同时写了一个用户的同一行数据,那这个时候就无法判断合过来的时候,到底哪边的数据是对的,这是一个很大的问题。阿里平台上都是交易,和社交及搜索都不一样,因为涉及到资金,任何错误都会影响用户信任。
所以在多活实践中,延迟问题相对可控,也许只是用户响应时间从1秒变成3秒,影响体验,但数据一致性是最要保住的点,因为这影响信任。当然我们希望都能保证。
实际上,去年双活中已经积累了很多经验,但双活数据复制的复杂程度比多活要低,因为两点是对等的,两边都100%,为了能够切走,流量可以从这个中心切到另外一个数据中心去。但是在三点的情况下一定不是这样的,一定会变成不对等的状况,数据复制的逻辑就更加复杂,所以我们做了很多架构设计和开发工作,并且已经很好解决这些困难了。
记者:刚提到双活没有暴漏出的问题,还有哪些?
毕玄:主要解决延时问题,尽管去年用户层面感知不到,但今年距离变长,延时会增加好几倍。比如测试阶段向第三个点引流的时候,我们发现某些功能点明显不能用,会超时。解决这个问题的方法就是尽量避免跨数据中心调用,我们就通过工具软件分析,比如你访问这次页面背后要交互100次,这100次交互有多少次是要跨出数据中心去访问的,然后再做应用调整,确保用户单次操作背后的所有调用都在同一个数据中心内。因此解决延时问题的挑战不在于技术难度,而在于技术的复杂度,因为会涉及的几百甚至上千个系统,要通过有效的工具和反复的演练确保没有遗漏。
记者:多系统演练一向是双十一技术预案的重点(去年双11,阿里准备500多套技术预案,前年是2000多套)。今年的多活演练已经完成?
毕玄:多活搭建远早双十一,基本在双活完成以后我们就开始做多活的规划了。刚才介绍,延时最大的问题在于一个页面展现的过程中有多少次在跨出数据中心去访问,需要强大的系统而不是靠人解决,所以我们不仅靠预案,更要靠精密的雷达系统,这套系统实时告诉我们那些调用跨机房了。然后再由经验非常丰富的工程师介入分析,为什么会出现跨机房调用,怎么解决。简单的情况只需要做一下部署,复杂的情况就需要认真分析怎么处理数据。
对于异地多活架构,在双十一当天不会因为延时去启动预案,必须在双十一之前就要把这些问题全部解掉。在阿里,我们现在已经不太谈灾备的概念了,而是通过多活的架构保障高可用性,原因是灾备主要靠冷备,真的出现问题的时候,基本没人敢做切换的决策,因为不知道切换一次要多久,也不知道切过去能不能用,一旦切换也不能恢复业务,那就悲剧了。但异地多活架构不一样,因为每个数据中心都一直在提供服务的,我们现在每天都可以根据业务需要,在多个数据中心之间调度淘宝的流量,我今天中午来之前就刚刚做过一次切流。但我们的动作,用户是不会有任何感受的。所以对多活架构来说,我们能做到如果一个数据中心出问题,就敢把流量直接全部迁走。
实际上,双活2014年8月就完成了,也成功了支撑了去年的双11,三活其实也跑了很久了,基本没有什么问题。我们很早就启动了今年的双11技术准备,包括数据中心布局、软件重构等,都已经落地并作了多次演练,现在主要是打磨细节。
记者:具体技术细节举例分析下?
毕玄:保证数据一致性,多点同时写就必须把数据库做切片,确保这个用户在这个时间必须写入这个数据中心,保证逻辑正确不变。但要确保这件事的发生,我们在技术上做了多层保护。首先,一个用户的流量进来后会有很多应用层,每一层都有可能进来之后可能进到不同数据中心,我们在每一层都做好拦截保护,每一层都看看你是不是应该在这一层,如果不在的话我们就把你引到正确的一边,即使你进来的时候访问错了,比如你应该在B数据中心,但是你进到A的数据中心去了,但当你访问一个页面,你进来我们会发现你不在这个数据中心,就会把你跳过去。其次,容易引发数据错乱的另一个原因是多活的情况下如果要做到可以切流量,就意味着我的每个数据中心一定会有数据的冗余,那在一定冗余的情况下怎么来保证。为什么双活的情况下问题会更加简单,是因为双活两边数据中心是对等的,就不会循环复制。但在三活的情况下则要注意避免这个问题,保证数据复制的方向正确、路径正确,我们会层层保护用户数据写入正确的数据中心。
第三,切流量的过程也需要注意,避免数据错乱。如果没有控制好这个过程,你认为在那个数据中心还继续写,事实上那个数据中心已经不用了,这个时候永远看不到你的数据。怎么保证这个过程一定不会出问题?分布式系统的整个切换过程是非常复杂的,意味着层层都要感应到这一次切换,如果没感应到可能出问题,也可能不会出问题,我们为了做到数据保护在背后做了很多的事情。我们会检查每个点的数据是不是符合我们想要的规则,假如我希望这个数据中心有一定百分比的数据,还有可能是特定用户的数据,那我们都会去检查,如果你合适的话,那我们会立刻知道是有问题的。除了数据检测之外还会做业务层面的检查,如果发现你在A数据中心和在B数据中心买的两个东西的价格是不一样的,同等的两个身份的人,如果两个点看到的价格是不一样的,显然是有问题的。我们从业务层面以及本身数据层面都会做这些处理。
记者:雷达系统和监控监测系统是基于什么开发的?
毕玄:雷达系统和监控监测系统不基于任何平台,没有任何外部的系统,就我们纯粹自研的系统。雷达系统是阿里自研的eagleeye。eagleeye和监控监测系统都是基于Java自研的。为什么对阿里而言,双活和多活都是大的技术挑战。就是因为淘宝之前的架构改造是有一定参考对象的。但在双活和三活改造中,我们碰到的所有的问题都是没有参考对象的,只能靠自研的,在自研的过程中碰到问题知能自己解决,开源软件都不涉足这个领域。
记者:从规模和复杂度来说,谷歌、Facebook是否有相关经验?
毕玄:谷歌、Facebook在多活架构上面临和我们一样的挑战。但阿里的业务类型要比社交和搜索都复杂。对社交而言,一个用户的数据其实都是你用户之间相关的数据,但是一个电商网站数据的特征是除了你自己的数据以外,比如我访问淘宝除了我自己的数据以外,我需要知道商品的数据,知道卖家的数据,而社交并不需要如此,所以他们可以采用异步,而延时对异步是没有影响的,但是对同步就是很大的挑战。但交易网站,整个过程必须同步的,因为只要不同步,这个用户就丧失购买兴趣了。比如你拍一个东西,点了购买,告诉你要稍等一下让我后面确认一下,然后我再给你展示,你再来买,用户立刻就不买了。
记者:要实现双活或者多活的技术朋友们分享下你的经验?
毕玄:做这件事情我们用了三年,从单机房到多单元,到同城双机房,到异地双活,再到今年异地多活,整个投入非常巨大,而且要有很好的节奏控制。毕竟,这对于我们来讲,是为一个飞行的飞机换引擎的过程,在做这么大规模的架构改造的同时,不能对业务有任何影响。异地多活,确实会影响数据中心的布局,所以随着变化要控制好节奏。技术经验方面,要有强大的分析系统来控制延时问题,如果连跨出去多少都不知道,是无法处理的。此外,业务方面,如果要做到在本地的数据中心完成动作,一定意味着除了访问之外,怎么让依赖的数据尽可能在本地。
记者:可以再详细展开下?
毕玄:也许我们前一轮的架构改造对更多企业有更多的意义。异地双活除了数据中心、网络层,软件层面的技术投入也是巨大的。因为其不是一个通用方案,而是结合业务所做的动作,这就需要原有的基础软件都要改造才能支持。所以人力和投入都是很大的技术改造。对很多规模略小的企业而言,在业务没有迫切需求的时候,异地双活只是需要关注的方向。而同城双活比较现实,意义也更大。因为很多创业公司最害怕的是服务不可用,比如之前滴滴快的打仗的时候就很明显,一旦一家出现服务问题,用户量很快就会飘移到另一家。好多情况为了打这一仗前期已经投入了很多市场的费用,钱已经花出去了,结果&军火&(技术平台能力)不够。在同城双活的时候,地址访问是要特别重视的问题。两个机房之间的交互,以前的简单方案是我要访问什么系统,就用一个地址去访问的,但在双活的架构架构,地址访问绝对不能出现,因为一旦出现就意味着我切不了,所以这些地方全部都要改造,把跟地址相关的部分被收拢到系统里,这个切换系统是可以全部操作的。像这种项目中最大的其实不是一个技术难度问题,而是一个复杂度的问题,因为当要做这个事情的时候,通常意味着这家公司有一定的规模了,肯定不是一开始就做了。当你有了一定的规模的时候,意味着各种现象都已经出现了,怎么把所有的现象全部解决掉,这是一个最复杂的问题。我们以前做同城双活也花了很长的时间,是经常演练的,我们是靠演练证明我们是可以的,演练了非常多次才成功。
阿里云上的持续交付平台(CRP,Continuous Release Platform)
记者:未来会不会将这些开发的系统和经验能够变成标准化产品在云平台上输出?
毕玄:云栖大会上会看到持续交付平台(CRP,Continuous Release Platform),供软件生命周期全环节服务。包括项目管理,需求管理,缺陷管理,代码托管,开发环境管理,全量构件库管理,持续交付流水线,构建管理,依赖管理,测试管理,一键部署,监控管理,团队协作等功能,就是从开发一直到上线整个过程的云产品。我们的思路不是对外输出一份文档或者讲一个PPT,而是将所有的变成云产品去对外输出,持续交付是其中的一个。而异地多活中,为了保证多点数据同步以及解决时延的自研产品,已经变成阿里云的商业产品&&DTS数据传输。我们会慢慢将这些内部已经经过大规模验证过的技术逐步变成云产品对外部的用户开放。实际上,在我们从同城双活走向异地多活中,基本将所有软件都全部改造了一轮,其中也添加了很多基础产品,如DTS,还有内部服务、系统交互、消息服务,都已经在云上。所以对用户而言,不用向我们一样自己摸索在改造,而是直接可以选择这些能够达到异地多活的产品,难度会降低很多。
马上就是双十一,期待阿里巴巴技术保障及其他技术部门更多的精彩分享,也期待更多电商企业的技术实战分享。
关注中国IDC圈官方微信:idc-quan或微信号: 我们将定期推送IDC产业最新资讯
近年来,安全问题一直在IT行业频繁发生,WannaCry ransomware数据窃取事件发生在英国国家医疗服务系统(NHS)和"发薪日贷款公司Wonga",这让人们感到不安,因为传统的安全
数据中心最重要的是要完善和建设10Gb、40Gb甚至是100Gb以太网的设施基础。软件定义网络(SDN)一直都是网络领域里的热门话题。SDN的最大好处是有可能节约网络的总拥有成本
以中心地区带动发展已经成为我国目前培育经济新动能的主要方,向记者从多个部门了解到,以北京、上海等大城市为主,我国部署了多批国家大数据中心、国家科学中心、国家制造
7月12日,苹果宣布将投资10亿美元在贵州建立其在中国的首个数据中心,也是目前投资贵州云计算大数据行业最大的海外公司。
腾讯云今日宣布新增国内2大数据中心:成都第二个数据中心、广州第四个数据中心。6月13日,腾讯云宣布开放了成都第一个数据中心,今日成都二区开放之后,国内互联网云计算服
热门会议:
我们的服务: 上传我的文档
 上传文档
 下载
 收藏
粉丝量:107
IT专业技术人员,擅长IT专业及教育培训相关工作
 下载此文档
浅谈基于CRP系统的本土化建设思考
下载积分:633
内容提示:浅谈基于CRP系统的本土化建设思考
文档格式:PDF|
浏览次数:3|
上传日期: 11:17:25|
文档星级:
全文阅读已结束,如果下载本文需要使用
 633 积分
下载此文档
该用户还上传了这些文档
浅谈基于CRP系统的本土化建设思考
关注微信公众号&figure&&img src=&https://pic3.zhimg.com/v2-4b509e51a963ad14dbb66e_b.jpg& data-rawwidth=&900& data-rawheight=&1011& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&https://pic3.zhimg.com/v2-4b509e51a963ad14dbb66e_r.jpg&&&/figure&&p&Statsmodels 是 Python 中一个强大的统计分析包,包含了回归分析、时间序列分析、假设检&br&验等等的功能。Statsmodels 在计量的简便性上是远远不及 Stata 等软件的,但它的优点在于可以与 Python 的其他的任务(如 NumPy、Pandas)有效结合,提高工作效率。在本文中,我们重点介绍最回归分析中最常用的 OLS(ordinary least square)功能。&/p&&p&当你需要在 Python 中进行回归分析时……&br&import statsmodels.api as sm!!!&/p&&h4&在一切开始之前&/h4&&p&上帝导入了 NumPy(大家都叫它囊派?我叫它囊辟),&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&import numpy as np
&/code&&/pre&&/div&&p&便有了时间。&/p&&p&上帝导入了 matplotlib,&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&import matplotlib.pyplot as plt
&/code&&/pre&&/div&&p&便有了空间。&/p&&p&上帝导入了 Statsmodels,&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&import statsmodels.api as sm
&/code&&/pre&&/div&&p&世界开始了。&/p&&h4&简单 OLS 回归&/h4&&p&假设我们有回归模型&/p&Y=β0+β1X1+?+βnXn+ε,&br&&p&并且有 k 组数据 &img src=&https://www.zhihu.com/equation?tex=%28y%28t%29%2Cx_%7B1%7D%28t%29+%2C...%2Cx_%7Bn%7D%28t%29+%29_%7Bt%3D1%7D%5E%7Bk%7D+& alt=&(y(t),x_{1}(t) ,...,x_{n}(t) )_{t=1}^{k} & eeimg=&1&&。OLS 回归用于计算回归系数 βi 的估值 b0,b1,…,bn,使误差平方&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d0cac8eaee6ac4e4c4f1_b.jpg& data-rawwidth=&479& data-rawheight=&76& class=&origin_image zh-lightbox-thumb& width=&479& data-original=&https://pic4.zhimg.com/v2-d0cac8eaee6ac4e4c4f1_r.jpg&&&/figure&&br&&p&最小化。&br&&/p&&p&statsmodels.OLS 的输入有 (endog, exog, missing, hasconst) 四个,我们现在只考虑前两个。第一个输入 endog 是回归中的反应变量(也称因变量),是上面模型中的 y(t), 输入是一个长度为 k 的 array。第二个输入 exog 则是回归变量(也称自变量)的值,即模型中的x1(t),…,xn(t)。但是要注意,statsmodels.OLS 不会假设回归模型有常数项,所以我们应该假设模型是&br&&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-31ffb3f87f3cc037cef174a_b.jpg& data-rawwidth=&407& data-rawheight=&45& class=&content_image& width=&407&&&/figure&并且在数据中,对于所有 t=1,…,k,设置 x0(t)=1。因此,exog的输入是一个 k×(n+1) 的 array,其中最左一列的数值全为 1。往往输入的数据中,没有专门的数值全为1的一列,Statmodels 有直接解决这个问题的函数:sm.add_constant()。它会在一个 array 左侧加上一列 1。(本文中所有输入 array 的情况也可以使用同等的 list、pd.Series 或 pd.DataFrame。)&/p&&p&确切地说,statsmodels.OLS 是 statsmodels.regression.linear_model 里的一个函数(从这个命名也能看出,statsmodel 有很多很多功能,其中的一项叫回归)。它的输出结果是一个 statsmodels.regression.linear_model.OLS,只是一个类,并没有进行任何运算。在 OLS 的模型之上调用拟合函数 fit(),才进行回归运算,并且得到 statsmodels.regression.linear_model.RegressionResultsWrapper,它包含了这组数据进行回归拟合的结果摘要。调用 params 可以查看计算出的回归系数 b0,b1,…,bn。&/p&&p&简单的线性回归&/p&&p&上面的介绍绕了一个大圈圈,现在我们来看一个例子,假设回归公式是:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-05bcea4dd914b6d4055fd1_b.jpg& data-rawwidth=&216& data-rawheight=&60& class=&content_image& width=&216&&&/figure&&p&我们从最简单的一元模型开始,虚构一组数据。首先设定数据量,也就是上面的 k 值。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&nsample = 100
&/code&&/pre&&/div&&p&然后创建一个 array,是上面的 x1 的数据。这里,我们想要 x1 的值从 0 到 10 等差排列。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&x = np.linspace(0, 10, nsample)
&/code&&/pre&&/div&&p&使用 sm.add_constant() 在 array 上加入一列常项1。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&X = sm.add_constant(x)
&/code&&/pre&&/div&&p&然后设置模型里的 β0,β1,这里要设置成 1,10。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&beta = np.array([1, 10])
&/code&&/pre&&/div&&p&然后还要在数据中加上误差项,所以生成一个长度为k的正态分布样本。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&e = np.random.normal(size=nsample)
&/code&&/pre&&/div&&p&由此,我们生成反应项 y(t)。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&y = np.dot(X, beta) + e
&/code&&/pre&&/div&&p&好嘞,在反应变量和回归变量上使用 OLS() 函数。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&model = sm.OLS(y,X)
&/code&&/pre&&/div&&p&然后获取拟合结果。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&results = model.fit()
&/code&&/pre&&/div&&p&再调取计算出的回归系数。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&print(results.params)
&/code&&/pre&&/div&&p&得到&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&[ 1..]
&/code&&/pre&&/div&&p&和实际的回归系数非常接近。&/p&&p&当然,也可以将回归拟合的摘要全部打印出来。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&print(results.summary())
&/code&&/pre&&/div&&p&得到&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c29a687c28e14b16fdcd9_b.jpg& data-rawwidth=&838& data-rawheight=&557& class=&origin_image zh-lightbox-thumb& width=&838& data-original=&https://pic1.zhimg.com/v2-c29a687c28e14b16fdcd9_r.jpg&&&/figure&&p&中间偏下的 coef 列就是计算出的回归系数。&/p&&p&我们还可以将拟合结果画出来。先调用拟合结果的 fittedvalues 得到拟合的 y 值。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&y_fitted = results.fittedvalues
&/code&&/pre&&/div&&p&然后使用 matplotlib.pyploft 画图。首先设定图轴,图片大小为 8×6。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&fig, ax = plt.subplots(figsize=(8,6))
&/code&&/pre&&/div&&p&画出原数据,图像为圆点,默认颜色为蓝。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ax.plot(x, y, 'o', label='data')
&/code&&/pre&&/div&&p&画出拟合数据,图像为红色带点间断线。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ax.plot(x, y_fitted, 'r--.',label='OLS')
&/code&&/pre&&/div&&p&放置注解。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ax.legend(loc='best')
&/code&&/pre&&/div&&p&得到&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a6ea1d9d9a52b121b6fd47fb3c3a9fd9_b.jpg& data-rawwidth=&744& data-rawheight=&557& class=&origin_image zh-lightbox-thumb& width=&744& data-original=&https://pic3.zhimg.com/v2-a6ea1d9d9a52b121b6fd47fb3c3a9fd9_r.jpg&&&/figure&&p&在大图中看不清细节,我们在 0 到 2 的区间放大一下,可以见数据和拟合的关系。&/p&&p&加入改变坐标轴区间的指令&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ax.axis((-0.05, 2, -1, 25))
&/code&&/pre&&/div&&figure&&img src=&https://pic4.zhimg.com/v2-cc8df3f68a92f3da71a21_b.jpg& data-rawwidth=&720& data-rawheight=&551& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic4.zhimg.com/v2-cc8df3f68a92f3da71a21_r.jpg&&&/figure&&h4&高次模型的回归&/h4&&p&假设反应变量 Y 和回归变量 X 的关系是高次的多项式,即&/p&&figure&&img src=&https://pic2.zhimg.com/v2-9db145cfedec5bbfe178ccf_b.jpg& data-rawwidth=&448& data-rawheight=&56& class=&origin_image zh-lightbox-thumb& width=&448& data-original=&https://pic2.zhimg.com/v2-9db145cfedec5bbfe178ccf_r.jpg&&&/figure&&p&我们依然可以使用 OLS 进行线性回归。但前提条件是,我们必须知道 X 在这个关系中的所有次方数;比如,如果这个公式里有一个 &img src=&https://www.zhihu.com/equation?tex=x%5E%7B2%7D+& alt=&x^{2} & eeimg=&1&&.5项,但我们对此并不知道,那么用线性回归的方法就不能得到准确的拟合。&/p&&p&虽然 X 和 Y 的关系不是线性的,但是 Y 和 &img src=&https://www.zhihu.com/equation?tex=X%2CX%5E%7B2%7D+%2C...X%5E%7Bn%7D+& alt=&X,X^{2} ,...X^{n} & eeimg=&1&& 的关系是高元线性的。也就是说,只要我们把高次项当做其他的自变量,即设 &img src=&https://www.zhihu.com/equation?tex=X_%7B1%7D+%3DX%2CX_%7B2%7D+%3DX%5E%7B2%7D+%2C...%2CX%5E%7Bn%7D+& alt=&X_{1} =X,X_{2} =X^{2} ,...,X^{n} & eeimg=&1&&。那么,对于线性公式&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-c9a8589cfc6bf3abc6bd73d_b.jpg& data-rawwidth=&432& data-rawheight=&45& class=&origin_image zh-lightbox-thumb& width=&432& data-original=&https://pic3.zhimg.com/v2-c9a8589cfc6bf3abc6bd73d_r.jpg&&&/figure&可以进行常规的 OLS 回归,估测出每一个回归系数 βi。可以理解为把一元非线性的问题映射到高元,从而变成一个线性关系。&/p&&p&下面以&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d31d051d83c6d963cdcb90f_b.jpg& data-rawwidth=&309& data-rawheight=&52& class=&content_image& width=&309&&&/figure&为例做一次演示。&p&首先设定数据量,也就是上面的 k 值。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&nsample = 100
&/code&&/pre&&/div&&p&然后创建一个 array,是上面的 x1 的数据。这里,我们想要 x1 的值从 0 到 10 等差排列。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&x = np.linspace(0, 10, nsample)
&/code&&/pre&&/div&&p&再创建一个 k×2 的 array,两列分别为 x1 和 x2。我们需要 x2 为 x1 的平方。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&X = np.column_stack((x, x**2))
&/code&&/pre&&/div&&p&使用 sm.add_constant() 在 array 上加入一列常项 1。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&X = sm.add_constant(X)
&/code&&/pre&&/div&&p&然后设置模型里的 β0,β1,β2,我们想设置成 1,0.1,10。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&beta = np.array([1, 0.1, 10])
&/code&&/pre&&/div&&p&然后还要在数据中加上误差项,所以生成一个长度为k的正态分布样本。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&e = np.random.normal(size=nsample)
&/code&&/pre&&/div&&p&由此,我们生成反应项 y(t),它与 x1(t) 是二次多项式关系。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&y = np.dot(X, beta) + e
&/code&&/pre&&/div&&p&在反应变量和回归变量上使用 OLS() 函数。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&model = sm.OLS(y,X)
&/code&&/pre&&/div&&p&然后获取拟合结果。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&results = model.fit()
&/code&&/pre&&/div&&p&再调取计算出的回归系数。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&print(results.params)
&/code&&/pre&&/div&&p&得到&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&[ 0...9998477]
&/code&&/pre&&/div&&p&获取全部摘要&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&print(results.summary())
&/code&&/pre&&/div&&p&得到&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-6cce5b6e4bb79a0b1736_b.jpg& data-rawwidth=&850& data-rawheight=&594& class=&origin_image zh-lightbox-thumb& width=&850& data-original=&https://pic1.zhimg.com/v2-6cce5b6e4bb79a0b1736_r.jpg&&&/figure&拟合结果图如下&br&&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-4291d72eac77fbdf0b735a_b.jpg& data-rawwidth=&730& data-rawheight=&552& class=&origin_image zh-lightbox-thumb& width=&730& data-original=&https://pic3.zhimg.com/v2-4291d72eac77fbdf0b735a_r.jpg&&&/figure&在横轴的 [0,2] 区间放大,可以看到&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-eb5f1b63c06b4ba58d391e_b.jpg& data-rawwidth=&728& data-rawheight=&554& class=&origin_image zh-lightbox-thumb& width=&728& data-original=&https://pic4.zhimg.com/v2-eb5f1b63c06b4ba58d391e_r.jpg&&&/figure&&h4&哑变量&/h4&&p&一般而言,有连续取值的变量叫做连续变量,它们的取值可以是任何的实数,或者是某一区间里的任何实数,比如股价、时间、身高。但有些性质不是连续的,只有有限个取值的可能性,一般是用于分辨类别,比如性别、婚姻情况、股票所属行业,表达这些变量叫做分类变量。在回归分析中,我们需要将分类变量转化为哑变量(dummy variable)。&/p&&p&如果我们想表达一个有 d 种取值的分类变量,那么它所对应的哑变量的取值是一个 d 元组(可以看成一个长度为 d 的向量),其中有一个元素为 1,其他都是 0。元素呈现出 1 的位置就是变量所取的类别。比如说,某个分类变量的取值是 {a,b,c,d},那么类别 a 对应的哑变量是(1,0,0,0),b 对应 (0,1,0,0),c 对应 (0,0,1,0),d 对应 (0,0,0,1)。这么做的用处是,假如 a、b、c、d 四种情况分别对应四个系数 β0,β1,β2,β3,设 (x0,x1,x2,x3) 是一个取值所对应的哑变量,那么&/p&&figure&&img src=&https://pic1.zhimg.com/v2-68dd69bcf2_b.jpg& data-rawwidth=&344& data-rawheight=&66& class=&content_image& width=&344&&&/figure&&p&可以直接得出相应的系数。可以理解为,分类变量的取值本身只是分类,无法构成任何线性关系,但是若映射到高元的 0,1 点上,便可以用线性关系表达,从而进行回归。&/p&&p&Statsmodels 里有一个函数 categorical() 可以直接把类别 {0,1,…,d-1} 转换成所对应的元组。确切地说,sm.categorical() 的输入有 (data, col, dictnames, drop) 四个。其中,data 是一个 k×1 或 k×2 的 array,其中记录每一个样本的分类变量取值。drop 是一个 Bool值,意义为是否在输出中丢掉样本变量的值。中间两个输入可以不用在意。这个函数的输出是一个k×d 的 array(如果 drop=False,则是k×(d+1)),其中每一行是所对应的样本的哑变量;这里 d 是 data 中分类变量的类别总数。&/p&&p&我们来举一个例子。这里假设一个反应变量 Y 对应连续自变量 X 和一个分类变量 Z。常项系数为 10,XX 的系数为 1;Z 有 {a,b,c}三个种类,其中 a 类有系数 1,b 类有系数 3,c 类有系数 8。也就是说,将 Z 转换为哑变量 (Z1,Z2,Z3),其中 Zi 取值于 0,1,有线性公式&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-ede3f8c5695_b.jpg& data-rawwidth=&417& data-rawheight=&57& class=&content_image& width=&417&&&/figure&可以用常规的方法进行 OLS 回归。&/p&&p&我们按照这个关系生成一组数据来做一次演示。先定义样本数量为 50。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&nsample = 50
&/code&&/pre&&/div&&p&设定分类变量的 array。前 20 个样本分类为 a。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&groups = np.zeros(nsample, int)
&/code&&/pre&&/div&&p&之后的 20 个样本分类为 b。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&groups[20:40] = 1
&/code&&/pre&&/div&&p&最后 10 个是 c 类。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&groups[40:] = 2
&/code&&/pre&&/div&&p&转变成哑变量。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&dummy = sm.categorical(groups, drop=True)
&/code&&/pre&&/div&&p&创建一组连续变量,是 50 个从 0 到 20 递增的值。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&x = np.linspace(0, 20, nsample)
&/code&&/pre&&/div&&p&将连续变量和哑变量的 array 合并,并加上一列常项。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&X = np.column_stack((x, dummy))
X = sm.add_constant(X)
&/code&&/pre&&/div&&p&定义回归系数。我们想设定常项系数为 10,唯一的连续变量的系数为 1,并且分类变量的三种分类 a、b、c 的系数分别为 1,3,8。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&beta = [10, 1, 1, 3, 8]
&/code&&/pre&&/div&&p&再生成一个正态分布的噪音样本。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&e = np.random.normal(size=nsample)
&/code&&/pre&&/div&&p&最后,生成反映变量。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&y = np.dot(X, beta) + e
&/code&&/pre&&/div&&p&得到了虚构数据后,放入 OLS 模型并进行拟合运算。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&result = sm.OLS(y,X).fit()
print(result.summary())
&/code&&/pre&&/div&&p&得到&/p&&figure&&img src=&https://pic4.zhimg.com/v2-0f2d1cce104db3b86ef780c_b.jpg& data-rawwidth=&856& data-rawheight=&643& class=&origin_image zh-lightbox-thumb& width=&856& data-original=&https://pic4.zhimg.com/v2-0f2d1cce104db3b86ef780c_r.jpg&&&/figure&&p&再画图出来&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&fig, ax = plt.subplots(figsize=(8,6))
ax.plot(x, y, 'o', label=&data&)
ax.plot(x, result.fittedvalues, 'r--.', label=&OLS&)
ax.legend(loc='best')
&/code&&/pre&&/div&&p&得出&/p&&figure&&img src=&https://pic4.zhimg.com/v2-30cb9ecaea2f151ec05f1f957ef48e8f_b.jpg& data-rawwidth=&732& data-rawheight=&549& class=&origin_image zh-lightbox-thumb& width=&732& data-original=&https://pic4.zhimg.com/v2-30cb9ecaea2f151ec05f1f957ef48e8f_r.jpg&&&/figure&&p&这里要指出,哑变量是和其他自变量并行的影响因素,也就是说,哑变量和原先的 x 同时影响了回归的结果。初学者往往会误解这一点,认为哑变量是一个选择变量:也就是说,上图中给出的回归结果,是在只做了一次回归的情况下完成的,而不是分成3段进行3次回归。哑变量的取值藏在其他的三个维度中。可以理解成:上图其实是将高元的回归结果映射到平面上之后得到的图。&br&&/p&&h4&简单应用&/h4&&p&我们来做一个非常简单的实际应用。设 x 为上证指数的日收益率,y 为深证成指的日收益率。通过对股票市场的认知,我们认为 x 和 y 有很强的线性关系。因此可以假设模型&br&&/p&&p&&figure&&img src=&https://pic2.zhimg.com/v2-36cfebeaa13616c1adf9fc32e40531e2_b.jpg& data-rawwidth=&195& data-rawheight=&52& class=&content_image& width=&195&&&/figure&并使用 Statsmodels 包进行 OLS 回归分析。&/p&&p&我们取上证指数和深证成指一年中的收盘价。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&data = get_price(['000001.XSHG', '399001.XSHE'], start_date='', end_date='', frequency='daily', fields=['close'])['close']
x_price = data['000001.XSHG'].values
y_price = data['399001.XSHE'].values
&/code&&/pre&&/div&&p&计算两个指数一年内的日收益率,记载于 x_pct 和 y_pct 两个 list 中。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&x_pct, y_pct = [], []
for i in range(1, len(x_price)):
x_pct.append(x_price[i]/x_price[i-1]-1)
for i in range(1, len(y_price)):
y_pct.append(y_price[i]/y_price[i-1]-1)
&/code&&/pre&&/div&&p&将数据转化为 array 的形式;不要忘记添加常数项。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&x = np.array(x_pct)
X = sm.add_constant(x)
y = np.array(y_pct)
&/code&&/pre&&/div&&p&上吧,λu.λv.(sm.OLS(u,v).fit())!全靠你了!&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&results = sm.OLS(y, X).fit()
print(results.summary())
&/code&&/pre&&/div&&p&得到&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f1d5f4bdadd20464ad5dff4_b.jpg& data-rawwidth=&852& data-rawheight=&564& class=&origin_image zh-lightbox-thumb& width=&852& data-original=&https://pic1.zhimg.com/v2-f1d5f4bdadd20464ad5dff4_r.jpg&&&/figure&&p&恩,y=0.002+0.9991x,合情合理,或者干脆直接四舍五入到 y=x。最后,画出数据和拟合线。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&fig, ax = plt.subplots(figsize=(8,6))
ax.plot(x, y, 'o', label=&data&)
ax.plot(x, results.fittedvalues, 'r--', label=&OLS&)
ax.legend(loc='best')
&/code&&/pre&&/div&&br&&figure&&img src=&https://pic2.zhimg.com/v2-a1a17d8cbeeb4e1_b.jpg& data-rawwidth=&752& data-rawheight=&574& class=&origin_image zh-lightbox-thumb& width=&752& data-original=&https://pic2.zhimg.com/v2-a1a17d8cbeeb4e1_r.jpg&&&/figure&&h4&结语&/h4&&p&本篇文章中,我们介绍了 Statsmodels 中很常用 OLS 回归功能,并展示了一些使用方法。线性回归的应用场景非常广泛。在我们量化课堂应用类的内容中,也有相当多的策略内容采用线性回归的内容。我们会将应用类文章中涉及线性回归的部分加上链接,链接到本篇文章中来,形成体系。量化课堂在未来还会介绍 Statsmodel 包其他的一些功能,敬请期待。&/p&&p&到JoinQuant查看代码并与作者交流讨论:&a class=& wrap external& href=&https://link.zhihu.com/?target=https%3A//www.joinquant.com/post/1786%3Ff%3Dzh& target=&_blank& rel=&nofollow noreferrer&&【量化课堂】Statsmodels 统计包之 OLS 回归&/a&&/p&
Statsmodels 是 Python 中一个强大的统计分析包,包含了回归分析、时间序列分析、假设检 验等等的功能。Statsmodels 在计量的简便性上是远远不及 Stata 等软件的,但它的优点在于可以与 Python 的其他的任务(如 NumPy、Pandas)有效结合,提高工作效率。在…
&figure&&img src=&https://pic2.zhimg.com/78fb385f1ab9e2e134cdd_b.jpg& data-rawwidth=&829& data-rawheight=&419& class=&origin_image zh-lightbox-thumb& width=&829& data-original=&https://pic2.zhimg.com/78fb385f1ab9e2e134cdd_r.jpg&&&/figure&&p&感谢大家给这篇文章大力点赞!!但贵妃的专栏是其实一个关于设计的专栏,数据可视化也是设计的一部分哟& & 各位对设计感兴趣知友们也请多多关注贵妃专栏的其他文章哦╭( ′o o o′ )╭?&a href=&http://zhuanlan.zhihu.com/tezign& class=&internal&&读点儿设计 - 知乎专栏&/a&&/p&&p&-------------------------------------------------------------&/p&&p&辛辛苦苦分析一堆大数据,竟然没人看!如果你正着手于从数据中洞察出有用信息,那你所需要的正是——数据可视化。俗话说,有图有真相,一图胜千言,取悦了眼球,剩下的都好说。&/p&&p&贵妃周一巨献!!挖掘了21款炙手可热的数据可视化工具,干净利落的高颜值信息图,就要这样做!&/p&&ul&&li&FushionCarts&/li&&/ul&&figure&&img src=&https://pic1.zhimg.com/3c8159afb3cc864edc858c5f3b680b78_b.jpg& data-rawwidth=&640& data-rawheight=&264& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/3c8159afb3cc864edc858c5f3b680b78_r.jpg&&&/figure&&p&FusionCharts Suite XT不仅可以为带给你漂亮的图表,还能帮你制作出生动的动画、巧妙的设计和丰富的交互性。它在PC端、Mac、iPad、iPhone和Android平台都可兼容,具有很好的用户体验一致性,同时也适用于所有的网页和移动应用,甚至包括IE6、7、8这些绝大部分插件都不支持的主儿。在这软件里,创建你的首幅图表也只需要15分钟。&br&&/p&&p&FusionCharts套件提供了超过90种图表和图示,从最基本款的到进阶版,例如漏斗图、热点地图、放缩线图和多轴图等。&br&&/p&&p&网址请戳
&a href=&http://link.zhihu.com/?target=http%3A//www.fusioncharts.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript Charts, JavaScript Graphs for Web, Mobile & Apps&/a&&/p&&br&&br&&ul&&li&&strong&&strong&&strong&
Dygraphs &/strong&&/strong&&br&&/strong&&/li&&/ul&&figure&&img src=&https://pic3.zhimg.com/028bd14b8ec7072fbf52_b.jpg& data-rawwidth=&640& data-rawheight=&267& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic3.zhimg.com/028bd14b8ec7072fbf52_r.jpg&&&/figure&Dygraphs是一款快捷、灵活的开源JavaScript图表库,用户可以自由探索和编译密集型数据集。它具有极强的交互性,比如缩放、平移和鼠标悬停等都是默认动作。更棒的是,它还对误差线有很强的支持。Dygraphs也是高度兼容的,所有的主流浏览器都可正常运行(包括不受待见的IE8)。你甚至可以在手机和平板设备上使用双指缩放!&br&&br&&p&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//dygraphs.com/download.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&dygraphs.com/download.h&/span&&span class=&invisible&&tml&/span&&span class=&ellipsis&&&/span&&/a&&/p&&br&&ul&&li&&strong&&strong&&strong&&strong& Datawrapper
&/strong&&/strong&&/strong&&/strong&&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/46f03aa4d64f1d3e5dbecc9_b.jpg& data-rawwidth=&640& data-rawheight=&214& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/46f03aa4d64f1d3e5dbecc9_r.jpg&&&/figure&&p&Datawrapper让你只需4步就可以创建出图表和地图。这款工具帮你将数据可视化的时间从几小时减少到了几分钟。它的操作非常简单,你只需上传数据,选择一个图表或地图,然后点击发布就可以了。Datawrapper是为你的需求定制化而存在的,版式和视觉效果都可以按照你的样式规范而调整。&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=https%3A//datawrapper.de& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Datawrapper&/a&&br&&ul&&li&&strong&&strong& Leaflet &/strong&&/strong&&br&&/li&&/ul&&figure&&img src=&https://pic1.zhimg.com/c258df3a8eddd7065afd95e349ea146c_b.jpg& data-rawwidth=&640& data-rawheight=&280& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/c258df3a8eddd7065afd95e349ea146c_r.jpg&&&/figure&&p&Leaflet是为移动端友好型交互地图所做的开源JavaScript库,其中包含了大部分在线地图开发人员都需要的所有特征。Leaflet被设计为简单易用、性能优良的工具。归功于HTML5和CSS3,它得以支持所有主流电脑和移动平台。如果你还想扩展这个app,有大量可供选择的插件能安装。&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//leafletjs.com/download.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Download - Leaflet&/a&&br&&ul&&li&&strong&&strong&
Tableau Public &/strong&&/strong&&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/b67c8cfd29fc5ca05372b9_b.jpg& data-rawwidth=&640& data-rawheight=&282& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/b67c8cfd29fc5ca05372b9_r.jpg&&&/figure&&p&这是一款操作简便的app,它可以轻松帮你创建令人眼前一亮的可视化作品。只需打开数据,用Tableau桌面版来进一步探索。然后,把可视化内容存储在你1GB Tableau Public在线文件空间,最后,将他们放进网站或Blog,通过社交媒体把你的作品分享给全世界吧!&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=https%3A//public.tableau.com/s/download& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Download Now&/a&&br&&ul&&li&&strong&&strong&
PiktoChart &/strong&&/strong&&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/e75d6cc8c5_b.jpg& data-rawwidth=&640& data-rawheight=&288& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/e75d6cc8c5_r.jpg&&&/figure&&p&这是一款很赞的app,你可以用它创作出漂亮、清晰、透明的信息图表。PiktoChart提供了单击编辑器,有着超过400种模板、图标、图表,一个极大的图片素材库和无限制的自定义服务,保证了你的信息图表是独一无二的。一切只需要三步:在图库里预览主题然后选择一个;在图库中超过1000张图像之间选择你要的素材或是自己上传;最后,分享这幅信息图表给全世界看吧。&/p&&p&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//piktochart.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Create Easy Infographics, Reports, Presentations&/a&&br&&/p&&br&&ul&&li&&strong&&strong&&strong&&strong& Google Charts &/strong&&/strong&&/strong&&/strong&&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/81b2b1cb3b0e61b0a92dac5_b.jpg& data-rawwidth=&640& data-rawheight=&263& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/81b2b1cb3b0e61b0a92dac5_r.jpg&&&/figure&&p&Google Charts为你的网站提供完美的数据可视化处理。从简单的折线图到复杂的分级树形图,他的图表库里提供了海量的模版可供选择。Google Charts如同JavaScript的类(classes)一样是开放的,你可以按需定制,但通常默认样式就能满足你的所有需求。所有的图表样式都是使用数据库表类(DataTable class)来填充数据的,这意味着你可以在挑选完美表现效果的时候轻松转换表格类型。&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=https%3A//developers.google.com/chart/%3Fhl%3Den& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&developers.google.com/c&/span&&span class=&invisible&&hart/?hl=en&/span&&span class=&ellipsis&&&/span&&/a&&br&&ul&&li&&strong&&strong&
Raw &figure&&img src=&https://pic1.zhimg.com/e2afc9c98_b.jpg& data-rawwidth=&640& data-rawheight=&395& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/e2afc9c98_r.jpg&&&/figure&&/strong&&/strong&&/li&&/ul&&br&&p&Raw是一款开放的Web app,可以按需创作矢量图形可视化作品。它是使用LGPL许可(GNU Lesser General Public License -GNU宽通用公共许可证的缩写,许多自由软件(Free Software)使用GPL作为其授权声明,译注)的定制项目,允许随意下载并修改。但是Raw只是Web app,你所上传的数据只能用网页浏览器处理,因此没有实质性服务器端数据交互。你可将可视化作品导出为矢量图形(SVG)格式或者栅格化为(PNG)格式。&/p&&p&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//raw.densitydesign.org& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Raw&/a&&br&&/p&&br&&ul&&li&&strong&&strong& iCharts &figure&&img src=&https://pic4.zhimg.com/728c32ccb45f_b.jpg& data-rawwidth=&640& data-rawheight=&257& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic4.zhimg.com/728c32ccb45f_r.jpg&&&/figure&&/strong&&/strong&&/li&&/ul&&br&&p&iCharts是基于云端的趋势预测视觉分析平台,它可以快速地将复杂的商业信息、大规模调查数据和动态数据研究的结果可视化。它非常的快速简便,但却可以根据实时数据创造出富有冲击力的视觉智能图像,并且可以为你带来全方位信息聚合和信息对比。&/p&&p&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//www.icharts.in& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iCharts - NSE, BSE, MCX Realtime Charts&/a&&br&&/p&&br&&ul&&li&&strong&&strong&&strong&&strong& Gliffy &figure&&img src=&https://pic2.zhimg.com/a5d617fca556dae4abbc01_b.jpg& data-rawwidth=&640& data-rawheight=&330& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/a5d617fca556dae4abbc01_r.jpg&&&/figure&&/strong&&/strong&&/strong&&/strong&&/li&&/ul&&p&Gliffy可以帮助你制作专业级流程图、组织图、UML分析图(Unified Modeling Language,统一建模语言,译注)、线框图、技术制图等等,而且它兼容所有的浏览器。Gliffy使用HTML5编辑器,速度是Flash的两倍。它提供一个可读的URL地址展示你的分析图,也可以将成果分享到社交媒体上。你只需从海量库里把你想要的图形拖拖拽拽,然后单击选择需要的格式,通过简单的重选就能定制你的图表。&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=https%3A//www.gliffy.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Online Diagram Software and Flow Chart Software&/a&&br&&ul&&li&&strong&&strong& Canva &figure&&img src=&https://pic4.zhimg.com/8a7ae9a91d956dbb8b1a0b2d7ef9c687_b.jpg& data-rawwidth=&640& data-rawheight=&209& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic4.zhimg.com/8a7ae9a91d956dbb8b1a0b2d7ef9c687_r.jpg&&&/figure&&/strong&&/strong&&/li&&/ul&&br&&p&Canva让每个人都能简单做设计,它提供你所需要的一切来帮助你把想法转变成杰出的设计。你可以从一个定制版面或一个空白页面开始。你所需的工具都在一个地方,简明的界面才不会限制你发挥创造力。只需通过搜索并拖拽,就能创造出漂亮的设计,那些无聊的编程就让Canva来处理吧。Canva可以在线免费使用。&br&&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//www.canva.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Amazingly simple graphic design&/a&&br&&ul&&li&&strong&&strong& HighCharts &/strong&&/strong&&/li&&/ul&&figure&&img src=&https://pic3.zhimg.com/00d7f89d42e45db79129e_b.jpg& data-rawwidth=&640& data-rawheight=&302& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic3.zhimg.com/00d7f89d42e45db79129e_r.jpg&&&/figure&&p&通过HighCharts你可以为网站项目制作交互式图表。它的用户非常广泛(全世界最大的100家公司里面有61家以及成千上万的开发人员都在使用)。如果是为个人网站或非盈利组织使用这个软件,它将是免费的。HighCharts是建立在HTML5上的,在现代的浏览器包括移动、平板设备上运行,也支持过时的IE浏览器(IE6之后的都可以)。它同时也是动态的,你可以自由添加、移除、修改数据列(Series)和关键点(Points)。这款app支持多种类型的图表:折现图、样条曲线、面积图、曲线面积图、柱状图、条状图、饼状图和散点图等等。&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//www.hcharts.cn& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Highcharts中文网&/a&&br&&ul&&li&&strong&&strong&
ZingChart &figure&&img src=&https://pic4.zhimg.com/a88b573aeefccf02ff5a77_b.jpg& data-rawwidth=&640& data-rawheight=&292& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic4.zhimg.com/a88b573aeefccf02ff5a77_r.jpg&&&/figure&&/strong&&/strong&&/li&&/ul&&br&&p&ZingChart是一个强大的库,为用户提供了快速创造漂亮的图表、操作面板和信息图表的可能性。你可以在上百种图表类型中自由选择,你的设计和个性化要求不会受到任何限制。你也可以使你的用户通过交互式图表特性参与到你的作品之中。&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//www.zingchart.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript Charts For Interactive Big Data&/a&&br&&ul&&li&&strong&&strong&
D3.js &figure&&img src=&https://pic4.zhimg.com/8cf52f5e75cc3a7b5e6f57_b.jpg& data-rawwidth=&640& data-rawheight=&281& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic4.zhimg.com/8cf52f5e75cc3a7b5e6f57_r.jpg&&&/figure&&/strong&&/strong&&/li&&/ul&&p&D3.js是数据驱动文件(Data-Driven Documents)的缩写,他通过使用HTML\CSS和SVG来渲染精彩的图表和分析图。D3对网页标准的强调足以满足在所有主流浏览器上使用的可能性,使你免于被其他类型架构所捆绑的苦恼,它可以将视觉效果很棒的组件和数据驱动方法结合在一起。&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//d3js.org& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&D3.js - Data-Driven Documents&/a&&br&&ul&&li&&strong&&strong& Timeline.js
&/strong&&/strong&&br&&/li&&/ul&&p&Timeline.js会让你爱上制作漂亮的时间轴,因为它的操作非常简单直观。这是一款支持40种语言的开源工具,通过它你可以建立自己的可视化互动时间轴,还可从各种途径置入到媒体中,目前已支持Twitter、Flickr、Google Maps、YouTube、Vimeo、Vine、Dailymotion、Wikipedia、SoundCloud等等。如果想看到由这款app创建的时间轴案例,请移步&a href=&http://link.zhihu.com/?target=http%3A//timeline.knightlab.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Timeline JS3&/a& 查看。&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//timeline.knightlab.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Timeline JS3&/a&&br&&ul&&li&&strong&&strong&
InstantAtlas &/strong&&/strong&&br&&/li&&/ul&&p&InstantAtlas让信息分析师和研究者得以创建交互式动态分配图报告,并结合统计数据和地图数据来优化数据可视化效果。如果你正在寻找一个可以制图的数据映射工具,那么恭喜你,就是它了。&br&&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//www.instantatlas.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Information visualization software & solutions from InstantAtlas&/a&&br&&ul&&li&&strong&&strong&
WolframAlpha &/strong&&/strong&&br&&/li&&/ul&&br&&p&WolframAlpha把自己称作计算型知识引擎、谷歌在分析领域的劲敌。它最棒的一点是在显示图表时可以不需要任何配置就响应数据请求。如果你用的是公开的数据,那么你只需一个简单的小部件生成器就能在你的网页上轻松加入可视化数据。&br&&/p&&p&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//www.wolframalpha.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Wolfram|Alpha: Computational Knowledge Engine&/a&&br&&/p&&br&&ul&&li&&strong&&strong&&strong&&strong&
&a href=&http://link.zhihu.com/?target=http%3A//Visual.ly& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&Visual.ly&/span&&span class=&invisible&&&/span&&/a& &/strong&&/strong&&br&&/strong&&/strong&&/li&&/ul&&br&&p&&a href=&http://link.zhihu.com/?target=http%3A//Visual.ly& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&Visual.ly&/span&&span class=&invisible&&&/span&&/a&是一个综合图库和信息图表生成器。它的工具很简单,却可创造出亮眼的数据展示作品。另外,你还可以在它的平台上分享你的图像。他能在内容上比一般的视觉分析工具表达更深入。&/p&&p&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//visual.ly& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Visually | Premium Content Creation for Better Marketing&/a&&br&&/p&&br&&ul&&li&&strong&&strong&&strong&&strong& Dipity &/strong&&/strong&&br&&/strong&&/strong&&/li&&/ul&&br&&p&Dipity也是一款做时间轴的工具,用于管理网站上的时间和日期相关内容非常有效。用户可以创造并分享他们精彩的交互式时间轴,内容形式多种多样,包括音频、视频和图像甚至社交媒体频道。它对纸媒从业者、记者和博主来说简直必不可少。&/p&&p&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//www.dipity.com& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&dipity.com&/span&&span class=&invisible&&&/span&&/a&&br&&/p&&br&&ul&&li&&strong&&strong&&strong&&strong&
Polymaps &/strong&&/strong&&br&&/strong&&/strong&&/li&&/ul&&p&如果你在找一款可同时使用位图和SVG矢量地图的JavaScript库,那么Polymaps正是你需要的。它为地图提供的多级缩放数据集方面表现非常迅速,并且可支持矢量数据的多种视觉表现形式。更棒的是,Polymaps可以在很大的尺度范围上加载数据。它使用的是球形墨卡托投影的tile格式,因此快到弹指间便可发布信息。&br&&/p&&br&网址请戳 &a href=&http://link.zhihu.com/?target=http%3A//polymaps.org& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Polymaps&/a&&br&&ul&&li&&strong&&strong& Excel &/strong&&/strong&&br&&/li&&/ul&&p&Excel现在作为微软商用Office套件里的组成部分,它提供了一些漂亮而复杂的东西,从单元热度图到散点坐标图都有。虽然只是一款入门级工具,但这对于想要探索数据的初学者来说倒不失为一个快速上手的好东西。你绝对应该将其放入工具箱。不过,如果你没办法得到Office套件,还可以试试Google Docs——它们也能干一样的事(作者绝对是微软高级黑)。&br&&/p&&br&&br&&br&&p&拿走,不谢!用得顺手别忘了回来留言告诉我们你的最爱哦。&br&&/p&&br&&br&&br&&p&文 | Piotr Ku?niewicz&/p&&p&译 | 高雨滴&/p&&p&校 | 郭瑽&/p&&br&&br&&p&---------------------------------------------------------------------------&/p&&p&转载请与我联系,并注明文章来源:&/p&&p&特赞(&a href=&http://link.zhihu.com/?target=http%3A//www.tezign.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&www.tezign.com&/a& )| 产品策划 |&a href=&http://www.zhihu.com/people/gui-fei-nai-huang-bao& class=&internal&&贵妃奶黄包&/a&&/p&&p&知乎专栏:&a href=&http://zhuanlan.zhihu.com/tezign& class=&internal&&读点儿设计 - 知乎专栏&/a&&/p&
感谢大家给这篇文章大力点赞!!但贵妃的专栏是其实一个关于设计的专栏,数据可视化也是设计的一部分哟& & 各位对设计感兴趣知友们也请多多关注贵妃专栏的其他文章哦╭( ′o o o′ )╭?------------------------------------…
&figure&&img src=&https://pic2.zhimg.com/v2-ede8bb019aec_b.jpg& data-rawwidth=&425& data-rawheight=&332& class=&origin_image zh-lightbox-thumb& width=&425& data-original=&https://pic2.zhimg.com/v2-ede8bb019aec_r.jpg&&&/figure&&h2&Python 环境搭建以及神器推荐&/h2&&p&今天给大家讲一下如何搭建一个舒适的 Python 环境,包括本地环境和远程调试环境,然后再附送给大家两套好用的 Python Web 框架。在这个过程中,还穿插着介绍一些适合于初学者的神器,希望大家中意~&/p&&h2&1 安装 Python&/h2&&p&第一步,当然是安装 Python 啦。&/p&&h2&1.1 Mac 系统&/h2&&p&Mac 系统默认是安装了 Python2.7 的。我们如何另外安装一个 Python3 呢?&br&首先,推荐你安装神器 HomeBrew 作为命令行下的管理软件。&/p&&p&HomeBrew 的安装方法:&/p&&ol&&li&&code&ruby -e &$(wget -O- https://raw.github.com/Homebrew/linuxbrew/go/install)&&/code& &/li&&/ol&&p&&br&&/p&&p&安装完毕后使用 &code&brew help&/code&命令即可查看brew的各种用法啦。&/p&&p&现在我们只要使用这条命令: &code&brew install python3&/code&,即能轻松安装上 python3 了。&/p&&p&然后我们使用 &code&brew info python2&/code&或者 &code&brew info python3&/code&就能查看 Python 2/3 的具体信息,妈妈再也不用担心我找不到 Python 的位置了!&/p&&p&最后,使用 &code&brew list&/code&可以查看目前所有通过 brew 安装的命令行工具,其它的用法就通过 &code&brew help&/code&自行查阅吧。&/p&&h2&1.2 Ubuntu 系统&/h2&&p&Ubuntu 系统使用的是则默认的包管理工具 apt 。使用如下命令即可安装 python :&/p&&ol&&li&&code&apt install python2 #安装python2&/code&&/li&&li&&code&apt install python3 #安装python3&/code& &/li&&/ol&&p&&br&&/p&&p&然后,在 Ubuntu 下有两点是需要注意的。&br&一个是 Python 的定位,我们用 whereis 命令来查看其所在的文件夹:&/p&&ol&&li&&code&whereis python&/code&&/li&&/ol&&p&&br&&/p&&p&另一个是 Pip 的安装——Pip 是 Python 的包管理插件。&/p&&p&首先安装 setuptools :&/p&&blockquote&wget --no-check-certificate &a href=&https://link.zhihu.com/?target=https%3A//pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz%23md5%3Dc607dd118eae682c44ede26& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&pypi.python.org/package&/span&&span class=&invisible&&s/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ede26&/span&&span class=&ellipsis&&&/span&&/a&&br&tar -zxvf setuptools-19.6.tar.gz&br&cd setuptools-19.6&br&python3 setup.py build&br&python3 setup.py install&/blockquote&&p&然后给 Python3 安装 pip:&/p&&blockquote&wget --no-check-certificate &a href=&https://link.zhihu.com/?target=https%3A//pypi.python.org/packages/source/p/pip/pip-8.0.2.tar.gz%23md5%3D3a73c4188f8dbad6a1e6f6d44d117eeb& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&pypi.python.org/package&/span&&span class=&invisible&&s/source/p/pip/pip-8.0.2.tar.gz#md5=3a73c4188f8dbad6a1e6f6d44d117eeb&/span&&span class=&ellipsis&&&/span&&/a&&br&tar -zxvf pip-8.0.2.tar.gz&br&cd pip-8.0.2&br&python3 setup.py build&br&python3 setup.py install&/blockquote&&p&然后输入 pip3,如果有正常返回,那么大功告成!&/p&&h2&1.3 Python2/3 轻松分离&/h2&&p&有时候我们只想使用 Python3,但是 Python2 会干扰到,那么怎么解决呢?&br&很简单,在要用 Python3 的时候不是输入 Python 而是输入 Python3,在使用 Python3 的 pip 的时候不是输入 pip 而是输入 pip3。&br&例如,给 Python3 安装 Flask :&/p&&ol&&li&&code&pip3 install Flask&/code&&/li&&/ol&&p&&br&&/p&&h2&2 Pycharm 神器管理本地环境&/h2&&p&然后,当当,就是我们第二个神器登场啦,就是大名鼎鼎的 Pycharm 代码编辑器。&/p&&blockquote&&a href=&https://link.zhihu.com/?target=https%3A//www.jetbrains.com/pycharm/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&jetbrains.com/pycharm/&/span&&span class=&invisible&&&/span&&/a&&/blockquote&&p&Pycharm 分为社区版(免费)和专业版(付费),二者最大的区别就是付费版本的 Pycharm 支持远程调试。&/p&&h2&2.1 创建新项目&/h2&&p&我们来创建一个新项目。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a68d8badb8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1558& data-rawheight=&964& class=&origin_image zh-lightbox-thumb& width=&1558& data-original=&https://pic3.zhimg.com/v2-a68d8badb8_r.jpg&&&/figure&&p&&br&&/p&&p&主要的参数有两个,一个是 Location ,项目的地址。&br&第二个是 Project Interpreter 项目解释器,也就是你要使用哪个 Python 。如果选择 New environment using 呢,就是新建一个虚拟环境,和本机安装的 Python 互不干扰。如果选择 Existing Interpreter,则是使用本机的现有环境。&/p&&p&如果本机安装的 Python 没显示怎么办?那么点击最后边的省略号,选择 System Interpreter,再点击一次省略号,就能添加了。&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-53cee27bddf_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1704& data-rawheight=&1120& class=&origin_image zh-lightbox-thumb& width=&1704& data-original=&https://pic3.zhimg.com/v2-53cee27bddf_r.jpg&&&/figure&&p&&br&&/p&&p&然后我们找到 Python 的所在位置,添加即可。如何找到 Python 位置?请见第一部分。&/p&&h2&2.2 改变已有项目的环境&/h2&&p&如果一开始配置错了,那么该怎么办呢?&br&点击 Pycharm & Preference & Project & Project Interpreter设置即可。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-a2cd781ca5a59b7e5072d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&288& data-rawheight=&279& class=&content_image& width=&288&&&/figure&&figure&&img src=&https://pic3.zhimg.com/v2-951df63ecd6eed3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&2042& data-rawheight=&1238& class=&origin_image zh-lightbox-thumb& width=&2042& data-original=&https://pic3.zhimg.com/v2-951df63ecd6eed3_r.jpg&&&/figure&&p&&br&&/p&&h2&2.3 Pycharm 中包的安装&/h2&&p&在 Pycharm 中,安装 Python 的包有两种方法,一种方法是在刚才的 Project Interpreter 界面里,使用加减号进行包的安装与卸载。&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-006c2d3b40bfcc74240cdaa0e46883ea_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1842& data-rawheight=&1242& class=&origin_image zh-lightbox-thumb& width=&1842& data-original=&https://pic2.zhimg.com/v2-006c2d3b40bfcc74240cdaa0e46883ea_r.jpg&&&/figure&&p&&br&&/p&&p&在安装一两个包的情况下,这种方法是一种简便的方法。那么如果是很多的包呢?这种时候我们就要用到 pip 了。&/p&&p&一般而言,github 中规范的 python 源码会提供一个叫 requirements.txt 的文档,文档里记录的是要安装的包的名称以及版本。&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-3f422fadea076574cbfbd97_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&990& data-rawheight=&615& class=&origin_image zh-lightbox-thumb& width=&990& data-original=&https://pic1.zhimg.com/v2-3f422fadea076574cbfbd97_r.jpg&&&/figure&&p&&br&&/p&&p&然后我们打开 Pycharm 里的终端窗口:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-c4c95a14ce569be97abdaac7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&2044& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&2044& data-original=&https://pic4.zhimg.com/v2-c4c95a14ce569be97abdaac7_r.jpg&&&/figure&&p&&br&&/p&&p&只要到 requirements.txt 所在的目录下,使用 &code&pip3 install-r requirements.txt&/code&命令,就能在当前的 python 环境中导入所有需要的包啦,很方便。&/p&&p&那么,我们在做项目的时候,如何生成 requirements.txt 以供自己和他人使用呢?同样是一行命令就能搞定的事: &code&pip freeze&requirements.txt&/code&。&/p&&p&怎么样,你 get 了吗?&/p&&h2&3 Pycharm 轻松实现远程调试&/h2&&p&某些时候,我们会涉及到在服务器上运行 Python 程序,那么我们就需要对 Pycharm 做一些配置。&/p&&p&&b&注意,只有 Pycharm Pro 支持远程调试。&/b&&/p&&h2&3.1 配置远程连接&/h2&&p&首先,假定我们手头有一台服务器,并有服务器的账号和密码。&/p&&p&然后打开Tools & Deployment & Configuration & new&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-06f51e19aa4ce5f541eb957e79a9c727_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1604& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&1604& data-original=&https://pic4.zhimg.com/v2-06f51e19aa4ce5f541eb957e79a9c727_r.jpg&&&/figure&&p&&br&如下内容是要我们填写的:&/p&&ul&&li&SFTP host:服务器地址&/li&&li&Port:端口,默认22,一般不用改它。&/li&&li&Root path:在服务器上的路径。&/li&&li&User name:服务器上的用户名&/li&&li&Password:服务器上的密码&/li&&/ul&&p&再点击Mapping:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-4efb8cf20d1ccaac8c473_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&806& data-rawheight=&641& class=&origin_image zh-lightbox-thumb& width=&806& data-original=&https://pic4.zhimg.com/v2-4efb8cf20d1ccaac8c473_r.jpg&&&/figure&&p&&br&&/p&&ul&&li&Local path:映射到服务器上对应位置的本机地址&/li&&li&Deploy path:服务器上的文件夹位置。Root path + Deploy path 就是服务器上我们文件所在的完整路径。&/li&&/ul&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-e18fd6a3b8b9bd5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&1032& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/v2-e18fd6a3b8b9bd5_r.jpg&&&/figure&&p&&br&&/p&&p&配置完成后,点击Tools & Browse Remote Host,右侧出现我们服务器上的文件,就说明远程连接成功了!&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-cce3c3e408ee35_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&684& data-rawheight=&1124& class=&origin_image zh-lightbox-thumb& width=&684& data-original=&https://pic1.zhimg.com/v2-cce3c3e408ee35_r.jpg&&&/figure&&p&&br&&/p&&h2&添加远程 Python 解释器&/h2&&p&接下来我们添加远程 Python 解释器,就能在本地「遥控」远程的服务器执行我们的 Python 程序了。&br&点击 Pycharm & Preference & Project & Project Interpreter & SSH Interpreter&br&输入 地址、用户名、密码三件套。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-4bd5d181b0c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1215& data-rawheight=&699& class=&origin_image zh-lightbox-thumb& width=&1215& data-original=&https://pic1.zhimg.com/v2-4bd5d181b0c_r.jpg&&&/figure&&p&&br&&/p&&p&Alright,试着在服务器上运行 Hello World 吧!&/p&&h2&4 Python Web 环境搭建&/h2&&p&这里是本文的重头戏了——如何用 Python 在服务器上搭建一个网站。&br&这里推荐 Python-Flask + Nginx + Gunicorn +Supervisor + Sqlite 的方案,因为这几个软件都对新手非常友好。其中 Python-Flask 是后端核心,Nginx 是前端服务器,Gunicorn 是后端服务器,Supervisor 是进程监控软件,Sqlite 是轻型数据库。&/p&&h2&4.1 配置 Python-Flask 框架&/h2&&p&首先,我们 &code&git clone&/code&一个Python框架。&/p&&p&无数据库的 Flask 框架:&/p&&blockquote&&a href=&https://link.zhihu.com/?target=https%3A//github.com/albertschr/Mixin& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/albertschr/M&/span&&span class=&invisible&&ixin&/span&&span class=&ellipsis&&&/span&&/a&&i&EOS&/i&Player/tree/master/Python/Flask&i&Sketch&/i&Nosql&/blockquote&&p&有数据库的 Flask 框架:&/p&&blockquote&&a href=&https://link.zhihu.com/?target=https%3A//github.com/albertschr/Mixin& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/albertschr/M&/span&&span class=&invisible&&ixin&/span&&span class=&ellipsis&&&/span&&/a&&i&EOS&/i&Player/tree/master/Python/Flask_Sketch&/blockquote&&p&然后先在服务器上安装必要的 Python 包:&/p&&ol&&li&&code&pip install -r requirements.txt&/code&&/li&&/ol&&p&&br&&/p&&p&接着测试一下框架是否能正常运行:&/p&&ol&&li&&code&python3 run.py&/code&&/li&&/ol&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-a31f97eca6b3cb5f67eb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1016& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&1016& data-original=&https://pic1.zhimg.com/v2-a31f97eca6b3cb5f67eb_r.jpg&&&/figure&&p&&br&如果显示`Running on &a href=&https://link.zhihu.com/?target=http%3A//127.0.0.1%3A5000& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&127.0.0.1:5000&/span&&span class=&invisible&&&/span&&/a& 表示框架运行正常。&/p&&h2&4.2 安装 Nginx、Gunicorn 与 Supervisor&/h2&&p&在服务器上运行:&/p&&ol&&li&&code&apt install nginx&/code&&/li&&li&&code&pip3 install gunicorn&/code&&/li&&li&&code&apt install supervisor&/code&&/li&&/ol&&p&&br&&/p&&h2&4.3 修改 nginx 的配置文件&/h2&&p&nginx 的配置文件在 &code&/etc/nginx/sites-available&/code& 目录下,default 文件。&/p&&ol&&li&&code&server {&/code&&/li&&li&&code&
listen 80;&/code&&/li&&li&&code&
listen [::]:80;&/code&&/li&&li&&code&
server_name example.&/code&&/li&&li&&code&
root /home/&/code&&/li&&li&&code&
index index.&/code&&/li&&li&&code&
location /&/code& &code&{&/code&&/li&&li&&code&
try_files $uri $uri/&/code& &code&=404;&/code&&/li&&li&&code&}&/code&&/li&&li&&code&}&/code&&/li&&/ol&&p&&br&&/p&&p&我们要做以下两件事:&/p&&ul&&li&修改 root 为我们前端文件所在的目录。&/li&&li&在 location 中添加一行 &code&expires-1;&/code&,以让页面能即时刷新。&/li&&/ul&&h2&4.4 配置 supervisor&/h2&&p&在你喜欢的目录下生成 supervisor.conf 文件:&/p&&ol&&li&&code&echo_supervisord_conf & supervisor.conf
# 生成 supervisor 默认配置文件&/code&&/li&&/ol&&p&&br&&/p&&p&打开配置文件:&/p&&ol&&li&&code&nano supervisor.conf&/code&&/li&&/ol&&p&&br&&/p&&p&在底部添加:&/p&&ol&&li&&code&[program:&/code& &code&[项目名称]&/code& &code&]&/code&&/li&&li&&code&command=gunicorn -w4 -b0.0.0.0:1234 run:app
supervisor启动命令,文件叫run.py,run.py里面执行的类叫app。&/code&&/li&&li&&code&directory=[项目目录]&/code& &code&;&/code& &code&项目的文件夹路径&/code&&/li&&li&&code&startsecs=0&/code& &code&;&/code& &code&启动时间&/code&&/li&&li&&code&stopwaitsecs=0&/code& &code&;&/code& &code&终止等待时间&/code&&/li&&li&&code&autostart=false&/code& &code&;&/code& &code&是否自动启动&/code&&/li&&li&&code&autorestart =&/code& &code&true&/code& &code&;&/code& &code&程序异常退出后自动重启&/code&&/li&&li&&code&startretries =&/code& &code&3&/code& &code&;&/code& &code&启动失败自动重试次数,默认是&/code& &code&3&/code&&/li&&li&&code&stdout_logfile=[日志目录]/gunicorn.log&/code&&/li&&li&&code&stderr_logfile=[日志目录]/gunicorn.err&/code&&/li&&/ol&&p&&br&&/p&&p&把上面的项目名称、项目目录、日志目录改成自己的即可。&/p&&h2&4.5 修改run.py&/h2&&p&把 run.py 从本地运行改为服务器上运行。&br&把 &code&app.run&/code&那行注释掉,添加以下代码:&/p&&ol&&li&&code&if __name__ ==&/code& &code&'_main_':&/code&&/li&&li&&code&
app.run(host=&0.0.0.0&,debug=True)&/code&&/li&&li&&code&#无需填写端口,因为gunicorn中已经填了&/code&&/li&&/ol&&p&&br&&/p&&p&万事Okay。执行下面命令,你的后端服务器就运行起来啦!&/p&&ol&&li&&code&supervisorctl -c supervisor.conf reload&/code&&/li&&li&&code&supervisorctl -c supervisor.conf start all&/code&&/li&&/ol&&p&&br&&/p&&h2&4.6 supervisor 的用法&/h2&&ol&&li&&code&supervisord -c supervisor.conf
通过配置文件启动supervisor&/code&&/li&&li&&code&supervisorctl -c supervisor.conf status
察看supervisor的状态&/code&&/li&&li&&code&supervisorctl -c supervisor.conf reload
重新载入&/code& &code&配置文件&/code&&/li&&li&&code&supervisorctl -c supervisor.conf start [all]|[appname]&/code& &code&启动指定/所有 supervisor管理的程序进程&/code&&/li&&li&&code&supervisorctl -c supervisor.conf stop [all]|[appname]&/code& &code&关闭指定/所有 supervisor管理的程序进程&/code&&/li&&/ol&&p&&br&&/p&&h2&4.7 supervisor 的小 bug&/h2&&p&有时候,因为服务器重启等原因 supervisor会出现一个 error :&/p&&ol&&li&&code&error:&/code& &code&&class&/code& &code&'socket.error'&,&/code& &code&[Errno&/code& &code&2]&/code& &code&No such file or directory: file:&/code& &code&/usr/lib/python2.7/socket.py line:&/code& &code&228&/code& &/li&&/ol&&p&&br&&/p&&p&这时候,运行以下两个命令:&/p&&ol&&li&&code&sudo supervisord -c /etc/supervisor/supervisord.conf
&/code&&/li&&li&&code&sudo supervisorctl -c /etc/supervisor/supervisord.conf
&/code&&/li&&/ol&&p&&br&&/p&&p&再执行:&/p&&ol&&li&&code&supervisorctl -c supervisor.conf reload
&/code&&/li&&/ol&&p&&br&&/p&&p&就能解决。&/p&&h2&5 总结&/h2&&p&搭建 Python 环境对于初学者来说,有时候还挺费劲。因此,我把 Python 环境搭建中的五项基础技能集成在这一篇文章里啦:&/p&&ul&&li&如何安装 Python&/li&&li&如何安装及使用 Pip&/li&&li&Pycharm 本地怎么配置&/li&&li&Pycharm 如何配置远程调试环境&/li&&li&怎么在服务器上搭一个以 Python 为后端核心的网站&/li&&/ul&&p&希望能对大家有所帮助!?( ????` )&/p&&p&&br&&/p&&blockquote&文——李大狗&/blockquote&&p&&br&&/p&&p&人生苦短,我用 Python!简洁高效,新手友好!来自硅谷的「Python 编程入门」基石纳米学位课程,已经开放报名,限量课程席位!点击以下卡片,免费预览和体验课程。&/p&&p&&br&&/p&&a href=&https://link.zhihu.com/?target=https%3A//cn.udacity.com/course/intro-to-python-nanodegree--nd302-cn-basic%3Futm_source%3Dzhihu-oa%26utm_medium%3Dsocial%26utm_campaign%3Dpython& data-draft-node=&block& data-draft-type=&link-card& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python 编程入门_Python基础教程_Python培训班_Python快速入门-优达学城(Udacity)官网&/a&&p&&/p&
Python 环境搭建以及神器推荐今天给大家讲一下如何搭建一个舒适的 Python 环境,包括本地环境和远程调试环境,然后再附送给大家两套好用的 Python

我要回帖

更多关于 怎么黑学校crp 的文章

 

随机推荐