Scipy基础+进阶

Python科学计算库—Scipy

一、Scipy 入门

1.1、Scipy 简介及安装

官网:http://www.scipy.org/SciPy
安装:在C:\Python27\Scripts下打开cmd执行:
执行:pip install scipy

1.2、安装Anaconda及环境搭建(举例演示)

创建环境:conda create -n env_name python=3.6
示例:   conda create -n Py_36 python=3.6  #创建名为Py_367的环境
列出所有环境:conda info -e
进入环境:   source activate Py_36  (OSX/LINUX系统)
            activate Py_36          (windows系统) 

1.3、jupyter 安装

jupyter简介:jupyter(Jupyter Notebook)是一个交互式笔记本
            支持运行40多种编程语言
            数据清理和转换,数值模拟,统计建模,机器学习等 
jupyter 安装:conda install jupyter notebook
启动 jupyter:激活相应环境
在控制台执行 :jupyter notebook
notebook服务器运行地址:http://localhost:8888   
                新建(notebook,文本文件,文件夹)
关闭notebook:ctrl+c执行两次

1.4、scipy的’hello word’

需求:将一个多维数组保存a.mat文件,后加载该mat文件,获取内容并打印
步骤1:导入scipy需要的模块
    from scipy import io    #(需要使用的模块)
步骤2:利用savemat保存数据
    io.savemat(file_name,mdict)
    io.savemat('a.mat',{''array:a})
步骤3:利用 loadmat载入数据
    io.loadmat(file_name)
    data = io.loadmat('a.mat')
举例:
from scipy import io              #导入io
import numpy as np                #导入numpy并命名为np    
arr = np.array([1,2,3,4,5,6])
io.savemat('test.mat',{'arr1':arr})
loadArr=io.loadmat('test.mat')

二、利用Scipy实现统计功能

需求:用Scipy的scipy.stats中的统计函数分析随机数

stats提供了产生连续性分布的函数
均匀分布(uniform)
x=stats.norm.rvs(size = 20) 生成20个[0,1]均匀分布随机数
-正态分布(norm)
x=stats.norm.rvs(size = 20) 生成20个正态分布随机数
-贝塔分布(beta)
x=stats.beta.rvs(size=20,a=3,b=4)生成20个服从参数a=3,b=4贝塔分布随机数
-离散分布
-伯努利分布(Bernoulli)
-几何分布(geom)
-泊松分布(poisson)
x=stats.poisson.rvs(0.6,loc=0,size = 20)生成20个服从泊松分布随机数

三、计算随机数均值和标准差

stats.norm.fit :利用正态分布去拟合生成的数据,得到其均值和标准差

四、计算随机数的偏度

1.概念:
偏度(skewness)描述的是概率分布的偏度(非对称)程度。
有两个返回值,第二个为p-value,即数据集服从正态分布的概率(0~1)

2 利用 stats.skewtest()计算偏度

五、计算随机数的峰度

1 概念:峰度(kurtosis)-描述的是概率分布曲线陡峭程度
2 利用 stats.kurtosis() 计算峰度
3 正态分布峰度值为3excess_k0
低阔峰(platykurtic) 相对于正态分布来说更扁平 excess_k<0
高狭峰(leptokurtic) 相对于正态分布来说更陡峭 excess_k>0

示例:(../Scipy/Test01/test1)
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

arr = stats.norm.rvs(size=900)
(mean,std) = stats.norm.fit(arr)
print('平均值',mean)       #mean平均值
print('std标准差',std)     #std标准差
(skewness,pvalue1) = stats.skewtest(arr)
print('偏度值')    
print(skewness)
print('符合正态分布数据的概率为')
print(pvalue1)
(Kurtosistest,pvalue2) = stats.kurtosistest(arr)
print('Kurtosistest',Kurtosistest)    #峰度
print('pvalue2',pvalue2)
(Normltest,pvalue3) = stats.normaltest(arr)
print('Normltest',Normltest)          #服从正太分布度
print('pvalue3',pvalue3)
num = stats.scoreatpercentile(arr,95) #某一百分比处的数值
print('在95%处的数值:')                #某一百分比处的数值
print num
indexPercent = stats.percentileofscore(arr,1) #某一数值处的百分比
print ('在数值1处的百分比:')                   #某一数值处的百分比
print indexPercent
plt.hist(arr)   #设置直方图
plt.show()      #显示图

六、正态分布程度检验

1 正态性检验(normality test),同样返回两个值,第二个返回p-values
2 利用 stats.normaltest()来检验
一般情况 pvalue>0.05表示服从正态分布

七、计算数据所在区域中某一百分比处的数值

1 利用scoreatpercentile 计算在某一百分比位置的数值
格式:scoreatpercentile (数据集、百分比)
stats.scoreatpercentile(name_arr,percent)
2 示例:求出95%所在位置的数值
num = stats.scoreatpercentile(arr,95)
print num

八、从某数值出发找到对应的百分比

1 利用percentileofscore 计算在某数值对应的百分比
格式:percentileofscore(数据集,数值)
2示例:indexPercent = stats.percentileofscore(arr,1)

九、直方图显示

import matplotlib.pyplot as plt
在Anaconda环境下(py36)C:\Users\lenovo>导入:conda install matplotlib
plt.hist(arr) #设置直方图
plt.show() #显示图

九、综合练习

1 求出考试分数的以下值:
均值          中位数       众数        极差          方差  
标准差        变异系数(均值/方差)       偏度          峰度
2 步骤1: 创建两个二维数组:[分数,出现次数]
def createScore():
    arrEasy = np.array([
    [0,20],[2.5,24],[5,16],[7.5,19],[10,23],[12.5,26],
    [15,29],[17.5,23],[20,27],[22.5,31],[27.5,40],[30,53],
    [32.5,66],[35,90],[37.5,110],[40,160],[42.5,138],[45,175],
    [47.5,182],[50,195],[52.5,118],[55,217],[57.5,226],[60,334],
    [62.5,342],[65,359],[67.5,510],[70,521],[72.5,300],[75,210],
    [75.5,90],[80,20]
    ])
    return score
def createScore():  
    arrDiff = np.array([
    [0,2],[2.5,4],[5,6],[7.5,9],[10,13],[12.5,16],[15,19],
    [17.5,23],[20,27],[40,130],[42.5,148],[45,165],[47.5,182],
    [50,195],[52.5,108],[55,217],[57.5,226],[60,334],
    [62.5,342],[65,349],[67.5,500],[70,511],[72.5,300],
    [75,200],[75.5,80],[80,20]
    ])
    return score
步骤2:创建函数,将传入的多维数组扁平化->变成一维数组
def createScore(arr):
    score = []          #所有学员分数
    row = arr.shape[0]
    for i in np.arange(0,row):
        for j in np.arange(0,int(arr[i][1])):
        score.append(arr[i][1]))
    score = np.array(score)
    return score
步骤3:创建函数,根据传入数组,对其进行统计
def calStatValue(score):
    #集中趋势度量
    print('均值')
    print(np.mean(score))
    print('中位数')
    print(np.median(score))
    print('众数')
    print(stats.mode(score))
    #离散趋势度量
    print('极差')
    print(np.ptp(score))
    print('方差')
    print(np.var(score))
    print('标准差')
    print(np.std(score))
    print('变异系数')
    print(np.mean(score)/np.std(score))
    #偏度与峰度的度量
    print('偏度')
    print(stats.skewness(score))
    print('峰度')
    print(stats.Kurtosis(score))
步骤4:创建函数,做一个简单的箱线图/柱形图
def drawGraghic(score)
    plt.boxplot([score],labels['score'])    #箱线图
    plt.title('箱线图')
    plt.show()
    plt.hist(score,100)
    plt.show()

步骤5:
步骤6:

案例完整代码:
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
def createScore(arr):
    score = []                  #所有学员分数
    row = arr.shape[0]          #获取多少组元素
    for i in np.arange(0,row):  #遍历所有元素组
        for j in np.arange(0,int(arr[i][1])):#从0开始填充次数,第i行第1列
            score.append(arr[i][0]))
    score = np.array(score)
    return score
def createOneScore():
    arrOne = np.array([
        [0,20],[2.5,24],[5,16],[7.5,19],[10,23],
        [12.5,26],[15,29],[17.5,23],[20,27],
        [35,90],[37.5,110],[40,160],
        [42.5,138],[45,175],[47.5,182],[50,195],
        [52.5,118],[55,217],[57.5,226],[60,334],
        [72.5,300],[75,210],[75.5,90],[80,20]
        ])
    return createScore(arrOne)
def createTwoScore():       
    arrTwo = np.array([
        [0,2],[2.5,4],[5,6],[7.5,9],[10,13],
        [12.5,16],[15,19],[17.5,23],[20,27],
        [35,90],[37.5,110],[40,130],
        [42.5,148],[45,165],[47.5,182],[50,195],
        [52.5,108],[55,217],[57.5,226],[60,334],
        [72.5,300],[75,200],[75.5,80],[80,20]
        ])
    return createScore(arrTwo)
def calStatValue(score):
    #集中趋势度量
    print('均值')
    print(np.mean(score))
    print('中位数')
    print(np.median(score))
    print('众数')
    print(stats.mode(score))
    #离散趋势度量
    print('极差')
    print(np.ptp(score))
    print('方差')
    print(np.var(score))
    print('标准差')
    print(np.std(score))
    print('变异系数')
    print(np.mean(score)/np.std(score))

    #偏度与峰度的度量
    (skewness,pvalue1) = stats.skewtest(score)  
    print('偏度')
    print(stats.skewness(score))

    (Kurtosistest,pvalue2) = stats.kurtosistest(arr)
    print('峰度')
    print(stats.Kurtosis(score))    
    return

#画图
def drawGraghic(score)
    plt.boxplot([score],labels['score'])    #箱线图
    plt.title('箱线图')
    plt.show()
    plt.hist(score,100)
    plt.show()
    return          

猜你喜欢

转载自blog.csdn.net/wsp_1138886114/article/details/80444621