常用的工具有:
工具 | 作用 |
---|---|
matplotlib | 画图工具 |
numpy | 表格处理工具 |
padas | 信息处理工具 |
一,Matplotlib工具
基本统计图
-
折线图
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.show()
-
散点图
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.show()
-
柱状图
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.show()
举个例子(题目同饼图)
使用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保存
(1)从创建的图表里读取数据,根据class列中各类的数量画饼图,并标注各类占比
(2)从创建的图表离读取数据,根据class和count列画出柱状图,其中y轴为各类的数值(对应count列)总和,x轴为类名称,并在各柱上方标注值
(2):双色柱状图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import norm
index=np.arange(1,10001)
num_rows=10000
count=np.random.randint(0, high = 10001,size = 10000,dtype = 'i')
b=np.random.choice([1, 2, 3, 4, 5], 10000)
normal_distribution=np.random.randint(0, high = 10000,size = 10000,dtype = 'i')
a= np.random.rand(num_rows)
data = {
"index": index,
"count": count,
"class": b,
"normal_distribution": normal_distribution,
"0-1": a
}
#将创建的csv保存
df1 = pd.DataFrame(data)
df1.to_csv(r'D:\python feishu zuoye\frame.csv',index = False)
#3.从创建的图表离读取数据,根据class和count列画出柱状图,其中y轴为各类的数值(对应count列)总和,x轴为类名称,并在各柱上方标注值
data = pd.read_csv(r'D:\python feishu zuoye\frame.csv')
df = pd.DataFrame(data)
df.to_csv(r'D:\python feishu zuoye\frame.csv',index = False)
plt.rcParams["font.sans-serif"] = ["SimHei"]
class_sum = df.groupby('class')['count'].sum()
plt.figure(figsize=(10,7))
class_sum.plot(kind='bar',color='green',edgecolor='black')
plt.title('各类别总计柱状图',fontsize='20')
plt.xlabel('类别',fontsize='15')
plt.ylabel('总数',fontsize='15')
plt.yticks(np.linspace(0,10000000, 11))
plt.tick_params(labelsize=15)
for a, b in enumerate(class_sum): #标记每列数值
plt.text(a, b, str(b),ha='center',va='bottom',fontsize=12)
plt.show()
-
直方图
import matplotlib.pyplot as plt
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.show()
-
饼图
举个例子(题目同柱状图)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import norm
index=np.arange(1,10001)
num_rows=10000
count=np.random.randint(0, high = 10001,size = 10000,dtype = 'i')
b=np.random.choice([1, 2, 3, 4, 5], 10000)
normal_distribution=np.random.randint(0, high = 10000,size = 10000,dtype = 'i')
a= np.random.rand(num_rows)
data = {
"index": index,
"count": count,
"class": b,
"normal_distribution": normal_distribution,
"0-1": a
}
#将创建的csv保存
df1 = pd.DataFrame(data)
df1.to_csv(r'D:\python feishu zuoye\frame.csv',index = False)
#2.根据class列中各类的数量画饼图,并标注各类占比
n=pd.read_csv(r'D:\python feishu zuoye\frame.csv',sep = ',',usecols = ['class'])
print(n.head())
import matplotlib.pyplot as plt
df2 = pd.DataFrame(data)
df2.to_csv('random_data.csv', index=False)
df2 = pd.read_csv('random_data.csv')
plt.figure(figsize=(12, 6))
plt.pie(df2['class'].value_counts(), labels=df2['class'].unique(), autopct='%1.1f%%')
plt.title('Distribution of Class')
plt.xlabel('Class')
plt.ylabel('Percentage')
plt.show()
基本语句
1.导入库
import matplotlib.pyplot as plt
2.创建画布
注意:后面的matplotlib.pyplot均代指画布名称
plt.figure(figsize = (a,b),dpi = )
figsize:指图像的长(a)宽(b) dpi:图像清晰度(越大越清晰)
3.绘制图像
plt.plot(x,y.color = '',linestyle = '',marker = '',linestyle='',label='')
x:横轴数据
y:纵轴数据
color:图像颜色,可以直接输入英文名称,或者是RGB颜色值
linewidth:线条宽度
marker: 标记风格
linestyle: 线条样式
label:图例
4.常用color
颜色 | 说明 | 颜色 | 说明 |
---|---|---|---|
r | 红色 | g | 绿色 |
b | 蓝色 | w | 白色 |
c | 青色 | m | 洋红 |
y | 黄色 | k | 黑色 |
5.标记风格
标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|
'.' | 点标记 | ',' | 像素标记(极小点) |
'v' | 倒三角标记 | ’^‘ | 上三角标记 |
'>' | 右三角标记 | '<' | 左三角标记 |
'1' | 下花三角标记 | '2' | 上花三角标记 |
'3' | 左花三角标记 | '4' | 右花三角标记 |
'o' | 实心圈标记 | 's' | 实心方形标记 |
'p' | 实心五角标记 | '*' | 星形标记 |
'h' | 竖六边形标记 | 'H' | 横六边形标记 |
'+' | 十字标记 | 'x' | x标记 |
'D' | 菱形标记 | 'd' | 瘦菱形标记 |
6.线条样式
样式 | 说明 |
---|---|
’-‘ | 实线 |
’--‘ | 虚线 |
’-.‘ | 点划线 |
':' | 点虚线 |
7.添加自定义x,y刻度
plt.xticks(x,rotation=,fontsize=)
plt.yticks(y,rotation=,fontsize=)
x:要显示的刻度值
y:要显示的刻度值
rotation:旋转角度
fontsize:字体大小
注意:在传递进去的第一个参数必须是数字,不能是字符串,如果是字符串需要进行替换操作
8.设置x,y标签和标题
plt.xlabel(,fontsize=)
plt.ylabel(,fontsize=)
plt.title(,fontsize=)
9.添加网格显示
plt.grid(True,linestyle=,alpha=)
alpha:代表透明度
10.设置图例位置
plt.legend(loc=)
loc:图例所在位置
loc位置表
位置 | 描述 | 对应数字 |
---|---|---|
best | 最佳位置 | 0 |
upper right | 右上方 | 1 |
upper left | 左上方 | 2 |
lower left | 左下方 | 3 |
lower right | 右下方 | 4 |
right | 右边 | 5 |
center left | 中间左边 | 6 |
center right | 中间右边 | 7 |
lower center | 下方中间 | 8 |
upper center | 上方中间 | 9 |
center | 正中心 | 10 |
11.设置画板多图
matplotlib.pyplot.add_subplot(nrows,ncols,**fig_kw)
nrows:第几行
ncols:第几列
**fig_kw:代表第几个图
12.图像保存
plt.savefig(path_or_buffer)
path_or_buffer:文件地址 注意:图像保存需要放在显示图像的前面,因为plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片
13.显示图像
plt.show()
14.中文显示问题
在图像中设置刻度标签中有汉字,但汉字显示不出来的情况(通常显示为[]),这是因为没有装'SimHei'字体 解决办法: 在导入库后填上如下代码
plt.rcParams['font.sans-serif'] = ['SimHei']
二,Numpy工具
1.导入库
import numpy as np
2.创建ndarray
注意:后面的ndarray均代指对象名称
data = np.array()
上面的构造器接受以下参数:
序号 | 参数及描述 |
---|---|
1. | object 任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。 |
2. | dtype 数组的所需数据类型,可选。 |
3. | copy 可选,默认为true ,对象是否被复制。 |
4. | order C (按行)、F (按列)或A (任意,默认)。 |
5. | subok 默认情况下,返回的数组被强制为基类数组。 如果为true ,则返回子类。 |
6. | ndmin 指定返回数组的最小维数。 |
3.基本方法
名称 | 作用 |
---|---|
data.shape | 查看数组的维度(以元组的形式输出) |
data.ndim | 查看数组维数 |
data.size | 查看数组中的元素数量 |
data.itemsize | 查看一个数组元素的长度 |
data.dtype | 查看数组元素的类型 |
4.生成固定范围内的数组
1.np.linspace
np.linspace(start, stop, num, endpoint)
创建等差数组,指定数量(步长自动计算)
start:序列的起始值
stop:序列的结束值
num:要生成的等间隔样例数量,默认为50
endpoint:序列中是否包含stop值,默认为true
2.np.arange
np.arange(start,stop,step,dtype)
创建等差数组,指定步长(数量自动计算)
step:步长,默认为1
3.np.logspace
np.logspace(start,stop,num)
创建等比数组,生成以10的N次幂的数据
num:要生成的等比数组数量,默认为50
5.生成随机数组
1.np.random模块
导入库
import random
-
正态分布
第一种: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)
返回指定形状的标准正态分布的数组
-
均匀分布
第一种: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)之间随机整数
6.数组索引,切片
通过索引将数组进行切片,其切片方式与列表相似
data[a:b,c:d]
注意:这里的数组切片遵循的规律是先行后列
三,pandas工具
-
导入库
import pandas as pd
三种主要的数据结构
数据结构 | 描述 |
---|---|
Series | 一维数据结构 |
DataFrame | 二维数据结构 |
MultiIndex | 三维数据结构 |
Panel | 三维数据结构(MultiIndex老版本) |
-
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 | 获取每一列的非空元素个数 |
1.DataFrame索引设置
(1).修改行列索引值
data.index = new_index
data.columns = new_columns
注意:修改索引值不能单个修改,必须整体修改
(2).重设索引
dataframe.reset_index(drop = False)
设置新的下标索引
drop:默认为False,不删除原来索引,如果为True,删除原来索引值
(3).以某列值设置为新的索引
dataframe.set_index(keys,drop = True)
keys:列索引命或者列索引名称的列表
drop:bool值默认为True,当做新的索引,删除原来的列
注意:行索引的修改与重设类似列索引
-
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转换成数据图类型
CSV(文件的读取与储存)
1. read_csv
pd.read_csv(filepath_or_buffer,sep = ',',usecols = None)
filepath_or_buffer:文件路径
sep:分隔符,默认用','隔开
usecols:指定读取的列名,列表形式
2. to_csv
dataframe.to_csv(path_or_buffer=None,sep = ',',columns = None,header = True,index = True,mode = 'w',encoding = None)
path_or_buf:文件路径 sep:分隔符,默认用','隔开
columns:选择需要的列索引
header:是否写进列索引值
index:是否写进行索引值
mode:'w':重写,'a':追加
#具体应用可以参考之前饼图的题目
四,典型练习题
numpy
题目一: 问题: 创建一个形状为 (3, 4) 的二维数组,并将所有元素初始化为随机整数值。然后计算数组中每一列的平均值。
答案:
import numpy as np
# 创建形状为 (3, 4) 的二维数组
arr = np.random.randint(1, 10, size=(3, 4))
# 计算每一列的平均值
column_means = np.mean(arr, axis=0)
print("二维数组:\n", arr)
print("每一列的平均值:", column_means)
题目二: 问题: 给定一个一维数组,找出数组中的奇数元素,并将其替换为该元素的平方值。
答案:
import numpy as np
# 创建一维数组
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 找出奇数元素并替换为平方值
arr[arr % 2 != 0] = arr[arr % 2 != 0] ** 2
print("处理后的数组:", arr)
题目三: 问题: 创建一个包含 10 个元素的一维数组,元素的值是从 0 到 9(包含)的整数,然后将数组中的奇数位置元素进行逆序排列。
答案:
import numpy as np
# 创建一维数组
arr = np.arange(10)
# 将奇数位置元素逆序排列
arr[1::2] = arr[1::2][::-1]
print("处理后的数组:", arr)
题目四: 问题: 创建一个形状为 (5, 5) 的二维数组,其中对角线上的元素为 1,其余元素为 0。
答案:
import numpy as np
# 创建形状为 (5, 5) 的二维数组
arr = np.eye(5)
print("二维数组:\n", arr)
题目五: 问题: 给定两个形状分别为 (3, 4) 和 (4, 3) 的二维数组,计算它们的矩阵乘积。
答案:
import numpy as np
# 创建两个二维数组
arr1 = np.random.randint(1, 10, size=(3, 4))
arr2 = np.random.randint(1, 10, size=(4, 3))
# 计算矩阵乘积
result = np.dot(arr1, arr2)
print("第一个矩阵:\n", arr1)
print("第二个矩阵:\n", arr2)
print("矩阵乘积:\n", result)
pandas
题目一: 问题: 给定以下字典数据,创建一个 Pandas DataFrame,并显示只包含 "Name" 和 "Age" 列的子集。
import pandas as pd data = { 'Name': ['Alice', 'Bob', 'Charlie', 'David'], 'Age': [25, 30, 22, 35], 'City': ['New York', 'San Francisco', 'Los Angeles', 'Chicago'] }
答案:
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 22, 35],
'City': ['New York', 'San Francisco', 'Los Angeles', 'Chicago']
}
# 创建DataFrame
df = pd.DataFrame(data)
# 显示只包含 "Name" 和 "Age" 列的子集
subset_df = df[['Name', 'Age']]
print(subset_df)
题目二: 问题:用上题的数据字典字典数据,创建一个 Pandas Series,并计算每个城市的平均年龄。
答案:
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 22, 35],
'City': ['New York', 'San Francisco', 'Los Angeles', 'Chicago']
}
# 创建DataFrame
df = pd.DataFrame(data)
# 计算每个城市的平均年龄
average_age_by_city = df.groupby('City')['Age'].mean()
print(average_age_by_city)
题目三: 问题: 给定一个包含学生考试成绩的 DataFrame,筛选出所有数学成绩大于 80 分且英语成绩大于 75 分的学生记录。
import pandas as pd data = { 'Student': ['Alice', 'Bob', 'Charlie', 'David'], 'Math': [85, 90, 78, 88], 'English': [76, 82, 80, 88] }
答案:
import pandas as pd
data = {
'Student': ['Alice', 'Bob', 'Charlie', 'David'],
'Math': [85, 90, 78, 88],
'English': [76, 82, 80, 88]
}
# 创建DataFrame
df = pd.DataFrame(data)
# 筛选条件
filtered_df = df[(df['Math'] > 80) & (df['English'] > 75)]
print(filtered_df)
题目四: 问题: 给定一个包含订单信息的 DataFrame,计算每个客户的总订单金额,并将结果按降序排列。
import pandas as pd data = { 'Customer': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob', 'David'], 'OrderAmount': [100, 150, 200, 120, 180, 130] }
答案:
import pandas as pd
data = {
'Customer': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob', 'David'],
'OrderAmount': [100, 150, 200, 120, 180, 130]
}
# 创建DataFrame
df = pd.DataFrame(data)
# 计算每个客户的总订单金额并按降序排列
total_order_amounts = df.groupby('Customer')['OrderAmount'].sum().sort_values(ascending=False)
print(total_order_amounts)
题目五: 问题: 给定一个包含日期和销售额的 DataFrame,计算每个月的平均销售额。
import pandas as pd import numpy as np # 创建包含日期和销售额的 DataFrame date_rng = pd.date_range(start='2023-01-01', end='2023-03-31', freq='D') sales_data = { 'Date': date_rng, 'Sales': np.random.randint(1000, 5000, size=(len(date_rng))) }
答案:
import pandas as pd
import numpy as np
# 创建包含日期和销售额的 DataFrame
date_rng = pd.date_range(start='2023-01-01', end='2023-03-31', freq='D')
sales_data = {
'Date': date_rng,
'Sales': np.random.randint(1000, 5000, size=(len(date_rng)))
}
# 创建DataFrame
df = pd.DataFrame(sales_data)
# 计算每个月的平均销售额
df['Month'] = df['Date'].dt.to_period('M')
average_sales_by_month = df.groupby('Month')['Sales'].mean()
print(average_sales_by_month)
Ps.一些不太会的东西
1.记得看看第三周的作业——Task:数据处理+图形可视化,基本思路都差不多,还有那个双色的 柱状图。。。
2.numpy 的形状修改和类型修改,数组运算
pandas的高级数据处理
3.除了画图,也得注意一下运算,统计指标,布尔赋值啊