"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > डेटा इंजीनियरिंग के साथ स्वास्थ्य पर नज़र रखना - अध्याय भोजन अनुकूलन

डेटा इंजीनियरिंग के साथ स्वास्थ्य पर नज़र रखना - अध्याय भोजन अनुकूलन

2024-08-07 को प्रकाशित
ब्राउज़ करें:893

परिचय

सभी को नमस्कार! यह मेरी पहली पोस्ट होगी इसलिए मेरे साथ कठोरता से व्यवहार करें, जहां आपको लगता है कि मैं सुधार कर सकता हूं वहां मेरी आलोचना करें और अगली बार मैं निश्चित रूप से इसे ध्यान में रखूंगा।

पिछले कुछ महीनों से, मैं स्वास्थ्य पर गहराई से ध्यान दे रहा हूं, मुख्य रूप से व्यायाम करता हूं और यह देखता हूं कि मैं क्या खाता हूं, और अब जब मुझे लगता है कि मुझे इस पर एक ठोस पकड़ मिल गई है, तो मैं यह देखना चाहता था कि मैं इसे और कैसे अनुकूलित कर सकता हूं ऐसा है कि कुछ चीजें हैं जो शायद मुझसे छूट गई हैं।

उद्देश्य

इस अध्याय के लिए, मैं अपनी स्वास्थ्य यात्रा के दौरान अपने भोजन का अध्ययन करना चाहता हूं और अगले सप्ताह के लिए एक भोजन योजना के साथ निष्कर्ष निकालना चाहता हूं जो (1) मेरी न्यूनतम प्रोटीन आवश्यकताओं को पूरा करता हो, (2) मेरी कैलोरी सीमा से अधिक न हो, (3) मेरी न्यूनतम फाइबर आवश्यकताओं को पूरा करता है, और (4) लागत को कम करता है।

डेटासेट

हम डेटासेट पेश करके शुरुआत करते हैं, वह भोजन जिसे हमने क्रोनोमीटर का उपयोग करके ट्रैक किया है। क्रोनोमीटर मेरी यात्रा में मेरे साथ कंधे से कंधा मिलाकर काम कर रहा है और अब, मैं अपने द्वारा पहले सूचीबद्ध उद्देश्यों के साथ विश्लेषण करने के लिए जो डेटा इनपुट किया है उसे निर्यात करूंगा।

सौभाग्य से, क्रोनोमीटर मुझे अपनी वेबसाइट पर आसानी से एक .csv फ़ाइल में डेटा निर्यात करने देता है।
Screenshot of the export options from Cronometer

इस अध्याय के लिए, हम केवल 'खाद्य और व्यंजन प्रविष्टियाँ' डेटासेट निर्यात करेंगे।

हम 'खाद्य और व्यंजन प्रविष्टियाँ' से प्राप्त डेटा की जांच से शुरुआत करते हैं। डेटासेट बहुत व्यापक है, मुझे यकीन है कि यह भविष्य के अध्यायों के लिए बहुत अच्छा होगा! इस अध्याय में, हम इसे भोजन के नाम, उसकी मात्रा, प्रोटीन, कैलोरी और फाइबर तक सीमित रखना चाहते हैं।

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

डेटा प्रीप्रोसेसिंग

हमारे पास 'खाद्य नाम', 'मात्रा', 'ऊर्जा (किलो कैलोरी)', 'फाइबर (जी)', और 'प्रोटीन (जी)' में पहले से ही कुछ कॉलम निर्धारित हैं। उत्तम! अब, हमारे पास केवल एक चीज की कमी है, वह है प्रत्येक भोजन की लागत को एक निश्चित राशि देना, क्योंकि इसे डेटासेट में ट्रैक नहीं किया जा रहा था। मेरे लिए सौभाग्य से, मैं ही वह व्यक्ति था जिसने सबसे पहले डेटा इनपुट किया था ताकि मैं उन कीमतों को इनपुट कर सकूं जो मुझे पता हैं। हालाँकि, मैं सभी खाद्य पदार्थों के लिए कीमतें नहीं डालूँगा। इसके बजाय, हम अपने अच्छे पुराने मित्र चैटजीपीटी से उनका अनुमान पूछते हैं और .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 का उपयोग करेंगे जो एक पायथन लाइब्रेरी है जिसका उद्देश्य बिल्कुल यही करना है। मैं टेम्प्लेट का पालन करने के अलावा इसका उपयोग करने के बारे में अधिक नहीं जानता, इसलिए यह कैसे काम करता है इसके बारे में मेरे गैर-पेशेवर स्पष्टीकरण को पढ़ने के बजाय उनके दस्तावेज़ ब्राउज़ करें। लेकिन उन लोगों के लिए जो विषय पर मेरी आकस्मिक व्याख्या सुनना चाहते हैं, हम मूल रूप से y = ax1 bx2 cx3 ... zxn के लिए समाधान कर रहे हैं।

जिस टेम्प्लेट का हम अनुसरण करेंगे वह सम्मिश्रण समस्या के केस स्टडी का टेम्प्लेट है, जहां हम समान उद्देश्यों का पालन करते हैं लेकिन इस मामले में, हम पूरे दिन अपने भोजन को मिश्रित करना चाहते हैं। शुरू करने के लिए, हमें डेटाफ़्रेम को शब्दकोशों में परिवर्तित करने की आवश्यकता होगी, विशेष रूप से, 'खाद्य नाम' को स्वतंत्र चर की एक सूची के रूप में जो 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)

जिनके पास गहरी दृष्टि नहीं है, उनके लिए स्क्रॉल करना जारी रखें। उन लोगों के लिए जिन्होंने कोड की भयानक 2 पंक्तियों पर ध्यान दिया, मैं समझाता हूँ। मैंने इसे तब देखा जब मैं किराने की खरीदारी कर रहा था, लेकिन गार्डेनिया के उच्च फाइबर गेहूं किशमिश पाव पर पोषण संबंधी तथ्य वास्तव में 1 स्लाइस में 9 ग्राम फाइबर नहीं है, इसमें 6 ग्राम के लिए 2 स्लाइस हैं। यह एक बड़ी बात है और मुझे यह जानकर बहुत दुख हुआ है कि डेटा के गलत इनपुट या सामग्री में बदलाव के कारण मान गलत हो सकते हैं, जिसके कारण डेटा पुराना हो गया है। किसी भी तरह से, मुझे इस न्याय में सुधार की आवश्यकता थी और मैं अपने योग्य फाइबर से कम फाइबर के लिए खड़ा नहीं होऊंगा। आगे बढ़ते रहना।

हम केस स्टडी डेटा से टेम्पलेट का उपयोग करके सीधे अपने मूल्यों को जोड़ने में लग जाते हैं। हम प्रोटीन और फाइबर से प्राप्त न्यूनतम मूल्यों के साथ-साथ हम जो अधिकतम कैलोरी खाना चाहते हैं, उसके लिए चर निर्धारित करते हैं। फिर, हम जादुई टेम्पलेट कोड को अपना काम करने देते हैं और परिणाम प्राप्त करते हैं।

# 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 ग्राम फाइबर प्राप्त करने के लिए, मुझे 269 ग्राम चिकन ब्रेस्ट फ़िलेट और 526 ग्राम मूंग बीन्स पर 128 फिलीपीन पेसोस खर्च करने होंगे। यह...यह बिल्कुल भी बुरा नहीं लगता, यह देखते हुए कि मुझे दोनों सामग्रियां कितनी पसंद हैं। मैं निश्चित रूप से इसे आज़माऊंगी, शायद एक सप्ताह या एक महीने के लिए, यह देखने के लिए कि पर्याप्त पोषण होने के बावजूद मैं कितना पैसा बचा पाऊंगी।

डेटा इंजीनियरिंग के साथ ट्रैकिंग हेल्थ के इस अध्याय के लिए यही था, यदि आप उस डेटा को देखना चाहते हैं जिस पर मैंने इस अध्याय में काम किया है, तो रिपॉजिटरी पर जाएं या इस पृष्ठ के लिए नोटबुक पर जाएं। यदि आपके पास कोई टिप्पणी है तो अवश्य लिखें और स्वस्थ रहने का प्रयास करें।

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/wilyanse/tracking-health-with-data-engineeering-chapter-1-meal-optimization-2cl7?1 यदि कोई उल्लंघन है, तो कृपया [email protected] पर संपर्क करें। इसे हटाने के लिए
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3