• 20200302 数据分析之numpy以及Jupyter


    数据分析

    py的就业方向

    web方向
    爬虫和数据分析
    自动化运维
    人工智能
    

    数据分析历史

    以前使用的语言是R语言进行数据分析的,BI(商业智能部)
    R语言能做的事,python也能做,并且写的代码非常少
    

    数据分析的介绍

    数据分析的步骤

    提出需求

    产品经理或者领导
    

    数据的来源

    公司足够大,那每天产生的数据(Nginx日志数据),就足够我们分析使用
    买数据
    

    开始数据的清洗

    通过删除,修改没替换等方式保证数据的准确性
    

    得出结论

    使用图表的方式
    

    常见数据分析库

    - numpy
    - pandas
    - matplotlib  画图 
    

    写代码的工具

    anaconda 是一个软件,有一个Jupyter notebook 
    

    Jupyter notebook

    ipython
    

    numpy

    简介

    使用numpy进行数据分析

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
    

    NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

    • 一个强大的N维数组对象 ndarray
    • 广播功能函数
    • 整合 C/C++/Fortran 代码的工具
    • 线性代数、傅里叶变换、随机数生成等功能

    安装

    pip install numpy
    

    使用

    NumPy Ndarray 对象

    NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。

    ndarray 对象是用于存放同类型元素的多维数组。

    ndarray 中的每个元素在内存中都有相同存储大小的区域。

    ndarray 内部由以下内容组成:

    • 一个指向数据(内存或内存映射文件中的一块数据)的指针。
    • 数据类型或 dtype,描述在数组中的固定大小值的格子。
    • 一个表示数组形状(shape)的元组,表示各维度大小的元组。
    • 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。

    ndarray 的内部结构:

    img

    跨度可以是负数,这样会使数组在内存中后向移动,切片中 obj[::-1]obj[:,::-1] 就是如此。

    创建一个 ndarray 只需调用 NumPy 的 array 函数即可:

    numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
    

    参数说明:

    名称 描述
    object 数组或嵌套的数列
    dtype 数组元素的数据类型,可选
    copy 对象是否需要复制,可选
    order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
    subok 默认返回一个与基类类型一致的数组
    ndmin 指定生成数组的最小维度

    ndarray是一个包含了相同元素类型和大小的多维数组。

    创建数组:

    1、使用系统方法

    empty(shape[, dtype, order]) # 根据给定的参数创建一个ndarray数组,值用随机数填充

    例:

    >>> np.empty([2, 2])
    array([[ -9.74499359e+001,   6.69583040e-309],
           [  2.13182611e-314,   3.06959433e-309]])
    

    empty_like(a[, dtype, order, subok]) #和empty不同的是,需要给出一个array的模板,就是a参数,新生成的ndarray继承了a的shape和dtype

    例:

    >>> a = ([1,2,3], [4,5,6]) 
    >>> np.empty_like(a)
    array([[-1073741821, -1073741821,           3],    #random
           [          0,           0, -1073741821]])
    

    eye(N[, M, k, dtype]) #生成一个N行M列的数组,K指定一条斜线,这条斜线上的值都是1,数组的其他元素维0

    例:生成一个5行4列的数组,索引为1的斜线上全部是1,其他元素为0

    >>> np.eye(5,4,1)
    array([[ 0.,  1.,  0.,  0.],
           [ 0.,  0.,  1.,  0.],
           [ 0.,  0.,  0.,  1.],
           [ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]])
    

    identity(n[, dtype]) #生成一个正方形的数组即N×N类型的数组,且索引万恶哦0的斜线上维1,其他元素维0

    例:

    >>> np.identity(3)
    array([[ 1.,  0.,  0.],
           [ 0.,  1.,  0.],       
           [ 0.,  0.,  1.]])
    

    ones(shape[, dtype, order]) #生成一个指定shape和dtype的数组,用1填充

    例:

    >>> np.ones(5)
    array([ 1.,  1.,  1.,  1.,  1.])
    >>> np.ones((2, 1))
    array([[ 1.],
           [ 1.]])
    

    ones_like(a[, dtype, order, subok]) #和ones的区别就是需要给定一个dnarray模板,新生成的array继承了a的shape和dtype

    例:

    >>> x = np.arange(6)
    >>> x = x.reshape((2, 3))
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> np.ones_like(x)
    array([[1, 1, 1],
           [1, 1, 1]])
    

    zeros(shape[, dtype, order]) #根据给定的shape,和dtype生成一个由0填充的数组

    例:

    >>> np.zeros(5)
    array([ 0.,  0.,  0.,  0.,  0.])
    

    zeros_like(a[, dtype, order, subok]) #根据a模板生成一个新的用0 填充的ndarray数组

    例:

    >>> x = np.arange(6)
    >>> x = x.reshape((2, 3))
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> np.zeros_like(x)
    array([[0, 0, 0],
           [0, 0, 0]])
    

    full(shape, fill_value[, dtype, order]) #用指定的值填充数组

    例:

    >>> np.full((2, 2), 10)
    array([[10, 10],
           [10, 10]])
    

    full_like(a, fill_value[, dtype, order, subok]) #根据a模板的shape和dtype生成一个数组,如果指定的填充数不是a的dtype类型,会向下取整,这时候也可以指定新数组的dtype类型。

    例:

    >>> x = np.arange(6, dtype=np.int)
    >>> np.full_like(x, 1)
    array([1, 1, 1, 1, 1, 1])
    >>> np.full_like(x, 0.1)   #如果full_value设置为1.2则就是用1填充
    array([0, 0, 0, 0, 0, 0])
    >>> np.full_like(x, 0.1, dtype=np.double)
    array([ 0.1,  0.1,  0.1,  0.1,  0.1,  0.1])
    >>> np.full_like(x, np.nan, dtype=np.double)
    array([ nan,  nan,  nan,  nan,  nan,  nan])
    

    用指定的数据填充

    array(object[, dtype, copy, order, subok, ndmin]) #用对象直接填充数组

    例:

    >>> np.array([1, 2, 3])  #一维数组
    array([1, 2, 3])
    >>> np.array([[1, 2], [3, 4]])   #二维数组
    array([[1, 2],
           [3, 4]])
    >>> np.array([1, 2, 3], ndmin=2)   #只有一个元素的二维数组
    array([[1, 2, 3]])
    >>> np.array(np.mat('1 2; 3 4'))    #从子类创建
    array([[1, 2],
           [3, 4]])
    

    asarray(a[, dtype, order]) #把lists, lists of tuples, tuples, tuples of tuples, tuples of lists and ndarrays转化为array

    例:

    >>> a = [1, 2]
    >>> np.asarray(a)
    array([1, 2])
    

    asanyarray(a[, dtype, order]) #通过ndarray的子类创建array

    >>> a = [1, 2]
    >>> np.asanyarray(a)
    array([1, 2])
    

    ascontiguousarray(a[, dtype]) #返回一个地址连续的数组(C order)

    >>> x = np.arange(6).reshape(2,3)
    >>> np.ascontiguousarray(x, dtype=np.float32)
    array([[ 0.,  1.,  2.],
           [ 3.,  4.,  5.]], dtype=float32)
    >>> x.flags['C_CONTIGUOUS']
    True
    

    asmatrix(data[, dtype]) # 把数组转化为矩阵,新的变量没有copy数据,只是指向原有的数据

    >>> x = np.array([[1, 2], [3, 4]])
    >>> m = np.asmatrix(x)
    >>> x[0,0] = 5
    >>> m
    matrix([[5, 2],        [3, 4]])
    

    copy(a[, order]) #顾名思义就是复制的意思

    >>> x = np.array([1, 2, 3])
    >>> y = x
    >>> z = np.copy(x)
    >>> x[0] = 10
    >>> x[0] == y[0]
    True
    >>> x[0] == z[0]
    False
    

    frombuffer(buffer[, dtype, count, offset]) #把buffer数据转化为1维数组ps:如果数据不是机器字节顺序,需要指定他的dtype类型

    >>> s = 'hello world'
    >>> np.frombuffer(s, dtype='S1', count=5, offset=6)
    array(['w', 'o', 'r', 'l', 'd'],
          dtype='|S1')
    

    frombuffer(buffer[, dtype, count, offset]) #从文件读取数据 ps:该方法不长用用save替代

    fromfunction(function, shape, **kwargs) #用方法计算出来的数据填充数组

    >>> np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int)
    array([[0, 1, 2],
           [1, 2, 3],       
           [2, 3, 4]])
    

    fromiter(iterable, dtype[, count]) #通过迭代器生成一个一维数组

    >>> iterable = (x*x for x in range(5))
    >>> np.fromiter(iterable, np.float)
    array([  0.,   1.,   4.,   9.,  16.])
    

    fromstring(string[, dtype, count, sep]) #把二进制流或者字符串转化维数组

    >>> np.fromstring('x01x02', dtype=np.uint8)
    array([1, 2], dtype=uint8)
    >>> np.fromstring('1 2', dtype=int, sep=' ')
    array([1, 2])
    >>> np.fromstring('1, 2', dtype=int, sep=',')
    array([1, 2])
    >>> np.fromstring('x01x02x03x04x05', dtype=np.uint8, count=3)
    array([1, 2, 3], dtype=uint8)
    

    arange([start,] stop[, step,][, dtype])

    #根据给定的区间创建连续的值

    >>> np.arange(3)
    array([0, 1, 2])
    >>> np.arange(3.0)
    array([ 0.,  1.,  2.])
    >>> np.arange(3,7)
    array([3, 4, 5, 6])
    >>> np.arange(3,7,2)
    array([3, 5])
    

    numpu.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None) #arrange一样,主要是生成浮点型

    >>> np.linspace(2.0, 3.0, num=5)
    array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ])
    >>> np.linspace(2.0, 3.0, num=5, endpoint=False)
    array([ 2. ,  2.2,  2.4,  2.6,  2.8])
    >>> np.linspace(2.0, 3.0, num=5, retstep=True)
    (array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ]), 0.25)
    

    numpy.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None) #log函数.base默认值为10

    >>> np.logspace(2.0, 3.0, num=4)
    array([  100.        ,
       215.443469  ,   
       464.15888336,  
       1000.        ])
    >>> np.logspace(2.0, 3.0, num=4, endpoint=False)
    array([ 100.        ,
      177.827941  ,  
      316.22776602,  
      562.34132519])
    >>> np.logspace(2.0, 3.0, num=4, base=2.0)
    array([ 4.        ,
      5.0396842 ,  
      6.34960421,  
      8.        ])
    

    numpy.geomspace(start,stop,num=50,endpoint=True,dtype=None) #几何级增长

    >>> np.geomspace(1, 1000, num=4)
    array([    1.,    10.,   100.,  1000.])
    >>> np.geomspace(1, 1000, num=3, endpoint=False)
    array([   1.,   10.,  100.])
    >>> np.geomspace(1, 1000, num=4, endpoint=False)
    array([   1.        ,
        5.62341325,   
        31.6227766 ,  
        177.827941  ])
    >>> np.geomspace(1, 256, num=9)
    array([   1.,    2.,    4.,    8.,   16.,   32.,   64.,  128.,  256.])
    

    numpy.emshgrid(*xi,**kwargs) #把向量坐标转化为矩阵坐标;在二维度数组中长度为M,N的的俩个数组作为输入:如果indexing='ij',则shape(M,N)如果indexing='xy'则shape(N.M)

    >>> nx, ny = (3, 2)
    >>> x = np.linspace(0, 1, nx)
    >>> y = np.linspace(0, 1, ny)
    >>> xv, yv = np.meshgrid(x, y)
    >>> xv
    array([[ 0. ,  0.5,  1. ],
           [ 0. ,  0.5,  1. ]])
    >>> yv
    array([[ 0.,  0.,  0.],
           [ 1.,  1.,  1.]])
    

    numpy.diag(v,k=0) #提取对角或构建一个对角阵

    >>> x = np.arange(9).reshape((3,3))
    >>> xarray([[0, 1, 2],
           [3, 4, 5],       [6, 7, 8]])
    >>> np.diag(x)
    array([0, 4, 8])
    >>> np.diag(x, k=1)
    array([1, 5])
    >>> np.diag(x, k=-1
    array([3, 7])
    

    numpy.diagflat(v,k=0) #一个扁平输入作为一个二维数组的对角

    >>> np.diagflat([[1,2], [3,4]])
    array([[1, 0, 0, 0],
           [0, 2, 0, 0],       
           [0, 0, 3, 0],       
           [0, 0, 0, 4]])
    

    numpy.tri(N,M=None,k=0,dtype=<type 'float'>) #这个不会翻译,但是看数据有点映像

    >>> np.tri(3, 5, 2, dtype=int)
    array([[1, 1, 1, 0, 0],
           [1, 1, 1, 1, 0],       
           [1, 1, 1, 1, 1]])
    

    numpy.vander(x,N=None,incresing=False) # 范德蒙式,程序不重要,重要的是科学计算

    >>> x = np.array([1, 2, 3, 5])
    >>> N = 3
    >>> np.vander(x, N)
    array([[ 1,  1,  1],
           [ 4,  2,  1],       
           [ 9,  3,  1],       
           [25,  5,  1]])
    

    numpy.mat(data,dtype=None) #输入转化为矩阵,创建一个新变量,指向旧的数据

    >>> x = np.array([[1, 2], [3, 4]])
    >>> m = np.asmatrix(x)
    >>> x[0,0] = 5
    >>> m
    matrix([[5, 2],        [3, 4]])
    

    numpy.bmat(obj,ldict=None,gdict=None) #用字符串,嵌套序列,或者数组创建矩阵

    >>> A = np.mat('1 1; 1 1')
    >>> B = np.mat('2 2; 2 2')
    >>> C = np.mat('3 4; 5 6')
    >>> D = np.mat('7 8; 9 0')
    
    >>> np.bmat([[A, B], [C, D]])
    matrix([[1, 1, 2, 2],
            [1, 1, 2, 2],        
            [3, 4, 7, 8],        
            [5, 6, 9, 0]])
    >>> np.bmat(np.r_[np.c_[A, B], np.c_[C, D]])
    matrix([[1, 1, 2, 2],
            [1, 1, 2, 2],        
            [3, 4, 7, 8],        
            [5, 6, 9, 0]])
    >>> np.bmat('A,B; C,D')
    matrix([[1, 1, 2, 2],
            [1, 1, 2, 2],        
            [3, 4, 7, 8],        
            [5, 6, 9, 0]])
    

    实例

    #!/usr/bin/env python
    # coding: utf-8
    
    # In[21]:
    
    
    import numpy as np
    
    
    # ## 为啥使用numpy
    
    # 计算数组的总数
    
    # In[22]:
    
    
    shop_car = [2,3,10,3]
    shop_price = [10,20,1010,23]
    
    
    # In[23]:
    
    
    shop_car_np = np.array(shop_car)
    
    
    # In[24]:
    
    
    shop_price_np = np.array(shop_price)
    
    
    # In[25]:
    
    
    shop_car_np
    
    
    # In[26]:
    
    
    shop_price_np
    
    
    # In[27]:
    
    
    # 利用array进行求和
    np.sum(shop_car_np * shop_price_np)
    
    
    # ## 常见属性
    
    # ### 一维数组
    
    # In[29]:
    
    
    arr = np.array([1,1,23,42,1,])
    
    
    # In[30]:
    
    
    arr # 简单的ndarray一维数组
    
    
    # In[31]:
    
    
    arr.dtype  # 数组的数据类型
    
    
    # In[32]:
    
    
    arr.size  # 数组元素的个数
    
    
    # In[33]:
    
    
    arr.ndim   # 数组的维度
    
    
    # In[34]:
    
    
    arr.shape  # 数组的个数 (元组的形式)
    
    
    # ### 二维数组
    
    # In[36]:
    
    
    arr2 = np.array([[1,2,3,4,5],[6,7,8,9,0]]) 
    
    
    # In[37]:
    
    
    arr2
    
    
    # In[39]:
    
    
    arr2.ndim
    
    
    # In[40]:
    
    
    arr2.shape  # 数组的个数,前面是行,后面是列  2行5列
    
    
    #  数组的转置 T
    # 
    
    # In[41]:
    
    
    arr2.T
    
    
    # ### 数据类型的转换
    
    # In[43]:
    
    
    arr
    
    
    # In[44]:
    
    
    arr.dtype
    
    
    # In[45]:
    
    
    arr.astype('float')  # 强制的转换为指定的数据类型 
    
    
    # ### ndarray数组的创建方式
    
    # In[46]:
    
    
    arr3 = np.array([1,2,3,4,5,6],dtype='float')
    
    
    # In[47]:
    
    
    arr3
    
    
    # numpy版的arange
    
    # In[48]:
    
    
    np.arange(1,9)
    
    
    # In[54]:
    
    
    np.arange(0,10)
    
    
    # linspace 创建数组
    
    # In[57]:
    
    
    np.linspace(1,10,num=5)  # num控制分割数量
    
    
    # In[56]:
    
    
    np.linspace(1,10,num=5,endpoint=False)  # endpoint 控制最后一位
    
    
    # In[ ]:
    
    
    
    
    
    # In[60]:
    
    
    np.zeros(5)
    
    
    # In[61]:
    
    
    np.zeros((2,3),dtype='int')
    
    
    # In[62]:
    
    
    np.ones(5)
    
    
    # In[63]:
    
    
    np.ones((3,4))
    
    
    # 生成随机数组
    
    # In[64]:
    
    
    np.empty((2,3))
    
    
    # In[65]:
    
    
    get_ipython().run_line_magic('pinfo', 'np.eye')
    
    
    # In[ ]:
    
    
    # 默认生成5行5列的数组,并且数组的对角线默认是1
    
    
    # In[67]:
    
    
    np.eye(5,dtype='int')
    
    
    # ## ndarray的索引
    
    # 一维数组
    
    # In[68]:
    
    
    arr
    
    
    # In[70]:
    
    
    #### 列表中怎么通过索引获取值,在这里也是一样的
    arr[2]
    
    
    # 二维数组
    
    # In[71]:
    
    
    arr2   # 分为行索引与列索引
    
    
    # In[73]:
    
    
    arr2[0,2]   # 逗号前面是行索引,后面是列索引
    
    
    # ### 切片
    
    # 顾前不顾后
    
    # In[78]:
    
    
    arr 
    
    
    # 
    
    # In[81]:
    
    
    arr[1:3]
    
    
    # 二维数组
    
    # In[82]:
    
    
    arr2
    
    
    # 切出 2,3  7,8     # 和索引使用的方法一致,前面行索引,后面列索引
    
    # In[90]:
    
    
    arr2[0:2,1:3]
    
    
    # #### 布尔型索引
    
    # In[91]:
    
    
    arr
    
    
    # 查询arr中大于4的所有数据
    
    # In[94]:
    
    
    arr > 4
    
    
    # In[95]:
    
    
    arr[arr>4]
    
    
    # In[96]:
    
    
    arr2
    
    
    # In[97]:
    
    
    arr2[arr2 > 3]
    
    
    # ### 通用函数
    
    # In[101]:
    
    
    a = -4
    
    
    # In[104]:
    
    
    np.abs(a)  # 绝对值
    
    
    # In[105]:
    
    
    np.ceil(4.3)  # 向上取整
    
    
    # In[106]:
    
    
    np.floor(4.6)  # 向下取整
    
    
    # In[109]:
    
    
    np.rint(4.6) #  四舍五入取整
    
    
    # In[108]:
    
    
    np.rint(4.3)
    
    
    # In[110]:
    
    
    np.modf(5.6)
    
    
    # isnan   # 判断某一数据是否是nan == not a number(不是数字)
    
    # In[113]:
    
    
    np.nan
    
    
    # In[114]:
    
    
    arr
    
    
    # In[115]:
    
    
    np.sum(arr)
    
    
    # In[116]:
    
    
    np.cumsum(arr)
    
    
    # ### 随机数
    
    # In[119]:
    
    
    np.random.rand()
    
    
    # In[120]:
    
    
    np.random.rand(10)   # 随机生成10个0-1之间的数字
    
    
    # In[121]:
    
    
    np.random.randint(5)
    
    
    # In[123]:
    
    
    np.random.choice(6,4)   # 随机生成3个 0-5之间的数
    
    
    # In[124]:
    
    
    arr
    
    
    # In[127]:
    
    
    np.random.shuffle(arr)   # 随机打乱给定的数组
    
    
    # In[128]:
    
    
    arr
    
    
    # In[129]:
    
    
    arr
    
    
    # 转换为二维数组
    
    # In[133]:
    
    
    arr.reshape(5,1)   # 必须数组元素对的上
    
    
    

    Anaconda

    1. 简介

    Anaconda在英文中是“蟒蛇”,所以Anaconda的图标就像一个收尾互相咬住的“蟒蛇”。

    简单来说,Anaconda是包管理器和环境管理器,Jupyter notebook 可以将数据分析的代码、图像和文档全部组合到一个web文档中。

    下载

    Anaconda 官网下载地址

    Anaconda 清华镜像地址

    目前最新版本是 python 3.6,默认下载也是 Python 3.6。

    安装

    参考安装教程

    Anaconda 的下载文件比较大(约 500 MB),因为Anaconda附带了 Python 中最常用的数据科学包。

    如果计算机上已经安装了 Python,安装不会对你有任何影响。实际上,脚本和程序使用的默认 Python 是 Anaconda 附带的 Python。

    2. 使用

    为什么安装

    1)Anaconda 附带了一大批常用数据科学包,它附带了 conda、Python 和 150 多个科学包及其依赖项。因此你可以立即开始处理数据。

    2)管理包

    Anaconda 是在 conda(一个包管理器和环境管理器)上发展出来的。

    在数据分析中,你会用到很多第三方的包,而conda(包管理器)可以很好的帮助你在计算机上安装和管理这些包,包括安装、卸载和更新包。

    3)管理环境

    为什么需要管理环境呢?

    比如你在A项目中用了 Python 2,而新的项目B老大要求使用Python 3,而同时安装两个Python版本可能会造成许多混乱和错误。这时候 conda就可以帮助你为不同的项目建立不同的运行环境。

    还有很多项目使用的包版本不同,比如不同的pandas版本,不可能同时安装两个 Numpy 版本,你要做的应该是,为每个 Numpy 版本创建一个环境,然后项目的对应环境中工作。这时候conda就可以帮你做到,而且conda不会影响系统自带的python。

    测试安装

    cmd中输入conda list查看安装的内容

    在开始界面Anaconda中点击Jupyter Notebook即可打开浏览器

    设置Anaconda镜像

    使用conda install 包名 安装需要的Python非常方便,但是官方的服务器在国外,因此下载速度很慢,国内清华大学提供了Anaconda的仓库镜像,我们只需要配置Anaconda的配置文件,添加清华的镜像源,然后将其设置为第一搜索渠道即可cmd命令行下分别执行以下命令:

    (参考 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/)

    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    conda config --set show_channel_urls yes
    

    配置完后可以测试一下,安装第三方包明显神速

    3. 包管理

    安装Anacond之后,我们就可以很方便的管理安装包(安装,卸载,更新)。
    1. 安装包
    conda 的包管理功能和pip 是一样的,当然你选择pip 来安装包也是没问题的。

    1.  #安装 matplotlib   
    2. conda install matplotlib
    

    2. 卸载包

    1. # 删除包  
    2. conda remove matplotlib  
    

    3. 更新包

    1. # 包更新  
    2. conda update matplotlib  
    

    4. 查询已经安装的包

    1. # 查看已安装的包  
    2. conda list   
    

    4.环境管理

    conda 可以为你不同的项目建立不同的运行环境。

    1. 创建python2.7版本的环境

    #创建python2.7版本的环境
    conda create -n python27 python=2.7
    

    上面的命令中,python27是设置环境的名称(-n是指该命令后面的python27是你要创建环境的名称)
    注意:创建环境时,可以指定要安装在环境中的Python版本。当你同时使用 Python 2.x 和 Python 3.x 中的代码时这很有用。
    2. 进入环境

    #进入我刚创建的python27环境
    conda activate python27
    

    进入之后,你可以在终端提示符中看到环境名称(python27)。当然,当你进入环境后,可以用conda list 查看环境中默认的安装包。

    img

    3. 离开环境

    #离开当前环境
    deactivate
    

    4. 共享环境
    共享环境非常有用,它能让其他人安装你代码中使用的所有包,并确保这些包的版本正确。比如你开发了一个系统,你要提交给项目部署系统的人来部署你的项目,但是他们并不知道你当时开发时使用的是哪个python版本,以及使用了哪些包和包的版本。这怎么办呢?你可以在你当前的环境的终端中使用:

    #将你当前的环境保存到文件中包保存为YAML文件
    conda env export > environment.yaml  
    

    将你当前的环境保存到文件中包保存为YAML文件(包括Pyhton版本和所有包的名称)。命令的第一部分 conda env export 用于输出环境中的所有包的名称(包括 Python 版本)。你在终端中上可以看到导出的环境文件路径。在 GitHub 上共享代码时,最好同样创建环境文件并将其包括在代码库中。这能让其他人更轻松地安装你的代码的所有依赖项。

    导出的环境文件,在其他电脑环境中如何使用呢?
    首先在conda中进入你的环境,比如conda activate python27。然后在使用以下命令更新你的环境:

    #其中-f表示你要导出文件在本地的路径,所以/path/to/environment.yml要换成你本地的实际路径  
    conda env update -f=/path/to/environment.yml  
    

    对于不使用conda 的用户,我们通常还会使用以下命令将一个 txt文件导出并包括在其中:

    pip freeze > environment.txt   
    

    然后我将该文件包含在项目的代码库中,其他项目成员即使在他的电脑上没有安装conda也可以使用该文件来安装和我一样的开发环境:
    他在自己的电脑上进入python命令环境,然后运行以下命令就可以安装该项目需要的包:

    1. #其中C:UsersMicrostrongenviroment.txt是该文件在你电脑上的实际路径。  
    2. pip install -r C:UsersMicrostrongenviroment.txt  
    

    5. 列出环境
    有时候会忘记自己创建的环境名称,这时候用 conda env list 就可以列出你创建的所有环境。

    img

    你会看到环境的列表,而且你当前所在环境的旁边会有一个星号。默认的环境(即当你不在选定环境中时使用的环境)名为 base。

    6. 删除环境
    如果你不再使用某个环境,可以使用以下命令。

    1. #删除指定的环境(在这里环境名为 python27)。  
    2. conda env remove -n python27  
    

    Jupyter Notebook

    Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。

    Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown。 用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等

    1. 安装

    使用Anaconda安装

    上文有介绍

    使用pip命令安装

    有经验的Python用户,可以使用Python的包管理器pip而不是Anaconda 来安装Jupyter 。

    如果已经安装了Python 3:

    python3 -m pip install --upgrade pip
    
    pi3 install jupyter
    

    如果已经安装了Python 2:

    python2 -m pip install --upgrade pip
    
    pip2 install jupyter
    

    但推荐使用Anaconda,自带了Numpy、Scipy、Matplotlib等多种python开发包和Jupyter Notebook!

    2. 运行

    成功安装Jupyter Notebook后,在Terminal (Mac / Linux)或Command Prompt(Windows)中运行以下命令就可打开Jupyter Notebook

    jupyter notebook
    

    执行上面命令之后, Jupyter Notebook 将在你的默认浏览器中打开,网址为:http://localhost:8888/tree

    或者在开始菜单页面直接打开软件

    3. 使用

    主面板

    img

    打开Notebook,可以看到主面板。在菜单栏中有Files(文件)、Running(运行)、Clusters(集群)、三个选项。用到最多的是Files,我们可以在这里完成notebook的新建、重命名、复制等操作。

    Files 基本上列出了所有的文件,

    Running 显示你当前已经打开的终端和Notebooks,

    Clusters 由 IPython parallel 包提供,用于并行计算。

    要打开一个新的 Jupyter Notebook,请单击页面右侧的“New”选项卡。在这里,你有四个选项可供选择:

    ⦁ Python 3

    ⦁ Text File (文本文件)

    ⦁ Folder (文件夹)

    ⦁ Terminal (终端)

    在 "Text File" 选项中,你会得到一个空白的文档。输入你喜欢的任何字母,单词和数字。它基本上是一个文本编辑器(类似于 Ubuntu 上的应用程序)。你也可以选择一种语言(支持非常多的语言),然后用该语言来写一个脚本。你还可以查找和替换文件中的单词。

    在 "Folder" 选项中, 顾名思义它的功能就是创建文件夹。你可以创建一个新文件夹来放入文件,重新命名或者删除它。

    "Terminal" 的工作方式与你的 Mac 电脑或 Linux 电脑上的终端完全相同(或者 Windows 上的 cmd )。它在你的Web浏览器中支持终端会话。在这个终端中输入 python ,可以写 python 脚本了。

    创建python文件

    从“New”选项中选择 "Python 3" 选项。你会看到如下的截图:

    img

    代码上方的菜单栏提供了操作单元格的各种选项:

    insert (添加),edit (编辑),cut (剪切),move cell up/down (上下移动单元格),run cells(在单元格中运行代码),interupt (停止代码),save (保存工作),以及 restart (重新启动内核)

    img

    在下拉菜单中(如上所示),你有四个选项:

    Code - 这是你输入代码的地方

    Markdown - 这是你输入文本的地方。你可以在运行代码后添加结论,添加注释等。

    Raw NBConvert - 这是一个命令行工具,可将你的笔记本转换为另一种格式(如 HTML)

    Heading - 你可以将标题添加到单独的小节并使你的 Notebook 看起来干净整洁。这个选项现在已经集成到 Markdown 选项中。添加一个“##”,以确保在你之后输入的内容将被视为标题

    4.编辑界面

    一个notebook的编辑界面主要由四部分组成:名称、菜单栏、工具条以及单元(Cell),如下图所示:

    img

    1.名称

    1.在这里,我们可以修改notebook的名字,直接点击当前名称,弹出对话框进行修改:

    img

    2.菜单栏详解

    2.1 File

    img

    2.2 Edit

    img

    2.3 View

    img

    2.4 Insert

    img

    2.5 Cell

    img

    2.6 Kernel

    img

    2.7 Help

    img

    3. 工具条

    工具条中的功能基本上在菜单中都可以实现,这里是为了能更快捷的操作,将一些常用按钮放了出来。下图是对各按钮的解释。

    img

    4 .单元(Cell)

    在单元中我们可以编辑文字、编写代码、绘制图片等等。对于单元的详细内容放在第五节中介绍。

    两种模式

    对于Notebook中的单元,有两种模式:

    • 命令模式(Command Mode)
    • 编辑模式(Edit Mode)

    在不同模式下我们可以进行不同的操作

    img

    如上图,在编辑模式(Edit Mode)下,右上角出现一只铅笔的图标,单元左侧边框线呈现出绿色,点Esc键或运行单元格(ctrl-enter)切换回命令模式。

    img

    在命令模式(Command Mode)下,铅笔图标消失,单元左侧边框线呈现蓝色,按Enter键或者双击cell变为编辑状态。

    快捷键

    1.运行当前单元格代码:crtl + enter 
    2.运行当前单元格并选中下一个单元格:shift + enter
    
    
    编辑模式:鼠标闪动,并且框的颜色是绿色 
    命令行模式:按esc到命令行模式,颜色编程蓝色
    
    
    3.删除当前单元格:在命令行模式下, 按dd即可
    
    
    4.在当前单元格的上方添加一个单元格:在命令行模式下, 按a(above)即可添加 
    
    
    5.在当前单元格的下方添加一个单元格:在命令行模式下,按b(below)即可添加
    
    
    6.代码和markdown进行切换:在命令行模式下,按m进行切换
    

    一旦进入命令模式(即没有活动单元格),就可以尝试以下快捷键:

    • A 键将在选中单元格上方插入新单元格

    • B 键将在选中单元格下方插入一个单元格

    • 要删除单元格,请连续按两次 D 键

    • 要撤消已删除的单元格,请按 Z 键

    • Y 键将当前的选中单元格变成代码单元格

    • 按住 Shift + 向上或向下箭头键可以选择多个单元格。在多选模式下,按 Shift + M 会合并选中的单元格

    • F 键会弹出 “查找和替换” 菜单

    处于编辑模式时(在命令模式下按 Enter 键进入编辑模式),你会发现以下快捷键非常好用:

    • Ctrl + Home 转到单元格的开头

    • Ctrl + S 会保存你的工作

    • 和上面提过的一样,Ctrl + Enter 将运行你的整个单元格

    • Alt + Enter 不仅会运行你的单元格,它还会在下方添加一个新的单元格

    • Ctrl + Shift + F 打开命令选项板

    • 按tab键查看提示信息或者补全命令

    • 在一个库、方法或变量前加上 ?,就可以获得它的一个快速语法说明

    • 使用分号可以阻止该行函数的结果输出

    5. jupyter扩展

    扩展可以有效提高你的 Jupyter Notebooks 的生产力。安装和使用扩展的最佳工具之一是 Nbextensions。它需要两个简单的步骤来安装(也有其他方法,但我发现这是最方便的):

    安装

    第1步:用 pip 来安装它:

    pip install jupyter_contrib_nbextensions

    第2步:安装关联的 JavaScript 和 CSS 文件

    jupyter contrib nbextension install --user

    完成此操作后,你会在 Jupyter Notebook 主页顶部看到一个 Nbextensions 选项卡。这里面有很多非常棒的扩展供你使用

    img

    启用

    要启用一个扩展,只需点击它来激活。我在下面提到了4个我认为最有用的扩展:

    Code prettify:重新格式化和美化代码块的内容

    Printview:这个扩展添加了一个工具栏按钮来调用当前 Notebook 的 jupyter nbconvert,并可选择在新的浏览器标签中显示转换后的文件

    Scratchpad:这个扩展增加一个便捷单元格,它可以让你运行你的代码而不必修改你的 Notebook。这是一个非常方便的扩展,特别是当你想要测试你的代码,但不想在你的活动Notebook上做这件事。

    Table of Contents (2):这个扩展可以收集你的 Notebook 中的所有标题,并将它们显示在一个浮动窗口中

    6. 其他

    保存和共享你的 Notebook

    这是 Jupyter Notebook 中最重要和最棒的功能之一。当我需要写博客文章,但我的代码和注释都保存在 Jupyter 文件中时,我需要先将它们转换为另一种格式。请记住,这些 Notebooks 采用 json 格式,在共享它时这并不是很有帮助。我无法在电子邮件或博客上发布不同的单元格或代码块,对吧?

    进入 Files 菜单,你会看到一个 Download As 选项:

    img

    你可以将你的 Notebook 保存为 7 个选项中的任何一个。最常用的是 .ipynb 文件,这样其他人就可以在自己的机器上复制代码;或者保存为 .html 文件, 这样会打开一个网页(当你想要保存嵌入在 Notebook 中的图像时,这会派上用场)

    你也可以使用 nbconvert 选项手动将你的 Notebook 转换为不同的格式,如 HTML 或 PDF。

    你还可以使用 jupyterhub,它允许你在其服务器上托管 Notebooks 并与多个用户共享。许多顶尖的研究项目都使用这个功能用于协作。

    最佳实践

    虽然单独工作可能很有趣, 但大多数时候你会发现自己是在一个团队中工作。在这种情况下,遵循指导方针和最佳实践非常重要,这样可以确保你的代码和 Jupyter Notebooks 被正确标注,以便与你的团队成员保持一致。下面我列出了一些最佳实践指南,你在 Jupyter Notebooks 上工作时一定要遵循以下指南:

    对于任何程序员来说最重要的事情之一:始终确保为代码添加合适的注释!

    确保你有代码所需的文档。

    考虑一个命名方案,并坚持在所有代码中使用以确保一致性。这样其他人更容易读懂你的代码。

    无论你需要什么库,在 Notebooks 开始时导入它们(并在它们旁边添加注释,说明导入它们的目的)。

    确保代码中行与行之间有适当间隔,不要把循环和函数放在同一行中。

    有时候你会发现你的文件变得非常繁重。看看有没有方法隐藏你认为对于以后参考不太重要的代码。 Notebooks 看起来整洁干净, 让人赏心悦目也非常重要。

    Matplotlib 可以很漂亮整洁地展示你的 Notebook,看看怎么使用它!

    地址:http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-4-Matplotlib.ipynb

    另一个提示! 当你想创建演示文稿时,首先想到的工具是 PowerPoint 和 Google Slides。其实你的 Jupyter Notebooks 也可以创建幻灯片!还记得我说它超级灵活吗? 我一点都没有夸大。

    要将你的 Notebooks 转换为幻灯片,请转到 View -> Cell Toolbar,然后单击 Slideshow。看!现在,每个代码块都在右侧显示一个 Slide Type 的下拉选项。它提供了以下 5 个选项:

    img

    好好试一试每一个选项以更好地理解它,它会改变你呈现你的代码的方式!

  • 相关阅读:
    11月21日
    11月20日
    11月19日
    11月18日
    11月17日
    11月15日
    图文教程:在Mac上搭建Titanium的iOS开发环境
    经验
    IT术语的正确读法
    NSLog( @"%@", i );
  • 原文地址:https://www.cnblogs.com/fwzzz/p/12460465.html
Copyright © 2020-2023  润新知