机器学习部分所学

常用的工具有:

工具作用
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.除了画图,也得注意一下运算,统计指标,布尔赋值啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值