机器学习
pandas 的基本使用
Series
基础语法
Series
是一种一维数组,与Numpy
中的一维array
类似。Pandas
的 Series
能存放各种不同类型的对象,Series
能为数据自定义标签,也就是索引(index)
,然后通过索引来访问数组中的数据。
模块导入:
1 | import numpy as np |
基础语法:
1 | s = pd.Series(data,index) |
举一个例子:
1 | index = ['中国','美国','日本'] |
它所展现的形式如下:
data | index |
---|---|
100 | 中国 |
200 | 美国 |
300 | 日本 |
对 Series 进行算术运算操作
基于 index
进行的。我们可以用加减乘除$(+ - * /)$这样的运算符对两个 Series
进行运算,Pandas
将会根据索引 index
,对响应的数据进行计算,结果将会以浮点数的形式存储,以避免丢失精度。如果 Pandas
在两个Series
里找不到相同的 index
,对应的位置就返回一个空值 NaN
。
DataFrame
DataFrame
:二维的表格型数据结构。很多功能与R
中的data.frame
类似。可以将DataFrame
理解为Series
的容器。
DataFrame
是一个二维标记的数据结构,可以具有不同类型的列。您可以将其视为电子表格或SQL
表,或序列对象的dict
。它通常是最常用的pandas
对象。与系列一样,DataFrame
接受多种不同类型的输入:
- 一维
ndarray
的dict
,lists
,dicts
,or Series
- 二维
numpy.ndarray
- 结构化或记录
ndarray
A Series
Another DataFrame
创建
- 用多个
Series
创建
1 | df = {'Name':pd.Series(data,index), |
- 用一个字典来创建
DataFrame
其实这个和上面哪个差不多
基本操作
下面演示全部用这个数据来表示
1 | data = { |
形状如下:
name | price |
---|---|
性价比 | 小米 |
爱国 | 华为 |
奢侈品 | 苹果 |
获取列
my_df['name']
会输出
1 | 性价比 小米 |
如果想要获取多个列
my_df['name','price']
添加新列
和dict的添加方法基本类似
my_df['like'] = [1,2,3]
形状如下:
name | price | like |
---|---|---|
性价比 | 小米 | 1000 |
爱国 | 华为 | 2000 |
奢侈品 | 苹果 | 3000 |
- 当然也可以用已经存在的列添加
my_df['txt'] = my_df['price'] + my_df['like']
删除列或者行
想要删除某一行或一列,可以用 drop()
函数。在使用这个函数的时候,你需要先指定具体的删除方向,axis=0
对应的是行 row
,而 axis=1
对应的是列 column
。
举一个例子:
my_df.drop('like', axis=1,inplace=True)
这里就把like
这一列给删掉了
为了防止用户误操作丢失数据,在调用 drop()
的时候,Pandas
并不会真的永久性地删除这行/列。可以通过调用 df
来确认数据的完整性(df就可以显示未永久删除的)。如果你确定要永久性删除某一行/列,你需要加上
获取 DataFrame 中的一行或多行数据
其实就是使用loc
和iloc
loc
通过按索引(或标签名)引用
iloc
按这行在表中的位置(行数(以0开始))来引用
举一个例子:
my_df.loc['性价比']
结果如下:
1 | name 小米 |
my_df.iloc[0]
结果和上面一样
同时你可以用 loc[] 来指定具体的行列范围,并生成一个子数据表。比如,提取 ‘性价比’ 行中 name
列的内容 ----> 小米
my_df.loc['性价比','name']
提取多个
my_df.loc[['性价比','爱国'],['name','price']]
结果如下:
1 | name price |
条件筛选
用中括号 [] 的方式,除了直接指定选中某些列外,还能接收一个条件语句,然后筛选出符合条件的行/列。
my_df[my_df['like'] == 1]
结果如下
1 | name price like |
重置并设置DataFrame 的索引
1 | df.reset_ () |
和删除操作差不多,.reset_index()
并不会永久改变你表格的索引,除非你调用的时候明确传入了 inplace
参数,比如:.reset_index(inplace=True)
然后用 .set_index()
方法,将 DataFrame
里的某一列作为索引来用。
注意,不像
.reset_index()
会保留一个备份,然后才用默认的索引值代替原索引,.set_index()
将会完全覆盖原来的索引值。
数据处理
缺失值的处理
在许多情况下,如果你用 Pandas
来读取大量数据,往往会发现原始数据中会存在不完整的地方。在 DataFrame
中缺少数据的位置, Pandas
会自动填入一个空值NAN
缺失值的删除:
.dropna()
来丢弃这些自动填充的值,当你使用.dropna()
方法时,就是告诉Pandas
删除掉存在一个或多个空值的行(或者列)。删除行用的是.dropna(axis=0)
,删除列用的是.dropna(axis=1)
,默认axis = 0
。
缺失值的填充:
.fillna()
来自动给这些空值填充数据,使用.fillna()
方法,Pandas
将对这个DataFrame
里所有的空值位置填上你指定的默认值。
同样地,
.dropna()
方法 和.fillna()
方法并不会永久性改变你的数据,除非你传入了inplace=True
参数。
分组统计
Pandas
的分组统计功能可以按某一列的内容对数据行进行分组,并对其应用统计函数,比如求和,平均数,中位数,标准差等
用 .groupby()
方法,我们可以按 xxx
列进行分组,并用 .mean()
求每组的平均值,用 .count()
方法,能对 DataFrame
中的某个元素出现的次数进行计数
数据描述
.describe()
方法将对 DataFrame
里的数据进行分析,并一次性生成多个描述性的统计指标,方便用户对数据有一个直观上的认识。生成的指标,从左到右分别是:计数、平均数、标准差、最小值、25% 50% 75% 位置的值、最大值。用 .transpose()
方法获得一个竖排的格式
其他操作
-
堆叠(Concat)
堆叠基本上就是简单地把多个DataFrame
堆在一起,拼成一个更大的DataFrame
。当你进行堆叠的时候,堆叠时要注意数据表的索引和列的延伸方向,堆叠的方向要和它一致。
默认按行的方向堆叠,把每个表的索引按顺序叠加。
按列的方向堆叠,那你需要传入axis=1
参数 -
归并(Merge)
使用pd.merge()
函数,能将多个DataFrame
归并在一起,它的合并方式类似合并SQL
数据表的方式
1 | pd.merge(left, right, how='inner', on='Key') |
-
连接(Join)
若要把两个表连在一起,然而它们之间没有太多共同的列,可以选择使用.join()
方法。和.merge()
不同,连接采用索引作为公共的键,而不是某一列。
同样inner
表示内连接,取交集”,outer
外连接,取并集,并用nan
填充”,left
左连接, 左侧取全部,右侧取部分”,right
右连接,左侧取部分,右侧取全部” -
查找不重复的值
.unique()
方法.nunique()
方法,获取所有不重复值的个数.value_counts()
同时获得所有值和对应值的计数
- apply() 方法
.apply()
方法,可以对DataFrame
中的数据应用自定义函数,进行数据处理。通常使用lambda
获取 DataFrame 的属性
DataFrame
的属性包括列和索引的名字。假如你不确定表中的某个列名是否含有空格之类的字符,你可以通过 .columns
来获取属性值,以查看具体的列名。
排序(sort)
.sort_values()
将整个表按某一列的值进行排序
查找空值
数据集很庞大时,使用用 Pandas
的 .isnull()
方法,方便快捷地发现表中的空值。
该方法返回的是一个新的
DataFrame
,里面用布尔值(True/False)
表示原DataFrame
中对应位置的数据是否是空值。
数据透视表
使用 Excel
的时候,有数据透视表的功能,同样,pandas
也有。数据透视表是一种汇总统计表,它展现了原表格中数据的汇总统计结果。Pandas
的数据透视表能自动帮你对数据进行分组、切片、筛选、排序、计数、求和或取平均值,并将结果直观地显示出来。
1 | df .pivot_table(data, values='', index=[''], columns=['']) |
导入导出数据(文件操作)
pd.read_
这样的方法,你可以用 Pandas
读取各种不同格式的数据文件,包括 Excel 表格、CSV 文件、SQL 数据库,甚至 HTML 文件等。
- 读写 CSV 文件
pd.read_csv()
就能将CSV
文件里的数据转换成DataFrame
对象
.to_csv()
,DataFrame
对象存入csv
文件
不希望Pandas
把索引写入加上index=False
即可 - 读写 Excel 表格文件
pd.read_excel()
,能将Excel
表格中的数据导入Pandas
中。但是请注意,Pandas 只能导入表格文件中的数据,其他对象,例如宏、图形和公式等都不会被导入。如果文件中存在有此类对象,可能会导致 pd.read_excel() 方法执行失败
写入CSV
文件类似,我们可以将一个DataFrame
对象存成.xlsx
文件,语法是.to_excel()
数据结构以及操作——时间序列(Time- Series)
1 | pandas.date_range(start=None, end=None, periods=None, freq=‘D’, tz=None, normalize=False, name=None,closed=None, **kwargs) |
利用CNN模型实现MNIST图像分类
1 | import numpy as np |
利用CNN模型实现人马分类
1 | import numpy as np |
利用PyTorch框架,使用R-CNN模型,在生活垃圾数据集上完成目标检测任务
这些是导入必要的库和模块。warnings.filterwarnings(‘ignore’)用于忽略警告信息。
1 | import os |
自定义的数据集类TrashDataset,用于加载和预处理图像及其对应的标注数据。
1 | # 数据预处理类 |
定义了一个数据转换管道,将图片转换为Tensor格式
1 | # 数据转换 |
定义了一个collate_fn函数,用于DataLoader在批处理数据时的处理方式
1 | # 定义collate_fn函数 |
加载数据集
1 | # 加载数据集 |
将数据集划分为训练集和验证集,80%用于训练,20%用于验证
1 | # 划分数据集 |
创建DataLoader用于加载训练和验证数据,batch_size设置为2
1 | train_loader = DataLoader(train_dataset, batch_size=2, shuffle=True, collate_fn=collate_fn) |
加载预训练的Faster R-CNN模型,并将其分类器调整为输出2个类别(垃圾和背景)
1 | # 加载预训练的Faster R-CNN模型并微调 |
将模型移动到GPU(如果可用)或CPU上
1 |
|
定义优化器,这里使用Adam优化器,也可以选择使用SGD优化器
1 | # 优化器 |
训练循环,遍历每个epoch和batch,计算损失并进行反向传播和优化
1 | # 训练循环 |
定义一个可视化函数,显示模型在验证集上的预测结果,绘制边界框和置信度分数
1 | # 定义可视化函数 |
完整代码
1 | import os |