1、数据分析的含义与目标
统计分析的方法
提取有用的信息
研究、概括、总结
2、Python与数据分析
特点:简洁、开发效率、运算速度慢、胶水特性(解决运算速度的问题,可以把c语言引入进来)
3、python数据分析的大家族
numpy : 数据结构的基础
关键词:开源、数据计算扩展
功能:ndarray、多维操作、线性代数
官网:numpy官网
scipy:强大的科学计算方法(矩阵分析、信号分析、数理分析…)
matplotlib:丰富的可视化套件
pandas:基础数据分析的套件
scikit-learn:强大的数据分析建模库
keras:人工神经网络
科学计算工具:Anaconda
#encode utf-8
import numpy as np
#如果运行的是主函数的话,执行下一句main()
#如果作为模块被其他文件导入使用的话,我们就不执行后面的main()什么的。
def main():
lst=[[1,2,9],[2,6,2]]
print(type(lst))
nplst=np.array(lst) #nparray只能有一种数据类型
print(type(nplst))
nplst=np.array(lst,dtype=np.float64)
print(nplst.shape) #形状
print(nplst.ndim) #二维
print(nplst.dtype) #数据类型
print(nplst.itemsize)#每个元素所占字节,64位占8个字节
print(nplst.size) #共多少个元素
if __name__=='__main__':
main()
import matplotlib
import numpy as np
#some Arrays
print(np.zeros([2,4])) #1、输出零矩阵
print(np.zeros([3,5]))
print("Rand:")
print(np.random.rand(2,4))#2、输出随机矩阵,其中各元素在0-1之间
print(np.random.rand())#输出0-1之间的数
print("RandInt:")
print(np.random.randint(3,8,9))#3、输出3-8之间的9个整数
print("Randn:")
print(np.random.randn(2,4))#4、标准正态的随机数
print("choice:")
print(np.random.choice([1,6,33,8,9]))#5、生成1,6,33,8,9中的随机数
print("Distribute:")
print(np.random.beta(1,10,100))#6、生成贝塔分布、当然像均匀分布、二项分布这样子的分布也可以用随机函数表示出来
1、对 axis的解释
原数组
(1)axis=0
(2)axis=1
(3)axis=2
#对原生list进行操作
lst=np.array([[[1,2,3,4],[4,5,6,7]],[[7,8,9,10],[10,11,12,13]],[[14,15,16,17],[18,19,20,21]]])#将该级别括号的元素相加
#print(lst.shape)
print(lst)
#print(lst.sum())
#print(lst.sum(axis=2,keepdims=True))
print(lst.sum(axis=2,keepdims=True))
总结:
(1)保持括号不变,将元素相加
(2)找到进入的括号
(3)将括号内元素相加
2、对数组操作的代码
(1)对一维列表操作
(2)对二维列表进行操作
(3)对两个列表的操作
import matplotlib
import numpy as np
# # 对列表本身操作
# print(np.arange(1,11))#输出1到10的数组
# print(np.arange(1,11).reshape([2,5]))#将数组变成2×5维
# print(np.arange(1,11).reshape([2,-1]))#将数组变成2×5维,5可以缺省成为-1
# #原生list是不可以直接加操作的
# lst=np.arange(1,11).reshape([2,-1])
# print("Exp")
# print(np.exp(lst))#指数形式
# print("Exp2")
# print(np.exp2(lst))
# print("sqrt")
# print(np.sqrt(lst))
# print("sin")
# print(np.sin(lst))
# print("log")
# print(np.log(lst))
lst=np.array([[[1,2,3,4],[1,2,3,5]],[[7,8,9,10],[10,11,12,13]],[[14,15,16,17],[18,19,20,21]]])#将该级别括号的元素相加
#print(lst.shape)
#print(lst)
#print(lst.sum())
#print(lst.sum(axis=2,keepdims=True))
print(lst.sum(axis=2,keepdims=True))
print(lst.max(axis=2))
print(lst.min(axis=2))
#对多个列表进行操作
lst1=np.array([10,20,30,40])
lst2=np.array([4,3,2,1])
print("Add")
print(lst1+lst2)
print("Sub")
print(lst1-lst2)
print("Mu1")
print(lst1*lst2)
print("div")
print(lst1/lst2)
print("square")
print(lst1**2)
print("dot")#点乘,矩阵乘法
print(np.dot(lst1.reshape([2,2]),lst2.reshape([2,2])))
print("Cancatenate")
print(np.concatenate((lst1,lst2),axis=0))#对列表进行叠加
print(np.vstack((lst1,lst2)))#组装成二维数组
print(np.hstack((lst1,lst2)))#对列表进行叠加
print(np.split(lst1,4))#分开
print(np.copy(lst1))#复制
补充
import numpy as np导入的是numpy包。通过np.linalg.xxx()来使用linalg的函数。
import numpy.linalg导入的是numpy中的linalg包。通过numpy.linalg.xxx()来使用linalg的函数。
from numpy.linalg import *是导入numpy.linalg下的所有函数。通过xxx()来使用linalg的函数。
import matplotlib
import numpy as np
from numpy.linalg import *
print(np.eye(3))#单位矩阵
lst=np.array([[1.,2.],[3.,4.]])
print("Inv:")
print(inv(lst))#求逆
print("T:")
print(lst.transpose())
print("det")#求行列式
print(det(lst))
print("Eig")
print(eig(lst))#求特征值和特征向量
y=np.array([[5.],[7.]]) #列向量
print("solve")#求解方程
print(solve(lst,y))
#5 Others
print("FFT:")
print(np.fft.fft(np.array([1,1,2,3])))
print("coef:")
print(np.corrcoef([1,0,1],[0,2,1]))
print("Poly:")#输出多项式
print(np.poly1d([2,1,3]))
#encoding=utf-8
from cProfile import label
import numpy as np
def main():
#line绘图线
import matplotlib.pyplot as plt
x=np.linspace(-np.pi,np.pi,256,endpoint=True)#在-pi到pi之间包含256个点,包含最后一个点
c,s=np.cos(x),np.sin(x)
plt.figure(1)
plt.plot(x,c,color='blue',linewidth=1.0,linestyle="-",label="cos",alpha=0.5)
plt.plot(x,s,label="sin")#标签
plt.title("COS&SIN")
#边框线
ax=plt.gca()
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")
ax.spines["left"].set_position(("data",0))
ax.spines["bottom"].set_position(("data",0))
#坐标轴,#坐标上刻度
ax.xaxis.set_ticks_position("bottom")#刻度在哪边
ax.yaxis.set_ticks_position("left")
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$',r'$-\pi/2$',r'$0$',r'$+\pi/2$',r'$+\pi$'])
plt.yticks(np.linspace(-1,1,5,endpoint=True))
#设置标签格式
for label in ax.get_xticklabels()+ax.get_yticklabels():
label.set_fontsize(20)
label.set_bbox(dict(facecolor="red",edgecolor="blue",alpha=0.2))#设置标签的格式
plt.legend(loc="upper left")#图例
plt.grid()#网格线
#显示范围
# plt.axis([-1,1,-0.5,1])
#进行填充
plt.fill_between(x,np.abs(x)<0.5,c,c>0.4,color="green",alpha=0.25)#x的范围是-0.5-0.5;在范围内,c>0.8则从1开始,c<0.8则从0开始
t=1
#画线
plt.plot([1,1],[0,np.cos(t)],"y",linewidth=3,linestyle="--")
#加上注释
plt.annotate("cos(1)",xy=(t,np.cos(1)),xycoords="data",xytext=(+10,+30),textcoords="offset points",arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=.3"))
plt.show()
if __name__=='__main__':
main()
#encoding=utf-8
from cProfile import label
from matplotlib import projections
import numpy as np
def main():
import matplotlib.pyplot as plt
#1、散点图
fig=plt.figure()
# ax=fig.add_subplot(3,3,1)#将图像画在3行3列的第一个位置上面
# n=128
# x=np.random.normal(0,1,n)#生成随机数
# y=np.random.normal(0,1,n)
# t=np.arctan2(y,x)#上色
# # plt.axes([0.025,0.025,0.95,0.95])#散点范围
# ax.scatter(x,y,s=5,c=t,alpha=.5)#散点的大小,c为颜色
# plt.xlim(-1.5,1.5),plt.xticks([])#x的氛围
# plt.ylim(-1.5,1.5),plt.yticks([])
# plt.axis()
# plt.title("scatter")
# plt.xlabel("x")
# plt.ylabel("y")
# plt.show()
#2、柱状图
# fig.add_subplot(332)
# n=12
# x=np.arange(n)
# y1=(1-x/float(n)*np.random.uniform(0.5,1.0,n))
# y2=(1-x/float(n)*np.random.uniform(0.5,1.0,n))
# plt.bar(x,+y1,facecolor="red",edgecolor="white")#向上的柱状图
# plt.bar(x,-y2,facecolor="pink",edgecolor="white")#向下的柱状图
# for x,y1,y2 in zip(x,y1,y2):
# #ha:对齐方式、va:垂直
# plt.text(x+0.4,y1+0.04,'%.2f'%y1,ha='center',va='bottom')#0.4是移动的数字
# #ha:对齐方式、va:垂直
# plt.text(x+0.4,-y2-0.04,'%.2f'%y2,ha='center',va='bottom')#0.4是移动的数字
# plt.xlim(-.5,n)
# plt.xticks(())
# plt.ylim(-1.25,1.25)
# plt.yticks(())
#3、饼图
# labels='A','B','C','D'
# fracs=[15,30,45,10]
# explode=[0,0.1,0,0]#每一块远离中心点的距离
# plt.axes(aspect=1)#让比例变成1:17
# plt.pie(x=fracs,labels=labels,autopct='%.0f%%',explode=explode,shadow=True)#所占比例、标签、在饼状图上面显示所占比例
# plt.show()
#4、极坐标
# # r=np.arange(1,6,1)
# #生成一个四边形
# # r=np.empty(5)
# # r.fill(5)#生成元素为5的数组
# #生成一个八边形(注意边和角度要一一对应)
# r=np.empty(9)
# r.fill(5)#生成元素为5的数组
# # theta=[0,np.pi/2,np.pi,3*np.pi/2,2*np.pi]
# theta=[0,2*np.pi/8,2*2*np.pi/8,2*3*np.pi/8,2*4*np.pi/8,2*5*np.pi/8,2*6*np.pi/8,2*7*np.pi/8,2*8*np.pi/8]
# ax=plt.subplot(111,projection="polar")#添加子图
# ax.plot(theta,r,color='r',linewidth=3)#画图
# ax.grid(True)
# plt.show()
#5、热图
# from matplotlib import cm#上色用的
# data=np.random.rand(9,3)#生成3✖3的随机数
# cmap=cm.Blues#引入颜色
# map=plt.imshow(data,interpolation='nearest',cmap=cmap,aspect='auto',vmin=0,vmax=1)
# plt.show()
#6、3D图
# from mpl_toolkits.mplot3d import Axes3D#引入三维坐标系
# ax=fig.add_subplot(111,projection="3d")
# ax.scatter(1,1,3,s=100)
# plt.show()
#7、热力图
def f(x,y):
return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
n=256
x=np.linspace(-3,3,n)
y=np.linspace(-3,3,n)
X,Y=np.meshgrid(x,y)
plt.contourf(X,Y,f(X,Y),8,alpha=.75,cmap=plt.cm.hot)
plt.show()
if __name__=='__main__':
main()
数值计算库
官网scipy的官网
import numpy as np
def main():
#--integral
from scipy.integrate import quad,dblquad
#先定义被积分的函数
def myfunction(x,n,k):
return k*x**n
print(quad(myfunction,0,2,args=(2,3)))#将2,3传入到被积分的函数中,输出的是3x的平方从0到1的积分
if __name__=='__main__':
main()
(2)二重积分
#1、二重积分
#encoding=utf-8
import numpy as np
def main():
#--integral
from scipy.integrate import quad,dblquad
#先定义被积分的函数
def f(x,y):
return 4-x-y
v,err=dblquad(f,0,2,0,1)
print(v)
if __name__=='__main__':
main()
找到函数的局部或者全局最小以及求方程解的问题都属于优化问题
optimize模块中包含:
(1)leastsq拟合方法
(2)函数最小值方法
(3)解方程及方程组的方法fsolve
#5、拟合直线
#encoding=UTF-8
import scipy as sp
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
#完全随机设计实验
#两个样本均来自正态样本
#两个样本的方差相等
#H0:U1=U2;H1:U1!=U2
def main():
##样本数据(x,y),需要转换成数组(列表)形式
xi=np.array([160,165,158,172,159,176,160,162,171])
yi=np.array([58,63,57,65,62,66,58,59,62])
##需要拟合的函数:指定函数的形状k=0.42116973935 b=-8.28830260655
def func(p,x):
k,b=p
return k*x+b
##偏差函数:x,y都是列表:这里的x,y和xi,yi是一一对应的
def error(p,x,y):
return func(p,x)-y
#k,b的初始值,可以任意设定,经过几次试验,发现p0的值会影响cost的值:Para[1]
p0=[1,20]
#把error函数中除了p0以外的参数打包到args中(使用需要)
Para=leastsq(error,p0,args=(xi,yi))
#读取结果
k,b=Para[0]
print("k=",k,"b=",b)
# #画样本点
# plt.figure(figsize=(8,6))#指定图像比例:8:6
# plt.scatter(xi,yi,color='green',label="样本数据",linewidth=2)
matplotlib.rcParams['font.sans-serif']=['SimHei']#解决中文乱码
#画拟合直线
x=np.linspace(150,190,100)##在150-190直接画100个连续点#linspace主要是建立等差数列
y=k*x+b##函数式
plt.plot(x,y,color='red',label="拟合直线",linewidth=2)
plt.legend()#绘制图例
plt.show()
if __name__=='__main__':
main()
注意插值和拟合的区别:插值要使得所有的点都在线上,拟合是使得点离直线的距离之和最小
def main():
import numpy
import matplotlib.pyplot as plt
from scipy import interpolate
x=numpy.arange(0,10)
print(x)
y=numpy.exp(-x/3.0)
f=interpolate.interp1d(x,y)
xnew=numpy.arange(0,9,0.1)
ynew=f(xnew)#使用的插值的函数
plt.plot(x,y,'o',xnew,ynew,'*')
plt.show()
if __name__=='__main__':
main()
# #3、统计趋势的描述
# #encoding=utf-8
# import numpy as np
# def main():
# import numpy as np
# import scipy.stats
# #抗体滴度为1:10,1:20,1:40,1:80,1:160,1:320,1:640,1:1280
# #分别对应人数f为:4,3,10,10,11,15,14,2
# Didu=np.array([10,20,40,80,160,320,640,1280])
# Repeat_f=np.array([4,3,10,10,11,15,14,2])
# Data=Didu.repeat(Repeat_f)
# print(Data)
# print(Data.mean())#平均数
# print(scipy.stats.gmean(Data))#几何平均数
# print(scipy.stats.iqr(Data))#四分位数间距
# print(scipy.stats.variation(Data))#变异系数
# print(scipy.stats.skew(Data))#偏度
# print(scipy.stats.kurtosis(Data))#峰度
# if __name__=='__main__':
# main()
# #4、参数估计
# #encoding=UTF-8
# import scipy.stats
# #若某市某年18岁男生身高服从
# #g:总共100个、每次10个、均值:167.7、置信度:1-0.05
# #总体方差未知,小样本、服从t分布
# def main():
# #encoding=UTF-8
# g,n,u,s,a=100,10,167.7,5.3,0.05
# records=[]
# for i in range(g):#进行100次,每次10个数据
# #每次样本的均值和标准差
# data=scipy.stats.norm.rvs(loc=167.7,scale=5.3,size=n)
# # print(data)
# mean,xsem=data.mean(),scipy.stats.sem(data)
# # print(mean,xsem)
# #1-a置信区间CI为
# records.append([mean-scipy.stats.t.isf(a/2,n-1)*xsem,mean+scipy.stats.t.isf(a/2,n-1)*xsem])#在相应的数组后加上相应的元素
# #置信区间包含住总体均值的概率
# count=0
# for i in range(g):
# if records[i][0]
#4、参数检验
#encoding=UTF-8
import scipy.stats
import numpy as np
#完全随机设计实验
#两个样本均来自正态样本
#两个样本的方差相等
#H0:U1=U2;H1:U1!=U2
def main():
#待测两个样本均来自正态样本
data=np.array([[-0.7,-5.6,2,2.8,0.7,3.5,4,5,8,7.1,-0.5,2.5,-1.6,1.7,3,0.4,4.5,4.6,2.5,6,-1.4],[3.7,6.5,5,5.2,0.8,0.2,0.6,3.4,6.6,-1.1,6,3.8,2,1,6,2,2.2,1.2,3.1,1.7,-2]])
data.shape
#equal var 参数表示,两样本总体方差是否相等,默认为True
#方法1:现有两组样本,直接计算
print(scipy.stats.ttest_ind(data[0],data[1]))
if __name__=='__main__':
main()