2023年数学建模国赛C题数据处理

目录

智能助手学习

1.将excel表格某一列全填充为0

2.查找替换

 3.表格间自然连接

4.时间序列处理转换为日期时间格式df['SaleDateTime'] = pd.to_datetime(df['SaleDateTime'])将日期时间列设置为索引df.set_index('SaleDateTime', inplace=True)

5.数据聚合

6.Fisher精确性检验是一种用于分析计数数据的统计方法,特别是当样本量较小且假设条件不满足进行卡方检验时。此检验通常用于2x2列联表(contingency table),以确定两个分类变量之间是否存在显著的关联性。

7.删除含有#N/A缺失值的行

8.计算相关系数矩阵

数据处理各具体步骤 

python可实现代码


智能助手学习

1.将excel表格某一列全填充为0

import pandas as pd

# 读取Excel文件
df = pd.read_excel('文件名.xlsx',sheet_name='Sheet1')

# 假设需要填充的列为'Column_Name'
df['H'] = df['H'].fillna(0)

# 保存到新的Excel文件,或者覆盖原文件
with pd.ExcelWriter('附件2-1.xlsx') as writer:
    df.to_excel(writer, sheet_name='Sheet1-1', index=False)

2.查找替换

这段代码首先使用pd.merge函数来匹配df_target和df_source中的数据,基于C列(目标数据)和A列(源数据)进行匹配,并且只保留目标数据的所有行(使用how='left')。接着,使用apply函数和lambda表达式来更新H列的值,如果匹配到源数据的D列有值,则替换,否则保持原H列值。最后,删除辅助列并保存到新的Excel文件中。

这种方法避免了循环操作,对于大型数据集而言,效率会有显著提升。

import pandas as pd

# 读取第一个Excel文件(源数据)
df_source = pd.read_excel('附件1.xlsx')

# 读取第二个Excel文件(目标数据),并指定了工作表名称Sheet1
df_target = pd.read_excel('附件2.xlsx', sheet_name='Sheet1')

# 假设我们基于'A'列在源数据中匹配目标数据的'C'列,并希望用源数据的'D'列值替换目标数据的'H'列值

# 使用merge函数进行匹配,注意这里我们左连接目标数据(df_target),确保所有目标数据的行都被保留
df_merged = pd.merge(df_target, df_source[['A', 'D']], left_on='C', right_on='A', how='left')

# 使用合并后的DataFrame来更新'H'列,如果源数据的'D'列有值,则使用该值,否则保持原值
df_merged['H'] = df_merged.apply(lambda x: x['D'] if pd.notnull(x['D']) else x['H'], axis=1)

# 删除辅助列(来自源数据的列),这里假设我们不再需要它们
df_final = df_merged.drop(columns=['A', 'D'])

# 保存修改后的数据到新的Excel文件
df_final.to_excel('附件2-1.xlsx', index=False)

 3.表格间自然连接

import pandas as pd

# 读取Excel文件
df1 = pd.read_excel('path_to_file1.xlsx', sheet_name='Sheet1')
df2 = pd.read_excel('path_to_file2.xlsx', sheet_name='Sheet1')

# 进行自然连接
# 假设我们想要根据'ID'列进行连接
result = pd.merge(df1, df2, on='ID', how='outer')#ID列用于标识每行数据;how='outer':自然连接(外连接)

# 查看结果
print(result)

# 将结果保存到新的Excel文件
result.to_excel('path_to_output_file.xlsx', index=False)#不包含索引

4.时间序列处理
转换为日期时间格式
df['SaleDateTime'] = pd.to_datetime(df['SaleDateTime'])
将日期时间列设置为索引
df.set_index('SaleDateTime', inplace=True)

4.One-hot编码

import pandas as pd

# 创建一个包含分类变量的DataFrame
df = pd.DataFrame({
    'Color': ['Red', 'Green', 'Blue', 'Green', 'Red'],
    'Value': [10, 20, 30, 40, 50]
})

# 进行One-hot编码
one_hot_encoded_df = pd.get_dummies(df, columns=['Color'])

# 查看结果
print(one_hot_encoded_df)

对Color列进行One-hot编码后,Color列被转换为三个新的列:Color_Red、Color_Green和Color_Blue。每个颜色类别都转换为一个二进制列,如果行属于该颜色类别,则对应列的值为1,否则为0。
注意:
1.分类变量不宜过多,维度灾难
2.One-hot编码不能出现缺失值
3.One-hot编码可能会引入多重共线性问题,特别是当分类变量的类别是有序的时候
4.One-hot编码、标签编码(Label Encoding)

5.数据聚合

数据聚合是数据分析中的一项基本技术,它可以帮助我们理解数据的不同方面,如不同组的销售情况,或者随时间变化的趋势等

import pandas as pd

# 创建示例数据
data = {
    'Group': ['A', 'A', 'B', 'B', 'C', 'C', 'C'],
    'Sales': [100, 200, 300, 400, 500, 600, 700],
    'Year': [2020, 2020, 2021, 2021, 2020, 2021, 2021]
}
df = pd.DataFrame(data)

# 按'Group'分组并聚合
grouped = df.groupby('Group')
total_sales = grouped['Sales'].sum()
average_sales = grouped['Sales'].mean()
#结合多个聚合函数
#summary = grouped['Sales'].agg(['sum', 'mean'])

# 分组和聚合多个列
# grouped_multiple = df.groupby(['Group', 'Year'])
# total_sales_by_group_year = grouped_multiple['Sales'].sum()
# 打印结果
print("Total Sales by Group:\n", total_sales)
print("Average Sales by Group:\n", average_sales)

自定义聚合函数,在.agg()中使用:先定义,再聚合
参数:column指列名,aggfunc指聚合函数
def custom_agg(x):
    return x.mean() * 2  # 举例:将均值乘以2
result = df.groupby('Group').agg(
    CustomSales=pd.NamedAgg(column='Sales', aggfunc=custom_agg)
)

6.Fisher精确性检验
是一种用于分析计数数据的统计方法,特别是当样本量较小且假设条件不满足进行卡方检验时。
此检验通常用于2x2列联表(contingency table),以确定两个分类变量之间是否存在显著的关联性。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import fisher_exact

# 创建一个2x2列联表的numpy数组
contingency_table = np.array([[10, 20], [30, 40]])

# 进行Fisher精确性检验
oddsratio, p_value = fisher_exact(contingency_table)
print(f"Odds Ratio: {oddsratio:.4f}, P-value: {p_value:.4f}")

# 使用Seaborn的heatmap函数可视化列联表
sns.heatmap(contingency_table, annot=True, fmt="d", cmap="Blues",
            xticklabels=['Yes', 'No'], yticklabels=['Category A', 'Category B'])
plt.title('Contingency Table for Category A vs Category B\nP-value: {p_value:.4f}'.format(p_value=p_value))

# 显示图表
plt.show()

7.删除含有#N/A缺失值的行

#删除含有缺失值#N/A的行
import pandas as pd
df = pd.read_excel('附件1.xlsx', sheet_name="Sheet1")
df_cleaned = df[df.notna().all(axis=1)]
new_sheet_name = 'Sheet2'
with pd.ExcelWriter('附件1.xlsx', engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
    # 写入新工作表,如果工作表已存在,将会追加数据
    df_cleaned.to_excel(writer, sheet_name=new_sheet_name, index=True) 

8.计算相关系数矩阵

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 直接输入数据,这里使用numpy数组
data = np.array([[9.26,25.53,17.06,9.43], [14,19.8,9,16], [143.64,525.294,162.54,166.88],[0.329,0.702,0.445,0.207]])

# 将numpy数组转换为pandas DataFrame
df = pd.DataFrame(data, columns=['西兰花', '紫白菜(1)', '青梗散花', '紫白菜(2)'])

# 计算相关系数矩阵
corr_matrix = df.corr()
# 设置seaborn的全局字体,确保它支持中文
sns.set(font='SimHei')  # 'SimHei' 是一种支持中文的字体
# 定义自定义颜色映射的列表
custom_colors = ['#46788e', '#78b7c9', '#f6e093', '#97b319']
# 使用Seaborn绘制热力图
plt.figure(figsize=(8, 6))  # 可以根据需要调整图形大小
sns.heatmap(corr_matrix, annot=True, fmt=".2f", cmap=custom_colors, square=True, cbar_kws={"shrink": .5})
plt.title('花菜类相关系数热力图')
# 显示图形
plt.savefig('heatmap.png', dpi=300, bbox_inches='tight', transparent=True)
plt.show()

  


数据处理各具体步骤 

python可实现代码

# #1.将表格2和表格3进行自然连接
# import pandas as pd
#
# # 读取Excel文件
# df1 = pd.read_excel(r"附件2.xlsx", sheet_name='Sheet1')
# df2 = pd.read_excel(r"附件3.xlsx", sheet_name='Sheet1')
#
# # 进行自然连接
# # 假设我们想要根据'ID'列进行连接
# result = pd.merge(df1, df2, on=['销售日期','单品编码'], how='outer')#ID列用于标识每行数据;how='outer':自然连接(外连接)
#
# # 查看结果
# #print(result)
#
# # 将结果保存到新的Excel文件
# result.to_excel(r"2-3.xlsx", index=True)#包含索引
#

# #时间序列处理
# import pandas as pd
#
# # 读取Excel文件
# df = pd.read_excel(r"2-3.xlsx", sheet_name='Sheet1')
#
# # 转换为日期时间格式
# df['销售日期'] = pd.to_datetime(df['销售日期'])
#
# # 假设 '扫码销售时间' 也是一列,并且你想将其与 '销售日期' 一起作为复合索引
# # 确保 '扫码销售时间' 列存在并且是字符串格式,如果不是,则需要进行转换
# df.set_index(['销售日期', '扫码销售时间'], inplace=True)
#
# # 对分类列进行One-hot编码
# df1 = pd.get_dummies(df, columns=['销售类型', '是否打折销售'])
#
# # 指定新工作表的名称,确保它与原工作表不同
# new_sheet_name = 'Sheet2'
#
# # 使用ExcelWriter以追加模式写入同一个文件的新工作表
# # if_sheet_exists='replace'(替换)
# # 或 if_sheet_exists='overlay'(追加)
# with pd.ExcelWriter(r"2-3.xlsx", engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
#     # 写入新工作表,如果工作表已存在,将会追加数据
#     df1.to_excel(writer, sheet_name=new_sheet_name, index=True)

#
# #Fisher精确性检验
# import numpy as np
# import matplotlib.pyplot as plt
# from matplotlib.font_manager import FontProperties
# import seaborn as sns
# from scipy.stats import fisher_exact
#
# # 创建一个2x2列联表的numpy数组
# contingency_table = np.array([[, 830680], [4, 47362]])
#
# # 进行Fisher精确性检验:Odds Ratio: 6.5141, P-value: 0.0000
# oddsratio, p_value = fisher_exact(contingency_table)
# print(f"Odds Ratio: {oddsratio:.4f}, P-value: {p_value:.4f}")
#
# # 设置seaborn的全局字体,确保它支持中文
# sns.set(font='SimHei')  # 'SimHei' 是一种支持中文的字体
# # 定义自定义颜色映射的列表
# custom_colors = ['#46788e', '#78b7c9', '#f6e093', '#97b319']
# # 使用Seaborn的heatmap函数可视化列联表
# ax = sns.heatmap(contingency_table, annot=True, fmt="d", cmap=custom_colors,
#             xticklabels=['退货', '不退货'], yticklabels=['不打折', '打折'])
# # 设置热力图背景为无色(透明)
# ax.set_facecolor('none')
# plt.title('Fisher精确性检验\nP-value: {p_value:.4f}'.format(p_value=p_value))
# #保存图像
# plt.savefig('contingency_table_heatmap.png', dpi=300, bbox_inches='tight', transparent=True)
# # 显示图表
# plt.show()


# #删除含有缺失值#N/A的行
# import pandas as pd
# df = pd.read_excel(r"附件1.xlsx", sheet_name="Sheet1")
# df_cleaned = df[df.notna().all(axis=1)]
# new_sheet_name = 'Sheet2'
# with pd.ExcelWriter(r"附件1.xlsx", engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
#     # 写入新工作表,如果工作表已存在,将会追加数据
#     df_cleaned.to_excel(writer, sheet_name=new_sheet_name, index=True)


# #计算相关系数矩阵
# import numpy as np
# import seaborn as sns
# import matplotlib.pyplot as plt
# import pandas as pd
# # 直接输入数据,这里使用numpy数组
# data = np.array([[9.26,25.53,17.06,9.43], [14,19.8,9,16], [143.64,525.294,162.54,166.88],[0.329,0.702,0.445,0.207]])
# 
# # 将numpy数组转换为pandas DataFrame
# df = pd.DataFrame(data, columns=['西兰花', '紫白菜(1)', '青梗散花', '紫白菜(2)'])
# 
# # 计算相关系数矩阵
# corr_matrix = df.corr()
# # 设置seaborn的全局字体,确保它支持中文
# sns.set(font='SimHei')  # 'SimHei' 是一种支持中文的字体
# # 定义自定义颜色映射的列表
# custom_colors = ['#46788e', '#78b7c9', '#f6e093', '#97b319']
# # 使用Seaborn绘制热力图
# plt.figure(figsize=(8, 6))  # 可以根据需要调整图形大小
# sns.heatmap(corr_matrix, annot=True, fmt=".2f", cmap=custom_colors, square=True, cbar_kws={"shrink": .5})
# plt.title('花菜类相关系数热力图')
# # 显示图形
# plt.savefig('heatmap.png', dpi=300, bbox_inches='tight', transparent=True)
# plt.show()

  • 33
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于2023数学建模国赛的C,因为我是CSDN开发的AI助手,无法预测具体的国赛目。然而,我可以提供一些常见的数学建模目思路供参考。 通常,数学建模比赛目涉及实际问,要求参赛选手通过数学建模方法进行问分析、建模和求解,最终给出合理的结论和建议。以下是一些常见的数学建模思路: 1. 问分析:仔细阅读目,理解问背景和要求,明确需要解决的问。 2. 数据处理:对于给定的数据,进行必要的处理、整理和分析,例如数据清洗、统计特征提取等。 3. 建立模型:根据问要求和数据特点,选择合适的数学模型进行建立。常用的数学模型包括线性规划、非线性规划、动态规划、图论等。 4. 模型求解:运用合适的数值计算方法或优化算法,对建立的模型进行求解。可以使用计算机编程语言进行模拟仿真或优化算法实现。 5. 结果分析:对求解结果进行分析和解释,给出合理的结论。可以通过可视化技术将结果以图表或图像形式展示。 6. 模型评价及改进:对建立的模型进行评价,分析其优缺点,并提出改进的方法。 需要注意的是,数学建模比赛目的复杂程度各不相同,解思路也会有所差异。对于具体的C,还需要根据实际目要求进行具体思考和分析。希望以上思路能对您有所帮助,祝您在数学建模国赛中取得好成绩!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值