Hallo zusammen! Dies wird mein erster Beitrag sein, seien Sie also hart zu mir und kritisieren Sie mich dort, wo ich Ihrer Meinung nach Verbesserungspotenzial habe. Ich werde es beim nächsten Mal auf jeden Fall berücksichtigen.
In den letzten Monaten habe ich mich intensiv mit der Gesundheit beschäftigt, hauptsächlich trainiert und darauf geachtet, was ich esse, und jetzt, wo ich denke, dass ich es gut im Griff habe, wollte ich sehen, wie ich es noch weiter optimieren kann Fall, dass es einige Dinge gibt, die ich möglicherweise übersehen habe.
In diesem Kapitel möchte ich mich mit meinen Mahlzeiten während meiner gesamten Gesundheitsreise befassen und mit einem Essensplan für die nächste Woche abschließen, der (1) meinen Mindestproteinbedarf deckt, (2) mein Kalorienlimit nicht überschreitet, (3) erfüllt meinen Mindestfaserbedarf und (4) minimiert die Kosten.
Wir beginnen mit der Einführung des Datensatzes, der Lebensmittel, die wir mit Cronometer verfolgt haben. Cronometer hat auf meiner Reise Seite an Seite mit mir zusammengearbeitet und jetzt werde ich die von mir eingegebenen Daten exportieren, um sie selbst mit den zuvor aufgeführten Zielen zu analysieren.
Glücklicherweise ermöglicht mir Cronometer den problemlosen Export von Daten in eine CSV-Datei auf ihrer Website.
Für dieses Kapitel exportieren wir nur den Datensatz „Lebensmittel- und Rezepteinträge“.
Wir beginnen mit der Untersuchung der Daten, die wir von „Food & Recipe Entries“ erhalten haben. Der Datensatz ist sehr umfangreich, was sicher für zukünftige Kapitel großartig sein wird! In diesem Kapitel möchten wir uns auf den Namen des Lebensmittels, seine Menge, Protein, Kalorien und Ballaststoffe beschränken.
# Importing and checking out the dataset df = pd.read_csv("servings.csv") df.head()
Wir haben bereits einige Spalten für uns eingerichtet, in „Lebensmittelname“, „Menge“, „Energie (kcal)“, „Ballaststoffe (g)“ und „Protein (g)“. Perfekt! Jetzt fehlt uns nur noch die Ermittlung der Kosten für jedes Lebensmittel bei einer bestimmten Menge, da diese nicht im Datensatz erfasst wurden. Zum Glück war ich derjenige, der die Daten als Erster eingegeben hat, sodass ich die Preise eingeben kann, die ich kenne. Allerdings werde ich nicht für alle Lebensmittel Preise eingeben. Stattdessen fragen wir unseren guten alten Freund ChatGPT nach seinem Kostenvoranschlag und geben die Preise ein, die wir kennen, indem wir die CSV-Datei anpassen. Wir speichern den neuen Datensatz in „cost.csv“, den wir abgeleitet haben, indem wir die Spalten „Food Name“ und „Amount“ aus dem Originaldatensatz übernommen haben.
# 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()
Einige Lebensmittel wurden einfach weggelassen, weil sie zu merkwürdig spezifisch waren und nicht in den Geltungsbereich der Daten für kalorienarm, nahrhaft und/oder billig fielen (oder weil ich einfach keine Lust hatte, das Rezept noch einmal zu machen). ). Wir müssten dann zwei Datenrahmen zusammenführen, den ursprünglichen Datensatz und den mit den Kosten, um den vermeintlichen „endgültigen“ Datensatz zu erhalten. Da der Originaldatensatz die Einträge für jedes Lebensmittel enthält, bedeutet dies, dass der Originaldatensatz mehrere Einträge zu demselben Lebensmittel enthält, insbesondere zu denen, die ich wiederholt esse (z. B. Eier, Hähnchenbrust, Reis). Wir möchten auch Spalten ohne Werte mit „0“ füllen, da die wahrscheinlichste Problemquelle hier die Spalten „Energie“, „Ballaststoffe“, „Protein“ und „Preis“ wären.
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()
Perfekt! Unser Datensatz ist fertig und jetzt beginnen wir mit dem zweiten Teil, der Optimierung. Unter Berücksichtigung der Ziele der Studie möchten wir die geringsten Kosten bei einer minimalen Menge an Protein und Ballaststoffen und einer maximalen Menge an Kalorien ermitteln. Die Option hier besteht darin, jede einzelne Kombination brutal zu erzwingen, aber in der Branche ist der richtige Begriff „Lineare Programmierung“ oder „Lineare Optimierung“, aber zitieren Sie mich dazu nicht. Dieses Mal werden wir puLP verwenden, eine Python-Bibliothek, die genau darauf abzielt. Ich weiß nicht viel über die Verwendung, abgesehen davon, dass ich der Vorlage folge. Schauen Sie sich also die Dokumentation an, anstatt meine unprofessionelle Erklärung zu lesen, wie es funktioniert. Aber für diejenigen, die sich meine lockere Erklärung des Themas anhören möchten: Wir lösen im Grunde nach y = ax1 bx2 cx3 ... zxn.
Die Vorlage, der wir folgen werden, ist die Vorlage für die Fallstudie zum Mischproblem, in der wir ähnliche Ziele verfolgen, in diesem Fall jedoch unsere Mahlzeiten über den Tag verteilt mischen möchten. Um zu beginnen, müssten wir den DataFrame in Wörterbücher umwandeln, insbesondere den „Lebensmittelnamen“ als Liste unabhängiger Variablen, die als Reihe von x dienen, und dann Energie, Ballaststoffe, Protein und Preis als ein solches Wörterbuch „Lebensmittelname“: Wert für jeden. Bitte beachten Sie, dass auf die Angabe der Menge von nun an verzichtet und stattdessen mit dem „Namen des Lebensmittels“ verkettet wird, da wir ihn nicht quantitativ verwenden.
# 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)
Für diejenigen, die kein gutes Sehvermögen haben, scrollen Sie weiter. Für diejenigen, denen die unheimlichen zwei Codezeilen aufgefallen sind, möchte ich sie erklären. Ich habe das beim Einkaufen gesehen, aber die Nährwertangaben für das ballaststoffreiche Weizen-Rosinen-Laib von Gardenia besagen nicht, dass 1 Scheibe 9 Gramm Ballaststoffe enthält, sondern 2 Scheiben für 6 Gramm. Das ist eine große Sache und hat mir unermessliche Schmerzen bereitet, weil ich wusste, dass die Werte entweder aufgrund einer falschen Dateneingabe oder einer Änderung der Inhaltsstoffe, die dazu geführt hat, dass die Daten veraltet sind, falsch sein könnten. In jedem Fall musste diese Gerechtigkeit korrigiert werden, und ich werde nicht für weniger Fasern eintreten, als ich verdiene. Weiter geht's.
Wir beginnen direkt mit der Umsetzung unserer Werte anhand der Vorlage aus den Fallstudiendaten. Wir legen Variablen fest, die für die Mindestwerte stehen, die wir von Protein und Ballaststoffen erwarten, sowie für die maximalen Kalorien, die wir zu essen bereit sind. Dann lassen wir den magischen Vorlagencode seine Arbeit machen und erhalten die Ergebnisse.
# 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))
Um 120 Gramm Protein und 40 Gramm Ballaststoffe zu bekommen, müsste ich 128 philippinische Pesos für 269 Gramm Hähnchenbrustfilet und 526 Gramm Mungobohnen ausgeben. Das klingt überhaupt nicht schlecht, wenn man bedenkt, wie sehr ich beide Zutaten liebe. Ich werde es auf jeden Fall ausprobieren, vielleicht für eine Woche oder einen Monat, nur um zu sehen, wie viel Geld ich sparen würde, obwohl ich gerade genug Nährstoffe habe.
Das war’s für dieses Kapitel von „Tracking Health with Data Engineering“. Wenn Sie die Daten sehen möchten, an denen ich in diesem Kapitel gearbeitet habe, besuchen Sie das Repository oder das Notizbuch für diese Seite. Hinterlassen Sie einen Kommentar, wenn Sie welche haben, und versuchen Sie, gesund zu bleiben.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3