python DataScience数据分析笔记day07

day07-随机数-超几何分布-标准正态分布-排序-插值-积分-图像处理-金融计算    
        3.随机数(random)
            生成服从特定统计规律的随机数序列
                统计规律如:正态、均匀、离散分布规律等等
            1)二项分布
                numpy.random.binomial (n, p, size) -> [size个随机数]
                size:产生随机个数,
                n:尝试次数
                p:成功的概率            
                如猜硬币的游戏:初始筹码1000,每轮猜9次,猜对5次
                    或5次以上为赢,筹码加1,否则为输,筹码减1。
                    求:10000轮的过程中手中筹码的变化。
                        binomial(9, 0.5 10000)
                代码:bi.py
                示例:
                    import numpy as np
                    import matplotlib.pyplot as mp
                    outcomes = np.random.binomial(9,0.5,10000)
                    chips = [1000]
                    for outcome in outcomes:
                            if outcome >= 5:
                                    chips.append(chips[-1]+1)
                            else:
                                    chips.append(chips[-1]-1)
                    chips = np.array(chips)
                    o,h,l,c = 0,chips.argmax(),chips.argmin(),chips.size-1
                    if chips[o] < chips[c]: #赚
                            color = 'orangered'
                    elif chips[c] < chips[o]: #赔
                            color = 'limegreen'
                    else:
                            color = 'dodgerblue'
                    mp.figure('bi',facecolor='lightgray')
                    mp.title('bi',fontsize=20)
                    mp.xlabel('Round',fontsize=14)
                    mp.ylabel('chip',fontsize=14)
                    mp.tick_params(labelsize=10)
                    mp.grid(linestyle=':')
                    mp.plot(chips,c=color,label='bi')
                    mp.axhline(y=chips[o],linestyle = '--',linewidth = 1,color = 'deepskyblue')
                    mp.axhline(y=chips[h],linestyle = '--',linewidth = 1,color = 'crimson')
                    mp.axhline(y=chips[l],linestyle = '--',linewidth = 1,color = 'seagreen')
                    mp.axhline(y=chips[c],linestyle = '--',linewidth = 1,color = 'orange')
                    mp.legend()
                    mp.tight_layout()
                    mp.show()
            2)超几何分布
                numpy.random.hypergeometric(ngood, nbad,
                    nsample, size)
                    size:产生的随机次数
                    nsample:随机抽取好样本的个数
                    nbad:总样本中坏样本的个数
                    ngood:总样本中好样本的个数
                    产生size个随机数,
                    每个随机数来自随机抽取的nsample个样本中好样本个数,
                    总体样本有ngood个好样本和nbad个坏样本组成。
                模球游戏:
                    25个好球和1个坏球放在一起,
                    每次摸3个球,全为好球加1分,摸到坏球减6分
                    求100轮过程中分值的变化
                    np.random.hypergeometric(25,1,3,100)
                示例:
                    import numpy as np
                    import matplotlib.pyplot as mp
                    outcomes = np.random.hypergeometric(25,1,3,100)
                    #print(outcomes)
                    scores = [0]
                    for outcome in outcomes:
                            if outcome == 3:
                                    scores.append(scores[-1]+1)
                            else:
                                    scores.append(scores[-1]-6)
                    scores = np.array(scores)
                    #print(scores)
                    o,h,l,c = 0,scores.argmax(),scores.argmin(),scores.size-1
                    if scores[o] < scores[c]: #赚
                            color = 'orangered'
                    elif scores[c] < scores[o]: #赔
                            color = 'limegreen'
                    else:
                            color = 'dodgerblue'
                    mp.figure('hypergeometric',facecolor='lightgray')
                    mp.title('bi',fontsize=20)
                    mp.xlabel('Round',fontsize=14)
                    mp.ylabel('scores',fontsize=14)
                    mp.tick_params(labelsize=10)
                    mp.grid(linestyle=':')
                    mp.plot(scores,c=color,label='scores')
                    mp.axhline(y=scores[o],linestyle = '--',linewidth = 1,color = 'deepskyblue')
                    mp.axhline(y=scores[h],linestyle = '--',linewidth = 1,color = 'crimson')
                    mp.axhline(y=scores[l],linestyle = '--',linewidth = 1,color = 'seagreen')
                    mp.axhline(y=scores[c],linestyle = '--',linewidth = 1,color = 'orange')
                    mp.legend()
                    mp.tight_layout()
                    mp.show()
            3)标准正态分布
                numpy.random.normal(size)
                产生size个随机数,服从标准正态(平均值0,标准差1)分布。
                    正态分布函数概率密度:        e^((-x^2)/2)/√2π
                    见:正态分布函数.png        
                代码:normal.py 
                示例,正态分布直方图:
                    import numpy as np
                    import matplotlib.pyplot as mp
                    samples = np.random.normal(size=1000)
                    mp.figure('Normal',facecolor='lightgray')
                    mp.title('Normal',fontsize=20)
                    mp.xlabel('Sample',fontsize=14)
                    mp.ylabel('Occ',fontsize=14)#出现的机会
                    mp.tick_params(labelsize=10)
                    mp.grid(axis='y',linestyle=':')
                    #画直方图,将样本分成100份(100个直方条)
                    bins = mp.hist(samples,100,normed=True,edgecolor='steelblue',
                                    facecolor='deepskyblue',label='Normal')[1]
                    #画函数曲线
                    probs = np.exp(-bins**2/2)/np.sqrt(2*np.pi)#概率函数
                    mp.plot(bins,probs,'o-',c='orangered',label='Probability')
                    mp.legend()
                    mp.tight_layout()
                    mp.show()    
    六、numpy的其他函数
        1.排序和查找
            1)联合间接排序:
                numpy.lexsort((参考序列,待排序列)) -->返回有序的索引
                    例如:numpy.lexsort((年龄,成绩))
                                --->获得成绩排名,
                                        之后可根据成绩排名获得对应的姓名
                            首先按成绩排序,相同成绩的,按照年龄排序
                    相当于是:首要排序成绩,次要排序年龄
                返回a数组按升序排列的索引数组,
                对于a数组中值相同的元素参考其在b数组中对应元素的升序排列。
                示例:
                    ages = np.array([30,20,30,20])
                    scores = np.array([70,60,80,70])
                    names = np.array(['zhang','li','wang','zhao'])
                    #先按scores排序,然后按ages排序
                    l=np.lexsort((ages,scores))
                    print(l)
                    name = np.take(names,l)
                    print(name) #输出对应排序的姓名
            2)sort_complex(复数数组)
                按照复数实部的升序排序,
                对于实部相同的元素参考其虚部的升序。
                示例:
                    ages = np.array([30,20,30,20])
                    scores = np.array([70,60,80,70])
                    names = np.array(['zhang','li','wang','zhao'])
                    complexes = scores + ages * 1j#创建复数数组
                    print(np.sort_complex(complexes))#对复数排序
            3)argmax/argmin/max/min: 将nan值视为最大和最小值
            4)nanargmax/nanargmin/nanmax/nanmin: 将nan值直接忽略不计
            5)有序插入:searchsorted / insert
                searchsorted(有序序列,待查序列)
                    将待插序列插入有序序列后,结果依然有序
                    返回分别应该放在哪个位置的数组
                有序插入: insert(被插序列,位置序列,待插序列)
                    将待插序列按照位置序列插入被插序列,并返回
                示例:
                    a = np.array([1,2,4,5,6,8,9])
                    b = np.array([7,3])
                    c = np.searchsorted(a,b) #获得位置数组
                    d = np.insert(a,c,b)#将b按照c的位置插入到a中
                    print(d)
            6)where/掩码/extract/nonzero: 根据条件选择元素
        2.插值
            收集到的有限样本数据,很难形成曲线,
            通过插值方式,插入多个模拟数据,最终形成近似接近的曲线
            import scipy.interpolate as si
            一维插值si.interp1d(离散x坐标,离散y坐标,
                            kind=插值算法(默认为线性插值)) -->返回茶之器
                    插值器(x坐标)-->得出y坐标
            二维插值si.interp2d 
            三维插值si.interp3d 
            示例:
                import numpy as np
                import scipy.interpolate as si
                import matplotlib.pyplot as mp
                min_x,max_x = -2.5,2.5
                con_x = np.linspace(min_x,max_x,1001)
                con_y = np.sinc(con_x)
                #生成有限个离散样本
                dis_x = np.linspace(min_x,max_x,11)
                dis_y = np.sinc(dis_x)
                #通过得到的有限样本数据,通过插值的方式模拟出曲线
                linear = si.interp1d(dis_x,dis_y)#构造线性插值器
                lin_x = np.linspace(min_x,max_x,51) # 比dis_x多了40个,则多余的就需要插值去完成
                lin_y = linear(lin_x)
                cubic = si.interp1d(dis_x,dis_y,kind='cubic')#构造三次样条插值器
                cub_x = np.linspace(min_x,max_x,51)
                cub_y = cubic(cub_x)
                mp.figure('interpolate',facecolor='lightgray')
                mp.subplot(221)
                mp.title('interpolate',fontsize=16)
                mp.xlabel('x',fontsize=12)
                mp.ylabel('y',fontsize=12)
                mp.tick_params(labelsize=10)
                mp.grid(linestyle=':')
                mp.plot(con_x,con_y,c='hotpink',label='Cont')
                mp.subplot(222)
                mp.title('Discrete',fontsize=16)
                mp.tick_params(labelsize=10)
                mp.grid(linestyle=':')
                mp.scatter(dis_x,dis_y,c='orangered',s=60,label='dis')
                mp.subplot(223)
                mp.title('Linear',fontsize=16)
                mp.xlabel('X',fontsize=12)
                mp.ylabel('Y',fontsize=12)
                mp.tick_params(labelsize=10)
                mp.grid(linestyle=':')
                #绘制插值后的曲线
                mp.plot(lin_x,lin_y,'o-',label='linear')
                mp.scatter(dis_x,dis_y,c='orangered',s=60,zorder=3)
                mp.subplot(224)
                mp.title('Cubic',fontsize=16)
                mp.xlabel('X',fontsize=12)
                mp.ylabel('Y',fontsize=12)
                mp.tick_params(labelsize=10)
                mp.grid(linestyle=':')
                #绘制插值后的曲线
                mp.plot(cub_x,cub_y,'o-',label='cubic')
                mp.scatter(dis_x,dis_y,c='orangered',s=60,zorder=3)
                mp.legend()
                mp.tight_layout()
                mp.show()
        3.积分
            import matplotlib.pyplot as mp #用于绘制曲线,散点等
            import matplotlib.patches as mc #用于绘制几何图形,如三角,园等
            import scipy.integrate as si
            si.quad(积分函数,积分下限,积分上限),返回积分值、最大误差
            示例:
                import numpy as np
                import scipy.integrate as si
                import matplotlib.pyplot as mp #用于绘制曲线,散点等
                import matplotlib.patches as mc #用于绘制几何图形,如三角,园等
                def f(x):
                        return 2 * x ** 2 + 3 * x + 4 #一个典型的二次多项式 ,抛物线
                a , b = -5,5
                #按scipy计算积分
                area1 = si.quad(f,a,b)
                print(area1)
                #按照古典方式计算积分
                n = 300
                x2 = np.linspace(a,b,n+1)
                y2 = f(x2)
                area = 0
                for i in range(n):
                        #梯形面积公式:(上底 + 下底)* 高 / 2
                        area += (y2[i] + y2[i+1]) * (x2[i+1]-x2[i]) / 2
                print(area)
                mp.figure('Integral',facecolor='lightgray')
                mp.title('Integral',fontsize=16)
                mp.xlabel('x',fontsize=12)
                mp.ylabel('y',fontsize=12)
                mp.tick_params(labelsize=10)
                mp.grid(linestyle=':')
                #绘制曲线
                x1 = np.linspace(a , b, 1001)
                y1 = f(x1)
                mp.plot(x1,y1,label=r'$y=2x^2+3x+4$')
                #绘制古典积分方法用的多边形
                for i in range(n):
                        mco = mc.Polygon([[x2[i],0],[x2[i],y2[i]],
                                             [x2[i+1],y2[i+1]],[x2[i+1],0]],
                                             fc='deepskyblue',ec='dodgerblue',
                                             alpha=0.5)#绘制多边形,定点坐标数量,由图形顶点数决定
                        mp.gca().add_patch(mco)
                mp.legend()
                mp.tight_layout()
                mp.show()
        4.图像
            import scipy.ndimage as sn #可进行颜色变换
            import scipy.misc as sm 
            #相对scipy,opencv的图像处理更强大
            #pip install opencv-python 
            示例:
                import scipy.misc as sm 
                import scipy.ndimage as sn #可进行颜色变换
                import matplotlib.pyplot as mp
                originalt = sm.imread('./lily.jpg')#读取图片的源格式
                #print(originalt.shape,originalt.dtype) #(512, 512, 3) 表示(高度,宽度,颜色通道) 3,表示红绿蓝
                original = sm.imread('./lily.jpg',True)#读取图片的灰度格式
                #print(original.shape,original.dtype) #(512, 512) float32,没有颜色维了
                median = sn.median_filter(original,(20,20))#中值滤波,实际是二维卷积模糊化,也叫高斯模糊
                #卷积模糊通常用于去除杂质
                rotate = sn.rotate(originalt,45) #旋转45度
                prewitt = sn.prewitt(original)#索贝尔边缘识别,索贝尔微分,浮雕效果,找物体轮廓
                mp.figure('Image',facecolor='lightgray')
                mp.subplot(221)
                mp.title('Original',fontsize=16)
                mp.axis('off')
                mp.imshow(original,cmap='gray')
                mp.subplot(222)
                mp.title('prewitt',fontsize=16)
                mp.axis('off')
                mp.imshow(prewitt)
                mp.subplot(223)
                mp.title('mediane',fontsize=16)
                mp.axis('off')
                mp.imshow(median,cmap='gray')
                mp.subplot(224)
                mp.title('rotate',fontsize=16)
                mp.axis('off')
                mp.imshow(rotate,cmap='gray')
                mp.tight_layout()
                mp.show()
        5.金融计算
            1)终值fv(利率,期数,每期支付,现值)
                如:将1000元存入银行,利率为1%,存5年,每年加存100
                        到期后本息合计多少
                    np.fv(0.01,5,-100,-1000) #资金流出为负,流入为正
                示例:
                    fv = np.fv(0.01,5,-100,-1000)
                    print(round(fv,2)) #输出:1561.11
            2)现值pv(利率,期数,每期支付,终值)
                如:银行利率为1%,存5年,每年加存100
                        到期后能拿到2000元,请问现在应该存多少
                    np.pv(0.01,5,-100,2000) 
                示例:
                    pv = np.pv(0.01,5,-100,2000)
                    print(round(pv,2)) #输出:-1417.59
            3)净现值npv(利率,现金流)
                如:将1000元存入银行,利率为1%,存5年,每年加存100
                        相当于现在一次性存入多少
                    npv(0.01,[-1000,-100,-100,-100,-100,-100])
                示例:
                    npv = np.npv(0.01,[-1000,-100,-100,-100,-100,-100])
                    print(round(npv,2))#输出:-1485.34-
            4)内部收益率IRR(现金流)
                如:将1000元存入银行存5年,以后逐年提取100,200,300,400,
                    500,之后银行利率达到多少,可在最后一次体现尝清本息
                    即净现值为0
                    irr([-1000,100,200,300,400,500])
                示例:
                    irr = np.irr([-1000,100,200,300,400,500])
                    print(round(irr,2))#输出:0.12
            5)每期支付pmt(利率,期数,现值)
                如:以1%的年利率从银行贷款1万,分5年还清,
                    平均每年还多少钱
                    pmt(0.01,5,10000)
                示例:
                    pmt = np.pmt(0.01,5,10000)
                    print(round(pmt,2))#输出:-2060.4
            6)还款期数nper(利率,每期支付,现值)
                如:以1%的年利率从银行贷款1万,平均每年还2060.4
                    多少年还清,
                    nper(0.01,-2060.4,10000)
                示例:
                    nper = np.nper(0.01,-2060.4, 10000)
                    print(nper)#输出:约5
            7)贷款利率rate(期数,每期支付,现值,终值)
                示例:
                    rate = np.rate(5,-2060.4,10000,0)
                    print(rate)#输出:0.01
        6.窗函数
            1)巴特莱特窗:numpy.bartlett
            2)布莱克曼窗:numpy.blackman
            3)哈明窗:numpy.hamming
            4)汉宁窗:numpy.hanning
            5)凯瑟窗:numpy.kaiser

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值