数据分析总结:
导入import numpy as np
np.version #version查看numpy的版本
type()查看数据的类型
xx.dtype 查看数据中元素的类型
xx.shape #shape数据的形状
导入
import matplotlib.pyplot as plt
例如:
cat =plt.imread("./cat.jpg")#imread是读取照片的位置
plt.imshow(cat)#展现cat数据
plt.show()
重要:
nd6 = np.array([[[1,2,3,5],[4,5,6,5]],[[1,2,3,5],[4,5,6,5]]])
nd6.shape
#这个一定要看懂
坑:
rgb jpg格式的图片0-255
np.ones(shape, dtype=None, order='C')
例:
ones = np.ones((456,730,3),dtype = "float")
ones
numpy.zeros(shape, dtype=float, order=’C’)
参数:
shape:int或int类型序列,表示矩阵形状
dtype:输出的数据类型
order:‘C’ 或者 ‘F’,表示数组在内存的存放次序是以行(C)为主还是以列(F)为主
np.zeros((456,730,3),dtype="float")
zeros的使用方法】
B=zeros(n):生成n×n全零阵。
B=zeros(m,n):生成m×n全零阵。
B=zeros([m n]):生成m×n全零阵。
B=zeros(d1,d2,d3……):生成d1×d2×d3×……全零阵或数组。
B=zeros([d1 d2 d3……]):生成d1×d2×d3×……全零阵或数组。
B=zeros(size(A)):生成与矩阵A相同大小的全零阵。
numpy.full(shape, fill_value, dtype=None, order=’C’)
参数:
shape:int或int类型序列,表示矩阵形状
fill_value:填充值
dtype:输出的数据类型
order:‘C’ 或者 ‘F’,表示数组在内存的存放次序是以行(C)为主还是以列(F)为主
nd4 = np.full(12,fill_value=1024)
numpy.eye(N, M=None, k=0, dtype=float)
参数:
N:行数
M:列数
k:对角线偏移
dtype:输出的数据类型
对角矩阵(主对角线上元素都为1,其他元素都为0)——对角线向右上方偏移k(k>0向右上方偏移,k<0向左下方偏移)
例:
np.eye(2, dtype=int)
np.eye(3, k=1)
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
np.random.randint(low, high=None, size=None, dtype='l')#生成一个整数或N维整数数组,取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
例:
nd1=np.random.randint(0,255,size=(3,4,2))
numpy.random.rand(d0, d1, ..., dn):生成一个[0,1)之间的随机浮点数或N维浮点数组
例:
numpy.random.randn(d0, d1, ..., dn):生成一个浮点数或N维浮点数组,取数范围:正态分布的随机样本数。
例:
np.random.randn(10,2,1)
np.arange([start, ]stop, [step, ]dtype=None)
例:
np.arange(start = 5,stop = 10,dtype= float)
np.random.random(size=(12,2))
numpy.random.choice(a, size=None, replace=True, p=None):从序列中获取元素,若a为整数,元素取值为np.range(a)中随机数;若a为数组,取值为a数组元素中随机元素。
例:
ndarray的属性:
4个必记参数: ndim:维度 shape:形状(各维度的长度) size:总长度
索引总结:
l[4] 4代表的下坐标
可以根据索引修改数据:
nd[1,1,1]=0
切片:
同理
数据反转:
例子:
nd1=[27, 86, 82, 15, 4, 1, 1, 84, 23, 55, 61]
反转:
nd[::-1]
结果:
nd1=[61, 55, 23, 84, 1, 1, 4, 15, 82, 86, 27]
np.hstack与np.vstack 水平级联与垂直级联,处理自己,进行维度的变更
np.hstack如果是水平的 就变成垂直的 就是列变成行
np.vstack如果是垂直的 就变成水平的 就是行变成列
切分:
np.split
np.vsplit
np.hsplit
np.hsplit:一行为基准 进行切分 np.hsplit(nd, [1,3,5])就是1单独一份 3单独一份,5单独一份 其他一份
np.vsplit;一列为基准 进行切分
np.split(nd, [2], axis = 1)
#axis = 0 和vsplit一样的效果 axis = 1 和 hspilt一样的效果
np.sum 和 np.nansum 的区别 nan not a number
nan与数相加还是nan
矩阵积np.dot()
np.dot(nd1,nd2)#两个ndarray 在进行相乘的时候,一个数据的行和一个数据 的列必须相同
必记:
astype数据类型转化的函数
例子:
a=dtype('uint8')
b=a.astype('uint32')
cat.flags.writeable = True #改成可写
np.concatenate()
运算:sum 和 max最大 min最小 mean平均数 argmin最小数的下坐标 argmin、argsum同理
nd.sum(axis = 0) 列为准 上下数相加
nd.sum(axis = 1) 行为准 一行相加
ndarray的矩阵操作: + - / * 系统函数:add subtract
np.sort()不改变输入 含义:这个函数不改变原始的数据 排序后 再次打印原始的数据 还是以前的数据
ndarray.sort()本地处理,不占用空间,但改变输入 含义:这个函数改变了原始的数据 再次打印 打印的排序后的数据
np.partition(a,k)
当k为正时,我们想要得到最小的k个数
当k为负时,我们想要得到最大的k个数
luban.shape#就是降维操作
#cv2在读图片的时候,是以BGR格式 RGB
sanpang = cv2.imread("./cv2_change_head/j.jpg")
plt.imshow(sanpang[::,::,::-1])
#作用,加载各种算法的类
cascade = cv2.CascadeClassifier()
#加载算法
cascade.load("./cv2_change_head/haarcascade_frontalface_default.xml")
#识别人脸
face = cascade.detectMultiScale(sanpang)
face
Pandas的数据结构
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
Series是一种类似与一维数组的对象,由下面两个部分组成:
values:一组数据(ndarray类型)
index:相关的数据索引标签
Series 就是对ndarray的包装
索引:
s[["pi","a"]] 里面还要套一个括号
方法二:loc操作
s.loc["pi"] 左闭右闭
总结:两个中括号出来的数据,就是当前数据类型, 一个中括号是元素的类型
(2) 隐式索引:
s.iloc[0:2]
loc 进行切片的时候, 左闭右闭 iloc进行切片的时候左闭右开
Series的基本概念:
shape,类型
size,几维数据
index,行数据
values列数据
head(),tail()快速查看Series对象的样式
xxx.head(3)查看前3行数据
xxx.tail(3)查看后3行数据
#===============================================
重点:
导入
csv文件或者 excel表格, 或者txt
例:data = pd.read_csv("./president_heights.csv")
pd.read_excel
还可以是json数据 html数据
可以使用pd.isnull(),pd.notnull(),或自带isnull(),notnull()函数检测缺失数据
pd.isnull(s)
#返回的结果 Series 每个元素是boolean
如果有空的数据则是返回True
pd.notnull()
如果不是空的数据则是返回True
#================================================
创建Series
例:
s = Series(data = np.random.randint(0,150,size = 5), index = ["张三","李四","Sara","Lisa","Michale"],
name = "Python")
Series之间的运算,在运算中自动对齐不同索引的数据,如果索引不对应,则补NaN。
DataFrame
是一个【表格型】的数据结构,可以看做是【由Series组成的字典】(共用同一个索引)。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
行索引:index
列索引:columns
值:values(numpy的二维数组)
DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。
创建:
例:
df1 = DataFrame(data = {"Python":[99,101,120,78],
"数学":[120,136,141,149],
"汉语":[123,114,130,117]},
index = list("abcd"))
df1
Python 数学 汉语 英语
a 99 120 123 NaN
b 101 136 114 NaN
c 120 141 130 NaN
d 78 149 117 NaN
DataFrame的索引
可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经设置好了,就是相应的列名。
对行进行索引
- 使用.ix[]来进行行索引
- 使用.loc[]加index来进行行索引 左闭右闭
- 使用.iloc[]加整数来进行行索引 左闭右开
对行进行索引的额时候使用loc或者iloc 对列进行索引的时候,直接使用中括号
#但是一定要注意 一个中括号和两个中括号的区别, 列不能切片的
Series与DataFrame之间的运算
使用Python操作符:以行为单位操作(参数必须是行),对所有行都有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN)
使用pandas操作函数:
axis=0:以列为单位操作(参数必须是列),对所有列都有效。
axis=1:以行为单位操作(参数必须是行),对所有行都有效。
Series与DataFrame之间的区别
Series 可以简单地被认为是一维的数组。
Series 和一维数组最主要的区别在于 Series 类型具有索引( index )。
可以调用as_matrix()将其转换为ndarray类型的对象
DataFrame对象
将数个 Series 按列合并而成的二维数据结构,每一列单独取出来是一个 Series
=========================================================================
Series也可以创建多层索引
例:
s = Series(data = [1,2,3,“a”],
index = [[“a”,“a”,“b”,“b”], [“期中”,“期末”,“期中”,“期末”]])
s
#三层索引
df = DataFrame(data = np.random.randint(0,150,size = 8),
index = [["a","a","a","a","b","b","b","b"],
["期中","期中","期末","期末","期中","期中","期末","期末"],
["一单元","二单元","一单元","二单元","一单元","二单元","一单元","二单元"]],
columns = ["Python"])
df
#隐式创建
造pd.MultiIndex
方式1:
df1 = DataFrame(data = np.random.randint(0,100,size = 8),
index = pd.MultiIndex.from_arrays([["a","a","a","a","b","b","b","b"],
["期中","期中","期末","期末","期中","期中","期末","期末"],
["一单元","二单元","一单元","二单元","一单元","二单元","一单元","二单元"]]),
columns = ["Python"])
df1
方式2:
df3 = DataFrame(np.random.randint(0,150,size = 4),
index = pd.MultiIndex.from_tuples([("a",1),("a",2),("b",1),("b",2)]),
columns = ["Python"])
df3
方式3:
df4 = DataFrame(np.random.randint(0,150,size = (8,2)),
index = pd.MultiIndex.from_product([list("abcd"), ["期中","期末"]]),
columns = ["Python","数学"])
df4
索引的堆(stack)
df4.unstack() #把第二层行索引变成了列索引
df4.unstack(level = 0) #把行索引变成列索引
#stack 是把列变成行索引
总结:使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
聚合操作:
需要指定axis
和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留
例:
div()平均数
df4.sum(axis =0) 列为主
df4.sum(axis = 1) 行为主
df4.std()标准差
=====================================================================
pandas的拼接操作
注意:在进行pandas 级联的时候, 一定要注意轴的变化
参数ignore_index 含义:重新索引
pd.concat()默认axis=0
例:
pd.concat([df1, df3], axis = 1)
a b c d e f
1 a1 b1 c1 d1 e1 f1
2 a2 b2 c2 d2 e2 f2
3 a3 b3 c3 d3 e3 f3
pd.concat([df1, df2])默认axis=0
a b c
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
4 a4 b4 c4
5 a5 b5 c5
6 a6 b6 c6
使用多层索引 keys
concat([x,y],keys=['x','y'])
不匹配级联
外连接:补NaN(默认模式)
df1
a b c
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
df5 = make_df(list("abcd"), [3,4,5,6])
df5
a b c d
3 a3 b3 c3 d3
4 a4 b4 c4 d4
5 a5 b5 c5 d5
6 a6 b6 c6 d6
pd.concat([df1, df5], join = "outer")
a b c d
1 a1 b1 c1 NaN
2 a2 b2 c2 NaN
3 a3 b3 c3 NaN
3 a3 b3 c3 d3
4 a4 b4 c4 d4
5 a5 b5 c5 d5
6 a6 b6 c6 d6
内连接:只连接匹配的项
pd.concat([df1,df5], join = "inner")
a b c
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
3 a3 b3 c3
4 a4 b4 c4
5 a5 b5 c5
6 a6 b6 c6
df6 = make_df(list("abcz"), [3,4,7,8])
df6
df6.columns
pd.concat([df1,df2,df5,df6], join_axes=[df6.columns])
#连接指定的轴
a b c z
1 a1 b1 c1 NaN
2 a2 b2 c2 NaN
3 a3 b3 c3 NaN
4 a4 b4 c4 NaN
5 a5 b5 c5 NaN
6 a6 b6 c6 NaN
3 a3 b3 c3 NaN
4 a4 b4 c4 NaN
5 a5 b5 c5 NaN
6 a6 b6 c6 NaN
3 a3 b3 c3 z3
4 a4 b4 c4 z4
7 a7 b7 c7 z7
8 a8 b8 c8 z
使用append()函数添加
s1 = ["123"]
s1.append("456")
使用pd.merge()合并
===========================
merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并
使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。
注意每一列元素的顺序不要求一致
---==================================
一对一合并:
df1 = DataFrame({"age":[30,22,36],
"work":["tech","accounting","sell"],
"sex":["男","女","女"]},
index = list("abc"))
df1
age sex work
a 30 男 tech
b 22 女 accounting
c 36 女 sell
df2 = DataFrame({"home":["上海","安徽","山东"],
"work":["tech","accounting","sell"],
"weight":[60,50,40]}, index = list("abc"))
df2
home weight work
a 上海 60 tech
b 安徽 50 accounting
c 山东 40 sell
df1.merge(df2)
age sex work home weight
0 30 男 tech 上海 60
1 22 女 accounting 安徽 50
2 36 女 sell 山东 40