python学习

第一周: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()默认获取
dataframe.reset_index(drop = False)
前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、文件读取与文件存储

数据类型读取文件存储文件
textCSVread_csvto_csv
textJSONread_jsonto_json
textHTMLread_htmlto_json
textLocal clipboardread_clipboardto_clipboard
binaryMS Excelread_excelto_excel
binaryHDF5 Formatread_hdfto_hdf
binaryFeather Formatread_featherto_feather
binaryParquet Formatread_parquetto_parquet
binaryMsgpackread_msgpackto_msgpack
binaryStataread_statato_stata
binarySASread_sas--
binaryPython Pickle Formatread_pickleto_pickle
SQLSQLread_sqlto_sql
SQLGoogle Big Queryread_gbpto_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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值