Helo, semua! Ini akan menjadi catatan pertama saya jadi bersikap keras terhadap saya, kritik saya di mana anda fikir saya boleh memperbaikinya dan saya pasti akan mengambil kiranya pada masa akan datang.
Sejak beberapa bulan lalu, saya sangat mendalami kesihatan, terutamanya bersenam dan memerhati apa yang saya makan, dan sekarang setelah saya rasa saya sudah memahaminya, saya ingin melihat bagaimana saya boleh mengoptimumkan lagi dalam sekiranya terdapat beberapa perkara yang saya mungkin terlepas.
Untuk bab ini, saya ingin mengkaji makanan saya sepanjang perjalanan kesihatan saya dan membuat kesimpulan dengan rancangan makan untuk minggu depan yang (1) mencapai keperluan protein minimum saya, (2) tidak melepasi had kalori saya, (3) memenuhi keperluan serat minimum saya, dan (4) meminimumkan kos.
Kami mulakan dengan memperkenalkan set data, makanan yang telah kami jejak menggunakan Cronometer. Kronometer telah bekerjasama dengan saya secara bersebelahan dalam perjalanan saya dan sekarang, saya akan mengeksport data yang saya masukkan untuk dianalisis sendiri dengan objektif yang telah saya senaraikan sebelum ini.
Nasib baik bagi saya, Cronometer membenarkan saya mengeksport data ke fail .csv dengan mudah di tapak web mereka.
Untuk bab ini, kami hanya akan mengeksport set data 'Entri Makanan & Resipi'.
Kami mulakan dengan memeriksa data yang kami dapat daripada 'Entri Makanan & Resipi'. Set data adalah sangat komprehensif, yang saya pasti akan bagus untuk bab akan datang! Dalam bab ini, kami mahu mengehadkannya kepada nama makanan, jumlahnya, protein, kalori dan seratnya.
# Importing and checking out the dataset df = pd.read_csv("servings.csv") df.head()
Kami sudah mempunyai beberapa lajur yang ditetapkan untuk kami, dalam 'Nama Makanan', 'Amaun', 'Tenaga (kcal)', 'Serat (g)' dan 'Protein (g)'. Sempurna! Kini, satu-satunya perkara yang kami kekurangan ialah mendapatkan kos untuk setiap makanan yang diberi jumlah tertentu kerana ia tidak dijejaki dalam set data. Nasib baik bagi saya, saya adalah orang yang memasukkan data pada mulanya supaya saya boleh memasukkan harga yang saya tahu. Walau bagaimanapun, saya tidak akan memasukkan harga untuk semua barangan makanan. Sebaliknya, kami meminta rakan lama kami ChatGPT untuk anggaran mereka dan isikan harga yang kami tahu dengan mengubah suai fail .csv. Kami menyimpan set data baharu dalam 'cost.csv' yang kami perolehi dengan mengambil lajur 'Nama Makanan' dan 'Jumlah' daripada set data asal.
# 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()
Sesetengah makanan digugurkan hanya kerana ia terlalu spesifik dan tidak berada dalam skop data yang rendah kalori, berkhasiat dan/atau murah (atau semata-mata kerana saya tidak boleh bersusah payah membuat resipi itu semula ). Kami kemudiannya perlu menggabungkan dua bingkai data, set data asal dan satu dengan kos, untuk mendapatkan set data 'akhir' yang sepatutnya. Memandangkan set data asal mengandungi entri untuk setiap makanan, ini bermakna set data asal mempunyai berbilang entri makanan yang sama, terutamanya yang saya makan berulang kali (iaitu telur, dada ayam, nasi). Kami juga ingin mengisi lajur tanpa nilai dengan '0' kerana kemungkinan besar punca masalah di sini ialah lajur 'Tenaga', 'Serat', 'Protein' dan 'Harga'.
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()
Sempurna! Set data kami telah selesai dan sekarang, kami mulakan dengan bahagian kedua, pengoptimuman. Mengimbas kembali objektif kajian, kami ingin mengenal pasti kos paling rendah diberikan jumlah minimum protein dan serat, dan jumlah maksimum kalori. Pilihan di sini adalah untuk memaksa setiap kombinasi tunggal, tetapi dalam industri istilah yang sesuai ialah "Pengaturcaraan Linear" atau "Pengoptimuman Linear" tetapi jangan petik saya mengenainya. Kali ini, kita akan menggunakan puLP yang merupakan perpustakaan Python yang bertujuan untuk melakukan perkara itu. Saya tidak tahu banyak tentang menggunakannya selain mengikuti templat, jadi semak imbas dokumentasi mereka dan bukannya membaca penjelasan saya yang tidak profesional tentang cara ia berfungsi. Tetapi bagi mereka yang ingin mendengar penjelasan santai saya tentang topik ini, kami pada asasnya menyelesaikan untuk y = ax1 + bx2 + cx3 + ... + zxn.
Templat yang akan kami ikuti ialah templat untuk Kajian Kes masalah Pengadunan, di mana kami mengikut objektif yang sama tetapi dalam kes ini, kami mahu mengadun makanan kami sepanjang hari. Untuk memulakan, kita perlu menukar DataFrame ke dalam kamus, khususnya, 'Nama Makanan' sebagai senarai pembolehubah tidak bersandar yang berfungsi sebagai siri x, kemudian Tenaga, Serat, Protein dan Harga sebagai kamus seperti itu. 'Nama Makanan': nilai untuk setiap satu. Sila ambil perhatian bahawa Amaun akan diketepikan mulai sekarang dan sebaliknya akan digabungkan dengan 'Nama Makanan' kerana kami tidak akan menggunakannya secara kuantitatif.
# 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)
For those without keen eyesight, continue scrolling. For those who did notice the eerie 2 lines of code, let me explain. I saw this while I was grocery shopping but the nutrition facts on Gardenia's High Fiber Wheat Raisin loaf do not actually have 1 slice be 9 grams of Fiber, it has 2 slices for 6 grams. This is a big deal and has caused me immeasurable pain knowing that the values may be incorrect due to either a misinput of data or a change of ingredients which caused the data to be outdated. Either way, I needed this justice corrected and I will not stand for any less Fiber than I deserve. Moving on.
We go straight into plugging in our values using the template from the Case Study data. We set variables to stand for the minimum values we want out of Protein and Fiber, as well as the maximum Calories we are willing to eat. Then, we let the magical template code do its work and get the results.
# 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]) <= max_energy, "EnergyRequirement", ) prob += ( lpSum([fiber_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))
In order to get 120 grams of protein and 40 grams of fiber, I would need to spend 128 Philippine Pesos on 269 grams of chicken breast fillet, and 526 grams of mung beans. This... does not sound bad at all considering how much I love both ingredients. I will definitely try it out, maybe for a week or a month just to see how much money I would save despite having just enough nutrition.
That was it for this chapter of Tracking Health with Data Engineering, if you want to see the data I worked on in this chapter, visit the repository or visit the notebook for this page. Do leave a comment if you have any and try to stay healthy.
Atas ialah kandungan terperinci Menjejak Kesihatan dengan Kejuruteraan Data - Pengoptimuman Makanan Bab. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!