d3hfZm10PWdpZg==

又到摆脱重复工作,换个心情,然而并没有软用的时间了。这次,教大家如何搭建一个好看的jupyter环境。


安装Jupyter


先来展示一下我的环境


  • python: 3.5.*

  • macos: 10.12.4


安装Jupyter的过程只需安装Anaconda即可。


测试一下初始设置:


jupyter notebook


配置ipython


首先,如果每次你打开一个nb(notebook)时,如果都需要载入一些模块,一个很好地方法就是配置ipython的配置文件,可以直接使用以下命令创建配置文件:


ipython profile create


此时你会在~/.ipython/profile_default/目录中获得下面两个文件:


  • ipython_config.py:打开任意ipython kernel时都会运行

  • ipython_notebook_config.py:打开notebook时会运行


配置方式是在所需要的配置文件中先键入:


c = get_config()


然后就可以通过修改c的属性来控制所有的配置。


显然,对大多数分析场景,numpy, scipy, pandas是肯定要载入的,因此,写到配置中即可:


c.InteractiveShellApp.exec_lines = [

        "import pandas as pd",

        "import numpy as np",

        "import scipy.stats as spstats",

        "import scipy as sp",

        ]


配置matplotlib


还有一个常用功能就是matplotlib。matplotlib在notebook中需要使用


%matplotlib inline


才可默认在notebook中显示图像,一个简单地方法就是在配置文件中加入,


c.IPKernelApp.matplotlib = 'inline'


当然,默认也需要载入matplotlib


c.InteractiveShellApp.exec_lines = [

        "import pandas as pd",

        "import numpy as np",

        "import scipy.stats as spstats",

        "import scipy as sp",

        "import matplotlib.pyplot as plt"

        ]


当然,也可以更多。但这样可能会影响初始化notebook和ipython shell的速度,这个请大家自己权衡。


matplotlib显示中文


此外,单独拎matplotlib出来的另一个原因是,matplotlib还有一个中文显示的问题。


首先,解决编码问题


python 2.7.*的解决方案是,在配置中加入:


import seaborn as sns

import sys# print sys.getdefaultencoding()# ipython notebook中默认是ascii编码

reload(sys)

sys.setdefaultencoding('utf8')


python 3.*出于某些原因,不建议通过sys模块修改编码,原因参见这里(http://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script)。


解决方案是,在shell的配置中重新设置配置变量(bash的话设置文件.bashrc,zsh则设置文件.zshrc)。方法是末尾添加:


export PYTHONIOENCODING="utf8"


当然另一个方法是在启动notebook时使用


PYTHONIOENCODING="utf8" & jupyter notebook


第二个是修改matplotlib的默认字体。


首先我们来看可以使用的字体


import matplotlib.font_manager

fonts = matplotlib.font_manager.findSystemFonts()

l = []

for f in fonts:

    try:

        font =matplotlib.font_manager.FontProperties(fname=f)

        #print(font.get_family())

        l.append((f, font.get_name(), font.get_family(), font.get_weight()))

    except:

        pass

df = pd.DataFrame(l, columns=['path', 'name', 'family', 'weight'])

df


你应该看到下面这样的表格:


d3hfZm10PXBuZw==


然后找到支持中文的字体名,然后设置matplotlib的默认字体:


import matplotlib as mpl

mpl.rc('font', family='Noto Sans CJK SC')


当然,你可以添加到刚才的配置中,或者采用这个博客的方法。


此外,如果你使用seaborn的话,seaborn在设置配置时可能会覆盖掉matplotlib,此时采用以下代码即可:


import seaborn as sns

sns.set_style('ticks',

              {

                    'font.family': ['Noto Sans CJK SC'],

    })


但是,该语句不建议写在配置中,因为经常需要修改,可能会覆盖之前的配置。


matplotlib在Retina屏幕中显示模糊问题


直接使用下面语句即可,


%config InlineBackend.figure_format = 'retina'


当然也可在配置中直接加入


c.InlineBackend.figure_format = 'retina'


修改notebook样式


默认的notebook可以逼你心中大喊WTF,这时候你需要一点CSS技能,修改~/.jupyter/custom/custom.css的内容。


个人认为最需要修改的内容包括


  1. notebook的默认宽度:notebook默认比较宽,markdown文字会显得比较少,如果需要对外展示,文字部分会过少。

  2. notebook的代码字体


我的修改规则是:


pre.CodeMirror-line {

    font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif

}

 

.output_subarea.output_text.output_result>pre {

    font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif

}

 

.output_subarea.output_text.output_stream.output_stdout>pre {

    font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif

}

 

#notebook-container {

    max-width: 830px;

    padding: 40px;

}


安装Jupyter常用插件


这里推荐两个jupyter插件:


插件管理器jupyter notebook extensions


github地址在这里(https://github.com/ipython-contrib/jupyter_contrib_nbextensions)。安装和介绍也可以参考。


然后你就可以在jupyter主页里找到下面的标签页管理插件了:


aHR0cHM6Ly9tbWJpei5xbG9nby5jbi9tbWJpel9w


jupyter Dashboard


如果你的jupyter服务是搭建在主机上,并且平时和业务人员想用notebook地址的方式交付,jupyter dashboard插件是一个不错的选择。


安装方法和github地址在这里(https://github.com/jupyter/dashboards)。


原本效果如下:


d3hfZm10PXBuZw==


点击如下红色设置,并点击黄色按钮后


aHR0cHM6Ly9tbWJpei5xbG9nby5jbi9tbWJpel9w


就可得到如下的报告形式(删去了业务人员不想查看的代码),然后就可以粘贴连接交付报告了:


d3hfZm10PXBuZw==


切换成dashboard模式可以拖拽相关方格来设置位置。


大功告成,现在开工!


来源作者:三次方根

来源地址:segmentfault.com/a/1190000009305646