废话不多说,先上本次我学习的教程链接:Datawhale 数学建模教程
在教程链接中,本次我主要学习了导论第六章内容中的数据预处理、数据规约、数据可视化。还剩下常见的统计分析模型没有细度,将放在后面机器学习时再次重新学习。
本文将对第六章内容中的数据预处理、数据规约、数据可视化分享一些自己的学习心得
一、首先是数据预处理
①使用pandas处理数据
对于数据预处理,首先要处理三种常见的值,分别是:缺失值,重复值,异常值
①对于重复值,对于重复数据直接删除就可以了
②对于缺失值,有多种方法。主要是观察缺失率,如果存在缺失的数据项(数表一行称作一个数据项)占比较少(大概5%以内)这个时候如果问题允许可以把行删掉;如果缺失率稍微高一点(5%-20%)左右就可以使用填充、插值的方法去处理,而填充方法包括常数填充、均值填充等方法;如果缺失率还高一些(20%-40%)那么就需要用预测方法例如机器学习去填充缺失数据了;
③对于异常值,想要找出异常值,常用的方法是通过查看数据的描述性统计信息(如均值、中位数、标准差、分位数等)来识别可能的异常值。或者是使用箱线图直观地查看数据分布和可能的异常值。(异常值在教程的数据可视化部分)异常值通常位于上界和下界之外。
下面以一个例子对数据处理做一个基本解释,在这个例子里我们将学习一些简单的数据处理的代码编写,一共十二步,步骤如下:
(这里先把所有步骤是为了方便后面我自己再敲一遍,毕竟简单的代码还是要会一点的\(^o^)/~)
(1)Python创建一个数据框DataFrame:
(2)显示该 DataFrame 及其数据相关的基本信息
(3)返回DataFrame df 的前5列数据:
(4)从 DataFrame df
选择标签列为 animal
和 age
的列
(5)在 [3, 4, 8]
行中,列为 ['animal', 'age']
的数据
(6)选择列为visits
中等于3的行
(7)选择 age
为缺失值的行
(8)选择 animal
是cat且age
小于 3 的行
(9)选择 age
在 2 到 4 之间的数据(包含边界值)
(10)将 'f' 行的 age
改为 1.5
(11)对 visits
列的数据求和
(12)计算每种 animal
age
的平均值
首先创建一个数据框,并显示该 DataFrame 及其数据相关的基本信息
代码如下:
import pandas as pd
import numpy as np
data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df = pd.DataFrame(data)
df
结果如图所示:
接下来需要返回DataFrame df 的前5列数据
代码如下:
df.head(5)
结果如图:
接着把animal和age列提取出来
df[['animal','age']]
接着提取3,4,8行的animal和age
df.loc[[3,4,8],['animal','age']]
接着提取visits=3的行数
df.loc[df['visits']==3,:]
下一步提取出age列中所有缺失值的行
这边要注意一下,在python0.25版本之前isna是不能用来挑选NaN的,要用isnull
df.loc[df['age'].isnull(),:]
选择 animal 是cat且age 小于 3 的行
df.loc[(df['animal'] == 'cat') & (df['age'] < 3), :]
选择 age 在 2 到 4 之间的数据(包含边界值)
df.loc[(df['age']>=2)&(df['age']<=4), :]
将 'f' 行的 age 改为 1.5
df.index = labels
df.loc[['f'], ['age']] = 1.5
df
结果如图所示
下一步求visits列的和
df['visits'].sum()
分别求出cat、dog、snake的平均数
df.groupby(['animal'])['age'].mean()
上面的这十二步只是简单的步骤,接下来还需要学习处理一些特定的任务,如:数据去重、填补缺失值等等。
下面以这个代码为例
import pandas as pd
import numpy as np
# (1) 创建pandas dataframe
df = pd.DataFrame({'From_To': ['LoNDon_paris', 'MAdrid_miLAN', 'londON_StockhOlm',
'Budapest_PaRis', 'Brussels_londOn'],
'FlightNumber': [10045, np.nan, 10065, np.nan, 10085],
'RecentDelays': [[23, 47], [], [24, 43, 87], [13], [67, 32]],
'Airline': ['KLM(!)', '<Air France> (12)', '(British Airways. )',
'12. Air France', '"Swiss Air"']})
# (2) 填充FlightNumber列中的缺失值
df['FlightNumber'] = df['FlightNumber'].interpolate().astype(int)
# (3) 将列From_To拆分成两列From和To
temp = df['From_To'].str.split("_", expand=True)
temp.columns = ['From', 'To']
# (4) 将列From和To转化成只有首字母大写的形式
temp['From'] = temp['From'].str.capitalize()
temp['To'] = temp['To'].str.capitalize()
# (5) 将列From_To从df中去除,并把列From和To添加到df中
df.drop('From_To', axis=1, inplace=True)
df[['From', 'To']] = temp
# (6) 清除列中的特殊字符,只留下航空公司的名字
df['Airline'] = df['Airline'].str.extract(r'([a-zA-Z\s]+)', expand=False).str.strip()
# (7) 展开Series列表为名为delays的DataFrame,并替换df中的RecentDelays列
delays = df['RecentDelays'].apply(pd.Series)
delays.columns = ['delay_%s' % i for i in range(1, len(delays.columns)+1)]
df = df.drop('RecentDelays', axis=1).join(delays, how='left')
# (8) 将delay_i列的缺失值都填为自身的平均值
for i in range(1, 4):
df[f'delay_{i}'] = df[f'delay_{i}'].fillna(np.mean(df[f'delay_{i}']))
# (9) 在df中增加一行,值与FlightNumber=10085的行保持一致
#df = df._append(df.loc[df['FlightNumber'] == 10085, :], ignore_index=True)
#上面这个是错的
# (9) 在df中增加一行,值与FlightNumber=10085的行保持一致
df = df.append(df.loc[df['FlightNumber'] == 10085], ignore_index=True)
# (10) 对df进行去重
df = df.drop_duplicates()
df
结果如图所示
二、数据的规约
这里介绍两种比较经典的规约方式:min-max规约和Z-score规约。
(因为公式不好编写所以我直接截图了)
首先是min-max:
公式如下:
目的:这一操作的目的是为了消除量纲影响,所有的属性都被规约到[0,1]的范围内,数据的偏差不会那么大。但是如果出现异常值,比如非常大的数值,那么这个数据的分布是有偏的。
接着是Z-score
公式如下:
目的:本质上,一列数据减去其均值再除以标准差,如果这一列数据近似服从正态分布,这个过程就是化为标准正态分布的过程。
PS:Z-score规约和min-max规约往往不是二者取其一,有时候两个可以组合起来用。除此以外,还有很多的规约方法,但是这两种最为常用。
用上面的案例为例代码如下:
import pandas as pd
import numpy as np
# 创建数据
data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df = pd.DataFrame(data)
# 填充age列中的缺失值
df['age'] = df['age'].interpolate().astype(int)
# Min-Max 规约
df_min_max_age_1 = (df['age'] - df['age'].min()) / (df['age'].max() - df['age'].min())
df_min_max_visits_1 = (df['visits'] - df['visits'].min()) / (df['visits'].max() - df['visits'].min())
# Z-score 规约
df_z_score_age_2 = (df['age'] - df['age'].mean()) / df['age'].std()
df_z_score_visits_2 = (df['visits'] - df['visits'].mean()) / df['visits'].std()
# Min-Max 规约的 DataFrame
df_min_max = df.copy()
df_min_max['age'] = df_min_max_age_1
df_min_max['visits'] = df_min_max_visits_1
# Z-score 规约的 DataFrame
df_z_score = df.copy()
df_z_score['age'] = df_z_score_age_2
df_z_score['visits'] = df_z_score_visits_2
print(df_min_max)
print(df_z_score)
结果如图所示:
或者可以使用sklearn方法
# 创建pandas dataframe
import pandas as pd
import numpy as np.
df = pd. DataFrame(f'age' : [2.5, 3, 0.5, np.nan, 5, 2, 4.5,_np.nan, 7, 3],
'visits':[1,3,2,3,2,3,1,1,2,i])
df
# min-max规约
from sklearn. preprocessing import MinMaxScaler
scaler = MinMaxScaler() #创建 MinMaxScaler 实例
df[['age', 'visits'J] = scaler.fit_transform(df[['age', 'visits'J]) #对选定的列进行拟合和转换
df
# 创建pandas dataframe
import pandas as pd
import numpy as np
df = pd. DataFrame(t'age' : [2.5, 3, 0.5, np.nan, 5, 2, 4. 5,_np.nan, 7, 3],
visits':[1,3,2,3,2,3,1,1,2,i}))
df
# Z-score规约
from sklearn. preprocessing import StandardScaler
scaler = StandardScaler O # 创建 StandardScaler 实例
df[['age', 'visits' J] = scaler.fit_transform(df[['age', 'visits'J]) #对选定的列进行拟合和转换
df
三、数据可视化
在python中有三种常用的画图工具库,Matplotlib,Seaborn,Plotnine
(这边在教程里已经写的比较清楚了,这三个库的大致用法也已经写清楚了,由于内容比较多这里我就不再赘述,在这里我主要推荐一本书Python数学实验第三节,我之前学数据可视化的时候记得最早是跟着这本书的内容学的,跟着把代码都敲了一遍之后就对基本的画图有了初步理解)
在教程中有着很多的画图教程,对于想要认真动手画一遍图形的同学可以直接跟着教程做一遍。在我自己本篇的学习心得中我就不再过多赘述,到了比赛中我觉得在数据可视化的这个过程中最重要的还是根据数据表格画出自己需要的图形,而知道了自己要画什么图,后面具体要怎么实现就交给ai啦嘿嘿(实际还是我比较懒,教程太多画图内容了,我就不一一写出来啦)
最后简单总结一下,这次对于数学建模导论的第六章内容,我主要学习了数据预处理、数据规约、数据可视化,对于我后续建模时对这部分有了一个基本的了解,当然比如中间的异常值处理还有一些常见的画图,我在心得中并没有一一写出来,只是谈了谈我学习的部分内容(有很大一部分也是我比较懒,没有全写出来嘿嘿)想要更加系统的学这部分,还是需要结合教程还有网上的相关资料,后面对于经典的一些统计模型只是粗略的看了看还有部分没有细度,这部分准备放到机器学习那边再一起学习。其余就不多说啦,总之看教程就对咯~