2024电工杯B题保姆级分析完整思路+代码+数据教学
B题题目:大学生平衡膳食食谱的优化设计及评价
以下仅展示部分,完整版看文末的文章
import pandas as pd
df1 = pd.read_excel('附件1:1名男大学生的一日食谱.xlsx')
df1
# 获取所有工作表名称
excel_file = pd.ExcelFile('附件1:1名男大学生的一日食谱.xlsx')
sheet_names = excel_file.sheet_names
sheet_names
df3 = pd.read_excel('附件3:某高校学生食堂一日三餐主要食物信息统计表.xlsx')
df3
# 获取所有工作表名称
excel_file = pd.ExcelFile('附件3:某高校学生食堂一日三餐主要食物信息统计表.xlsx')
sheet_names = excel_file.sheet_names
sheet_names
# 食谱提取
foods = df1['1名男大学生的一日食谱'].dropna().values
meals = {}
name = ['早餐','午餐','晚餐']
meal = []
for item in foods:
if item in name:
key = item
meal = []
continue
if item != '食物名称':
meal.append(item)
else:
meals[key] = meal
meals
# 女大学生同理
df2 = pd.read_excel('附件2:1名女大学生的一日食谱.xlsx')
df2
foods = df2['1名女大学生的1日食谱'].dropna().values
meals_nv = {}
name = ['早餐','午餐','晚餐']
meal = []
for item in foods:
if item in name:
key = item
meal = []
continue
if item != '食物名称':
meal.append(item)
else:
meals_nv[key] = meal
meals_nv
food_male = pd.read_excel('./食谱.xlsx',sheet_name='男大')
food_female = pd.read_excel('./食谱.xlsx',sheet_name='女大')
food_female.head()
# 填充Nan值
# food_male=food_male.fillna(method='ffill', axis=0)
# food_female=food_female.fillna(method='ffill', axis=0)
food_male.ffill(axis=0)
food_female.ffill(axis=0)
food_female.head()
# 读取食物营养素
foods_nutrients = pd.read_csv('./foods_nutrients.csv')
foods_nutrients.head()
# 计算营养素
# 计算每餐的总营养素
whole_day_nutrients_male = {'热量 (kcal)': 0, '蛋白质 (g)': 0, '脂肪 (g)': 0, '碳水化合物 (g)': 0}
male_ls = []
for key in meals:
total_nutrients = {'热量 (kcal)': 0, '蛋白质 (g)': 0, '脂肪 (g)': 0, '碳水化合物 (g)': 0}
for item in meals[key]:
for _, food in food_male.iterrows():
if food['食物名称'] == item:
nutrient = foods_nutrients[foods_nutrients['食物'] == food['主要成分']].iloc[0]
portion_size = food['可食部(克/份)'] * food['食用份数'] / 100 # 换算成100g标准
total_nutrients['热量 (kcal)'] += nutrient['热量 (kcal)'] * portion_size
total_nutrients['蛋白质 (g)'] += nutrient['蛋白质 (g)'] * portion_size
total_nutrients['脂肪 (g)'] += nutrient['脂肪 (g)'] * portion_size
total_nutrients['碳水化合物 (g)'] += nutrient['碳水化合物 (g)'] * portion_size
print(f"{key}的总营养素:", total_nutrients)
male_ls.append(total_nutrients)
whole_day_nutrients_male['热量 (kcal)'] += total_nutrients['热量 (kcal)']
whole_day_nutrients_male['蛋白质 (g)'] += total_nutrients['蛋白质 (g)']
whole_day_nutrients_male['脂肪 (g)'] += total_nutrients['脂肪 (g)']
whole_day_nutrients_male['碳水化合物 (g)'] += total_nutrients['碳水化合物 (g)']
print(f"一天的总营养素:", whole_day_nutrients_male)
# 同理 计算女大
whole_day_nutrients_female = {'热量 (kcal)': 0, '蛋白质 (g)': 0, '脂肪 (g)': 0, '碳水化合物 (g)': 0}
female_ls = []
for key in meals_nv:
total_nutrients = {'热量 (kcal)': 0, '蛋白质 (g)': 0, '脂肪 (g)': 0, '碳水化合物 (g)': 0}
for item in meals_nv[key]:
for _, food in food_female.iterrows():
if food['食物名称'] == item:
nutrient = foods_nutrients[foods_nutrients['食物'] == food['主要成分']].iloc[0]
portion_size = food['可食部(克/份)'] * food['食用份数'] / 100 # 换算成100g标准
total_nutrients['热量 (kcal)'] += nutrient['热量 (kcal)'] * portion_size
total_nutrients['蛋白质 (g)'] += nutrient['蛋白质 (g)'] * portion_size
total_nutrients['脂肪 (g)'] += nutrient['脂肪 (g)'] * portion_size
total_nutrients['碳水化合物 (g)'] += nutrient['碳水化合物 (g)'] * portion_size
female_ls.append(total_nutrients)
print(f"{key}的总营养素:", total_nutrients)
whole_day_nutrients_female['热量 (kcal)'] += total_nutrients['热量 (kcal)']
whole_day_nutrients_female['蛋白质 (g)'] += total_nutrients['蛋白质 (g)']
whole_day_nutrients_female['脂肪 (g)'] += total_nutrients['脂肪 (g)']
whole_day_nutrients_female['碳水化合物 (g)'] += total_nutrients['碳水化合物 (g)']
print(f"一天的总营养素:", whole_day_nutrients_female)
绘制可视化图:
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负数显示问题
# 推荐摄入量
recommended_nutrients_male = {'热量 (kcal)': 2400, '蛋白质 (g)': 75, '脂肪 (g)': 66.5, '碳水化合物 (g)': 345}
recommended_nutrients_female = {'热量 (kcal)': 1900, '蛋白质 (g)': 60, '脂肪 (g)': 49.5, '碳水化合物 (g)': 275}
# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 男大学生热量
axes[0, 0].bar(['当前', '调整后', '推荐'], [whole_day_nutrients_male['热量 (kcal)'], adjusted_nutrients_male['热量 (kcal)'], recommended_nutrients_male['热量 (kcal)']], color=['red', 'blue', 'green'])
axes[0, 0].set_title('男大学生热量摄入')
# 女大学生热量
axes[0, 1].bar(['当前', '调整后', '推荐'], [whole_day_nutrients_female['热量 (kcal)'], adjusted_nutrients_female['热量 (kcal)'], recommended_nutrients_female['热量 (kcal)']], color=['red', 'blue', 'green'])
axes[0, 1].set_title('女大学生热量摄入')
# 男大学生主要营养素
axes[1, 0].bar(['蛋白质', '脂肪', '碳水化合物'], [whole_day_nutrients_male['蛋白质 (g)'], whole_day_nutrients_male['脂肪 (g)'], whole_day_nutrients_male['碳水化合物 (g)']], color='red', label='当前')
axes[1, 0].bar(['蛋白质', '脂肪', '碳水化合物'], [adjusted_nutrients_male['蛋白质 (g)'], adjusted_nutrients_male['脂肪 (g)'], adjusted_nutrients_male['碳水化合物 (g)']], color='blue', label='调整后', alpha=0.7)
axes[1, 0].bar(['蛋白质', '脂肪', '碳水化合物'], [recommended_nutrients_male['蛋白质 (g)'], recommended_nutrients_male['脂肪 (g)'], recommended_nutrients_male['碳水化合物 (g)']], color='green', label='推荐', alpha=0.5)
axes[1, 0].set_title('男大学生主要营养素摄入')
axes[1, 0].legend()
# 女大学生主要营养素
axes[1, 1].bar(['蛋白质', '脂肪', '碳水化合物'], [whole_day_nutrients_female['蛋白质 (g)'], whole_day_nutrients_female['脂肪 (g)'], whole_day_nutrients_female['碳水化合物 (g)']], color='red', label='当前')
axes[1, 1].bar(['蛋白质', '脂肪', '碳水化合物'], [adjusted_nutrients_female['蛋白质 (g)'], adjusted_nutrients_female['脂肪 (g)'], adjusted_nutrients_female['碳水化合物 (g)']], color='blue', label='调整后', alpha=0.7)
axes[1, 1].bar(['蛋白质', '脂肪', '碳水化合物'], [recommended_nutrients_female['蛋白质 (g)'], recommended_nutrients_female['脂肪 (g)'], recommended_nutrients_female['碳水化合物 (g)']], color='green', label='推荐', alpha=0.5)
axes[1, 1].set_title('女大学生主要营养素摄入')
axes[1, 1].legend()
# 设置总体布局
plt.tight_layout()
plt.show()
以上仅为部分第一问代码,其中更详细的思路、各题目思路、代码、讲解视频、成品论文及其他相关内容,可以看下方名片获取哦!