数据分析
数据分析环境搭建
自己搭建开发环境
- 安装python(自定义目录)
- 配置环境变量,python ,pip(Script)
- 数据分析环境 numpy,pandas,jupyter,scipy,sklean,matplotlib等
- 启动jupyter: jupyter notebook 映射到浏览器中
使用Anaconde集成开发环境
- 安装Anaconde(自定义安装目录)
- 配置环境变量,python(Anaconde) ,pip(Script)
- 启动jupyter: jupyter notebook 映射到浏览器中
jupyter使用规则
jupyter中有运行单元,单元写代码,规则和python一致。
后缀
代码文件的后缀名.ipynb (ipython notebook)
运行快捷键
Ctrl+Enter #运行并选中本单元
Alt+Enter #运行并在下面插入单元
Shift+Enter #运行选中下一个单元,没有则插入单元
插入新的单元
a #above 在上面插入
b #boolow 在下面插入
删除
双击D删除
TAB代码提示
输入两个字母后按tab键出现代码提示
代码方法的API
API(Application Programming Interface,应用程序编程接口)
使用Shift+Tab键查看方法的api
jupyter魔法指令
获取代码运行时间
%time #获取当前行代码运行时间(只能控制当前行)
%%time #获取多行代码运行时间(跨行)
%timeit #计算平均运行时间(跨行)
%lsmagic #列出常用的魔法指令(linux指令)
markdown
键盘m将转化成markdown
numpy入门
numpy介绍
numeric(数字化) python,是python的一种开源的数值计算扩展。numpy参考手册
numpy的核心是ndarray对象,n维数组。(Dimension 维度)
导入numpy
import numpy as np #导入numpy库
np.__version__ #查看numpy版本
创建ndarray
list = [1,2,3,4,5,6]
object = np.array(list) #将列表转换为ndarray对象
object_1 = np.array([[1,2,3],[4,5,6]]) #多维
- ndarray对象中封装了常用的方法,运行速度块。
- numpy默认ndarray的所有元素的类型是相同的,如果传进的列表中包含不同类型,则统一为同一类型(str>float>int)
使用np的routines(常规)函数创建
np.ones(shape=(5, 6), dtype=np.int8) #创建一个5行6列的全1数组(二维),数据类型为in8。
np.zeros(shape=(2, 3, 3), dtype=np.float) #创建一个2行3列的全0数组(三维),数据类型为float。
np.eye(N=6) #创建一个6行6列,且形似单位矩阵的数组。 N是大写
np.linspace(0, 100,num=21) #创建值属于[0, 100]且为等差数列,的一维数组共21个元素。
np.arange(1, 100, 5) #创建值属于[0, 100), 且步长为5的一维数组。
np.random.random(50) #创建值属于[0, 1)间随机值,且长度为50的一维数组。
np.random.randint(0, 100, size=(5, 5)) #创建一个值属于[0, 100)间随机数,且形状为5行5列的二维数组。
np.random.randn(4, 5) #正太分布(平均值是0方差是1),且形状为4行5列的二维数组。
np.random.normal(loc=170, scale=10, size=100).round(3) #创建一个均值为170,标准差为10,长度为100的一维数组,且保留小数点后三位。
ndarray对象的属性
ob.ndim #获取ndarray对象的维度
ob.shape #获取ndarray对象的形状
ob.size #获取ndarray对象的总长度
ob.dtype #获取ndarray对象的数据类型
ndarray的基本操作
ndarray的索引
ndarray的索引与python list 索引基本一致
ndarray的切片
ndarray的切片与python list 切片基本一致
变形
使用reshape()函数,注意参数是一个tuple
转置函数transpose()
级联(拼接)(数据的集成)
-
np.concatenate()将多个数据拼到一块
-
级联的参数是列表:一定要加中括号[] 或者小括号()
-
级联对象维度必须相同,形状相符
-
级联的方向默认是shape这个tuple的第一个值做代表的维度方向
-
可以通过使用axis改变级联的方向
水平级联(horizontal stack)
np.hstack((a, b)) #水平方向增多,意味着列数增加,类似axis=1
垂直级联(vertical stack)
np.vstack((a, b)) #竖直方向增多,也就意味着行数增多,类似axis=0
切分操作
np.split()
np.split(ary, indices_or_sections, axis=0)
"""
ary : 切分对象
indices_or_sections : int 平均分成N份(n要能被整除) list(一维) 按照列表数字进行划分,左开右闭
axis : 切分方向 0,行,垂直方向 1,列,水平方向
"""
np.vsplit()
np.vsplit(ary, indices_or_sections) #垂直方向切割,即行切割,axis=0
np.hsplit()
np.hsplit(ary, indices_or_sections) #水平方向切割,即列切割,axis=1
副本
a = np.random.random(size=3)
b = a.copy() #使用copy()函数建立副本,占用不同内存
ndarray的聚合操作(聚集合并)
可以指定axis参数,根据某一方向进行合并
#很多方法都可以指定参数 axis
np.sum() #求和
np.max() #最大值
np.min() #最小值
np.prod() #求累乘
np.mean() #求平均
np.mean(a, axis=None, dtype=None, out=None, keepdims=<class 'numpy._globals._NoValue'>)
#mean() 方法可以指定参数 exempli gratia axis
np.std() #标准差
np.var() #方差
np.argmax() #返回最大值的索引
np.argmin() #返回最小值的索引
np.any() #返回布尔类型,有一个为True则返回True 对于数而言0为False 其它为True (一真则真)
np.all() #返回布尔类型,有一个为False则返回False 对于数而言0为False 其它为True (一假则假)
"""块级方法"""
np.argwhere(conditional expression) #返回所有符合条件表达式的值的索引
np.median() #模块方法 中位数(数据从小到大排列,奇数取正中间,偶数取中间两位求平均值)
np.percentile(a, q) #模块方法 计算百分比 ,a造作对象 ,q 0到100之间 ,显示前 q% ,中位数 50%
numpy.percentile(a, q, axis)
"""
a: 输入数组
q: 要计算的百分位数,在 0 ~ 100 之间
axis: 沿着它计算百分位数的轴
首先明确百分位数:
第p个百分位数是这样一个值,它使得至少有 p% 的数据项小于或等于这个值,且至少有(100-p)%的数据项大于或等于这值。
举个例子:
高等院校的入学考试成绩经常以百分位数的形式报告。比如,假设某个考生在入学考试中的语文部分的原始分数为 54 分。相对于参加同一考试的其他学生来说,他的成绩如何并不容易知道。但是如果原始分数54分恰好对应的是第70百分位数,我们就能知道大约70%的学生的考分比他低,而约30%的学生考分比他高。
"""
nan
数学函数
见地址 数学函数(Mathematical functions) | NumPy 中文
统计学函数
np.histogram(ob,bins=10) #直方图,统计数据出现的频次
文件读写
见地址 输入和输出 | NumPy 中文
np.save('文件路径.npy',ob) #保存文件 .npy后缀以二进制形式保存
np.load('文件路径.npy') #读取文件
"""
也可以保存为其他格式 savetxt(科学计数法显示) savez savez_compressed
"""
矩阵运算
算数运算
加减乘除
矩阵积np.dot()
广播机制
广播机制是Numpy中的一个重要特性,是指对ndarray执行某些数值计算时(这里是指矩阵间的数值计算,对应位置元素1对1执行标量运算,而非线性代数中的矩阵间运算),可以确保在数组间形状不完全相同时可以自动的通过广播机制扩散到相同形状,进而执行相应的计算功能。
对多维数组进行数值计算时,通过广播机制扩散到相同形状,执行相应计算。
排序
见地址 Python NumPy numpy.sort() 函数 | D栈 - Delft Stack
np.sort(ob) #模块方法 建立一个新的对象 默认是升序排序
ob.sort() #对象方法,无返回值,改变原对象的值
np.partition(a, kth, axis=-1, kind='introselect', order=None)
#部分排序,找出最大或最小的一部分.
#当k为正时,得到最小的k位数。当k为负时,得到最大的k位数. (只找出数不进行排序,排序需要再操作)
opencv入门
opencv介绍
open computer vision 开源计算机视觉
python调用使用cv2 模块中的方法
导入cv2 库
import cv2 #导入库
读取图片
ob = cv2.imread(filename[, flags]) #读取图片,参数是图片地址(路径全英文)
cv2.imshow(winname, mat) #显示图片
cv2.waitKey(0) #等待键盘输入,单位毫秒,如果是0则无限等待。
cv2.destroyAllWindows() #关闭所有窗口
颜色通道转换
ob_1 = cv2.cvtColor(ob,code=cv2.COLOR_BGR2GRAY) #cv2读取图片色彩通道时BGR 蓝绿红
#cv2.COLOR_BGR2GRAY 是一个常量6 可以替换为code=6
#一般大写字母是个常量
保存图像
cv2.imwrite('./2.jpg',ob1) #成功返回True
改变图像尺寸
ob_2 = cv2.resize(ob,dsize=(533*2,568*2)) #放大目标值2倍
cv2.imshow('3',ob_2)
while True:
if ord('q') == cv2.waitKey(0): #ord('q') Assic 码转换
break
cv2.destroyAllWindows()
人脸识别例子
识别图像上的人脸
import numpy as np
import cv2
ob = cv2.imread('./1.jpg')
ob = cv2.cvtColor(ob,code=6) #转灰
#级联分类器给它人脸数据,返回可以识别人脸的对象
detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
#array([[181, 233, 181, 181]], dtype=int32) 左上角坐标,宽,高
face_zone = detector.detectMultiScale(ob,scaleFactor = 1.3,minNeighbors=5)
for x,y,w,h in face_zone:
#画正方形 ,获取左上点,和右下点坐标
cv2.rectangle(ob,pt1=(x,y),pt2=(x+w,y+h),color=[0,255,0],thickness=2)
#画圆, 获取圆心
color = np.random.randint(0,256,size=3)
cv2.circle(ob,center=(x+w//2,y+h//2),radius=w//2,color=color.tolist(),thickness=2)
cv2.imshow('ob',ob)
cv2.waitKey(0)
cv2.destroyAllWindows()
识别视频中的人脸
import numpy as np
import cv2
cap = cv2.VideoCapture('./1.mp4')
#cap = cv2.VideoCapture(0) 调取本地摄像头
cap.read
#print(cap.get(3),cap.get(4)) 获得图像宽度和高度
#cap.get(propId=cv2.CAP_PROP_FPS) 获得图像属性,查看视频对象帧率
detecor = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
while cap.isOpened():
# 两个返回值 第一个返回一个布尔类型,有帧为True 没有帧为False 第二个为返回的帧
flag, frame = cap.read()
#frame = cv2.resize(frame,None,fx=0.5,fy=0.5) #缩放1/2
frame_gray = cv2.cvtColor(frame, code=6) #转灰
face_zone = detecor.detectMultiScale(frame_gray,scaleFactor=1.3) #识别人脸区域
#标记所识别区域
for x, y, w, h in face_zone:
cv2.circle(frame, center=(x+w//2, y+h//2), radius=w//2, color=[255, 0, 0], thickness=5)
#视频结束退出
if flag == False:
break
#展示帧
cv2.imshow('1', frame)
#按q提前退出
if ord('q') == cv2.waitKey(33):
break
#关闭所有窗口
cv2.destroyAllWindows()
#释放
cap.release()
VideoCapture.get()
cv2.VideoCapture.get(0) CV_CAP_PROP_POS_MSEC 视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1) CV_CAP_PROP_POS_FRAMES 基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2) CV_CAP_PROP_POS_AVI_RATIO 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3) CV_CAP_PROP_FRAME_WIDTH 在视频流的帧的宽度
cv2.VideoCapture.get(4) CV_CAP_PROP_FRAME_HEIGHT 在视频流的帧的高度
cv2.VideoCapture.get(5) CV_CAP_PROP_FPS 帧速率
cv2.VideoCapture.get(6) CV_CAP_PROP_FOURCC 编解码的4字-字符代码
cv2.VideoCapture.get(7) CV_CAP_PROP_FRAME_COUNT 视频文件中的帧数
cv2.VideoCapture.get(8) CV_CAP_PROP_FORMAT 返回对象的格式
cv2.VideoCapture.get(9) CV_CAP_PROP_MODE 返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10) CV_CAP_PROP_BRIGHTNESS 图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11) CV_CAP_PROP_CONTRAST 图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12) CV_CAP_PROP_SATURATION 图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13) CV_CAP_PROP_HUE 色调图像(仅适用于照相机)
cv2.VideoCapture.get(14) CV_CAP_PROP_GAIN 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15) CV_CAP_PROP_EXPOSURE 曝光(仅适用于照相机)
cv2.VideoCapture.get(16) CV_CAP_PROP_CONVERT_RGB 指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17) CV_CAP_PROP_WHITE_BALANCE × 暂时不支持
cv2.VideoCapture.get(18) CV_CAP_PROP_RECTIFICATION 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
保存视频
import cv2
#创建视频对象
cap = cv2.VideoCapture(0)
#获取宽和高,int四舍五入,为防止尺寸不够再加上1像素
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))+1
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))+1
#创建视频保存对象
videoWriter = cv2.VideoWriter('./po.mp4',cv2.VideoWriter_fourcc('M','P','4','V'),24,(w,h))
detecor = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
while cap.isOpened():
flag,frame = cap.read()
if flag == False:
break
frame_gray = cv2.cvtColor(frame, code=6)
face_zone = detecor.detectMultiScale(frame_gray, scaleFactor=1.3) # 识别人脸区域
# 标记所识别区域
for x, y, w, h in face_zone:
cv2.rectangle(frame,pt1=(x, y), pt2=(x + w, y + h), color=[255, 0, 0], thickness=3)
cv2.imshow('1', frame) # 展示帧
videoWriter.write(frame) # 保存帧
# 按q提前退出
if ord('q') == cv2.waitKey(41):
break
# 关闭所有窗口
cv2.destroyAllWindows()
# 释放
cap.release()
#释放
videoWriter.release()
frame_gray = cv2.cvtColor(frame, code=6)
face_zone = detecor.detectMultiScale(frame_gray, scaleFactor=1.3) # 识别人脸区域
# 标记所识别区域
for x, y, w, h in face_zone:
cv2.rectangle(frame,pt1=(x, y), pt2=(x + w, y + h), color=[255, 0, 0], thickness=3)
cv2.imshow('1', frame) # 展示帧
videoWriter.write(frame) # 保存帧
# 按q提前退出
if ord('q') == cv2.waitKey(41):
break
关闭所有窗口
cv2.destroyAllWindows()
释放
cap.release()
#释放
videoWriter.release()