数据分析

7.18

  1. 4p理论

  2. 5w2h 理论PEST方法
    5W2H方法
    逻辑树方法
    4P营销理论方法

    用户行为理论方法

7.19

  1. 某些学者认为,数据分析分为三类,
    入门级的描述性数据分析,
    其方法主要有对比、平均、交叉分析法。
    高级的探索、和验证数据分析,

  2. 分析方法有主要有
    相关分析,
    回归分析,
    因子分析。
    这样的提法有它自己的道理。在我看来,
    实际上就两类:描述性统计分析和计算性数据分析。

  3. 几个常见的容易搞混淆统计术语

  4. 离散统计学 ,
    频数等于 是一个数出现的次数
    个体频数/所有频频的和 等于 频率

    比例:部分对整体
    比率:部分对部分

    倍数:表示A的总数翻一番,现在A的总数是原来的2倍。

    番数:2的幂数
    番数: 表示A的总数翻两番,现在A的总数是原来的4倍

    对比:这个产品的销售额与上一年相比,同比增长40%;

    环比:这个商品的销售额与上个月相比,环比增长30%。

  5. 漏斗图分析法:
    漏斗图
    占位数=(第一环节人数-当前环节人数)/2
    环节转化率 = 第一环节/第二个环节 为 40%
    总体转化率=累积环节转化率=第一行环节转化率*…*当前环节转化率

2 numpy

  1. import numpy as np
    丈量
    np.arange(1,1000)

1.出现一个大数组
  批量化的计算
  ar_2 = np.arange(1,1000)
2.dtype  置换数据类型 dtype=np.32  向下取整  
  ar_125=np.array([1,2.4,3,4.],dtype=np.32)

  array([1, 2, 3, 4])
    1. 创建 数组 一定要用 object dtype = object

       可以真正的把表格 读取到我们的编辑器中 
  1. 多维数字
    shape 函数
    2,3,3
    2个 行 列
    确定 外形

  2. 索引

单位矩阵 笛卡尔基底系统

7.16

7.16

import numpy as np

r_dim = np.arange(0,16).reshape(4,4)
array([[ 0,  1,  2,  3],
   [ 4,  5,  6,  7],
   [ 8,  9, 10, 11],
   [12, 13, 14, 15]])


---生成一个矩阵

ar3_dim = np.random.randint(2,10,size=(4,4))


ar3_dim
Out[6]: 
array([[6, 3, 5, 9],
    [8, 3, 7, 2],
    [8, 2, 3, 2],
    [7, 5, 2, 5]])

ar_dim + ar3_dim
Out[7]: 
array([[ 6,  4,  7, 12],
    [12,  8, 13,  9],
    [16, 11, 13, 13],
    [19, 18, 16, 20]])



把-4,4 分成1000份
ar2_dim =np.linspace(-4,4,1000)





ar1_dim = np.random.normal(size=(4,4))

ar1_dim
Out[49]: 
array([[ 2.23592643, -0.56739328, -0.37532249,  0.37043396],
    [-0.0815659 ,  0.69841392, -1.06545111, -0.97716546],
    [-1.51375169, -0.57465094,  0.97199617, -0.2471151 ],
    [ 1.3618376 ,  0.84458397, -1.76120145,  0.29179346]])

np.sign(ar1_dim)
Out[50]: 
array([[ 1., -1., -1.,  1.],
    [-1.,  1., -1., -1.],
    [-1., -1.,  1., -1.],
    [ 1.,  1., -1.,  1.]])



    画布三部
    import matplotlib.pyplot as plt ; asd,fgh = plt.subplots(1,1,bpi=140,figsize(8,6))

7.17

7.17

三个函数

  1. random.shuffle(aer)
    aer shuffle 可以随机打打乱一维数字 二位数组不能随机打乱

  2. lambda 表达

    map() 函数 可以处理一维数组
    import math
    map(lambda x:x2+math.sin(x),[2,3,4,5,6]) 返回一个对象
    list(map(lambda x:x
    2+math.sin(x),[2,3,4,5,6])) 返回一个列表
    list(map(lambda x:’%.2f’%x,np.random.normal(size=10)))
    [’-0.37’,
    ‘-0.65’,
    ‘-1.05’,
    ‘0.11’,
    ‘0.43’,
    ‘-0.50’,
    ‘-0.40’,
    ‘0.88’,
    ‘-1.28’,
    ‘-2.01’]

    reduce()函数
    from functools import reduce
    自动相加 乘 除 运算
    reduce(lambda x,y:(x+y),[1,2,3,4,5])

下午

  1. 数据筛选

  2. 基本的数学统计方法 方差和标准差 (简单的离散型)

     离散:有限的集合数据   有限的数据的一定是离散的{1.1,1.2,1.3}
          无限的可以数的集合  无限的 但不能可数来描述它
     不可以一对多  看多对一
     例子:1到2 的小数。 
    
     总体方差公式,
     样本方差公式, 
    

标准方差

  1. sun()函数 ------- np.sum()

     0行1列
     逐行案列 ,逐列按行
     artty = np.arange(25).reshape(5,5)
     artty
     array([[ 0,  1,  2,  3,  4],
             [ 5,  6,  7,  8,  9],
             [10, 11, 12, 13, 14],
             [15, 16, 17, 18, 19],
             [20, 21, 22, 23, 24]])
    
    np.sum(artty,0)
    
         array([50, 55, 60, 65, 70])
    
    np.sum(artty,1)
    
         array([ 10,  35,  60,  85, 110])
    
     artty.sum(0)
    
         array([50, 55, 60, 65, 70])
    
  2. np.mean()

     np.mean()整个二维数组的平均值
     np,mean(0)逐行案列求平均主 每一个行的平均值
    
     np,mean(1)逐列案行求平均主 每一个列的平均值
    
  3. min()

     np.min(ar12,0) )逐行案列求平均主 每一个行的最小值
     np.min(ar12,1) )逐列案行求 每一个列的最小值
    
  4. argmin(ar12)

     array([5, 6, 5, 3, 4])
     逐行案列操作 就是找到每一列左最小值的索引
     argmin(ar12,1)
     逐列案行操作 就是找到每一列左最小值的索引
    
  5.  分析 :argmin(ar12)
    
     ar12.ravel() 把二维数组 转化为一维数组  过滤最小值
    
     ar12.ravel()==np.min(ar12)
     返回义个bool
     
     np.where(ar12.ravel()==np.min(ar12))
     把二维数组  展开一维数字 最小值的搜引
    
  6.  cumsum(当前值加得  加后面的 值累计加)  全部的
    
     ar12
     
     Out[184]:
    
     array([[ 9, 13,  5, 11,  7],
         [12, 12, 15,  9,  7],
         [ 6, 15, 14, 12,  5],
         [ 5,  6, 13,  3, 13],
         [11,  8,  8,  5,  4]])
    
     np.cumsum(ar12)
     
    
     Out[185]:
    
     array([  9,  22,  27,  38,  45,  57,  69,  84,  93, 100, 106, 121, 135,
         147, 152, 157, 163, 176, 179, 192, 203, 211, 219, 224, 228], dtype=int32
    
  7. np.cumsum(ar12,1)
    逐列按行 求出每一个行的累加值
    
  8. np.cumproduct()
    (当前值乘得  加后面的 累计乘)  全部的
    
    np.cumproduct(ar12)
    逐行按列
    np.cumproduct(ar12,1)
    

7.18



二维数组和一维数组相减 是按行相减的


数据的排序和整理

    1: list1 = [2,4,5,6,7,3,2,5,78,8,5,3,4,6,4,7,4,7,4,21]
        转集合 集合没右重复
        list2 = set(list1)
        转列表
        list2 = list(list2)
        排序
        sorted(list2)
  1. 用soet 函数进行排序 sort 一次型 作为方法使用

  2. 用soet 函数进行排序 sort 一次型 作为方法使用

        逐列按行   不破坏,打乱数据
        
    
        ar123.sort(1)
        括号里的不指定轴号,就以为轴号  默认为1 逐列按行  对行排序
    
        ar123.sort(0)
        括号里的不指定轴号,就以为轴号0   逐行按列  对行排序
    
    
    
    
        ar123 = np.random.randint(1,100,(6,6))
        
        Out[60]:
    
        array([[29, 77, 39, 81, 36, 29],
                [35, 36, 99, 80, 94, 57],
                [37, 52, 28, 36, 57, 88],
                [87, 86, 65, 72, 54, 24],
                [96, 42, 46, 52,  1, 44],
                [35, 29, 97, 74, 21,  7]])
    
        ar123.sort(1)
    
        array([[ 1,  7, 28, 29, 29, 36],
                [21, 24, 35, 36, 39, 52],
                [29, 35, 36, 42, 46, 72],
                [37, 44, 52, 54, 65, 74],
                [57, 57, 77, 80, 87, 97],
                [81, 86, 88, 94, 96, 99]])
    
  3. np.unique() 等于0可以删除重复行 等于u1 就是删除列

  4. np.unique() 等于0可以删除重复行 等于u1 就是删除列

    ar234 = np.random.randint(2,25,25)
    
    Out[84]:
    
    array([23,  7,  6, 21,  4, 15, 21,  9,  5,  8, 16, 10, 24,  2, 19, 12, 12,
        18,  3, 23, 20, 24, 12,  5,  2])
    
    np.unique(ar234)
    
    
    
    np.unique()    可以删除重复行   按行清除  
    
    ar125[1] = ar125[4]
    
    array([[16, 22, 11,  8,  6,  9],
            [ 2, 18,  8,  6,  3,  5],
            [16,  2, 12, 13,  8,  9],
            [15, 22, 13, 17,  5, 11],
            [ 2, 18,  8,  6,  3,  5],
            [ 7,  7, 12,  6, 22, 21]])
    
    np.unique(ar125,axis=0)
    
    第一列 进行排序  升序
    
    array([[ 2, 18,  8,  6,  3,  5],
            [ 7,  7, 12,  6, 22, 21],
            [15, 22, 13, 17,  5, 11],
            [16,  2, 12, 13,  8,  9],
            [16, 22, 11,  8,  6,  9]])
    
    ----
    ar125[:,1] = ar125[:,-1]
    
    
    Out[98]:
    
    array([[16,  9, 11,  8,  6,  9],
        [ 2,  5,  8,  6,  3,  5],
        [16,  9, 12, 13,  8,  9],
        [15, 11, 13, 17,  5, 11],
        [ 2,  5,  8,  6,  3,  5],
        [ 7, 21, 12,  6, 22, 21]])
    
    np.unique(ar125,axis=1)
        
    np.unique()    可以删除重复列  
    
    array([[ 6,  8,  9, 11, 16],
            [ 3,  6,  5,  8,  2],
            [ 8, 13,  9, 12, 16],
            [ 5, 17, 11, 13, 15],
            [ 3,  6,  5,  8,  2],
            [22,  6, 21, 12,  7]])
    

7.18 下午 绘图

7.18 下午 绘图

    #   xticks 
        yticks   
        set_xlabel  
        set_ylabel
        legend  
        subplots
  1. 绘制第一幅图表

  2. 绘制第一幅图表

     (1)figure函数,创建图表
    
     (2)subplot函数,创建子图
    
     (3)在多个图表中创建子图
    
     (4)plot()函数,画函数图像
    
     (5)sca()函数,选择子图
    
     (6)在 一张表中画多个曲线
     alpha 透明度
     ----
     fig = plt.figure(11,dpi=140,figsize=(8,6))# 定义一个画框
     d1 = fig.add_subplot(2,2,1)
     d2 = fig.add_subplot(2,2,2)
     d3 = fig.add_subplot(2,2,3)
     d4 = fig.add_subplot(2,2,4)
     ----
      
     1.线图
     d1.plot(np.random.randn(200),'bo--')
    
    
    
    
    
     2.直方图
     x   bins 组数  renge 取值范围(确定值直方图的范围) stacken 垂直的
    
     (array([  8.,  47.,  70.,  51.,  20.,   4.]), 频数
             组上限          下限
     array([-1.40946983, -0.51867731,  0.3721152 ,  1.26290772,  2.15370023,
         3.04449275,  3.93528526]),   
     <a list of 6 Patch objects>)
    
     d2.hist(np.random.normal(1,size=200),bins=6,color='g')
    
    
    
    
    
     3.散点图
     参数:
          x,y (必须右两个参数)  c 颜色  marker 标志 cmap 调试板  
     d3.scatter(np.random.rand(50),np.random.uniform(-1,1,50),c='m',marker='*')
    
    
    
    
     4.饼图  统计分析最常用的图
     startangle 角度   labels 名称 
     sharex   sharey 共享 
                          一行一列
     asd,sdf=plt.subplots(1,1,sharex=True,sharey=True,)
     sdf 一次性 创建曾在画布 画框 
     自动转化曾在
                          两行两列
     asd,sdf=plt.subplots(2,2,sharex=True,sharey=True)
     
    
     #  在一个画框里画多个线图
     plt.legend(loc='upper center')
    

画图注解

画图注解

PANDAS 作图


subplots语法及操作

    fig, ax = plt.subplots(nrows=1, ncols=1, sharex=False, 
    sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw): 
    创建一个figure和多个子图。 
    参数: 
    nrows,ncols:int类型,默认值为1,表示子图窗格数 
    sharex,sharey:bool或者{‘none’, ‘all’, ‘row’, ‘col’},默认值为False。控制x、y坐标轴的属性共享。当为True或者’all’表示在所有子图中共享坐标轴;False或者’none’表示每个子图的坐标轴是独立的;’row’表示每个子图行会共享坐标轴;’col’表示每个子图列会共享坐标轴。 
    squeeze:bool,默认值为True。 
    subplot_kw:dict。保存的是传给add_subplot()的参数 
    gridspec_kw:dict。 
    fig_kw:dict。 
    返回: 
    fig:matplotlib.figure.Figure对象,fig可以用于修改图片级别的属性。 
    ax:Axes对象或者Axes对象的数据。

figure语法及操作

figure语法及操作

    figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

    num:图像编号或名称,数字为编号 ,字符串为名称
    figsize:指定figure的宽和高,单位为英寸;
    dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80
    facecolor:背景颜色
    edgecolor:边框颜色
    frameon:是否显示边框

    d4.pie(np.arange(1,9))

    5.图表的注释与标识

    6.加载txt文件并绘图
  1. np.intersectld(set1,set2) 选出交集

    unionld(set1,set2) 全部
    setdiffld(set1,set2) 插集
    np.setxorld(set1,set2)  把两个set 独有的元素 并到一起
    
  2. !type Desktop\yong344523.csv
    读取

     继续把数据转化为数组:只适合数据性 csv表格 只是数据的读取(二维数组) 不适合中文和带右字符串的
     In [72]: testarray_1=np.loadtxt('Desktop\yong344523.csv',delimiter=',')
     In [73]: testarray_1
     testarray_1=np.loadtxt(skprows=‘跳过’ ,delimiter=','分隔符 f)
    

* 数组的组合 和分割

    拼接纬度相同, 长度相同
    

    array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
    array([[ 9, 19, 13,  8],
        [ 6,  7,  6, 13],
        [ 4,  6,  6, 12],
        [10,  6,  6, 11]])


    水平组合 np.hstack((set1,set2)) 
    逐列按行 水平
            np.concatenatc((set1,set2),axis=1)

    Out[229]:

    array([[ 0,  1,  2,  3,  9, 19, 13,  8],
        [ 4,  5,  6,  7,  6,  7,  6, 13],
        [ 8,  9, 10, 11,  4,  6,  6, 12],
        [12, 13, 14, 15, 10,  6,  6, 11]])
  1. 垂直组合

     np.vstack((set1,set2))
    
     np.concatenatc((set1,set2),axis=0)
     列数必须相同  
     一维数组的拼接垂直变成二维数字
    
  2. #列组合

    np.column_stack((a1,a2))

    行组合

    np.row_stack((set1,set2))
    
    行组合 可以实现一维对二维的拼接  以行
    一维数组不能水平分隔
    

    垂直分隔

    切的必须可以 被整除 4
    1

    Out[12]: 
    [array([[ 0,  1],
            [ 4,  5],
            [ 8,  9],
            [12, 13]]), array([[ 2,  3],
            [ 6,  7],
            [10, 11],
            [14, 15]])]
    

7.19 线性代数

7.19 数据的转换

数据类型表
Int8和uint8(有符号和无符号的8位整形,i1 和 u1);
Int16和uint16(同上,i2 和 u2)
Int32和uint32(同上,i4 和 u4)
Int64和uint64(同上,i8 和 u8)
Float16(半精度浮点数,f2)
Float32(单精度浮点数,f4)
Float64(双精度浮点数,f8)
Float128(扩展精度浮点数,f16)
Complex64(c8),Complex128(c16),
Complex256(c32)
Bool(?),object(O),string_(S),Unicode(U)



test_array_1=test_array.astype(np.float64)
test_array_1.dtype
dtype('float64')

aaaaa=np.array(['12','21','33'],dtype=np.string_)

7.19 数据清洗 平均值补值 成段补全插条法

        通常 分析 字符串是无效的    只有数字有效
前提:  3%       里可以用平均值补值
        5% 以上  造成数据不稳定右
        np.nan    nan   
存储:格式注意
        exle 里面 没用空值
        csv  右空值

销售数据清洗

    创建 0到18 的      二维数组  3 行 3 列
    array_12=np.arange(18).reshape(2,3,3)

    def get_repeated_label(array_1dim):
    label_1dim=[]
    #查最后一项的 前一项
    for k in range(len(array_1dim)-1):
        for i in range(k+1,len(array_1dim),1):
            #  列表的前一项和 它后面的一项对比   如果一样把 一样值的索引添加到新的列表中
            if array_1dim[k]==array_1dim[i]:
                label_1dim.append(i)
            # 以数组的形式展示出来
    return np.unique(label_1dim) # 重复的索引列表


    -----------------------------------------------------
    
        def invalid(array_variable):
            #  遍历 行和列   
            for i in range(np.shape(array_variable)[0]):
                for j in range(np.shape(array_variable)[1]):
                        # 如果在 值上面的 值是 浮点型 或整数型 跳过
                        if type(array_variable[i,j])== float or type(array_variable[i,j])==int:
                            pass
                        else:
                            #   不是的话  则赋值为0
                            array_variable[i,j]=0
                    array_variable[np.where(np.isnan(array_variable.astype(np.float64)))]=0
            return array_variable

            ------------------------------------
            #    计算平均值   赋值  把空值 赋予 平均值
                def fillup_mean_value(array_parameter):
                     for index_j in range(np.shape(array_parameter)[1]):
                          array_columns_nr=list(np.where(array_parameter==0)[1])
                          if index_j in array_columns_nr:
                              appearance_sum=array_columns_nr.count(index_j)
                              if appearance_sum>0:
                mean_1=(array_parameter[:,index_j]).sum()/(np.shape(array_parameter)[0]-appearance_sum)
                                   bollmatrix_1=array_parameter[:,index_j]==0
                                   array_parameter[bollmatrix_1,index_j]=mean_1

                       return array_parameter
    -------------------------------------------- 
        # 删除重复项  np.delete(待删减的数组,obj整数的数组,)
            def delete_rows(list_variable,array_variable):
                    i=0
                    list_variable.sort()
                    array_medium=array_variable
                    for j in list_variable:
                         if i==0:
                             array_medium=np.delete(array_medium,j,0)
                         else:
                             array_medium=np.delete(array_medium,j-i,0)
                         i=i+1
                     return array_medium
        ------------------------------------------------
         delete_rows(get_repeated_label(Columns_1),Data_Deal_with)

索引

索引

python numpy.random详细解析

https://blog.csdn.net/vicdd/article/details/52667709

np.delete(待删减的数组,obj整数的数组,)

查数据 相同数据删除

pandas

ser1 = pd.Series([3,5,76],index=[‘s’,‘y’,‘x’],dtype=np.int32)
s 3
y 5
x 76
dtype: int32
Index([‘s’, ‘y’, ‘x’], dtype=‘object’)
Series
通过索引找值
ser1[0]

append 添加不能更新
updata 更新不能添加
ignore_index=ture  保证索引的唯一性


#  字典的主键  一定要转化 列索引名
table_sales={'Seller':sales1,'Sales':dict_1,'SalesQuantity':sales_}

 
framesample_1=pd.DataFrame(table_sales)
framesample_1
数据框 可以直接索引列 不能直接索引行
framesample_1['Seller']
索引行 .loc
framesample_1.loc['0']

T 转至
del framesample_1.T['Seller']

reindex 可以任意删除,添加,交换行列

reindex 可以任意删除,添加,交换行列

index=[‘行 索引名字’,‘行 索引名字’]

columns= =[‘列 索引名字’,‘列 索引名字’]

    frame_1=pd.DataFrame(np.arange(9).reshape(3,3),index=['row1','row2','row3'],columns=['one','two','three'])

利用ix函数修改数据框行索引与列,快捷整洁,节约时间。但是Ix已经几乎被启用,现在用loc函数。

利用ix函数修改数据框行索引与列,快捷整洁,节约时间。但是Ix已经几乎被启用,现在用loc函数。

Drop函数应用到“DataFrame”

表名字.drop([‘行或列’],axis=0) axrs=0 表示行 1 表示列

补缺失索引

    只有缺失索引 才能补值   
    向下 补
    test_12=a.reindex(range(11),method='ffill')
    向上补
    test_12=a.reindex(range(10),method='bfill')

7.23

7.23

pandas   Series  索引位相同才可以相加。(默认索引  没有空位置)

pandas add. 两个表的相加 fill_value补值

pandas add. 两个表的相加 fill_value补值

add1 = pd.DataFrame(np.arange(9).reshape(3,3),index=['ein','zwei','drei'],columns=list('bde'))
解释:指定义索引 相加 索引必须一至  否则 不一致的索引想会出现None 空 值   
不同情况用最合适的方法进行补值

add 相加  fill_value 可以进行补值
diframe=Q.add(Newframe,fill_value=0)
    两个相加必须有一个非空值  两个 相加才能得到非空值
    fill_value=100   把空值 补 100  
add_1 = new.add(new_1,fill_value=100)


加减 + - 默认是行相减
                
nnp.abs(frame12)   abs 绝对值

计数 np.nan 这数组中的数量

list_4 = pd.Series([1,1,np.nan,1,1,np.nan,1,1,np.nan,1,1,np.nan])
list_5 = pd.Series([1,1,np.nan,1,1,np.nan,1,1,1,1,1,1])
list_6 = pd.Series([1,1,np.nan,1,1,np.nan,1,np.nan,1,1,np.nan,1])
T_list =[list_4,list_5,list_6,]
null_1 = pd.Series(np.arange(11)*0)
for i in T_list:
    null_1 = null_1.add(i,fill_value=0)

null_1
#   把计算好的 np.nan  统计出来 
Out[28]:    0     3.0
            1     3.0
            2     0.0
            3     3.0
            4     3.0
            5     0.0
            6     3.0
            7     2.0
            8     2.0
            9     3.0
            10    2.0
            11    2.0
            dtype: float64

相减 np.subtract(ar12,ar22)

    数组的每列
    ar12

    array([[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]])

    ar22
    array([3, 2, 6])

     np.subtract(ar12,ar22)

     array([[-2,  0, -3],
            [ 1,  3,  0],
            [ 4,  6,  3]])

    T 转值  相减
    ar12.T
    array([[1, 4, 7],
            [2, 5, 8],
            [3, 6, 9]])

数据框 和 Series 二维数组和一维数组相减

数据框 和 Series 二维数组和一维数组相减

注意: 列索引 要保持一直  

Frame1=pd.DataFrame([[2,2,1],[1,1,3],[0,2,3]],index=['Nr1','Nr2','Nr3'],columns=['mon','tue','wen'])

s1=pd.Series([2,2,1],index=['mon','tue','wen'])
mon    2
tue    2
wen    1
dtype: int64

:     ”Frame1-s1

0   0   0
-1  -1  -1    
-2  0   2 

每一行都相减 这个二维数组  

Frame1.sub(s2,axis=1)

asd (frame1) 绝对值

    2、NumPy一元函数对ndarray中的数据执行元素级运算的函数

    np.abs(x)、np.fabs(x) : 计算数组各元素的绝对值
    np.sqrt(x) : 计算数组各元素的平方根
    np.square(x) : 计算数组各元素的平方
    np.log(x) 、np.log10(x)、np.log2(x) : 计算数组各元素的自然对数、10底对数和2底对数
    np.ceil(x) 、np.floor(x) : 计算数组各元素的ceiling值或floor值

    np.rint(x) : 计算数组各元素的四舍五入值
    np.modf(x) : 将数组各元素的小数和整数部分以两个独立数组形式返回
    np.cos(x)、 np.cosh(x)、np.sin(x)、 np.sinh(x)、np.tan(x) 、np.tanh(x) : 计算数组各元素的普通型和双曲型三角函数
    np.exp(x) : 计算数组各元素的指数值
    np.sign(x) : 计算数组各元素的符号值,1(+), 0, ‐1(‐)

sin cos 三角函数 公式

    np.sin(np.abs(frame12))

apply applymap lambda 函数

apply applymap lambda 函数

数据框名字.apply(table_extrem)  作用在每一列上  返回值是一个具体的值  返回一个数据框
r1    7.0 5.0 6.0 
r2    4.0 5.0 4.0 
r3    6.0 6.0 8.0 
r4    6.0 5.0 8.0 
  
f = lambda x:x.max()-x.min()

frame13.apply(f)
每一列的最大值和最小值相减  逐行按列
frame13.apply(f,1)  逐列按行

c1    3.0
c2    1.0
c3    4.0
dtype: float64


applymap ????????????????????????/

用 apply 函数 求每一列的最大值 和最小值
直接框的话 会出现  多维 的嵌套列表

def table_extrem (x):
     return pd.Series([x.min(),x.max()],index=['min','max'])

frame12.apply(table_extrem)
   返回的结果 义个数据框
    min 0 1 2 
    max 9 10 11 

DataFrame 的格式化

frame11=pd.DataFrame(np.random.randn(3,4),index=['r1','r2','r3'],columns=['c1','c2','c3','c4'])
formatierung=lambda x:'%.2f' % x
frame11.applymap(formatierung)

c1 c2 c3 c4
r11.40 0.39 -0.90 -2.27 
r20.54 -0.53 -0.36 0.40 
r31.83 -0.91 -0.39 0.51 

排序 和 排名

排序 和 排名

数字只有sort 函数一个
project_1.sort_index()

acending = Ture 升序 和降序

排名 不在是真正的数值  而是名次
Dataffdic=pd.DataFrame({'liu':[-1,0,2,-3],'wang':[3,2,-5,7],'jiang':[1,0,1,5]})
按 liu 进行进行排序
Dataffdic.sort_values('liu',0)

describe()   有效值查询

排名 :
        名字.rank(acending = False) 
        acending = False  最大的数组 数字最小
            默认出  最大的数组 数字最大
dataFrame_1=pd.DataFrame([range(4),[np.nan,2,3.6,0.9],[1.2,4,6,7],[3.4,7.9,0.4,8]],index=['r1','r2','r3','r4'],columns=['c1','c2','c3','c4']
dataFrame_1.idxmin()  返回每一行的 最小值

                c1    r1
                c2    r1
                c3    r4
                c4    r2
                dtype: object

   
按列累计加,遇到NaN值自动忽略,不参与运算。
dataFrame_1.cumsum()

     c1    c2    c3    c4
r1  0.0   1.0   2.0   3.0
r2  NaN   3.0   5.6   3.9
r3  1.2   7.0  11.6  10.9
r4  4.6  14.9  12.0  18.9
dataFrame_1.cumsum(1)   #行里的每一个值进行相加  累加
Out[10]: 
    c1    c2    c3    c4
r1  0.0   1.0   3.0   6.0
r2  NaN   2.0   5.6   6.5
r3  1.2   5.2  11.2  18.2
r4  3.4  11.3  11.7  19.7

describe() 有效值查询

    Out[12]: 
                c1     c2        c3       c4
    count  3.000000  4.000  4.000000  4.00000
    mean   1.533333  3.725  3.000000  4.72500
    std    1.724336  3.050  2.388863  3.34203
    min    0.000000  1.000  0.400000  0.90000
    25%    0.600000  1.750  1.600000  2.47500
    50%    1.200000  3.000  2.800000  5.00000
    75%    2.300000  4.975  4.200000  7.25000
    max    3.400000  7.900  6.000000  8.00000

count() 统计

list1 = [1,2,3,4,5,3,None,None]
list1.count(None)
2统计y
dataFrame_1.count()  有效值  字符串也算

随机漫步

    import matplotlib.pylab as plt
    table_1=plt.figure()
    # 创建一个画框
    ax=table_1.add_subplot(1,1,1)
    # 累计加
    ax.plot(np.random.randn(100000).cumsum())
    ax.plot(np.random.randn(100000).cumsum())
    # 给x轴  赋予刻度
    ticks_1=ax.set_xticks([0,25000,50000,75000,100000])
    # 给 刻度设置标标签   斜度   字体大小
    scale_name=ax.set_xticklabels(['step1','step2','step3','step4','step5'],rotation=45,fontsize=12)
    # title 名字
    ax.set_title('Python-03 Practice')
    # x轴的名字
    ax.set_xlabel('Steps')

    #下面我们添加图例
    ax.plot(np.random.randn(100000).cumsum(),color='m',linestyle='-',label='solid')
    ax.plot(np.random.randn(100000).cumsum(),color='c',linestyle=':',label='dotted')
    # 显示 线的名字
    ax.legend(loc='best')#plt.legend也是可以的
    plt.show()

画图注解

    fig,subpic=plt.subplots(1,1)
    subpic.plot([2,77,90,2.3,4,5,6,45,34,67,35,66,34,23,76],[34,32,35,43,34,23,45,56,44,57,56,33,55,66,54],'b*-')
    ticks_1=subpic.set_xticks([0,25,50,75,100])
    scale_name=subpic.set_xticklabels(['jenuary','february','march','april','may'],rotation=40,fontsize=12)
    subpic.set_title('Python-03 Practice_1',fontsize=16)
    subpic.set_xlabel('Weight')
    # 添加坐标备注 
    subpic.text(90,35,'key point one',fontsize=10)
    # 批量添加坐标备注 
    keymenge=[(67,57,'key point two'),(23,66,'key point two')]
    for x,y,label in keymenge:
        subpic.text(x,y,label,fontsize=12)
    # 设置 x 轴区间 0-100
    subpic.set_xlim([0,100])
    # 设置 x 轴区间 0-100
    subpic.set_ylim([0,100])
    #  xy 表示坐标 xytext 表示备注坐标点
    subpic.annotate('beautyful point',xy=(5,23),xytext=(5,23)) 
    #  把画出的图片存储 注意:要找show 之前完成 
    plt.savefig('Desktop\python_01.svg')
    # 设在图片 清晰    ,bbox_inches='tight'  框和画布之间的间距
    plt.savefig('Desktop\python_01.png',dpi=400,bbox_inches='tight')
    plt.show()

##Savefig的主要参数如下: 图片的存储

    fname: 表示绝对或者相对文件路径的字符串,文件具体格式由后缀来决定,譬如.pdf,.png格式等。
    dpi: 图像分辨率,默认100,(每英寸点数)
    Facecolor,edgecolor: 背景色,默认为“w”白色
    Format: 显示设置文件格式,png,jpeg,pdf等等,但不要与fname里的文件格式发生冲突。

PANDAS 作图

PANDAS 作图

    sdf,hgh=plt.subplots(1,1,dpi=140,figsize=(8,6))
    # ax  指明画框  画到那个画框里   ues_index=Ture(用索引作为刻度坐标)
    #  grid=Ture (网格线 ) rot (旋转) liabel (b图例)
    第一种表示ser.plot(ax=hgh,grid=True)
    第二种表示ser.plot(ax=hgh,grid=True,legend=True,label='ser')

    Series.plot 方法的常用参数汇总:
    label	用于设置图例的标签
    ax
        确定要被绘制的matplotlib subplot对象。如果没有设置,则使用当前matplotlib subplot
    style	设置传给matplotlib的风格字符串('g*--')
    alpha	图表的填充不透明度(数值为0到1之间的数)
    kind	各种图形样式line, bar, barh, kde, density, scatter
    logy	在Y轴上使用对数标尺
    use_index	将对象(Series and DataFrame)的索引用作刻度标签
    rot	旋转度数(0到360)
    xticks	用作X轴刻度的值
    yticks	用作y轴刻度的值
    xlim	x的值域
    ylim	y的值域
    grid	设置是否显示轴网格线

    专用于DataFrame的plot的参数

    Subplots	将依据数据框中的每个列绘制的图分别放置到单个的subplot(子画框)里
    sharex	Subplots=true时,设定是否共享X的刻度和值域
    sharey	Subplots=true时,设定是否共享y的刻度和值域
    figsize	元组,用来表示图像大小(宽,高)
    title	设置图像标题
    Legend	设定是否添加一个subplot图例
    sort_columns	设定是否以字母表中字母先后排列顺序绘制各列。

柱状图

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    # 画布 画框
    figure_1,get_information_of_pict=plt.subplots(2,1) # 右2,1 右是1 只能出现义个矢量
    datas=pd.Series(np.random.rand(20),index=list('qwertyuiopasdfghjklz'))
    datas.plot(kind='barh',ax=get_information_of_pict[0],figsize=(8,12),color='g')
    # kind='bar'  水平图  
    datas.plot(kind='bar',ax=get_information_of_pict[1],figsize=(8,12),color='r')
    plt.show()

    import numpy as np
    import pandas as pd
    plt.rcParams['font.sans-serif']=['SimHei'] 
    plt.rcParams['axes.unicode_minus'] = False
    Framedata_1=pd.DataFrame(np.arange(16).reshape(4,4)**(1/2)+np.arange(16).reshape(4,4)*3+6,index=['spring','sommer','autumn','winter'],columns=['Benz','BMW','Porsche','VW'])
    import matplotlib.pyplot as plt
    #  # 画布 画框
    picrange,pic_inf=plt.subplots(2,1)
    Framedata_1.plot(kind='bar',ax=pic_inf[0],title='2018年德系车销售额',rot=50,figsize=(8,12))
    Framedata_1.plot(kind='barh',ax=pic_inf[1],title='2018年德系车销售额',rot=130,figsize=(8,12))
    plt.show()

累计图 看增幅

算统计平面图

    serie_1=pd.Series([3,4.5,5,3,6,9,4.7,4.7,4.7,4.7,4.5,4.5,6,6,3,7,7,7,7])

    serie_1.value_counts().plot(kind='bar')
    
    每个数出现的频率用柱状图表示出来

直方图:

    asd,fgh=plt.subplots(1,1,dpi=140,figsize=(8,6))
    arrt = np.random.normal(0,size=500)  # 数据
    arrt_1=pd.Series(arrt)   #转Series  格式
    arrt_1.hist(ax=fgh,grid=True)  # 画图
    plt.show()

unique() 去重

7.24

series_3.value_counts() 频数计数

    数组名字.value_counts()  b
    每个出现的次数
    d     2
    we    2
    c     2
    a     1
    e     1
    f     1产
    dtype: int64

pd.value_counts() 必须是一维的数字 参数 cascending=True

    series_3.values   变成一维数组  
    必须是一维的数字
    
    返回的值对应 他的频数

# 对数据框的处理

isin() series_3.isin([‘a’])

        0    False
        1    False
        2    False
        3     True   这个索引值是a
        4    False
        5    False
        6    False
        7    False
        8    False
        dtype: bool

        series_3[ss]   把对应 Ture 的值返回出来  一个对象
        0    c
        3    a
        4    c
        dtype: object

        上两种 不适合在数据框里

np.column_stack()

    有用

None 随机补值

可以使用随机数补值(不建议用,小方差用随机补值,大方差用差减法)
随机补值的话 在空值的附近找几个数据的值 进行范围内随机补值
平均数补值只适合小方差
平均数越小 说明数值越集中 补值越精确

ser_1 = pd.Series(np.random.rand(20))
ser_1[12] = None 
ser_1[7] = None
# 使用随机进行补空值
有两个挡    1.  0-5  
           2.   数较大 1000以上  0-10 随机数
    随机补值
    ser_1.fillna(np.random.normal(0.42,size=1)[0])

循环补值

np.where(ser_1.isnull()) # 取出 数组里为None的索引
<!-- np.where(ser_1.isnull())[0][0] -->
    (array([ 7, 12], dtype=int64),)
np.where(ser_1.isnull())[0]
    array([ 7, 12], dtype=int64)

for i in np.where(ser_1.isnull())[0]:
# 在set_1列表里 最后 None的值  向上取两位 向下取两为 
list1 = [ser_1[i-1],ser_1[i-2],ser_1[i+1],ser_1[i+2]]
# 进行给None 赋值
ser_1[i] = (max(list1)+min(list1))/2

NAN 的数据处理

    fillna(9) 补值 只能补一个相同的值   局限型太大 
    # 属于瞎补 不建议 这样补值有问题
               

    isnull  处理空值  补单值
    数组名字.(数组名字.isnull()) =  0 #  快速补充
    


    四种补值 方法  
    fillna()  

数据框 平均值 补值

    frame_123=pd.DataFrame([[1,np.nan,np.nan,2,3],[1,2,3,None,8],[6,2.3,8,None,3],[2,3,2,3,2],[3.2,8.9,3,4.5,3],[2,3,0.45,None,8]])

    t = frame_123.isnull()# 转边bool 矩阵
    frame_123[t]=0
    # 赋值 0 
    frame_123
    frame_new=frame_123
    
    frame_123[frame_123.isnull()]=0  #把Ture 赋值 0 
    # 把bool 矩阵
    bool1 = frame_new[1]==0

    #      
    frame_new[1][bool1]=frame_new[1].sum()/(len(frame_new[1])-(frame_new[1]).value_counts()[0])

fillna() 和 describe() 有效值 补平均值

   frame_123=pd.DataFrame([[1,np.nan,np.nan,2,3],[1,2,3,None,8],[6,2.3,8,None,3],[2,3,2,3,2],[3.2,8.9,3,4.5,3],[2,3,0.45,None,8]])
   注解:frame_123.describe()
            
            count 6.000000 5.000000 5.000000 3.000000 6.000000 
            mean  2.533333 3.840000 3.290000 3.166667 4.500000 
    # 拿出 这这一列  对每一项 进行补值
   frame.fillna(frame_123.describe().loc['meam],axis=0) 

字典进行 补值 和 上面方法一样

     frame.fillna({ 0: 6.000000 ,1:5.000000 ,2:5.000000, 3:3.000000, 4:6.000000 },axis=0) 

Dropna 十分重要 处理Nan 数据 特别有效 筛值

    series_23=pd.Series([1,4,3,np.nan,4.5,None,3.4,4.5,6,np.nan,4,5,3])
    
    series_23.dropna()   #  把空值一次 全部过滤掉

    frame_234.dropna(how='all')  # 一行全部为空删掉

层次化索引

                                                            外层 索引
    series_1=pd.Series(np.random.randn(12),index=[['r1','r1','r1','t1','t1','s1','s1','s1','s1','p1','q1','q1'],[9,
     内层 索引
    8,7,6,5,4,3,2,1,0,12,11]])
    series_1.index
    MultiIndex(levels=[['p1', 'q1', 'r1', 's1', 't1'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12]],
                # 对应q2索引2*3 个                       索引的  对应数字
        labels=[[2, 2, 2, 4, 4, 3, 3, 3, 3, 0, 1, 1], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 11, 10]])

外层索引 建议唯一性

    也可以做切片。但是外层标签必须是
    1.经过排序的,必须!
    2.每个外层标签的第一个字母不能不一致,要大写,全大写,要小写全小写。

层次化索引

生成外基 np.outer(x,y)

纵数 频数 怎么算? value_counts() 深刻理解

7.25 层次化索引 数据的重建

层次化索引 要用嵌套列表

    数据的重建是有条件的:对内层索引的个数在每一个外层索引下 的个数是一值的
    不一致的话  只能做层次话索引

    seriser 转 DataFrame  

    
     series_1=pd.Series(np.random.randn(12),index=[['r1','r1','r1','t1','t1','s1','s1','s1','s1','p1','q1','q1'],[9,
     内层 索引
    8,7,6,5,4,3,2,1,0,12,11]])
    #带有层次化索引的Series可以立马转化为数据框,反之,数据#框也可以转化为带有层次化索引的Series
    # 转化为数据框   unstack()  拆分   unstack(0)  unstack(1)    参数补同进行重组
    名字.unstack(1,0)  # 补0

还原 stack()

    重建的数据框.stack(0)  # 还原到 重组前的数组

嵌套 层次化索引

    Gamedata=pd.DataFrame(np.array([[31,27,24,60],[26,28,13,29],[27,17,12,27],[29,9,5,18],[31,12,4,70],[45,11,12,12]]),index=[['A_Morning','A_Morning','A_Morning','B_Afternoon','B_Afternoon','B_Afternoon'],[1,2,3,1,2,3]],columns=[['Junior','Junior','Youth','Youth'],['Zhang','Wang','Li','Zhao']])

层次化索引 命名 数据框

    重要 name 命名
    Gamendata.index.names= ['time','sequs']
    Gamendata.列.names= ['time','sequs']


    age                  Junior      Youth     
    name                  Zhang Wang    Li Zhao
    time        sequence                       
    A_Morning   1            31   27    24   60
            2            26   28    13   29
            3            27   17    12   27
    B_Afternoon 1            29    9     5   18
            2            31   12     4   70
            3            45   11    12   12

多重标签的顺序互换:

            Gamedata.swaplevel('sequence','time')
            Out[52]: 
            age                  Junior      Youth     
            name                  Zhang Wang    Li Zhao
            sequence time                              
            1        A_Morning       31   27    24   60
            2        A_Morning       26   28    13   29
            3        A_Morning       27   17    12   27
            1        B_Afternoon     29    9     5   18
            2        B_Afternoon     31   12     4   70
            3        B_Afternoon     45   11    12   12

索引的排序

级别相加 251 页

    Gamedata.sum(level='sequence')
    每个级别包含两个元素,分别两两相加。



    Gamedata.sum(level='time')
    Out[71]: 
    age         Junior      Youth     
    name         Zhang Wang    Li Zhao
    time                              
    A_Morning       84   72    49  116
    B_Afternoon    105   32    21  100

    每个级别包含三个元素,分别相加即可

    把数据框的列转化为行索引

面板 数据

       Dataframe_3 = pd.Panel(np.random.randn(2,5,4),items=['Item1','Item2'],major_axis=pd.date_range('2000-01-01','2000-01-05'),minor_axis=['A','B','C','D'])
            # 返回数据结构 
            Dimensions: 2 (items) x 5 (major_axis) x 4 (minor_axis)
            Items axis: Item1 to Item2
            Major_axis axis: 2000-01-01 00:00:00 to 2000-01-05 00:00:00
            Minor_axis axis: A to D

处理数据

    常用的把 cvs 转化 成为 数据框 DataFrome        
    用小青蛙 转化

缺失数据 要么没有 要么用标记值表示

数组的合拼 柱状未完成

    ser_1=np.random.normal(0,1,200)
    ser_2=np.random.normal(16,1,200)
    # 两个数组的合拼
    A=np.concatenate((ser_1,ser_2))

    value = pd.Series(A)   # 变成一维数组

散布图 column_stack 把一维数组一列一列的 排列起来

    X5=np.random.beta(2,1,1001)

    test_data=np.column_stack((np.column_stack((np.column_stack((np.column_stack((X1,X2)),X3)),X4)),X5))

画图的复杂的分隔

    def subpicnr_invisible(fig):
    for i, ax in enumerate(fig.axes): #利用list(enumerate(plt.gcf().axes))枚举函数生成元组列表[(画框编号,画框对象)(),...]
            ax.text(0.5, 0.5, "ax%d" % (i+1))

#3D 绘制立体图

曲面图: 442页

to_csv 数据下载

DataFrame_2.to_csv (‘Desktop\DataFrame_3.csv’)

空值标识

DataFrame_2.to_csv(‘Desktop\DataFrame_4.csv’,na_rep=‘Cat’)
!type Desktop\DataFrame_4.csv

    注:
    1.Read_csv可以读取文件,url,文件型对象,但被加载文件必须有分割符,默认的分割符为逗号。
    2.Read_table可以读取文件,url,文件型对象,但被加载文件必须有分割符,默认的分割符为制表符‘\t’。这一点与read_csv不同,烦请再加载有逗号的数据时用seq属性注明,也即seq=‘,’!
    3.Read_fwf读取(或称加载)没有分隔符数据,但是各数据之间间距要恒定。
    4.Read_clipboard 通常用来读取网络数据,在使用前,必须把网页内容先复制到粘贴板上,例如:

pd.read_clipboard(sep=’\s+’) 读取内存里的数据显示出来

    Out[73]: 
    北      京  220956  209468   11488  697.02  264.30  253555   44087  701.42
    0    天      津   93162   90080    3082  330.68  126.98  106063   15983  340.10
    1    河      北  209740  200012    9728  963.39  327.27  262396   62384  982.31
    2    山      西  131802  114466   17336  628.55  192.27  214625  100159  669.39
    3  内蒙古  71196   65627    5569  306.82  110.15  101829   36202  308.10     
    4                                                                    NaN
    5    辽      宁  211502  199611   11891  838.09  305.58  268741   69130  846.25

    上面函数常用关键字列表

    filepath_or_buffer: 	文件系统位置,url,文件型对象的字符串
    delimiter或sep	源文件各数据间分隔符或正则表达式
    header	上载数据成数据框时,数据框的列名,默认为上载数据的第一行。即‘0’行。如果不需要列标签,那么使header=None
    index_col	就是给行层次化索引命名,行层次索引一般有两列,内列和外列。
    skiprows	需要忽略的行数,跳过无用行
    na_values	实质就是把源数据中的指定字符串转化为空值。
    converters	由列名或者说列号或者说列标签和函数组成字典,例如{‘A’:f}说明f函数应用到’A’列中的每一个数据。
    nrows	需要读取的数据行数
    skip_footer	需要忽略的行数,注意从源数据最后一行向上数
    encoding	用于指明unicode文本文件的文本编码格式
    Squeeze	如果数据仅有一列,自动返回seri es
    thousands	千分位分隔符,如’.’或’,’

import math 通过landba 函数 计算

    converters_1={i: lambda x:float(x)**3+math.sin((np.pi/6)*float(x)) for i in range(3)}
    计算
    pd.read_csv('Desktop\dong123.csv',delimiter=',',usecols=['A','B','C'],converters=converters_1)

pandas 替换

    df.ix[df['sex']=='f','sex']=0
    df.ix[df['sex']=='m','sex']=1

    设置索引列

            df_inner.set_index('id')
    
    按照特定列的值排序:  df_inner.sort_values(by=['age'])

    按照索引列排序:df_inner.sort_index()

    如果prince列的值>3000,group列显示high,否则显示low:

            f_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')

    对复合多个条件的数据进行分组标记

            df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1

    对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size
            pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size']))

    五、数据提取 
    
            主要用到的三个函数:loc,iloc和ix,loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取。 
            1、按索引提取单行的数值

            df_inner.loc[3]
            1
            2、按索引提取区域行数值

            df_inner.iloc[0:5]
            1
            3、重设索引

            df_inner.reset_index()
            1
            4、设置日期为索引

            df_inner=df_inner.set_index('date') 
            1
            5、提取4日之前的所有数据

            df_inner[:'2013-01-04']
            1
            6、使用iloc按位置区域提取数据

            df_inner.iloc[:3,:2] #冒号前后的数字不再是索引的标签名称,而是数据所在的位置,从0开始,前三行,前两列。
            1
            7、适应iloc按位置单独提起数据

            df_inner.iloc[[0,2,5],[4,5]] #提取第0、2、5行,4、5列
            1
            8、使用ix按索引标签和位置混合提取数据

            df_inner.ix[:'2013-01-03',:4] #2013-01-03号之前,前四列数据
            1
            9、判断city列的值是否为北京

            df_inner['city'].isin(['beijing'])
            1
            10、判断city列里是否包含beijing和shanghai,然后将符合条件的数据提取出来

            df_inner.loc[df_inner['city'].isin(['beijing','shanghai'])] 
            1
            11、提取前三个字符,并生成数据表

            pd.DataFrame(category.str[:3])
            1
            六、数据筛选 
            使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。 
            1、使用“与”进行筛选

            df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']]
            1
            2、使用“或”进行筛选

            df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']].sort(['age']) 
            1
            3、使用“非”条件进行筛选

            df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']) 
            1
            4、对筛选后的数据按city列进行计数

            df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count()
            1
            5、使用query函数进行筛选

            df_inner.query('city == ["beijing", "shanghai"]')
            1
            6、对筛选后的结果按prince进行求和

            df_inner.query('city == ["beijing", "shanghai"]').price.sum()
            1
            七、数据汇总 
            主要函数是groupby和pivote_table 
            1、对所有的列进行计数汇总

            df_inner.groupby('city').count()
            1
            2、按城市对id字段进行计数

            df_inner.groupby('city')['id'].count()
            1
            3、对两个字段进行汇总计数

            df_inner.groupby(['city','size'])['id'].count()
            1
            4、对city字段进行汇总,并分别计算prince的合计和均值

            df_inner.groupby('city')['price'].agg([len,np.sum, np.mean]) 
            1
            八、数据统计 
            数据采样,计算标准差,协方差和相关系数 
            1、简单的数据采样

            df_inner.sample(n=3) 
            1
            2、手动设置采样权重

            weights = [0, 0, 0, 0, 0.5, 0.5]
            df_inner.sample(n=2, weights=weights) 
            1
            2
            3、采样后不放回

            df_inner.sample(n=6, replace=False) 
            1
            4、采样后放回

            df_inner.sample(n=6, replace=True)
            1
            5、 数据表描述性统计

            df_inner.describe().round(2).T #round函数设置显示小数位,T表示转置
            1
            6、计算列的标准差

            df_inner['price'].std()
            1
            7、计算两个字段间的协方差

            df_inner['price'].cov(df_inner['m-point']) 
            1
            8、数据表中所有字段间的协方差

            df_inner.cov()
            1
            9、两个字段的相关性分析

            df_inner['price'].corr(df_inner['m-point']) #相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关
            1
            10、数据表的相关性分析

            df_inner.corr()

pd.set_option(“display.max_row”,2000) 显示2000行

pandas 给指定索引的 某列赋值 :

    data_S.loc[data_S.index==索引,改变值的列] =  赋值 
    data_S.loc[data_S.index==n,"Case Id"] = list_all[m]

删除重复的行:

    data_xls = data_xls.drop_duplicates(subset=['Start Time', 'End Time', 'Duration'],keep='first')

pandas 两表合并 :
按字段合并:
datafame = marge(表1,表2,on=[列名1,列名2],how=以那边表为坐标)
pandas 多表合并、
res = pd.concat([df1,df2,df3],axis=0,ignore_index=True)
参数axis=0表示上下合并,1表示左右合并,ignore_index=True表示忽略原来的索引

需求:pandas groupby 分组之后取 每个数据的值,写到不同的sheet中:

    data = pd.read_excel(excel_path)
    writer = pd.ExceWriter(res_file)
    groupby_df = data.groupby([列])
    for i in groupby_by:
            i[1].to_excel(writer,index=false,sheet_name=i[0])
    writer.save()

需求 保持原表sheet2不变,替换sheet1中的数据

    import pandas as pd
    import openpyxl
    import xlwings as xw
    # 首先这excel 中删除sheet1
    File = "路径:"
    wb = openpyxl.load_woekbook(File)
    ws = wb["sheet1"]
    wb.remove(ws)
    wb.save(File)
    # 创建dataframe数据
    data = pd.DataFrame({"id":[1,2,3,4,5]})
    #写入数据
    book = openpyxl.load_workbook(File)
    writer = pd.ExceWriter(File,engine="openpyxl") # 参数代表报留原有数据格式
    # 测试writer 里还只是读写器,然后将上面读取的book复制给writer
    writer.book = book
    writer.sheets = dict((ws.title,ws) for ws in book.worksheets)
    data.to_excel(writer,sheet_name="sheet1",index=False)
    writer.save()

xlrd 读取 使用

    读取 xlsx 信息
    book = xlrd.open_workbook(r'C:\Users\Administrator\Desktop\example.xlsx')
    # 读取sheet
    table = book.sheet_by_index(0)
    rec_data_list = []
    # print(table.nrows,"----",'\n')   #获取该sheet中的有效行数
    # print(table.row(1),"----",'\n')   #返回由该行中所有的单元格对象组成的列表
    for i in range(table.nrows):
            print(table.row_values(i),"----",'\n')
            # 读取每一行的values 详情信息 ['Food', '2013-01-16', 300.0, '']  列表形式
            rec_data = [{'仪表': table.row_values(i)[0], '测项': table.row_values(i)[1] }]
            rec_data_list.append(rec_data)

xlsxwriter 写入

    # 创建 xlsx 文件
    workbook = xlsxwriter.Workbook(r'C:\Users\Administrator\Desktop\example1.xlsx')
    # 字体 
    bold_format = workbook.add_format({'bold': True})
    # sheel 命名
    worksheet_nsiot = workbook.add_worksheet("haha")
    # 命名列名
    worksheet_nsiot.write('A1', '仪表', bold_format)
    worksheet_nsiot.write('B1', '测项', bold_format)
    worksheet_nsiot.write('C1', '芯片', bold_format)
    worksheet_nsiot.write('D1', 'Case Id', bold_format)
    # 写入行列
    row = 1
    col = 0
    for rec_data in rec_data_list:
            item = rec_data[0]
            # 重写入第1行,第0列开始,因为第0行是列名
            worksheet_nsiot.write_string(row, col, item['仪表']) 
            worksheet_nsiot.write_string(row, col + 1, str(item['测项']))
            worksheet_nsiot.write_string(row, col + 2, str(item['芯片']))
            worksheet_nsiot.write_string(row, col + 3, str(item['Case Id']))

显示第几行第几列的数据

print(table.cell_value(1,1))
# 设置第一行类名的格式 和 背景颜色
bold_format = workbook.add_format({
‘bold’: True,
‘border’: 1,
‘fg_color’: ‘#B8B8B8’,
})

7.18

  1. 4p理论

  2. 5w2h 理论PEST方法
    5W2H方法
    逻辑树方法
    4P营销理论方法

    用户行为理论方法

7.19

  1. 某些学者认为,数据分析分为三类,
    入门级的描述性数据分析,
    其方法主要有对比、平均、交叉分析法。
    高级的探索、和验证数据分析,

  2. 分析方法有主要有
    相关分析,
    回归分析,
    因子分析。
    这样的提法有它自己的道理。在我看来,
    实际上就两类:描述性统计分析和计算性数据分析。

  3. 几个常见的容易搞混淆统计术语

  4. 离散统计学 ,
    频数等于 是一个数出现的次数
    个体频数/所有频频的和 等于 频率

    比例:部分对整体
    比率:部分对部分

    倍数:表示A的总数翻一番,现在A的总数是原来的2倍。

    番数:2的幂数
    番数: 表示A的总数翻两番,现在A的总数是原来的4倍

    对比:这个产品的销售额与上一年相比,同比增长40%;

    环比:这个商品的销售额与上个月相比,环比增长30%。

  5. 漏斗图分析法:
    漏斗图
    占位数=(第一环节人数-当前环节人数)/2
    环节转化率 = 第一环节/第二个环节 为 40%
    总体转化率=累积环节转化率=第一行环节转化率*…*当前环节转化率

2 numpy

  1. import numpy as np
    丈量
    np.arange(1,1000)

1.出现一个大数组
  批量化的计算
  ar_2 = np.arange(1,1000)
2.dtype  置换数据类型 dtype=np.32  向下取整  
  ar_125=np.array([1,2.4,3,4.],dtype=np.32)

  array([1, 2, 3, 4])
    1. 创建 数组 一定要用 object dtype = object

       可以真正的把表格 读取到我们的编辑器中 
  1. 多维数字
    shape 函数
    2,3,3
    2个 行 列
    确定 外形

  2. 索引

单位矩阵 笛卡尔基底系统

7.16

7.16

import numpy as np

r_dim = np.arange(0,16).reshape(4,4)
array([[ 0,  1,  2,  3],
   [ 4,  5,  6,  7],
   [ 8,  9, 10, 11],
   [12, 13, 14, 15]])


---生成一个矩阵

ar3_dim = np.random.randint(2,10,size=(4,4))


ar3_dim
Out[6]: 
array([[6, 3, 5, 9],
    [8, 3, 7, 2],
    [8, 2, 3, 2],
    [7, 5, 2, 5]])

ar_dim + ar3_dim
Out[7]: 
array([[ 6,  4,  7, 12],
    [12,  8, 13,  9],
    [16, 11, 13, 13],
    [19, 18, 16, 20]])



把-4,4 分成1000份
ar2_dim =np.linspace(-4,4,1000)





ar1_dim = np.random.normal(size=(4,4))

ar1_dim
Out[49]: 
array([[ 2.23592643, -0.56739328, -0.37532249,  0.37043396],
    [-0.0815659 ,  0.69841392, -1.06545111, -0.97716546],
    [-1.51375169, -0.57465094,  0.97199617, -0.2471151 ],
    [ 1.3618376 ,  0.84458397, -1.76120145,  0.29179346]])

np.sign(ar1_dim)
Out[50]: 
array([[ 1., -1., -1.,  1.],
    [-1.,  1., -1., -1.],
    [-1., -1.,  1., -1.],
    [ 1.,  1., -1.,  1.]])



    画布三部
    import matplotlib.pyplot as plt ; asd,fgh = plt.subplots(1,1,bpi=140,figsize(8,6))

7.17

7.17

三个函数

  1. random.shuffle(aer)
    aer shuffle 可以随机打打乱一维数字 二位数组不能随机打乱

  2. lambda 表达

    map() 函数 可以处理一维数组
    import math
    map(lambda x:x2+math.sin(x),[2,3,4,5,6]) 返回一个对象
    list(map(lambda x:x
    2+math.sin(x),[2,3,4,5,6])) 返回一个列表
    list(map(lambda x:’%.2f’%x,np.random.normal(size=10)))
    [’-0.37’,
    ‘-0.65’,
    ‘-1.05’,
    ‘0.11’,
    ‘0.43’,
    ‘-0.50’,
    ‘-0.40’,
    ‘0.88’,
    ‘-1.28’,
    ‘-2.01’]

    reduce()函数
    from functools import reduce
    自动相加 乘 除 运算
    reduce(lambda x,y:(x+y),[1,2,3,4,5])

下午

  1. 数据筛选

  2. 基本的数学统计方法 方差和标准差 (简单的离散型)

     离散:有限的集合数据   有限的数据的一定是离散的{1.1,1.2,1.3}
          无限的可以数的集合  无限的 但不能可数来描述它
     不可以一对多  看多对一
     例子:1到2 的小数。 
    
     总体方差公式,
     样本方差公式, 
    

标准方差

  1. sun()函数 ------- np.sum()

     0行1列
     逐行案列 ,逐列按行
     artty = np.arange(25).reshape(5,5)
     artty
     array([[ 0,  1,  2,  3,  4],
             [ 5,  6,  7,  8,  9],
             [10, 11, 12, 13, 14],
             [15, 16, 17, 18, 19],
             [20, 21, 22, 23, 24]])
    
    np.sum(artty,0)
    
         array([50, 55, 60, 65, 70])
    
    np.sum(artty,1)
    
         array([ 10,  35,  60,  85, 110])
    
     artty.sum(0)
    
         array([50, 55, 60, 65, 70])
    
  2. np.mean()

     np.mean()整个二维数组的平均值
     np,mean(0)逐行案列求平均主 每一个行的平均值
    
     np,mean(1)逐列案行求平均主 每一个列的平均值
    
  3. min()

     np.min(ar12,0) )逐行案列求平均主 每一个行的最小值
     np.min(ar12,1) )逐列案行求 每一个列的最小值
    
  4. argmin(ar12)

     array([5, 6, 5, 3, 4])
     逐行案列操作 就是找到每一列左最小值的索引
     argmin(ar12,1)
     逐列案行操作 就是找到每一列左最小值的索引
    
  5.  分析 :argmin(ar12)
    
     ar12.ravel() 把二维数组 转化为一维数组  过滤最小值
    
     ar12.ravel()==np.min(ar12)
     返回义个bool
     
     np.where(ar12.ravel()==np.min(ar12))
     把二维数组  展开一维数字 最小值的搜引
    
  6.  cumsum(当前值加得  加后面的 值累计加)  全部的
    
     ar12
     
     Out[184]:
    
     array([[ 9, 13,  5, 11,  7],
         [12, 12, 15,  9,  7],
         [ 6, 15, 14, 12,  5],
         [ 5,  6, 13,  3, 13],
         [11,  8,  8,  5,  4]])
    
     np.cumsum(ar12)
     
    
     Out[185]:
    
     array([  9,  22,  27,  38,  45,  57,  69,  84,  93, 100, 106, 121, 135,
         147, 152, 157, 163, 176, 179, 192, 203, 211, 219, 224, 228], dtype=int32
    
  7. np.cumsum(ar12,1)
    逐列按行 求出每一个行的累加值
    
  8. np.cumproduct()
    (当前值乘得  加后面的 累计乘)  全部的
    
    np.cumproduct(ar12)
    逐行按列
    np.cumproduct(ar12,1)
    

7.18



二维数组和一维数组相减 是按行相减的


数据的排序和整理

    1: list1 = [2,4,5,6,7,3,2,5,78,8,5,3,4,6,4,7,4,7,4,21]
        转集合 集合没右重复
        list2 = set(list1)
        转列表
        list2 = list(list2)
        排序
        sorted(list2)
  1. 用soet 函数进行排序 sort 一次型 作为方法使用

  2. 用soet 函数进行排序 sort 一次型 作为方法使用

        逐列按行   不破坏,打乱数据
        
    
        ar123.sort(1)
        括号里的不指定轴号,就以为轴号  默认为1 逐列按行  对行排序
    
        ar123.sort(0)
        括号里的不指定轴号,就以为轴号0   逐行按列  对行排序
    
    
    
    
        ar123 = np.random.randint(1,100,(6,6))
        
        Out[60]:
    
        array([[29, 77, 39, 81, 36, 29],
                [35, 36, 99, 80, 94, 57],
                [37, 52, 28, 36, 57, 88],
                [87, 86, 65, 72, 54, 24],
                [96, 42, 46, 52,  1, 44],
                [35, 29, 97, 74, 21,  7]])
    
        ar123.sort(1)
    
        array([[ 1,  7, 28, 29, 29, 36],
                [21, 24, 35, 36, 39, 52],
                [29, 35, 36, 42, 46, 72],
                [37, 44, 52, 54, 65, 74],
                [57, 57, 77, 80, 87, 97],
                [81, 86, 88, 94, 96, 99]])
    
  3. np.unique() 等于0可以删除重复行 等于u1 就是删除列

  4. np.unique() 等于0可以删除重复行 等于u1 就是删除列

    ar234 = np.random.randint(2,25,25)
    
    Out[84]:
    
    array([23,  7,  6, 21,  4, 15, 21,  9,  5,  8, 16, 10, 24,  2, 19, 12, 12,
        18,  3, 23, 20, 24, 12,  5,  2])
    
    np.unique(ar234)
    
    
    
    np.unique()    可以删除重复行   按行清除  
    
    ar125[1] = ar125[4]
    
    array([[16, 22, 11,  8,  6,  9],
            [ 2, 18,  8,  6,  3,  5],
            [16,  2, 12, 13,  8,  9],
            [15, 22, 13, 17,  5, 11],
            [ 2, 18,  8,  6,  3,  5],
            [ 7,  7, 12,  6, 22, 21]])
    
    np.unique(ar125,axis=0)
    
    第一列 进行排序  升序
    
    array([[ 2, 18,  8,  6,  3,  5],
            [ 7,  7, 12,  6, 22, 21],
            [15, 22, 13, 17,  5, 11],
            [16,  2, 12, 13,  8,  9],
            [16, 22, 11,  8,  6,  9]])
    
    ----
    ar125[:,1] = ar125[:,-1]
    
    
    Out[98]:
    
    array([[16,  9, 11,  8,  6,  9],
        [ 2,  5,  8,  6,  3,  5],
        [16,  9, 12, 13,  8,  9],
        [15, 11, 13, 17,  5, 11],
        [ 2,  5,  8,  6,  3,  5],
        [ 7, 21, 12,  6, 22, 21]])
    
    np.unique(ar125,axis=1)
        
    np.unique()    可以删除重复列  
    
    array([[ 6,  8,  9, 11, 16],
            [ 3,  6,  5,  8,  2],
            [ 8, 13,  9, 12, 16],
            [ 5, 17, 11, 13, 15],
            [ 3,  6,  5,  8,  2],
            [22,  6, 21, 12,  7]])
    

7.18 下午 绘图

7.18 下午 绘图

    #   xticks 
        yticks   
        set_xlabel  
        set_ylabel
        legend  
        subplots
  1. 绘制第一幅图表

  2. 绘制第一幅图表

     (1)figure函数,创建图表
    
     (2)subplot函数,创建子图
    
     (3)在多个图表中创建子图
    
     (4)plot()函数,画函数图像
    
     (5)sca()函数,选择子图
    
     (6)在 一张表中画多个曲线
     alpha 透明度
     ----
     fig = plt.figure(11,dpi=140,figsize=(8,6))# 定义一个画框
     d1 = fig.add_subplot(2,2,1)
     d2 = fig.add_subplot(2,2,2)
     d3 = fig.add_subplot(2,2,3)
     d4 = fig.add_subplot(2,2,4)
     ----
      
     1.线图
     d1.plot(np.random.randn(200),'bo--')
    
    
    
    
    
     2.直方图
     x   bins 组数  renge 取值范围(确定值直方图的范围) stacken 垂直的
    
     (array([  8.,  47.,  70.,  51.,  20.,   4.]), 频数
             组上限          下限
     array([-1.40946983, -0.51867731,  0.3721152 ,  1.26290772,  2.15370023,
         3.04449275,  3.93528526]),   
     <a list of 6 Patch objects>)
    
     d2.hist(np.random.normal(1,size=200),bins=6,color='g')
    
    
    
    
    
     3.散点图
     参数:
          x,y (必须右两个参数)  c 颜色  marker 标志 cmap 调试板  
     d3.scatter(np.random.rand(50),np.random.uniform(-1,1,50),c='m',marker='*')
    
    
    
    
     4.饼图  统计分析最常用的图
     startangle 角度   labels 名称 
     sharex   sharey 共享 
                          一行一列
     asd,sdf=plt.subplots(1,1,sharex=True,sharey=True,)
     sdf 一次性 创建曾在画布 画框 
     自动转化曾在
                          两行两列
     asd,sdf=plt.subplots(2,2,sharex=True,sharey=True)
     
    
     #  在一个画框里画多个线图
     plt.legend(loc='upper center')
    

画图注解

画图注解

PANDAS 作图


subplots语法及操作

    fig, ax = plt.subplots(nrows=1, ncols=1, sharex=False, 
    sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw): 
    创建一个figure和多个子图。 
    参数: 
    nrows,ncols:int类型,默认值为1,表示子图窗格数 
    sharex,sharey:bool或者{‘none’, ‘all’, ‘row’, ‘col’},默认值为False。控制x、y坐标轴的属性共享。当为True或者’all’表示在所有子图中共享坐标轴;False或者’none’表示每个子图的坐标轴是独立的;’row’表示每个子图行会共享坐标轴;’col’表示每个子图列会共享坐标轴。 
    squeeze:bool,默认值为True。 
    subplot_kw:dict。保存的是传给add_subplot()的参数 
    gridspec_kw:dict。 
    fig_kw:dict。 
    返回: 
    fig:matplotlib.figure.Figure对象,fig可以用于修改图片级别的属性。 
    ax:Axes对象或者Axes对象的数据。

figure语法及操作

figure语法及操作

    figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

    num:图像编号或名称,数字为编号 ,字符串为名称
    figsize:指定figure的宽和高,单位为英寸;
    dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80
    facecolor:背景颜色
    edgecolor:边框颜色
    frameon:是否显示边框

    d4.pie(np.arange(1,9))

    5.图表的注释与标识

    6.加载txt文件并绘图
  1. np.intersectld(set1,set2) 选出交集

    unionld(set1,set2) 全部
    setdiffld(set1,set2) 插集
    np.setxorld(set1,set2)  把两个set 独有的元素 并到一起
    
  2. !type Desktop\yong344523.csv
    读取

     继续把数据转化为数组:只适合数据性 csv表格 只是数据的读取(二维数组) 不适合中文和带右字符串的
     In [72]: testarray_1=np.loadtxt('Desktop\yong344523.csv',delimiter=',')
     In [73]: testarray_1
     testarray_1=np.loadtxt(skprows=‘跳过’ ,delimiter=','分隔符 f)
    

* 数组的组合 和分割

    拼接纬度相同, 长度相同
    

    array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
    array([[ 9, 19, 13,  8],
        [ 6,  7,  6, 13],
        [ 4,  6,  6, 12],
        [10,  6,  6, 11]])


    水平组合 np.hstack((set1,set2)) 
    逐列按行 水平
            np.concatenatc((set1,set2),axis=1)

    Out[229]:

    array([[ 0,  1,  2,  3,  9, 19, 13,  8],
        [ 4,  5,  6,  7,  6,  7,  6, 13],
        [ 8,  9, 10, 11,  4,  6,  6, 12],
        [12, 13, 14, 15, 10,  6,  6, 11]])
  1. 垂直组合

     np.vstack((set1,set2))
    
     np.concatenatc((set1,set2),axis=0)
     列数必须相同  
     一维数组的拼接垂直变成二维数字
    
  2. #列组合

    np.column_stack((a1,a2))

    行组合

    np.row_stack((set1,set2))
    
    行组合 可以实现一维对二维的拼接  以行
    一维数组不能水平分隔
    

    垂直分隔

    切的必须可以 被整除 4
    1

    Out[12]: 
    [array([[ 0,  1],
            [ 4,  5],
            [ 8,  9],
            [12, 13]]), array([[ 2,  3],
            [ 6,  7],
            [10, 11],
            [14, 15]])]
    

7.19 线性代数

7.19 数据的转换

数据类型表
Int8和uint8(有符号和无符号的8位整形,i1 和 u1);
Int16和uint16(同上,i2 和 u2)
Int32和uint32(同上,i4 和 u4)
Int64和uint64(同上,i8 和 u8)
Float16(半精度浮点数,f2)
Float32(单精度浮点数,f4)
Float64(双精度浮点数,f8)
Float128(扩展精度浮点数,f16)
Complex64(c8),Complex128(c16),
Complex256(c32)
Bool(?),object(O),string_(S),Unicode(U)



test_array_1=test_array.astype(np.float64)
test_array_1.dtype
dtype('float64')

aaaaa=np.array(['12','21','33'],dtype=np.string_)

7.19 数据清洗 平均值补值 成段补全插条法

        通常 分析 字符串是无效的    只有数字有效
前提:  3%       里可以用平均值补值
        5% 以上  造成数据不稳定右
        np.nan    nan   
存储:格式注意
        exle 里面 没用空值
        csv  右空值

销售数据清洗

    创建 0到18 的      二维数组  3 行 3 列
    array_12=np.arange(18).reshape(2,3,3)

    def get_repeated_label(array_1dim):
    label_1dim=[]
    #查最后一项的 前一项
    for k in range(len(array_1dim)-1):
        for i in range(k+1,len(array_1dim),1):
            #  列表的前一项和 它后面的一项对比   如果一样把 一样值的索引添加到新的列表中
            if array_1dim[k]==array_1dim[i]:
                label_1dim.append(i)
            # 以数组的形式展示出来
    return np.unique(label_1dim) # 重复的索引列表


    -----------------------------------------------------
    
        def invalid(array_variable):
            #  遍历 行和列   
            for i in range(np.shape(array_variable)[0]):
                for j in range(np.shape(array_variable)[1]):
                        # 如果在 值上面的 值是 浮点型 或整数型 跳过
                        if type(array_variable[i,j])== float or type(array_variable[i,j])==int:
                            pass
                        else:
                            #   不是的话  则赋值为0
                            array_variable[i,j]=0
                    array_variable[np.where(np.isnan(array_variable.astype(np.float64)))]=0
            return array_variable

            ------------------------------------
            #    计算平均值   赋值  把空值 赋予 平均值
                def fillup_mean_value(array_parameter):
                     for index_j in range(np.shape(array_parameter)[1]):
                          array_columns_nr=list(np.where(array_parameter==0)[1])
                          if index_j in array_columns_nr:
                              appearance_sum=array_columns_nr.count(index_j)
                              if appearance_sum>0:
                mean_1=(array_parameter[:,index_j]).sum()/(np.shape(array_parameter)[0]-appearance_sum)
                                   bollmatrix_1=array_parameter[:,index_j]==0
                                   array_parameter[bollmatrix_1,index_j]=mean_1

                       return array_parameter
    -------------------------------------------- 
        # 删除重复项  np.delete(待删减的数组,obj整数的数组,)
            def delete_rows(list_variable,array_variable):
                    i=0
                    list_variable.sort()
                    array_medium=array_variable
                    for j in list_variable:
                         if i==0:
                             array_medium=np.delete(array_medium,j,0)
                         else:
                             array_medium=np.delete(array_medium,j-i,0)
                         i=i+1
                     return array_medium
        ------------------------------------------------
         delete_rows(get_repeated_label(Columns_1),Data_Deal_with)

索引

索引

python numpy.random详细解析

https://blog.csdn.net/vicdd/article/details/52667709

np.delete(待删减的数组,obj整数的数组,)

查数据 相同数据删除

pandas

ser1 = pd.Series([3,5,76],index=[‘s’,‘y’,‘x’],dtype=np.int32)
s 3
y 5
x 76
dtype: int32
Index([‘s’, ‘y’, ‘x’], dtype=‘object’)
Series
通过索引找值
ser1[0]

append 添加不能更新
updata 更新不能添加
ignore_index=ture  保证索引的唯一性


#  字典的主键  一定要转化 列索引名
table_sales={'Seller':sales1,'Sales':dict_1,'SalesQuantity':sales_}

 
framesample_1=pd.DataFrame(table_sales)
framesample_1
数据框 可以直接索引列 不能直接索引行
framesample_1['Seller']
索引行 .loc
framesample_1.loc['0']

T 转至
del framesample_1.T['Seller']

reindex 可以任意删除,添加,交换行列

reindex 可以任意删除,添加,交换行列

index=[‘行 索引名字’,‘行 索引名字’]

columns= =[‘列 索引名字’,‘列 索引名字’]

    frame_1=pd.DataFrame(np.arange(9).reshape(3,3),index=['row1','row2','row3'],columns=['one','two','three'])

利用ix函数修改数据框行索引与列,快捷整洁,节约时间。但是Ix已经几乎被启用,现在用loc函数。

利用ix函数修改数据框行索引与列,快捷整洁,节约时间。但是Ix已经几乎被启用,现在用loc函数。

Drop函数应用到“DataFrame”

表名字.drop([‘行或列’],axis=0) axrs=0 表示行 1 表示列

补缺失索引

    只有缺失索引 才能补值   
    向下 补
    test_12=a.reindex(range(11),method='ffill')
    向上补
    test_12=a.reindex(range(10),method='bfill')

7.23

7.23

pandas   Series  索引位相同才可以相加。(默认索引  没有空位置)

pandas add. 两个表的相加 fill_value补值

pandas add. 两个表的相加 fill_value补值

add1 = pd.DataFrame(np.arange(9).reshape(3,3),index=['ein','zwei','drei'],columns=list('bde'))
解释:指定义索引 相加 索引必须一至  否则 不一致的索引想会出现None 空 值   
不同情况用最合适的方法进行补值

add 相加  fill_value 可以进行补值
diframe=Q.add(Newframe,fill_value=0)
    两个相加必须有一个非空值  两个 相加才能得到非空值
    fill_value=100   把空值 补 100  
add_1 = new.add(new_1,fill_value=100)


加减 + - 默认是行相减
                
nnp.abs(frame12)   abs 绝对值

计数 np.nan 这数组中的数量

list_4 = pd.Series([1,1,np.nan,1,1,np.nan,1,1,np.nan,1,1,np.nan])
list_5 = pd.Series([1,1,np.nan,1,1,np.nan,1,1,1,1,1,1])
list_6 = pd.Series([1,1,np.nan,1,1,np.nan,1,np.nan,1,1,np.nan,1])
T_list =[list_4,list_5,list_6,]
null_1 = pd.Series(np.arange(11)*0)
for i in T_list:
    null_1 = null_1.add(i,fill_value=0)

null_1
#   把计算好的 np.nan  统计出来 
Out[28]:    0     3.0
            1     3.0
            2     0.0
            3     3.0
            4     3.0
            5     0.0
            6     3.0
            7     2.0
            8     2.0
            9     3.0
            10    2.0
            11    2.0
            dtype: float64

相减 np.subtract(ar12,ar22)

    数组的每列
    ar12

    array([[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]])

    ar22
    array([3, 2, 6])

     np.subtract(ar12,ar22)

     array([[-2,  0, -3],
            [ 1,  3,  0],
            [ 4,  6,  3]])

    T 转值  相减
    ar12.T
    array([[1, 4, 7],
            [2, 5, 8],
            [3, 6, 9]])

数据框 和 Series 二维数组和一维数组相减

数据框 和 Series 二维数组和一维数组相减

注意: 列索引 要保持一直  

Frame1=pd.DataFrame([[2,2,1],[1,1,3],[0,2,3]],index=['Nr1','Nr2','Nr3'],columns=['mon','tue','wen'])

s1=pd.Series([2,2,1],index=['mon','tue','wen'])
mon    2
tue    2
wen    1
dtype: int64

:     ”Frame1-s1

0   0   0
-1  -1  -1    
-2  0   2 

每一行都相减 这个二维数组  

Frame1.sub(s2,axis=1)

asd (frame1) 绝对值

    2、NumPy一元函数对ndarray中的数据执行元素级运算的函数

    np.abs(x)、np.fabs(x) : 计算数组各元素的绝对值
    np.sqrt(x) : 计算数组各元素的平方根
    np.square(x) : 计算数组各元素的平方
    np.log(x) 、np.log10(x)、np.log2(x) : 计算数组各元素的自然对数、10底对数和2底对数
    np.ceil(x) 、np.floor(x) : 计算数组各元素的ceiling值或floor值

    np.rint(x) : 计算数组各元素的四舍五入值
    np.modf(x) : 将数组各元素的小数和整数部分以两个独立数组形式返回
    np.cos(x)、 np.cosh(x)、np.sin(x)、 np.sinh(x)、np.tan(x) 、np.tanh(x) : 计算数组各元素的普通型和双曲型三角函数
    np.exp(x) : 计算数组各元素的指数值
    np.sign(x) : 计算数组各元素的符号值,1(+), 0, ‐1(‐)

sin cos 三角函数 公式

    np.sin(np.abs(frame12))

apply applymap lambda 函数

apply applymap lambda 函数

数据框名字.apply(table_extrem)  作用在每一列上  返回值是一个具体的值  返回一个数据框
r1    7.0 5.0 6.0 
r2    4.0 5.0 4.0 
r3    6.0 6.0 8.0 
r4    6.0 5.0 8.0 
  
f = lambda x:x.max()-x.min()

frame13.apply(f)
每一列的最大值和最小值相减  逐行按列
frame13.apply(f,1)  逐列按行

c1    3.0
c2    1.0
c3    4.0
dtype: float64


applymap ????????????????????????/

用 apply 函数 求每一列的最大值 和最小值
直接框的话 会出现  多维 的嵌套列表

def table_extrem (x):
     return pd.Series([x.min(),x.max()],index=['min','max'])

frame12.apply(table_extrem)
   返回的结果 义个数据框
    min 0 1 2 
    max 9 10 11 

DataFrame 的格式化

frame11=pd.DataFrame(np.random.randn(3,4),index=['r1','r2','r3'],columns=['c1','c2','c3','c4'])
formatierung=lambda x:'%.2f' % x
frame11.applymap(formatierung)

c1 c2 c3 c4
r11.40 0.39 -0.90 -2.27 
r20.54 -0.53 -0.36 0.40 
r31.83 -0.91 -0.39 0.51 

排序 和 排名

排序 和 排名

数字只有sort 函数一个
project_1.sort_index()

acending = Ture 升序 和降序

排名 不在是真正的数值  而是名次
Dataffdic=pd.DataFrame({'liu':[-1,0,2,-3],'wang':[3,2,-5,7],'jiang':[1,0,1,5]})
按 liu 进行进行排序
Dataffdic.sort_values('liu',0)

describe()   有效值查询

排名 :
        名字.rank(acending = False) 
        acending = False  最大的数组 数字最小
            默认出  最大的数组 数字最大
dataFrame_1=pd.DataFrame([range(4),[np.nan,2,3.6,0.9],[1.2,4,6,7],[3.4,7.9,0.4,8]],index=['r1','r2','r3','r4'],columns=['c1','c2','c3','c4']
dataFrame_1.idxmin()  返回每一行的 最小值

                c1    r1
                c2    r1
                c3    r4
                c4    r2
                dtype: object

   
按列累计加,遇到NaN值自动忽略,不参与运算。
dataFrame_1.cumsum()

     c1    c2    c3    c4
r1  0.0   1.0   2.0   3.0
r2  NaN   3.0   5.6   3.9
r3  1.2   7.0  11.6  10.9
r4  4.6  14.9  12.0  18.9
dataFrame_1.cumsum(1)   #行里的每一个值进行相加  累加
Out[10]: 
    c1    c2    c3    c4
r1  0.0   1.0   3.0   6.0
r2  NaN   2.0   5.6   6.5
r3  1.2   5.2  11.2  18.2
r4  3.4  11.3  11.7  19.7

describe() 有效值查询

    Out[12]: 
                c1     c2        c3       c4
    count  3.000000  4.000  4.000000  4.00000
    mean   1.533333  3.725  3.000000  4.72500
    std    1.724336  3.050  2.388863  3.34203
    min    0.000000  1.000  0.400000  0.90000
    25%    0.600000  1.750  1.600000  2.47500
    50%    1.200000  3.000  2.800000  5.00000
    75%    2.300000  4.975  4.200000  7.25000
    max    3.400000  7.900  6.000000  8.00000

count() 统计

list1 = [1,2,3,4,5,3,None,None]
list1.count(None)
2统计y
dataFrame_1.count()  有效值  字符串也算

随机漫步

    import matplotlib.pylab as plt
    table_1=plt.figure()
    # 创建一个画框
    ax=table_1.add_subplot(1,1,1)
    # 累计加
    ax.plot(np.random.randn(100000).cumsum())
    ax.plot(np.random.randn(100000).cumsum())
    # 给x轴  赋予刻度
    ticks_1=ax.set_xticks([0,25000,50000,75000,100000])
    # 给 刻度设置标标签   斜度   字体大小
    scale_name=ax.set_xticklabels(['step1','step2','step3','step4','step5'],rotation=45,fontsize=12)
    # title 名字
    ax.set_title('Python-03 Practice')
    # x轴的名字
    ax.set_xlabel('Steps')

    #下面我们添加图例
    ax.plot(np.random.randn(100000).cumsum(),color='m',linestyle='-',label='solid')
    ax.plot(np.random.randn(100000).cumsum(),color='c',linestyle=':',label='dotted')
    # 显示 线的名字
    ax.legend(loc='best')#plt.legend也是可以的
    plt.show()

画图注解

    fig,subpic=plt.subplots(1,1)
    subpic.plot([2,77,90,2.3,4,5,6,45,34,67,35,66,34,23,76],[34,32,35,43,34,23,45,56,44,57,56,33,55,66,54],'b*-')
    ticks_1=subpic.set_xticks([0,25,50,75,100])
    scale_name=subpic.set_xticklabels(['jenuary','february','march','april','may'],rotation=40,fontsize=12)
    subpic.set_title('Python-03 Practice_1',fontsize=16)
    subpic.set_xlabel('Weight')
    # 添加坐标备注 
    subpic.text(90,35,'key point one',fontsize=10)
    # 批量添加坐标备注 
    keymenge=[(67,57,'key point two'),(23,66,'key point two')]
    for x,y,label in keymenge:
        subpic.text(x,y,label,fontsize=12)
    # 设置 x 轴区间 0-100
    subpic.set_xlim([0,100])
    # 设置 x 轴区间 0-100
    subpic.set_ylim([0,100])
    #  xy 表示坐标 xytext 表示备注坐标点
    subpic.annotate('beautyful point',xy=(5,23),xytext=(5,23)) 
    #  把画出的图片存储 注意:要找show 之前完成 
    plt.savefig('Desktop\python_01.svg')
    # 设在图片 清晰    ,bbox_inches='tight'  框和画布之间的间距
    plt.savefig('Desktop\python_01.png',dpi=400,bbox_inches='tight')
    plt.show()

##Savefig的主要参数如下: 图片的存储

    fname: 表示绝对或者相对文件路径的字符串,文件具体格式由后缀来决定,譬如.pdf,.png格式等。
    dpi: 图像分辨率,默认100,(每英寸点数)
    Facecolor,edgecolor: 背景色,默认为“w”白色
    Format: 显示设置文件格式,png,jpeg,pdf等等,但不要与fname里的文件格式发生冲突。

PANDAS 作图

PANDAS 作图

    sdf,hgh=plt.subplots(1,1,dpi=140,figsize=(8,6))
    # ax  指明画框  画到那个画框里   ues_index=Ture(用索引作为刻度坐标)
    #  grid=Ture (网格线 ) rot (旋转) liabel (b图例)
    第一种表示ser.plot(ax=hgh,grid=True)
    第二种表示ser.plot(ax=hgh,grid=True,legend=True,label='ser')

    Series.plot 方法的常用参数汇总:
    label	用于设置图例的标签
    ax
        确定要被绘制的matplotlib subplot对象。如果没有设置,则使用当前matplotlib subplot
    style	设置传给matplotlib的风格字符串('g*--')
    alpha	图表的填充不透明度(数值为0到1之间的数)
    kind	各种图形样式line, bar, barh, kde, density, scatter
    logy	在Y轴上使用对数标尺
    use_index	将对象(Series and DataFrame)的索引用作刻度标签
    rot	旋转度数(0到360)
    xticks	用作X轴刻度的值
    yticks	用作y轴刻度的值
    xlim	x的值域
    ylim	y的值域
    grid	设置是否显示轴网格线

    专用于DataFrame的plot的参数

    Subplots	将依据数据框中的每个列绘制的图分别放置到单个的subplot(子画框)里
    sharex	Subplots=true时,设定是否共享X的刻度和值域
    sharey	Subplots=true时,设定是否共享y的刻度和值域
    figsize	元组,用来表示图像大小(宽,高)
    title	设置图像标题
    Legend	设定是否添加一个subplot图例
    sort_columns	设定是否以字母表中字母先后排列顺序绘制各列。

柱状图

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    # 画布 画框
    figure_1,get_information_of_pict=plt.subplots(2,1) # 右2,1 右是1 只能出现义个矢量
    datas=pd.Series(np.random.rand(20),index=list('qwertyuiopasdfghjklz'))
    datas.plot(kind='barh',ax=get_information_of_pict[0],figsize=(8,12),color='g')
    # kind='bar'  水平图  
    datas.plot(kind='bar',ax=get_information_of_pict[1],figsize=(8,12),color='r')
    plt.show()

    import numpy as np
    import pandas as pd
    plt.rcParams['font.sans-serif']=['SimHei'] 
    plt.rcParams['axes.unicode_minus'] = False
    Framedata_1=pd.DataFrame(np.arange(16).reshape(4,4)**(1/2)+np.arange(16).reshape(4,4)*3+6,index=['spring','sommer','autumn','winter'],columns=['Benz','BMW','Porsche','VW'])
    import matplotlib.pyplot as plt
    #  # 画布 画框
    picrange,pic_inf=plt.subplots(2,1)
    Framedata_1.plot(kind='bar',ax=pic_inf[0],title='2018年德系车销售额',rot=50,figsize=(8,12))
    Framedata_1.plot(kind='barh',ax=pic_inf[1],title='2018年德系车销售额',rot=130,figsize=(8,12))
    plt.show()

累计图 看增幅

算统计平面图

    serie_1=pd.Series([3,4.5,5,3,6,9,4.7,4.7,4.7,4.7,4.5,4.5,6,6,3,7,7,7,7])

    serie_1.value_counts().plot(kind='bar')
    
    每个数出现的频率用柱状图表示出来

直方图:

    asd,fgh=plt.subplots(1,1,dpi=140,figsize=(8,6))
    arrt = np.random.normal(0,size=500)  # 数据
    arrt_1=pd.Series(arrt)   #转Series  格式
    arrt_1.hist(ax=fgh,grid=True)  # 画图
    plt.show()

unique() 去重

7.24

series_3.value_counts() 频数计数

    数组名字.value_counts()  b
    每个出现的次数
    d     2
    we    2
    c     2
    a     1
    e     1
    f     1产
    dtype: int64

pd.value_counts() 必须是一维的数字 参数 cascending=True

    series_3.values   变成一维数组  
    必须是一维的数字
    
    返回的值对应 他的频数

# 对数据框的处理

isin() series_3.isin([‘a’])

        0    False
        1    False
        2    False
        3     True   这个索引值是a
        4    False
        5    False
        6    False
        7    False
        8    False
        dtype: bool

        series_3[ss]   把对应 Ture 的值返回出来  一个对象
        0    c
        3    a
        4    c
        dtype: object

        上两种 不适合在数据框里

np.column_stack()

    有用

None 随机补值

可以使用随机数补值(不建议用,小方差用随机补值,大方差用差减法)
随机补值的话 在空值的附近找几个数据的值 进行范围内随机补值
平均数补值只适合小方差
平均数越小 说明数值越集中 补值越精确

ser_1 = pd.Series(np.random.rand(20))
ser_1[12] = None 
ser_1[7] = None
# 使用随机进行补空值
有两个挡    1.  0-5  
           2.   数较大 1000以上  0-10 随机数
    随机补值
    ser_1.fillna(np.random.normal(0.42,size=1)[0])

循环补值

np.where(ser_1.isnull()) # 取出 数组里为None的索引
<!-- np.where(ser_1.isnull())[0][0] -->
    (array([ 7, 12], dtype=int64),)
np.where(ser_1.isnull())[0]
    array([ 7, 12], dtype=int64)

for i in np.where(ser_1.isnull())[0]:
# 在set_1列表里 最后 None的值  向上取两位 向下取两为 
list1 = [ser_1[i-1],ser_1[i-2],ser_1[i+1],ser_1[i+2]]
# 进行给None 赋值
ser_1[i] = (max(list1)+min(list1))/2

NAN 的数据处理

    fillna(9) 补值 只能补一个相同的值   局限型太大 
    # 属于瞎补 不建议 这样补值有问题
               

    isnull  处理空值  补单值
    数组名字.(数组名字.isnull()) =  0 #  快速补充
    


    四种补值 方法  
    fillna()  

数据框 平均值 补值

    frame_123=pd.DataFrame([[1,np.nan,np.nan,2,3],[1,2,3,None,8],[6,2.3,8,None,3],[2,3,2,3,2],[3.2,8.9,3,4.5,3],[2,3,0.45,None,8]])

    t = frame_123.isnull()# 转边bool 矩阵
    frame_123[t]=0
    # 赋值 0 
    frame_123
    frame_new=frame_123
    
    frame_123[frame_123.isnull()]=0  #把Ture 赋值 0 
    # 把bool 矩阵
    bool1 = frame_new[1]==0

    #      
    frame_new[1][bool1]=frame_new[1].sum()/(len(frame_new[1])-(frame_new[1]).value_counts()[0])

fillna() 和 describe() 有效值 补平均值

   frame_123=pd.DataFrame([[1,np.nan,np.nan,2,3],[1,2,3,None,8],[6,2.3,8,None,3],[2,3,2,3,2],[3.2,8.9,3,4.5,3],[2,3,0.45,None,8]])
   注解:frame_123.describe()
            
            count 6.000000 5.000000 5.000000 3.000000 6.000000 
            mean  2.533333 3.840000 3.290000 3.166667 4.500000 
    # 拿出 这这一列  对每一项 进行补值
   frame.fillna(frame_123.describe().loc['meam],axis=0) 

字典进行 补值 和 上面方法一样

     frame.fillna({ 0: 6.000000 ,1:5.000000 ,2:5.000000, 3:3.000000, 4:6.000000 },axis=0) 

Dropna 十分重要 处理Nan 数据 特别有效 筛值

    series_23=pd.Series([1,4,3,np.nan,4.5,None,3.4,4.5,6,np.nan,4,5,3])
    
    series_23.dropna()   #  把空值一次 全部过滤掉

    frame_234.dropna(how='all')  # 一行全部为空删掉

层次化索引

                                                            外层 索引
    series_1=pd.Series(np.random.randn(12),index=[['r1','r1','r1','t1','t1','s1','s1','s1','s1','p1','q1','q1'],[9,
     内层 索引
    8,7,6,5,4,3,2,1,0,12,11]])
    series_1.index
    MultiIndex(levels=[['p1', 'q1', 'r1', 's1', 't1'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12]],
                # 对应q2索引2*3 个                       索引的  对应数字
        labels=[[2, 2, 2, 4, 4, 3, 3, 3, 3, 0, 1, 1], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 11, 10]])

外层索引 建议唯一性

    也可以做切片。但是外层标签必须是
    1.经过排序的,必须!
    2.每个外层标签的第一个字母不能不一致,要大写,全大写,要小写全小写。

层次化索引

生成外基 np.outer(x,y)

纵数 频数 怎么算? value_counts() 深刻理解

7.25 层次化索引 数据的重建

层次化索引 要用嵌套列表

    数据的重建是有条件的:对内层索引的个数在每一个外层索引下 的个数是一值的
    不一致的话  只能做层次话索引

    seriser 转 DataFrame  

    
     series_1=pd.Series(np.random.randn(12),index=[['r1','r1','r1','t1','t1','s1','s1','s1','s1','p1','q1','q1'],[9,
     内层 索引
    8,7,6,5,4,3,2,1,0,12,11]])
    #带有层次化索引的Series可以立马转化为数据框,反之,数据#框也可以转化为带有层次化索引的Series
    # 转化为数据框   unstack()  拆分   unstack(0)  unstack(1)    参数补同进行重组
    名字.unstack(1,0)  # 补0

还原 stack()

    重建的数据框.stack(0)  # 还原到 重组前的数组

嵌套 层次化索引

    Gamedata=pd.DataFrame(np.array([[31,27,24,60],[26,28,13,29],[27,17,12,27],[29,9,5,18],[31,12,4,70],[45,11,12,12]]),index=[['A_Morning','A_Morning','A_Morning','B_Afternoon','B_Afternoon','B_Afternoon'],[1,2,3,1,2,3]],columns=[['Junior','Junior','Youth','Youth'],['Zhang','Wang','Li','Zhao']])

层次化索引 命名 数据框

    重要 name 命名
    Gamendata.index.names= ['time','sequs']
    Gamendata.列.names= ['time','sequs']


    age                  Junior      Youth     
    name                  Zhang Wang    Li Zhao
    time        sequence                       
    A_Morning   1            31   27    24   60
            2            26   28    13   29
            3            27   17    12   27
    B_Afternoon 1            29    9     5   18
            2            31   12     4   70
            3            45   11    12   12

多重标签的顺序互换:

            Gamedata.swaplevel('sequence','time')
            Out[52]: 
            age                  Junior      Youth     
            name                  Zhang Wang    Li Zhao
            sequence time                              
            1        A_Morning       31   27    24   60
            2        A_Morning       26   28    13   29
            3        A_Morning       27   17    12   27
            1        B_Afternoon     29    9     5   18
            2        B_Afternoon     31   12     4   70
            3        B_Afternoon     45   11    12   12

索引的排序

级别相加 251 页

    Gamedata.sum(level='sequence')
    每个级别包含两个元素,分别两两相加。



    Gamedata.sum(level='time')
    Out[71]: 
    age         Junior      Youth     
    name         Zhang Wang    Li Zhao
    time                              
    A_Morning       84   72    49  116
    B_Afternoon    105   32    21  100

    每个级别包含三个元素,分别相加即可

    把数据框的列转化为行索引

面板 数据

       Dataframe_3 = pd.Panel(np.random.randn(2,5,4),items=['Item1','Item2'],major_axis=pd.date_range('2000-01-01','2000-01-05'),minor_axis=['A','B','C','D'])
            # 返回数据结构 
            Dimensions: 2 (items) x 5 (major_axis) x 4 (minor_axis)
            Items axis: Item1 to Item2
            Major_axis axis: 2000-01-01 00:00:00 to 2000-01-05 00:00:00
            Minor_axis axis: A to D

处理数据

    常用的把 cvs 转化 成为 数据框 DataFrome        
    用小青蛙 转化

缺失数据 要么没有 要么用标记值表示

数组的合拼 柱状未完成

    ser_1=np.random.normal(0,1,200)
    ser_2=np.random.normal(16,1,200)
    # 两个数组的合拼
    A=np.concatenate((ser_1,ser_2))

    value = pd.Series(A)   # 变成一维数组

散布图 column_stack 把一维数组一列一列的 排列起来

    X5=np.random.beta(2,1,1001)

    test_data=np.column_stack((np.column_stack((np.column_stack((np.column_stack((X1,X2)),X3)),X4)),X5))

画图的复杂的分隔

    def subpicnr_invisible(fig):
    for i, ax in enumerate(fig.axes): #利用list(enumerate(plt.gcf().axes))枚举函数生成元组列表[(画框编号,画框对象)(),...]
            ax.text(0.5, 0.5, "ax%d" % (i+1))

#3D 绘制立体图

曲面图: 442页

to_csv 数据下载

DataFrame_2.to_csv (‘Desktop\DataFrame_3.csv’)

空值标识

DataFrame_2.to_csv(‘Desktop\DataFrame_4.csv’,na_rep=‘Cat’)
!type Desktop\DataFrame_4.csv

    注:
    1.Read_csv可以读取文件,url,文件型对象,但被加载文件必须有分割符,默认的分割符为逗号。
    2.Read_table可以读取文件,url,文件型对象,但被加载文件必须有分割符,默认的分割符为制表符‘\t’。这一点与read_csv不同,烦请再加载有逗号的数据时用seq属性注明,也即seq=‘,’!
    3.Read_fwf读取(或称加载)没有分隔符数据,但是各数据之间间距要恒定。
    4.Read_clipboard 通常用来读取网络数据,在使用前,必须把网页内容先复制到粘贴板上,例如:

pd.read_clipboard(sep=’\s+’) 读取内存里的数据显示出来

    Out[73]: 
    北      京  220956  209468   11488  697.02  264.30  253555   44087  701.42
    0    天      津   93162   90080    3082  330.68  126.98  106063   15983  340.10
    1    河      北  209740  200012    9728  963.39  327.27  262396   62384  982.31
    2    山      西  131802  114466   17336  628.55  192.27  214625  100159  669.39
    3  内蒙古  71196   65627    5569  306.82  110.15  101829   36202  308.10     
    4                                                                    NaN
    5    辽      宁  211502  199611   11891  838.09  305.58  268741   69130  846.25

    上面函数常用关键字列表

    filepath_or_buffer: 	文件系统位置,url,文件型对象的字符串
    delimiter或sep	源文件各数据间分隔符或正则表达式
    header	上载数据成数据框时,数据框的列名,默认为上载数据的第一行。即‘0’行。如果不需要列标签,那么使header=None
    index_col	就是给行层次化索引命名,行层次索引一般有两列,内列和外列。
    skiprows	需要忽略的行数,跳过无用行
    na_values	实质就是把源数据中的指定字符串转化为空值。
    converters	由列名或者说列号或者说列标签和函数组成字典,例如{‘A’:f}说明f函数应用到’A’列中的每一个数据。
    nrows	需要读取的数据行数
    skip_footer	需要忽略的行数,注意从源数据最后一行向上数
    encoding	用于指明unicode文本文件的文本编码格式
    Squeeze	如果数据仅有一列,自动返回seri es
    thousands	千分位分隔符,如’.’或’,’

import math 通过landba 函数 计算

    converters_1={i: lambda x:float(x)**3+math.sin((np.pi/6)*float(x)) for i in range(3)}
    计算
    pd.read_csv('Desktop\dong123.csv',delimiter=',',usecols=['A','B','C'],converters=converters_1)

pandas 替换

    df.ix[df['sex']=='f','sex']=0
    df.ix[df['sex']=='m','sex']=1

    设置索引列

            df_inner.set_index('id')
    
    按照特定列的值排序:  df_inner.sort_values(by=['age'])

    按照索引列排序:df_inner.sort_index()

    如果prince列的值>3000,group列显示high,否则显示low:

            f_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')

    对复合多个条件的数据进行分组标记

            df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1

    对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size
            pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size']))

    五、数据提取 
    
            主要用到的三个函数:loc,iloc和ix,loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取。 
            1、按索引提取单行的数值

            df_inner.loc[3]
            1
            2、按索引提取区域行数值

            df_inner.iloc[0:5]
            1
            3、重设索引

            df_inner.reset_index()
            1
            4、设置日期为索引

            df_inner=df_inner.set_index('date') 
            1
            5、提取4日之前的所有数据

            df_inner[:'2013-01-04']
            1
            6、使用iloc按位置区域提取数据

            df_inner.iloc[:3,:2] #冒号前后的数字不再是索引的标签名称,而是数据所在的位置,从0开始,前三行,前两列。
            1
            7、适应iloc按位置单独提起数据

            df_inner.iloc[[0,2,5],[4,5]] #提取第0、2、5行,4、5列
            1
            8、使用ix按索引标签和位置混合提取数据

            df_inner.ix[:'2013-01-03',:4] #2013-01-03号之前,前四列数据
            1
            9、判断city列的值是否为北京

            df_inner['city'].isin(['beijing'])
            1
            10、判断city列里是否包含beijing和shanghai,然后将符合条件的数据提取出来

            df_inner.loc[df_inner['city'].isin(['beijing','shanghai'])] 
            1
            11、提取前三个字符,并生成数据表

            pd.DataFrame(category.str[:3])
            1
            六、数据筛选 
            使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。 
            1、使用“与”进行筛选

            df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']]
            1
            2、使用“或”进行筛选

            df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']].sort(['age']) 
            1
            3、使用“非”条件进行筛选

            df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']) 
            1
            4、对筛选后的数据按city列进行计数

            df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count()
            1
            5、使用query函数进行筛选

            df_inner.query('city == ["beijing", "shanghai"]')
            1
            6、对筛选后的结果按prince进行求和

            df_inner.query('city == ["beijing", "shanghai"]').price.sum()
            1
            七、数据汇总 
            主要函数是groupby和pivote_table 
            1、对所有的列进行计数汇总

            df_inner.groupby('city').count()
            1
            2、按城市对id字段进行计数

            df_inner.groupby('city')['id'].count()
            1
            3、对两个字段进行汇总计数

            df_inner.groupby(['city','size'])['id'].count()
            1
            4、对city字段进行汇总,并分别计算prince的合计和均值

            df_inner.groupby('city')['price'].agg([len,np.sum, np.mean]) 
            1
            八、数据统计 
            数据采样,计算标准差,协方差和相关系数 
            1、简单的数据采样

            df_inner.sample(n=3) 
            1
            2、手动设置采样权重

            weights = [0, 0, 0, 0, 0.5, 0.5]
            df_inner.sample(n=2, weights=weights) 
            1
            2
            3、采样后不放回

            df_inner.sample(n=6, replace=False) 
            1
            4、采样后放回

            df_inner.sample(n=6, replace=True)
            1
            5、 数据表描述性统计

            df_inner.describe().round(2).T #round函数设置显示小数位,T表示转置
            1
            6、计算列的标准差

            df_inner['price'].std()
            1
            7、计算两个字段间的协方差

            df_inner['price'].cov(df_inner['m-point']) 
            1
            8、数据表中所有字段间的协方差

            df_inner.cov()
            1
            9、两个字段的相关性分析

            df_inner['price'].corr(df_inner['m-point']) #相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关
            1
            10、数据表的相关性分析

            df_inner.corr()

pd.set_option(“display.max_row”,2000) 显示2000行

pandas 给指定索引的 某列赋值 :

    data_S.loc[data_S.index==索引,改变值的列] =  赋值 
    data_S.loc[data_S.index==n,"Case Id"] = list_all[m]

删除重复的行:

    data_xls = data_xls.drop_duplicates(subset=['Start Time', 'End Time', 'Duration'],keep='first')

pandas 两表合并 :
按字段合并:
datafame = marge(表1,表2,on=[列名1,列名2],how=以那边表为坐标)
pandas 多表合并、
res = pd.concat([df1,df2,df3],axis=0,ignore_index=True)
参数axis=0表示上下合并,1表示左右合并,ignore_index=True表示忽略原来的索引

需求:pandas groupby 分组之后取 每个数据的值,写到不同的sheet中:

    data = pd.read_excel(excel_path)
    writer = pd.ExceWriter(res_file)
    groupby_df = data.groupby([列])
    for i in groupby_by:
            i[1].to_excel(writer,index=false,sheet_name=i[0])
    writer.save()

需求 保持原表sheet2不变,替换sheet1中的数据

    import pandas as pd
    import openpyxl
    import xlwings as xw
    # 首先这excel 中删除sheet1
    File = "路径:"
    wb = openpyxl.load_woekbook(File)
    ws = wb["sheet1"]
    wb.remove(ws)
    wb.save(File)
    # 创建dataframe数据
    data = pd.DataFrame({"id":[1,2,3,4,5]})
    #写入数据
    book = openpyxl.load_workbook(File)
    writer = pd.ExceWriter(File,engine="openpyxl") # 参数代表报留原有数据格式
    # 测试writer 里还只是读写器,然后将上面读取的book复制给writer
    writer.book = book
    writer.sheets = dict((ws.title,ws) for ws in book.worksheets)
    data.to_excel(writer,sheet_name="sheet1",index=False)
    writer.save()

xlrd 读取 使用

    读取 xlsx 信息
    book = xlrd.open_workbook(r'C:\Users\Administrator\Desktop\example.xlsx')
    # 读取sheet
    table = book.sheet_by_index(0)
    rec_data_list = []
    # print(table.nrows,"----",'\n')   #获取该sheet中的有效行数
    # print(table.row(1),"----",'\n')   #返回由该行中所有的单元格对象组成的列表
    for i in range(table.nrows):
            print(table.row_values(i),"----",'\n')
            # 读取每一行的values 详情信息 ['Food', '2013-01-16', 300.0, '']  列表形式
            rec_data = [{'仪表': table.row_values(i)[0], '测项': table.row_values(i)[1] }]
            rec_data_list.append(rec_data)

xlsxwriter 写入

    # 创建 xlsx 文件
    workbook = xlsxwriter.Workbook(r'C:\Users\Administrator\Desktop\example1.xlsx')
    # 字体 
    bold_format = workbook.add_format({'bold': True})
    # sheel 命名
    worksheet_nsiot = workbook.add_worksheet("haha")
    # 命名列名
    worksheet_nsiot.write('A1', '仪表', bold_format)
    worksheet_nsiot.write('B1', '测项', bold_format)
    worksheet_nsiot.write('C1', '芯片', bold_format)
    worksheet_nsiot.write('D1', 'Case Id', bold_format)
    # 写入行列
    row = 1
    col = 0
    for rec_data in rec_data_list:
            item = rec_data[0]
            # 重写入第1行,第0列开始,因为第0行是列名
            worksheet_nsiot.write_string(row, col, item['仪表']) 
            worksheet_nsiot.write_string(row, col + 1, str(item['测项']))
            worksheet_nsiot.write_string(row, col + 2, str(item['芯片']))
            worksheet_nsiot.write_string(row, col + 3, str(item['Case Id']))

显示第几行第几列的数据

print(table.cell_value(1,1))
# 设置第一行类名的格式 和 背景颜色
bold_format = workbook.add_format({
‘bold’: True,
‘border’: 1,
‘fg_color’: ‘#B8B8B8’,
})

pandas 存入mysql

df.to_sql(name='wx1',con='mysql+mysqlconnector://root:123456@localhost:3306/wechat?charset=utf8',if_exists='replace',index=False)

pandas 分组统计 归类

1.格式变化 : reset_index()

    data = pd.DataFrame({'id': [1, 1, 2, 2], 'time': [1, 1, 22, 222],'品牌': ['A', 'B', 'C', 'D']})

    # 合并数据
    data_new = data.groupby(['id','time'])['品牌'].apply(list).to_frame()
    id time        
	1  1     [A, B]
	2  22       [C]
	   222      [D]
    data_new['品牌'] = data_new['品牌'].apply(lambda x: str(x).replace('[', '').replace(']', ''))
    print(data.groupby(['id','time'])['品牌'].apply(list).reset_index())
      id  time      品牌
	0   1     1  [A, B]
	1   2    22     [C]
	2   2   222     [D]


print(data.groupby(['id','time'])['品牌'].apply(list).reset_index())

data = pd.DataFrame({'id': ['t1', 't2'],'time': [1, 2 ],'品牌': ['A,B', 'C,D,E']})
   id  time     品牌
0  t1     1    A,B
1  t2     2  C,D,E
 a = data.drop('品牌', axis=1).join(data['品牌'].str.split(',', expand=True).stack().reset_index(level=1, drop=True).rename('品牌'))
   print(a)
  id  time 品牌
0  t1     1  A
0  t1     1  B
1  t2     2  C
1  t2     2  D
1  t2     2  E
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值