”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 通过数据工程跟踪健康状况 - 膳食优化章节

通过数据工程跟踪健康状况 - 膳食优化章节

发布于2024-08-07
浏览:253

介绍

大家好!这将是我的第一篇文章,所以对我严厉一点,批评我你认为我可以改进的地方,我下次一定会考虑到它。

这几个月来,我一直在深入健康,主要是锻炼和注意饮食,现在我认为我已经掌握了它,我想看看我可以如何进一步优化如果我可能错过了一些事情。

目标

在本章中,我希望研究我在整个健康之旅中的膳食,并以下周的膳食计划作为结论:(1) 达到我的最低蛋白质需求,(2) 不超过我的卡路里限制, (3) 满足我的最低纤维要求,(4) 最大限度地降低成本。

数据集

我们首先介绍数据集,即我们使用 Cronometer 跟踪的食物。 Cronometer 在我的旅程中一直与我并肩工作,现在,我将导出我输入的数据,以便根据我之前列出的目标进行自己的分析。

对我来说幸运的是,Cronometer 可以让我在其网站上轻松将数据导出到 .csv 文件。
Screenshot of the export options from Cronometer

在本章中,我们将仅导出“食物和食谱条目”数据集。

我们首先检查从“食品和食谱条目”获得的数据。该数据集非常全面,我相信这对未来的章节非常有用!在本章中,我们确实希望将其限制为食物的名称、含量、蛋白质、卡路里和纤维。

# Importing and checking out the dataset
df = pd.read_csv("servings.csv")
df.head()

数据预处理

我们已经为我们设置了一些列,“食物名称”、“含量”、“能量(千卡)”、“纤维(克)”和“蛋白质(克)”。完美的!现在,我们唯一缺少的是获取给定数量的每种食物的成本,因为它没有在数据集中进行跟踪。对我来说幸运的是,我是第一个输入数据的人,这样我就可以输入我所知道的价格。但是,我不会输入所有食品的价格。相反,我们向我们的好老朋友 ChatGPT 询问他们的估计,并通过调整 .csv 文件填写我们确实知道的价格。我们将新数据集存储在“cost.csv”中,该数据集是通过从原始数据集中获取“食物名称”和“数量”列而得出的。

# Group by 'Food Name' and collect unique 'Amount' for each group
grouped_df = df.groupby('Food Name')['Amount'].unique().reset_index()

# Expand the DataFrame so each unique 'Food Name' and 'Amount' is on a separate row
expanded_df = grouped_df.explode('Amount')

# Export the DataFrame to a CSV file
expanded_df.to_csv('grouped_food_names_amounts.csv')

# Read the added costs and save as a new DataFrame
df_cost = pd.read_csv("cost.csv").dropna()
df_cost.head()

有些食物被丢弃只是因为它们太奇怪了,不属于低热量、有营养和/或便宜的数据范围(或者只是因为我懒得再做一次食谱) )。然后,我们需要合并两个数据框,即原始数据集和带有成本的数据集,以获得所谓的“最终”数据集。由于原始数据集包含每种食物的条目,这意味着原始数据集具有相同食物的多个条目,尤其是那些我反复吃的食物(即鸡蛋、鸡胸肉、米饭)。我们还希望用“0”填充没有值的列,因为这里最可能的问题来源是“能量”、“纤维”、“蛋白质”和“价格”列。

merged_df = pd.merge(df, df_cost, on=['Food Name', 'Amount'], how='inner')

specified_columns = ['Food Name', 'Amount', 'Energy (kcal)', 'Fiber (g)', 'Protein (g)', 'Price']
final_df = merged_df[specified_columns].drop_duplicates()
final_df.fillna(0, inplace=True)
final_df.head()

优化

完美的!我们的数据集已经完成,现在我们开始第二部分,优化。回顾该研究的目标,我们希望确定在给予最少量蛋白质和纤维以及最大热量的情况下的最低成本。这里的选择是暴力破解每一个组合,但在业界,正确的术语是“线性编程”或“线性优化”,但不要引用我的话。这次,我们将使用 puLP,它是一个旨在实现这一目标的 Python 库。除了遵循模板之外,我对使用它不太了解,所以请浏览他们的文档,而不是阅读我对其工作原理的不专业解释。但对于那些确实想听我对这个主题的随意解释的人来说,我们基本上是在求解 y = ax1 bx2 cx3 ... zxn.

我们将遵循的模板是混合问题案例研究的模板,我们遵循类似的目标,但在本例中,我们希望全天混合膳食。首先,我们需要将 DataFrame 转换为字典,具体来说,将“食物名称”作为自变量列表,充当 x 序列,然后将能量、纤维、蛋白质和价格作为字典,这样“食物名称”:每种食物的价值。请注意,从现在开始,“数量”将被放弃,并将与“食物名称”连接起来,因为我们不会定量使用它。

# Concatenate Amount into Food Name
final_df['Food Name'] = final_df['Food Name']   ' '   final_df['Amount'].astype(str)
food_names = final_df['Food Name'].tolist()

# Create dictionaries for 'Energy', 'Fiber', 'Protein', and 'Price'
energy_dict = final_df.set_index('Food Name')['Energy (kcal)'].to_dict()
fiber_dict = final_df.set_index('Food Name')['Fiber (g)'].to_dict()
fiber_dict['Gardenia, High Fiber Wheat Raisin Loaf 1.00 Slice'] = 3
fiber_dict['Gardenia, High Fiber Wheat Raisin Loaf 2.00 Slice'] = 6
protein_dict = final_df.set_index('Food Name')['Protein (g)'].to_dict()
price_dict = final_df.set_index('Food Name')['Price'].to_dict()

# Display the results
print("Food Names Array:", food_names)
print("Energy Dictionary:", energy_dict)
print("Fiber Dictionary:", fiber_dict)
print("Protein Dictionary:", protein_dict)
print("Price Dictionary:", price_dict)

对于那些视力不敏锐的人,请继续滚动。对于那些确实注意到这令人毛骨悚然的两行代码的人,让我解释一下。我在杂货店购物时看到了这个,但 Gardenia 的高纤维小麦葡萄干面包上的营养成分实际上并不是 1 片 9 克纤维,而是 2 片 6 克。这是一件大事,给我带来了无法估量的痛苦,因为我知道由于数据输入错误或成分变化导致数据过时,这些值可能不正确。不管怎样,我需要纠正这个正义,我不会容忍任何低于我应得的纤维。继续。

我们使用案例研究数据中的模板直接插入我们的价值观。我们设置变量来代表我们想要的蛋白质和纤维的最小值,以及我们愿意吃的最大卡路里。然后,我们让神奇的模板代码完成它的工作并获得结果。

# Set variables
min_protein = 120
min_fiber = 40
max_energy = 1500

# Just read the case study at https://coin-or.github.io/pulp/CaseStudies/a_blending_problem.html. They explain it way better than I ever could.
prob = LpProblem("Meal Optimization", LpMinimize)
food_vars = LpVariable.dicts("Food", food_names, 0)
prob  = (
    lpSum([price_dict[i] * food_vars[i] for i in food_names]),
    "Total Cost of Food daily",
)
prob  = (
    lpSum([energy_dict[i] * food_vars[i] for i in food_names]) = min_fiber,
    "FiberRequirement",
)
prob  = (
    lpSum([protein_dict[i] * food_vars[i] for i in food_names]) >= min_protein,
    "ProteinRequirement",
)
prob.writeLP("MealOptimization.lp")
prob.solve()
print("Status:", LpStatus[prob.status])
for v in prob.variables():
    if v.varValue > 0:
        print(v.name, "=", v.varValue)
print("Total Cost of Food per day = ", value(prob.objective))

结果

Image description

为了获得120克蛋白质和40克纤维,我需要花费128菲律宾比索购买269克鸡胸肉和526克绿豆。考虑到我对这两种成分的喜爱程度,这听起来一点也不坏。我一定会尝试一下,也许一周或一个月,看看尽管营养足够,但我能节省多少钱。

这就是“用数据工程跟踪健康状况”这一章的内容,如果您想查看我在本章中处理的数据,请访问存储库或访问此页面的笔记本。如果您有任何意见,请发表评论并尽力保持健康。

版本声明 本文转载于:https://dev.to/wilyanse/tracking-health-with-data-engineering-chapter-1-meal-optimization-2cl7?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-07-12
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-07-12
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-07-12
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-07-12
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-07-12
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-07-12
  • Python中何时用"try"而非"if"检测变量值?
    Python中何时用"try"而非"if"检测变量值?
    使用“ try“ vs.” if”来测试python 在python中的变量值,在某些情况下,您可能需要在处理之前检查变量是否具有值。在使用“如果”或“ try”构建体之间决定。“ if” constructs 结果= function() 如果结果: 对于结果: #处理项...
    编程 发布于2025-07-12
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-07-12
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-07-12
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-07-12
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-07-12
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-07-12
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-07-12
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-07-12
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    Transform Pandas DataFrame Column to DateTime FormatScenario:Data within a Pandas DataFrame often exists in various formats, including strings.使用时间数据时...
    编程 发布于2025-07-12

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3