第一周:python基本内容:
1、六种数据类型及之间的相互转换。
1.1六种数据类型
数据类型 | 名称 |
---|---|
number | 数字 |
string | 字符串 |
list | 列表 |
tuple | 元组 |
dictionary | 字典 |
set | 集合 |
其中number中包含3种数值类型:
(1).整型(int);
(2).浮点型(float) ;
(3).布尔型(bool),包含 True(真,1),另一个为False(假,0)。
注意:如果不知道某一变量的数据类型是什么,可以通过type()函数查询
a = []
print(type(a))
1.2 相互转换
函数 | 描述 |
---|---|
int(x) | 将x转换为一个整数 |
float(x) | 将x转换为一个浮点数 |
str(x/s) | 将x/s转换为字符串 |
eval(str) | 用于字符串,去除字符串的引号,获取引号里面的内容 |
list(s) | 将序列s转换为一个列表 |
tuple(s) | 将序列s转换为一个元组 |
set(s) | 将序列s转换为一个集合 |
dict(d) | 创建一个字典,d必须是一个(key,value)元组序列 |
2、运算符:
2.1 算术运算符:+;-;*;/(相除);//(向下取整的整除);%(取余数);**(幂运算)。
2.2 比较运算符:=;+=(#1加法赋值);-=;*=;/=;//=;%=;**=。
【#1:例:a+=b为a=a+b;后几个运算逻辑亦如此】
2.3 赋值运算符:and(与) “一假为假,全真为真 ”;
or (或)“一真为真,全假为假 ”;
not(非)“为真则假,为假则真 ”。
3、判断语句:
三种用法:
(1)if 判断条件 :
语句
(2)if 判断条件:
语句
else:
语句
(3)if 判断条件:
语句
elif 判断条件:
语句
else:
语句
4、循环语句:
4.1:while语句
while 表达式:
循环体
4.2:for循环
for 循环,从形式上可以分为俩种:
1.遍历对象2.使用range函数控制循环次数
range函数: range(起始值,终止值,步长)
【例:最最最最基本的99乘法表:】
for i in range(1,10):
for j in range(1,i+1):
print(f'{j}*{i}={i * j}\t', end='')
print()
5、字符串:
5.1 索引、切片与逆序
//索引(第一个字符串从0开始)
a = "Hello , world!"
print(a[7])
//输出结果:w
//切片[起始索引:结束索引+1:间隔个数]
a = "Hello , world!"
print(a[7:12])
//输出结果world
print(a[7:12:2])
//输出结果:wrd
//逆序[结束索引:开始索引-1:-1]
a = "Hello , world!"
print(a[11:6:-1])
输出结果:dlrow
print(a[11:6:-2])
输出结果:drw
5.2:字符串的连接
a = "Hello "
b = "world"
print(a+b)
Hello world
name = "xiaobian"
age = 18
print("My name is " + name +".I am "+ str(age) + " years old.")
//输出运行结果:My name is xiaobian.I am 18 years old.
第二周
1、列表
1.1列表操作
列表操作 | 示范 |
---|---|
创建一个空列表 | a = [ ] |
访问列表中的某个元素 | a[索引] |
访问列表的最后一个元素 | a[-1] |
1.2列表方法
操作 | 方法 | 描述 |
---|---|---|
增 | 列表.append(元素) | 在列表末尾添加一个元素 |
增 | 列表.extend(序列) | 在列表末尾追加一个序列 |
增 | 列表.insert(索引,元素) | 在列表对应的索引插入元素 |
删 | del 列表[索引] | 删除列表中对应索引的元素 |
删 | 列表.pop(索引) | 删除列表中对应索引的元素,并返回删除的元素,默认最后一个 |
删 | 列表.remove(元素) | 删除列表中对应元素的第一个匹配项 |
删 | 列表.clear() | 清空列表 |
改 | 列表[索引]=新元素 | 将列表对应索引的元素,修改为新元素 |
查 | 列表.index(元素) | 返回元素对应的索引 |
1.3遍历列表
a = [x for x in range(1,21)]
print(a)
//输出结果[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
b = [x for x in range(1,21) if x%2 == 0]
print(b)
//输出结果[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
1.4列表函数
//len()函数
a = [11,22,33,44,55]
print(len(a))
//输出结果:5
//sum()函数
a = [11,22,33]
print(sum(a))
//输出结果:66
//sort()函数排序:可以对列表进行永久排序
//方法:
a.sort(reverse=True/False)
//sorted()函数排序:可以对列表进行临时排序
//方法:
sorted(a,reverse=True/False)
//reverse=True 时,按降序排序。
//reverse=False 时,按升序排序。
2、元组
2.1元组操作
列表操作 | 示范 |
---|---|
创建一个空元组 | a =() |
创建包含一个元素的元组 | b =(元素,) |
创建元组 | c =(元素1,元素2,……) |
2.2
获取一个元素 | 元组序列[所有] |
---|---|
获取多个连接的元素 | 元组序列[开始索引,结束索引] |
2.3
操作 | 作用 |
---|---|
index() | 从元组中找出某个对象第一个匹配项的下标位置。 |
count() | 统计某个元素在元组中出现的次数 |
len() | 计数元组元素的个数,并返回值 |
max() | 返回元组中元素的最大值 |
min() | 返回元组中元素的最小值 |
注意:
元组除了两个方面,元组的数据类型几乎和列表数据类型一样:
1.元组输入时用圆括号(),不是方括号[ ]
2.元组的值无法修改、添加或删除。
【例:】
'''2.已知元组a=(1,2,1,4,1,3),b=(1,1,3,12,4,2),c=(1,34,1,1,1,11,2)创建一个元组d=(a,b,c,b,a,1,2,1,1,2),输出1的个数'''
a=(1,2,1,4,1,3)
b=(1,1,3,12,4,2)
c=(1,34,1,1,1,11,2)
d=(a,b,c,b,a,1,2,1,1,2)
count = 0
for i in d:
if i == a:
for j in a:
if j == 1:
count += 1
if i == b:
for k in b:
if k == 1:
count += 1
if i == c:
for l in c:
if l == 1:
count += 1
if i == 1:
count +=1
print(f"1的个数为:{count}")
//输出结果:1的个数为:17
3、字典
3.1字典操作
字典操作 | 代码示范 |
---|---|
创建空字典 | dict1 = {}/dict2 = dict() |
创建字典 | dict3 = { 键1 :值1 ,键2: 值2,……} |
3.2字典访问
操作 | 代码示范 | 描述 |
---|---|---|
访问值 | 字典序列[键] | 访问已知键所对应的值 |
修改值 | 字典序列[键]=新值 | 修改已知键的值 |
添加键值对 | 字典序列[新键]=新值 | 添加新的键值对 |
删 | del 字典序列[键] | 删除字典中对应的键的键值对 |
删 | del 字典序列 | 删除字典 |
删 | 字典序列.clear() | 清空字典 |
查 | 字典序列.items() | 查找字典的所有的键值对 |
查 | 字典序列.keys() | 查找字典的所有的key(键) |
查 | 字典序列.values() | 查找字典的所有的value(值) |
3.3字典特点
1.符号为大括号{};
2.数据为键值对形式出现;
3.各个键值对之间用逗号隔开。
list = {'10000001':'小明',
'10000002':'小洪',
'10000003':'小美',
'10000004':'小帅',
'10000005':'小郭',
'10000006':'小涛',
'10000007':'小花',
'10000008':'小电',
'10000009':'小路',
'10000010':'小英',}
'''(1)输出学号为10000009的同学姓名和小帅的学号'''
print(list['10000009'],"\n小帅的学号为:10000004")
'''(2)将学号为10000006的同学姓名改为小马'''
list['10000006'] = '小马'
print(list['10000006'])
'''输出结果:
小路
小帅的学号为:10000004
小马
dict_items([('10000001', '小明'), ('10000002', '小洪'), ('10000003', '小美'), ('10000004', '小帅'), ('10000005', '小郭'), ('10000006', '小马'), ('10000007', '小花'), ('10000008', '小电'), ('10000009', '小路'), ('10000010', '小英'), ('10000011', '小思')])
'''
3.4字典函数
//gets()方法
a = {'apple':2,'banana':3}
print('I have '+str(a.get('orange',0))+' oranges.')
//输出结果:I have 0 oranges.
print('I have '+str(a.get('apple',0))+' apples.')
//输出结果:I have 2 apples.
//setdefault()方法
a = {'apple':2,'banana':3}
print(a.setdefault('orange',10))
//输出结果:10
print(a.setdefault('apple',10))
//输出结果:2
4、集合
4.1集合特点
可以使用大括号 { } 或者 set() 函数创建集合,但创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
集合特点:
1.集合是一个无序的不重复元素序列;
2.集合中的元素是唯一的;
3.集合可以用来去重。
4.2集合操作
操作 | 代码示范 | 描述 |
---|---|---|
增 | 集合序列.add(数据) | 添加一个数据 |
增 | 集合序列.update(序列数据) | 添加序列 |
删 | 集合序列.remove(数据) | 删除集合中指定的数据,如果数据不存在就报错 |
删 | 集合序列.pop() | 随机删除集合中的某个数据 |
删 | 集合序列.discard(数据) | 删除集合中指定的数据,如果数据不存在不做任何操作 |
第三周:matplotlab(画图工具)
1、准备工作
1.1:安装:
打开cmd(win+R),输入:pip install matplotlib
检验是否安装成功:输入:pip list。检查其中是否有matplotlib
导入库:import matplotlib.pyplot as plt。
1.2:
创建画布:
plt.figure(figsize = (a,b),dpi = )
igsize:指图像的长(a)宽(b)
dpi:图像清晰度(越大越清晰)
绘制图像:
plt.plot(x,y.color = '',linestyle = '',marker = '',linestyle='',label='')
x:横轴数据
y:纵轴数据
color:图像颜色,可以直接输入英文名称,或者是RGB颜色值(下面附有图)
linewidth:线条宽度
marker: 标记风格
linestyle: 线条样式 label:图例
1.3:常用颜色:
颜色 | 说明 | 颜色 | 说明 |
---|---|---|---|
r | 红色 | g | 绿色 |
b | 蓝色 | w | 白色 |
c | 青色 | m | 洋红 |
y | 黄色 | k | 黑色 |
1.4:线条样式
样式 | 说明 |
---|---|
’-‘ | 实线 |
’--‘ | 虚线 |
’-.‘ | 点划线 |
':' | 点虚线 |
1.5:x、y轴刻度及标题
//添加自定义x,y刻度
plt.xticks(x,rotation=,fontsize=)
plt.yticks(y,rotation=,fontsize=)
//设置x,y标签和标题
plt.xlabel(,fontsize=)
plt.ylabel(,fontsize=)
plt.title(,fontsize=)
//添加网格显示
plt.grid(True,linestyle=,alpha=)
//图例位置
plt.legend(loc=)
1.6:图像保存及显示
//图像保存
plt.savefig("文件保存位置")
//显示图像
plt.show()
//中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
2、图像
2.1:折线图:
import matplotlib.pyplot as plt
import numpy as np
x = [5,10,15,20,25]
y = [3,7,4,5,3]
plt.plot(x,y)
plt.savefig(r"D:\python project\ATrain\机械学习\matplotlab")
plt.show()
2.2:散点图:
import matplotlib.pyplot as plt
import numpy as np
x = [5,10,15,20,25,7,4,2,4,12,23,14,19,22,19,18,20,16]
y = [3,7,4,5,3,3,2.3,2.4,4.5,4.8,2.1,3,4.5,5.6,6.5,5.8,6.2,3.9]
plt.scatter(x,y)
plt.savefig(r"D:\python project\ATrain\机械学习\matplotlab")
plt.show()
2.3:柱状图:
import matplotlib.pyplot as plt
import numpy as np
x = [5,10,15,20,25,7,4,2,4,12,23,14,19,22,19,18,20,16]
y = [3,7,4,5,3,3,2.3,2.4,4.5,4.8,2.1,3,4.5,5.6,6.5,5.8,6.2,3.9]
plt.bar(x,y)
plt.savefig(r"D:\python project\ATrain\机械学习\matplotlab图像")
plt.show()
2.4:直方图:
import matplotlib.pyplot as plt
import numpy as np
x = [5,10,15,20,25,7,4,2,4,12,23,14,19,22,19,18,20,16]
y = [3,7,4,5,3,3,2.3,2.4,4.5,4.8,2.1,3,4.5,5.6,6.5,5.8,6.2,3.9]
plt.hist(x,bins=25)
plt.savefig(r"D:\python project\ATrain\机械学习\matplotlab图像")
plt.show()
2.5:饼图:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = {'index': np.arange(1, 10001),
'count': np.random.randint(0, 10001, size=10000),
'class': np.random.choice([1, 2, 3, 4, 5], size=10000),
'normal_distribution': np.random.normal(0, 10000, 10000),
'0-1': np.random.rand(10000)}
df = pd.DataFrame(data)
df.to_csv(r"E:\I\feishu\02.csv")
class_counts = df['class'].value_counts()
plt.figure(figsize=(5, 5))
plt.pie(class_counts, labels='class', autopct='%1.1f%%', startangle=60)
plt.title('class_distribution')
plt.savefig(r"D:\python project\ATrain\机械学习\matplotlab图像")
plt.show()
2.6:绘制复杂图像:
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示问题
huaban = plt.figure(figsize=(10, 5), dpi=200)
p1 = huaban.add_subplot(211) #设置两个子图,排列方式为两行一列
plt.ylim(0, 100000) #设置y坐标的范围
x1 = np.linspace(0, 70, 35) #设置三组x,y
y1 = np.random.randint(0, 100000, 35) #使用np.random.randint(初始值,结束值,个数)输出随机数
x2 = np.linspace(0, 70, 35)
y2 = np.random.randint(0, 100000, 35)
x3 = np.linspace(0, 70, 35)
y3 = np.random.randint(0, 100000, 35)
plt.title('2000-2017年各产业季度生产总值折线图', fontsize=6)
plt.ylabel("生产总值(亿元)", fontsize=6)
L1, = p1.plot(x1, y1, color='blue', ls=':', lw=1)
L2, = p1.plot(x2, y2, color='red', ls='--', lw=1)
L3, = p1.plot(x3, y3, color='green', ls='-.', lw=1)
plt.legend(handles=[L1, L2, L3], labels=['第一产业', '第二产业', '第三产业'], loc='upper left', fontsize=4) #handles 表示所要处理的线,参数为列表
p2 = huaban.add_subplot(212) #子图2的编写
plt.ylim(0, 70000)
x4 = np.linspace(0, 17, 35) #设置9组x,y(y为随机数)
y4 = np.random.randint(0, 70000, 35) #使用np.random.randint(初始值,结束值,个数)输出随机数
x5 = np.linspace(0, 17, 35) #np.random.rand(个数)一般输出的随机数一般范围在-1.96~1.96之间
y5 = np.random.randint(0, 70000, 35)
x6 = np.linspace(0, 17, 35)
y6 = np.random.randint(0, 70000, 35)
x7 = np.linspace(0, 17, 35)
y7 = np.random.randint(0, 70000, 35)
x8 = np.linspace(0, 17, 35)
y8 = np.random.randint(0, 70000, 35)
x9 = np.linspace(0, 17, 35)
y9 = np.random.randint(0, 70000, 35)
x10 = np.linspace(0, 17, 35)
y10 = np.random.randint(0, 70000, 35)
x11 = np.linspace(0, 17, 35)
y11 = np.random.randint(0, 70000, 35)
x12 = np.linspace(0, 17, 35)
y12 = np.random.randint(0, 70000, 35)
plt.ylabel("生产总值(亿元)", fontsize=6)
_xtick_labels = ["200{}年第一季度".format(i) for i in range(10)] #设置x轴下标
_xtick_labels += ["201{}年第一季度".format(i) for i in range(8)]
plt.xticks(list(x4)[::2], _xtick_labels[::1], rotation=45, fontsize=6) #fontsize表示字体大小,rotation表示旋转角度
plt.yticks(np.linspace(0, 70000, 8))
D1, = p2.plot(x4, y4, color='blue', lw=1, label='农业') #定义9条线[D1, D2, D3, D4, D5, D6, D7, D8, D9]
D2, = p2.plot(x5, y5, color='yellow', ls=':', lw=1, label='工业')
D3, = p2.plot(x6, y6, color='red', ls='--', lw=1, label='建筑')
D4, = p2.plot(x7, y7, color='green', ls='-.', lw=1, label='批发')
D5, = p2.plot(x8, y8, color='grey', lw=1, label='交通')
D6, = p2.plot(x9, y9, color='brown', ls=':', lw=1, label='餐饮')
D7, = p2.plot(x10, y10, color='cyan', ls='--', lw=1, label='金融')
D8, = p2.plot(x11, y11, color='black', ls='-.', lw=1, label='房地产')
D9, = p2.plot(x12, y12, color='magenta', lw=1, label='其他')
plt.legend(handles=[D1, D2, D3, D4, D5, D6, D7, D8, D9]) #handles 表示所要处理的线,参数为列表
plt.savefig(r"D:\python project\ATrain\机械学习\matplotlab图像")
plt.show()
第四~六周:numpy、pandas
一、numpy(表格处理工具 )
1、numpy安装
1.1:
//打开cmd,输入以下代码
pip install numpy
//安装完成后,再次输入以下代码检查是否安装成功
pip list
//导入库
import numpy as np
//创建ndarray
data = np.array()
1.2:numpy基本方法
名称 | 作用 |
---|---|
data.shape | 查看数组的维度(以元组的形式输出) |
data.ndim | 查看数组维数 |
data.size | 查看数组中的元素数量 |
data.itemsize | 查看一个数组元素的长度 |
data.dtype | 查看数组元素的类型 |
2、创建数组
import numpy as np
//创建只有1的数组
one = np.ones([4,8])
'''输出结果:array([[1.,1.,1.,1.,1.,1.,1.,1.],
[1.,1.,1.,1.,1.,1.,1.,1.],
[1.,1.,1.,1.,1.,1.,1.,1.],
[1.,1.,1.,1.,1.,1.,1.,1.]])'''
//创建只有0的数组
zero = np.zeros_like(one)
'''输出结果:array([[0.,0.,0.,0.,0.,0.,0.,0.],
[0.,0.,0.,0.,0.,0.,0.,0.],
[0.,0.,0.,0.,0.,0.,0.,0.],
[0.,0.,0.,0.,0.,0.,0.,0.]])'''
2.1:数组拷贝np.array与np.asarray
深拷贝:np.array
浅拷贝:np.asarray
【例:有一原始数组a,定义两个数组a1=np.array(a)与a2=np.asaray(a);
当原始数组a改变时,a1不变,a2改变。】
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
//运行结果
array([[1, 2, 3],
[4, 5, 6]])
a1 = np.array(a)
a2 = np.asarray(a)
a[0][0] = 100
'''运行结果:
a1:array([[1,2,3],
[4,5,6]])
a2:array([[100,2,3],
[4,5,6]])'''
3、 生成固定范围内的数组
3.1 np.linspace
np.linspace(start, stop, num, endpoint)
创建等差数组,指定数量(步长自动计算) start:序列的起始值 stop:序列的结束值 num:要生成的等间隔样例数量,默认为50 endpoint:序列中是否包含stop值,默认为true
3.2 np.arange
np.arange(start,stop,step,dtype)
创建等差数组,指定步长(数量自动计算) step:步长,默认为1
3.3 np.logspace
np.logspace(start,stop,num)
创建等比数组,生成以10的N次幂的数据 num:要生成的等比数组数量,默认为50
4、生成随机数组
4.1: np.random模块
导入库
import random
4.2: 正态分布
第一种:np.random.randn
np.random.randn(d0,d1,d2,……,dn)
功能:从标准正态分布中返回一个或多个样本值
第二种:np.random.normal
np.random.normal(loc = 0.0,scale = 1.0,size = None)
loc:float 此概率分布的均值(对应整个分布的中心) scale:float 此概率分布的标准差(对应于分布的宽度,scale值越大越矮胖,scale值越小越瘦高) size:int or tuple of ints 输出的shape,默认为None,只输出一个值
第三种:np.random.standard_normal
np.random.standard_normal(size = None)
返回指定形状的标准正态分布的数组
4.3: 均匀分布
第一种:np.random.rand
np.random.rand(d0,d1,d2,……,dn)
返回[0.0,1.0)内的一组均匀分布的数
第二种:np.random.uniform
np.random.uniform(low = 0.0,high = 1.0,size = None)
从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high low:采样下界,float类型,默认值为0 high:采样上界,float类型,默认值为1 size:输出样本数目,为int或tuple类型,缺少时输出1个值。例如:size=(m,n,k)则输出mnk个样本 返回值:ndarray类型,其形状和参数与size中定义的一致
第三种:np.random.randint
np.random.randint(low, high = None,size = None,dtype = 'i')
从一个均匀分布中随机采样,生成一个整数或N维整数数组 取数范围:若high不为None时,取(low,high)之间的随机整数,否则取值[0,low)之间随机整数
5、数组修改
5.1 ndarray.reshape
ndarray.reshape(shape, order)
产生一个新的对象 返回一个具有相同数据域,但shape(维度)不一样的视图 行列不进行互换 可以使用data.reshape([-1,x])进行排序,但x必须被整除,否则会报错
下面用一个例子来帮助理解
data = np.array([[1,2,3],[4,5,6]])
//array([[1, 2, 3],
[4, 5, 6]])
data1 = data.reshape(3,2)
//array([[1, 2],
[3, 4],
[5, 6]])
data2 = data.reshape(-1,6)
//array([[1, 2, 3, 4, 5, 6]])
data3 = data.reshape(-1,5) #这样会报错
//ValueError:cannot reshape array of size 6 into shape (5)
5.2 ndarray.resize
ndarray.resize(new_shape)
修改数组本身的形状(需要保持元素个数前后相同) 行列不进行互换
看上去和ndarray.reshape没什么不一样的,这两个方法作用相似但用法不同 下面用一个例子来帮助区别和理解
data = np.array([[1,2,3],[4,5,6]])
'''array([[1, 2, 3],
[4, 5, 6]])'''
data1 = data.reshape(3,2)
'''data1:array([[1, 2],
[3, 4],
[5, 6]])'''
data:array([[1, 2, 3],
[4, 5, 6]])
data2 = data.resize([3,2])
'''data2:null
data:array([[1, 2],
[3, 4],
[5, 6]])'''
resize是对于自身数组进行改变,对于新的数组不做任何变化 reshape是产生一个新的对象对自身不做变化
5.3 ndarray.T
对数组进行转置,将数组的行列进行互换
data = np.array([[1,2,3],[4,5,6]])
'''array([[1, 2, 3],
[4, 5, 6]])'''
data1 = data.T
'''array([[1, 3, 5],
[2, 4, 6]])'''
6、数组的去重
np.unique()
下面用一个例子来帮助理解
data = np.array([[1,2,2],[4,5,6]])
data1 = np.unique(data)
'''array([1, 2, 4, 5, 6])'''
7、 ndarray运算
7.1
np.logical_and(condition1,condition2)
condition:条件 当两个条件同时满足时返回Ture
np.logical_or
np.logical_or(condition1,condition2)
当其中一个条件满足时返回Ture
7.2
np.all()
所有条件都满足要求返回True,有任一个不满足返回False
7.3
np.any()
任一个条件满足要求返回True
7.4
满足条件返回前一块内容,不满足返回后一块内容
np.where(condition,1,0)
满足条件返回1,不满足返回0 注意:复合逻辑需要结合np.logical_and和np.logical_or使用
8、 统计指标
方法 | 作用 |
---|---|
np.min(ndarray,axis) | 查询所有行或所有列的最小值 |
np.max(ndarray,axis) | 查询所有行或所有列的最大值 |
np.median(ndarray,axis) | 查询所有行或所有列的中位数 |
np.mean(ndarray,axis) | 查询所有行或所有列的平均值 |
np.std(ndarray,axis,dtype) | 查询所有行或所有列的标准差 |
np.var(ndarray,axis,dtype) | 查询所有行或所有列的方差 |
np.ardmax(ndarray) | 查询最大值的位置 |
np.ardmin(ndarray) | 查询最小值的位置 |
注意:axis轴的取值并不一定,Numpy中不同的API轴的值都不一样
9、数组间的运算
9.1 数组与数
ndarray +1:数组里每个元素 +1 ndarray /2:数组里每个元素 /2 ndarray *2:数组里每个元素 *2
下面用一个例子来帮助理解
data = np.array([[1,2,3],[4,5,6]])
data + 1
'''array([[2, 3, 4],
[5, 6, 7]])'''
data * 2
'''array([[ 2, 4, 6],
[ 8, 10, 12]])'''
注意:python列表运算,是将整个列表复制,不是将每个元素的值运算
a = [1,2,3]
a * 3
'''[1, 2, 3, 1, 2, 3, 1, 2, 3]'''
9.2 数组与数组
维度相等才可以运算 或者满足广播机制
广播机制(满足如下的条件之一即可运算)
1.数组的某一维度等长 2.其中一个数组的某一维度为1
下面用一个例子来帮助理解
a1 = np.array([[1,2,3],[4,5,6]])
a2 = np.array([[1],[2]])
a = a1 + a2
'''array([[2, 3, 4],
[6, 7, 8]])'''
9.3 矩阵乘法
方法 | 作用 |
---|---|
np.matmul | 矩阵与矩阵相乘(禁止出现矩阵与标量相乘) |
np.dot | 矩阵与矩阵和标量相乘皆可 |
注意:在矩阵与矩阵相乘时,二者没有区别
二、Pandas工具(信息处理工具 )
1、pandas安装
//打开cmd,输入以下代码
pip install pandas
//安装完成后,再次输入以下代码检查是否安装成功
pip list
//导入库
import pandas as pd
2、三种主要的数据结构
数据结构 | 描述 |
---|---|
Series | 一维数据结构 |
DataFrame | 二维数据结构 |
MultiIndex | 三维数据结构 |
Panel | 三维数据结构(MultiIndex老版本) |
3、DataFrame
注意:后面的dataframe均代指二维的对象名称
pd.DataFrame(data = None,index = None,columns = None)
index:行标签,如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引 columns:列标签,如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引
下面用一个例子来帮助理解
a = [1,2,3,4]
b = [5,6,7,8]
c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a,columns = b)
'''
5 6 7 8
1 23 28 85 59
2 52 81 45 7
3 70 54 71 15
4 70 35 27 89'''
属性 | 作用 |
---|---|
dataframe.shape | 获取维度 |
dataframe.index | 获取行索引表 |
dataframe.columns | 获取列索引表 |
dataframe.values | 获取其中array的值 |
dataframe.T | 行列互换(转置) |
dataframe.head() | 默认获取 前5行,其他行数自行添加 |
dataframe.tail() | 默认获取后5行,其他行数自行添加 |
dataframe.info | 获取每一列的非空元素个数 |
3.1 DataFrame索引设置
1 修改行列索引值
data.index = new_index
data.columns = new_columns
注意:修改索引值不能单个修改,必须整体修改
2 重设索引
设置新的下标索引 drop:默认为False,不删除原来索引,如果为True,删除原来索引值
3 以某列值设置为新的索引
dataframe.set_index(keys,drop = True)
keys:列索引命或者列索引名称的列表 drop:bool值默认为True,当做新的索引,删除原来的列
注意:行索引的修改与重设类似列索引
4、基本数据操作
4.1 索引操作
Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持 类似的操作。也可以直接使用列名、行名称,甚至组合使用。
1: 直接使用行列索引(先列后行)
a = [1,2,3,4]
b = [5,6,7,8]
c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a, columns = b)
''
5 6 7 8
1 23 28 85 59
2 52 81 45 7
3 70 54 71 15
4 70 35 27 89'''
c[5][3]
//70
c[:1,:2] #这样会报错
//TypeError: unhashable type: 'slice'
2:结合loc或者iloc使用索引
使用loc:只能指定行列索引的名字(先行后列) 使用iloc:可以通过索引的下标去获取 使用ix组合索引:下标和名称组合做引(版本较老)
可以使用以下两种方式来代替ix组合索引 1.dataframe.loc[dataframe.index[ a: b],['c','d']] 2.dataframe.iloc[ : ,dataframe.columns.get_indexer(['c','d'])]
下面用一个例子来帮助理解
a = ['a','b','c','d']
b = ['a1','b1','c1','d1']
c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a, columns = b)
'''
a1 b1 c1 d1
a 89 79 12 74
b 52 20 84 49
c 43 56 25 3
d 69 78 58 6'''
c.loc[ : ,'a1']
'''a 89
b 52
c 43
d 69'''
Name: a1, dtype: int32
c.iloc[:,0]
'''a 89
b 52
c 43
d 69'''
Name: a1, dtype: int32
c.loc[c.index,['a1']]
'''
a1
a 89
b 52
c 43
d 69'''
c.iloc[:,c.columns.get_indexer(['a1'])]
'''
a1
a 89
b 52
c 43
d 69'''
4.2赋值操作
dataframe['a'] = b
dataframe.a = b
注意: 1.a代表某一列或者某一行的名称 2.b代表某个值
下面用一个例子来帮助理解
a = ['a','b','c','d']
b = ['a1','b1','c1','d1']
c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a, columns = b)
'''
a1 b1 c1 d1
a 46 89 26 76
b 28 85 18 22
c 74 81 71 27
d 39 88 44 83'''
c['b1'] = 1
'''
a1 b1 c1 d1
a 46 1 26 76
b 28 1 18 22
c 74 1 71 27
d 39 1 44 83'''
c.d1 = 2
'''
a1 b1 c1 d1
a 46 1 26 2
b 28 1 18 2
c 74 1 71 2
d 39 1 44 2'''
5、 排序
5.1 DataFrame排序
dataframe.sort_values(by = ,ascending =)
单个或多个键排序 by:指定排序参考的键 ascending:默认升序 ascending = False 降序 ascending = True 升序
5.2 Series排序
进行值排序
dataframe.sort_values(ascending = True)
进行索引排序
series.sort_index()
6、DataFrame运算
6.1 基本运算
元素相加,维度相等时找不到元素默认用fill_value
dataframe.add(dataframe2, fill_value = None, axis = 1)
元素相减,维度相等时找不到元素默认用fill_value
dataframe.sub(dataframe2, fill_value = None, axis = 1)
元素相除,维度相等时找不到元素默认用fill_value
dataframe.div(dataframe2, fill_value = None, axis = 1)
元素相乘,维度相等时找不到元素默认用fill_value
dataframe.mul(dataframe2, fill_value = None, axis = 1)
查看日期,输入具体日期
直接通过一个例子来辅助理解
data = np.array(['2023-3-12','2023-3-13','2023-3-14'])
data1 = pd.to_datetime(data)
data1.week
//Int64Index([10, 11, 11], dtype = 'int64')
data1.weekday
//Int64Index([6, 0, 1], dtype = 'int64')
data1.day
//Int64Index([12, 13, 14], dtype = 'int64')
6.2 逻辑运算
直接通过一个例子辅助理解(这部分在Numpy中有提到过,现在拿出来重提是为了与下面的逻辑运算函数进行对比)
a = ['a','b','c','d']
b = ['a1','b1','c1','d1']
c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a, columns = b)
'''
a1 b1 c1 d1
a 22 14 93 36
b 86 77 41 5
c 96 84 37 84
d 89 94 54 97'''
c[(c['d1']>50) & (c['d1']<90)].head()
'''
a1 b1 c1 d1
c 96 84 37 84'''
6.3 逻辑运算函数
query(expr)
expr:查询字符串 通过逻辑运算函数可以使上面的过程更加方便简单
6.4 统计运算
dataframe.describe()
综合统计包括平均值,最大值,最小值等等
1 统计函数
函数 | 作用 |
---|---|
sum | 获取总和 |
mean | 获取平均值 |
median | 获取中位数 |
min | 获取最小值 |
max | 获取最大值 |
mode | 获取众数 |
abs | 获取绝对值 |
prod | 获取累积 |
std | 获取标准差 |
var | 获取方差 |
idxmax | 获取最大值索引 |
idxmin | 获取最小值索引 |
2 累计统计函数
函数 | 作用 |
---|---|
cumsum | 计算1/2/3/……/n个数的和 |
cummax | 计算1/2/3/……/n个数的最大值 |
cummin | 计算1/2/3/……/n个数的最小值 |
cumprod | 计算1/2/3/……/n个数的积 |
7、 Pandas画图
dataframe.plot(kind='line')
kind:str,需要绘制图形的种类
图形种类
种类 | 描述 |
---|---|
line | 折线图 |
bar | 条形图(竖直条状) |
bath | 条形图(水平条状) |
hist | 直方图 |
pie | 饼图 |
scatter | 散点图 |
注意: 1.条形图中可以添加是否堆积dataframe.plot(kind='bar',stacked=True) 2.stacked为True时堆积,为False时不堆积
具体过程跟matplotlib中类似,这里主要介绍利用pandas创造的二维对象dataframe,使用plot可以直接将dataframe转换成数据图类型
下面通过一个例子来辅助理解
a = ['a','b','c','d']
b = ['a1','b1','c1','d1']
c = pd.DataFrame(np.random.randint(0,100,(len(a),len(b))),index = a,columns = b)
plt.figure(figsize = (20,8),dpi = 100)
c.plot(kind='bar',stacked=True)
plt.show()
8、文件读取与文件存储
类 | 数据类型 | 读取文件 | 存储文件 |
---|---|---|---|
text | CSV | read_csv | to_csv |
text | JSON | read_json | to_json |
text | HTML | read_html | to_json |
text | Local clipboard | read_clipboard | to_clipboard |
binary | MS Excel | read_excel | to_excel |
binary | HDF5 Format | read_hdf | to_hdf |
binary | Feather Format | read_feather | to_feather |
binary | Parquet Format | read_parquet | to_parquet |
binary | Msgpack | read_msgpack | to_msgpack |
binary | Stata | read_stata | to_stata |
binary | SAS | read_sas | -- |
binary | Python Pickle Format | read_pickle | to_pickle |
SQL | SQL | read_sql | to_sql |
SQL | Google Big Query | read_gbp | to_gbp |
关于第四~七周的一些作业
1
import matplotlib.pyplot as plt; '''引用matplotlib.pyplot库(画图),之后简称为plt'''
import pandas as pd
import datetime
df = pd.read_csv(r"C:\Users\I\Desktop\培训材料\Task:数据处理+图形可视化\数据集1.csv")
plt.figure(figsize=(10000, 50), dpi=50)
plt.rcParams['font.sans-serif'] = ['SimHei']
c = df['Date']
x = []
for i in range(0, 188):
x.append(datetime.datetime.strptime(c[i], '%Y/%m/%d'))
a = df['Deaths']
b = df['Confirmed']
result = a/b
y = []
for i in range(0, 188):
y.append(result[i])
plt.xlabel('日期', fontsize=30)
plt.ylabel('死亡率', fontsize=30)
plt.title('2020年1月22日至2020年7月27日病毒死亡率走势', fontsize=50)
plt.plot(x, y, color='orange', marker='o', label='每日死亡率')
plt.show()
2
'''2.小瑶是一家酒店的董事长,由于她对计算机行业相当感兴趣,想借助计算机来解决财务上的问题,目前正在自学数据处理的相关知识,她现在有问题难住了,
所以想求助计算机专业毕业的你,现在你帮她解决一下吧。'''
'''(1)使用numpy中的随机函数创建一个csv图表,图表一共分为5列10000行,
各列名称依次为:index, count, class, normal_distribution, 0-1,
分别代表 :序号, 统计数据,类别, 正态分布数据, 0-1数据,
其中count的数据范围在0-10000,class的数据范围为[1,2,3,4,5],
normal_distribution的数据范围为0-10000,0-1的数据范围为[0,1],将创建的csv保存'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = {'index': np.arange(1, 10001),
'count': np.random.randint(0, 10001, size=10000),
'class': np.random.choice([1, 2, 3, 4, 5], size=10000),
'normal_distribution': np.random.normal(0, 10000, 10000),
'0-1': np.random.rand(10000)}
df = pd.DataFrame(data)
df.to_csv(r"E:\I\feishu\02.csv")
'''(2)从创建的图表里读取数据,根据normal_distribution列画出画出正态分布的图像'''
plt.figure(figsize=(10, 5))
plt.hist(df['normal_distribution'], bins=100)
plt.xlabel('x')
plt.ylabel('y')
plt.title('normal_distribution')
plt.show()
'''(3)从创建的图表里读取数据,根据class列中各类的数量画饼图,并标注各类占比'''
class_counts = df['class'].value_counts()
plt.figure(figsize=(5, 5))
plt.pie(class_counts, labels='class', autopct='%1.1f%%', startangle=60)
plt.title('class_distribution')
plt.savefig(r"D:\python project\ATrain\机械学习\matplotlab图像")
plt.show()
'''(4)从创建的图表离读取数据,根据class和count列画出柱状图,其中y轴为各类的数值(对应count列)总和,x轴为类名称,并在各柱上方标注值'''
class_count_sum = df.groupby('class')['count'].sum()
plt.figure(figsize=(10, 5))
plt.bar(class_count_sum.index, class_count_sum, color='orange')
plt.xlabel('Class')
plt.ylabel('Count sum')
plt.title('count sum of the class')
for i, v in enumerate(class_count_sum):
plt.text(i+1, v+50, str(v), ha='center', va='bottom')
plt.show()
'''(5)从创建的图表离读取数据,根据count列画出各阶段分布直方图,均分为十段'''
plt.figure(figsize=(10, 5))
plt.hist(df['count'], bins=10)
plt.xlabel('count')
plt.ylabel('y')
plt.show()
'''(6)从创建的图表离读取数据,根据0-1列和class列模拟出各场红蓝对决比赛中人们的支持'''
support_rates = df.groupby('class')['0-1'].mean()
plt.figure(figsize=(10, 5))
plt.bar(support_rates.index, support_rates, color=('red', 'blue', 'red', 'blue', 'red'))
plt.xlabel('Class')
plt.ylabel('Support rate')
plt.title('Support rates')
for i, v in enumerate(support_rates):
plt.text(i+1, v+0.01, f'{v:.2f}', ha='center', va='bottom')
plt.show()
3
'''3.刚过完双十一,想必大家或多或少的都满足了自己的物欲。小彭是一名人口普查员,由于我国现在人口出生率直线下降,小彭想从消费者身上下手,
看一看近几年母婴用品购买趋势是,他现在有2019和2020年两年的数据,由于小彭近日比较忙,由你来帮小彭按如下要求分析数据。'''
import pandas as pd
'''(1)将两份dataframe进行轴向合并'''
df_2019 = pd.read_csv(r"C:\Users\I\Desktop\Task:数据处理+图形可视化\数据集3\2019年下半年订单表.csv")
df_2020 = pd.read_csv(r"C:\Users\I\Desktop\Task:数据处理+图形可视化\数据集3\2020年上半年订单表.csv")
df_s = pd.concat([df_2019, df_2020], ignore_index=True)
'''(2)使用groupby()函数,将「订单数据表」按「商品ID」进行分组,「按月采样」计算出订单「数量」的和并赋值给dfSales。'''
dfSales = df_s.groupby(['商品ID', pd.to_datetime(df_s['下单时间']).dt.to_period('M')])['数量'].sum().reset_index()
'''(3)还原索引index赋值给dfnewSales并将"下单时间"这列设置成“年-月”的字符串类型并重新赋值给dfnewSales["下单时间"],处理完数据后保存csv文件'''
dfnewSales = dfSales.copy()
dfnewSales['下单时间'] = dfSales['下单时间'].dt.strftime('%Y-%m')
dfnewSales.to_csv(r"E:\I\feishu\03.csv", index=False)
4
'''4.小李是一名大厂的码农,今天领导给了他一个数据集,让他分析他们所在公司的视频会员订单情况。
你是他带的实习生,所以这个活不小心落到了你头上,希望你能帮他做好这份工作。该数据集中有一些脏数据需要处理,要求如下:'''
'''(1)首先,我们需要读取文件,并对数据集进行格式转换,把其中单位、数据类型不正确的地方,进行简单处理。'''
import pandas as pd
df = pd.read_csv(r"C:\Users\I\Desktop\培训材料\Task:数据处理+图形可视化\数据集4.csv")
'''(2)快速浏览数据集(df.info()),查看数据的一些基本信息'''
df.info()
'''(3)使用恰当的函数判断缺失值'''
missing_values = df.isnull().sum()
'''(4)对缺失值进行恰当的处理,要求:
方法一使用`drop`函数,将payment_provider这一列缺失值的行删除。再用info()函数进行浏览。
方法二payment_provider这一列缺失值用“wxpay”进行填充,再用drop函数进行浏览'''
df_1 = df.dropna(subset=['payment_provider'])
df_1.info()
'''(5)使用isin()函数判断payment_provider这一列的异常值,若有便将其删除。**注:这一列的值仅限于“wxpay""alipay""applepay",若有其他值,则为异常值'''
allowed_values = ["wxpay", "alipay", "applepay"]
df = df[df['payment_provider'].isin(allowed_values)]
'''(6)将处理后的payment_provider中的种类变为One-hot编码,处理完数据后保存csv文件'''
df_one_hot = pd.get_dummies(df['payment_provider'], prefix='payment')
df = pd.concat([df, df_one_hot], axis=1)
df.drop(['payment_provider'], axis=1, inplace=True)
df.to_csv(r"E:\I\feishu\04.csv", index=False)