数学建模中的数据预处理问题(Python语言)
以2023年C题的数据处理为例
数据读取
常见的数据集有两种,可能是.csv文件或者.xlsx文件。这里用的是.csv文件。
.csv文件的数据读取
import pandas as pd
# 文件路径
file_path1 = '附件1.csv' # 使用逗号分隔的文件
file_path2 = '附件2.csv' # 使用空格分隔的文件
file_path3 = '附件3.csv' # 使用空格分隔的文件
file_path4 = '附件4.csv' # 使用逗号分隔的文件
# 读取附件1和附件4,使用逗号分隔
df1 = pd.read_csv(file_path1, encoding='utf-8') # 读取附件1
df4 = pd.read_csv(file_path4, encoding='utf-8') # 读取附件4
# 读取附件2和附件3,使用空格分隔
df2 = pd.read_csv(file_path2, sep='\s+', encoding='utf-8') # 读取附件2
df3 = pd.read_csv(file_path3, sep='\s+', encoding='utf-8') # 读取附件3·
上面代码是通过pandas库读取了.csv文件,同时读取了两类文件(使用逗号分割的和使用空格分割的)
对于.xlsx文件的读取
import pandas as pd
# 指定Excel文件的路径
file_path1 = '附件1.xlsx'
file_path2 = '附件2.xlsx'
file_path3 = '附件3.xlsx'
file_path4 = '附件4.xlsx'
# 读取Excel文件
df1 = pd.read_excel(file_path1)
df2 = pd.read_excel(file_path2)
df3 = pd.read_excel(file_path3)
df4 = pd.read_excel(file_path4)
如果.xlsx文件存在多个工作表,可以这样读取
df = pd.read_excel(file_path,sheet_name='工作表名')
查看数据信息
head方法查看前几行数据(默认为5行)
df1.head()
tail方法查看后几行数据
df1.tail()
查看数据框的行数和列数
df1.shape
查看数据框的列名
df1.columns
查看数据框的信息,包括列名、数据类型、非空值数量
df1.info()
查看数据框的索引
df1.index
查看数据框的统计信息,包括均值、标准差、最大值、最小值等
df2.describe()
缺失值处理
删除有缺失值的行或列
df1.dropna()
将缺失值用指定元素来填充
df1.fillna(value)#value表示指定元素
将旧的列名改为新的列名
df7.rename(columns={'单品名称_x':'单品名称'})
数据处理
数据合并
使用merge方法进行数据的合并,merge(数据1,数据2,相同列
df5=pd.merge(df1,df2,on='单品编码')
df6=pd.merge(df5,df4,on='单品编码')
df7=pd.merge(df6,df3,left_on=['单品编码','销售日期'],right_on=['单品编码','日期'])
df7
这样,我们把题目所给的四个附件进行了合并,根据’单品编号’相同进行合并。
按列名进行分组(分为六类)
#数据按照列名(销售日期,分类名称)进行分组,计算和(即日销量)
df8=df7.groupby(['销售日期', '分类名称']).agg({'销量(千克)': ['sum']})
求销量的综合
df8.groupby(['分类名称']).sum().reset_index()
蔬菜六大品类日销量统计学指标的计算
# 重设列索引
df8.columns = df8.columns.get_level_values(0)
# 按销售日期和分类名称分组,并计算每个分类的日平均销量
df9 = df8.groupby('分类名称').agg(
最大值=('销量(千克)', 'max'),
最小值=('销量(千克)', 'min'),
均值=('销量(千克)', 'mean'),
中位数=('销量(千克)', 'median'),
峰度=('销量(千克)', lambda x: x.kurtosis()),
偏度=('销量(千克)', lambda x: x.skew()),
标准差=('销量(千克)', 'std')
).reset_index()
同理计算单品销售量的统计学指标
#数据按照列名(销售日期,分类名称)进行分组,计算和(即日销量)
df10=df7.groupby(['销售日期', '单品名称_x']).agg({'销量(千克)': ['sum']})
# 重设列索引
df10.columns = df10.columns.get_level_values(0)
# 按销售日期和分类名称分组,并计算每个分类的日平均销量
df11 = df10.groupby('单品名称_x').agg(
最大值=('销量(千克)', 'max'),
最小值=('销量(千克)', 'min'),
均值=('销量(千克)', 'mean'),
中位数=('销量(千克)', 'median'),
峰度=('销量(千克)', lambda x: x.kurtosis()),
偏度=('销量(千克)', lambda x: x.skew()),
标准差=('销量(千克)', 'std')
).reset_index()
数据写入
把数据写入.csv文件中
df = pd.DataFrame(df7)
# 将 DataFrame 写入 CSV 文件
df.to_csv('output1.csv', index=False, encoding='utf-8')
把数据写入.xlsx文件中
df = pd.DataFrame(df7)
# 将 DataFrame 写入 xlsx 文件
df.to_excel('output2.xlsx', index=False)
数据集链接
通过百度网盘分享的文件:新建文件夹
链接:https://pan.baidu.com/s/1ijrqPHoV5CFI8h9GNHOZaA
提取码:1111