基于大数据的食物营养数据分析系统 | 大数据毕设太难?食物营养数据分析系统用Python+Hadoop帮你轻松搞定

85 阅读9分钟

💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目

基于大数据的食物营养数据分析系统介绍

食物营养数据分析系统是一个基于大数据技术架构的综合性营养信息分析平台,采用Hadoop分布式存储和Spark内存计算引擎作为核心技术支撑,实现对海量食物营养数据的高效处理与深度挖掘。系统通过Python语言开发数据分析算法,结合Django框架构建稳定的后端服务架构,前端采用Vue+ElementUI+Echarts技术栈打造直观友好的用户交互界面。平台涵盖食物营养信息管理、宏观营养格局分析、食物营养排行分析、食物分类对比分析、膳食健康风险分析以及高级算法探索分析等核心功能模块,能够为用户提供从基础数据查询到高级统计分析的全方位服务。系统运用Spark SQL进行复杂查询优化,通过Pandas和NumPy进行数据预处理和特征工程,将传统的营养学研究与现代大数据分析技术有机融合,为营养健康领域的数据驱动决策提供了有力的技术支撑工具。

基于大数据的食物营养数据分析系统演示视频

演示视频

基于大数据的食物营养数据分析系统演示图片

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

基于大数据的食物营养数据分析系统代码展示

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, sum, avg, count, desc, asc, when, lit
from pyspark.sql.types import StructType, StructField, StringType, FloatType, IntegerType
import pandas as pd
import numpy as np
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json

spark = SparkSession.builder.appName("FoodNutritionAnalysis").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()

def macro_nutrition_analysis(request):
    try:
        nutrition_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "food_nutrition").option("user", "root").option("password", "password").load()
        carb_stats = nutrition_df.select(avg("carbohydrate").alias("avg_carb"), sum("carbohydrate").alias("total_carb"), count("*").alias("food_count")).collect()[0]
        protein_stats = nutrition_df.select(avg("protein").alias("avg_protein"), sum("protein").alias("total_protein")).collect()[0]
        fat_stats = nutrition_df.select(avg("fat").alias("avg_fat"), sum("fat").alias("total_fat")).collect()[0]
        calorie_distribution = nutrition_df.select("food_name", "calories", when(col("calories") < 100, "低热量").when((col("calories") >= 100) & (col("calories") < 300), "中等热量").otherwise("高热量").alias("calorie_level")).groupBy("calorie_level").agg(count("*").alias("food_count")).collect()
        nutrition_balance = nutrition_df.select("food_name", (col("protein") * 4 + col("carbohydrate") * 4 + col("fat") * 9).alias("calculated_calories")).filter(col("calculated_calories") > 0).orderBy(desc("calculated_calories")).limit(20)
        seasonal_nutrition = nutrition_df.filter(col("season").isNotNull()).groupBy("season").agg(avg("vitamin_c").alias("avg_vitamin_c"), avg("fiber").alias("avg_fiber"), count("*").alias("seasonal_count")).orderBy("season")
        macro_nutrients = nutrition_df.select(sum("protein").alias("total_protein_g"), sum("carbohydrate").alias("total_carb_g"), sum("fat").alias("total_fat_g")).collect()[0]
        nutrient_density = nutrition_df.select("food_name", (col("protein") + col("vitamin_a") + col("vitamin_c") + col("calcium") + col("iron")).alias("nutrient_score")).filter(col("nutrient_score") > 0).orderBy(desc("nutrient_score"))
        food_category_macro = nutrition_df.groupBy("category").agg(avg("protein").alias("avg_protein"), avg("carbohydrate").alias("avg_carb"), avg("fat").alias("avg_fat"), count("*").alias("category_count")).orderBy(desc("category_count"))
        result_data = {"carbohydrate_analysis": {"average": float(carb_stats["avg_carb"]), "total": float(carb_stats["total_carb"]), "food_count": carb_stats["food_count"]}, "protein_analysis": {"average": float(protein_stats["avg_protein"]), "total": float(protein_stats["total_protein"])}, "fat_analysis": {"average": float(fat_stats["avg_fat"]), "total": float(fat_stats["total_fat"])}, "calorie_distribution": [{"level": row["calorie_level"], "count": row["food_count"]} for row in calorie_distribution], "high_nutrition_foods": [{"food_name": row["food_name"], "calculated_calories": float(row["calculated_calories"])} for row in nutrition_balance.collect()], "seasonal_nutrition": [{"season": row["season"], "avg_vitamin_c": float(row["avg_vitamin_c"]), "avg_fiber": float(row["avg_fiber"]), "count": row["seasonal_count"]} for row in seasonal_nutrition.collect()], "macro_totals": {"protein_g": float(macro_nutrients["total_protein_g"]), "carb_g": float(macro_nutrients["total_carb_g"]), "fat_g": float(macro_nutrients["total_fat_g"])}, "nutrient_dense_foods": [{"food_name": row["food_name"], "score": float(row["nutrient_score"])} for row in nutrient_density.limit(15).collect()], "category_macros": [{"category": row["category"], "avg_protein": float(row["avg_protein"]), "avg_carb": float(row["avg_carb"]), "avg_fat": float(row["avg_fat"]), "count": row["category_count"]} for row in food_category_macro.collect()]}
        return JsonResponse({"status": "success", "data": result_data})
    except Exception as e:
        return JsonResponse({"status": "error", "message": str(e)})

def food_nutrition_ranking(request):
    try:
        ranking_type = request.GET.get('type', 'protein')
        limit_count = int(request.GET.get('limit', 20))
        nutrition_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "food_nutrition").option("user", "root").option("password", "password").load()
        if ranking_type == 'protein':
            ranked_foods = nutrition_df.select("food_name", "protein", "category", "calories").filter(col("protein") > 0).orderBy(desc("protein")).limit(limit_count)
            ranking_stats = nutrition_df.select(avg("protein").alias("avg_protein"), max("protein").alias("max_protein"), min("protein").alias("min_protein")).collect()[0]
        elif ranking_type == 'vitamin_c':
            ranked_foods = nutrition_df.select("food_name", "vitamin_c", "category", "calories").filter(col("vitamin_c") > 0).orderBy(desc("vitamin_c")).limit(limit_count)
            ranking_stats = nutrition_df.select(avg("vitamin_c").alias("avg_vitamin_c"), max("vitamin_c").alias("max_vitamin_c"), min("vitamin_c").alias("min_vitamin_c")).collect()[0]
        elif ranking_type == 'calories':
            ranked_foods = nutrition_df.select("food_name", "calories", "category", "protein", "carbohydrate", "fat").filter(col("calories") > 0).orderBy(desc("calories")).limit(limit_count)
            ranking_stats = nutrition_df.select(avg("calories").alias("avg_calories"), max("calories").alias("max_calories"), min("calories").alias("min_calories")).collect()[0]
        else:
            ranked_foods = nutrition_df.select("food_name", "fiber", "category", "calories").filter(col("fiber") > 0).orderBy(desc("fiber")).limit(limit_count)
            ranking_stats = nutrition_df.select(avg("fiber").alias("avg_fiber"), max("fiber").alias("max_fiber"), min("fiber").alias("min_fiber")).collect()[0]
        category_ranking = nutrition_df.groupBy("category").agg(avg(ranking_type).alias(f"avg_{ranking_type}"), count("*").alias("food_count")).filter(col(f"avg_{ranking_type}") > 0).orderBy(desc(f"avg_{ranking_type}"))
        percentile_analysis = nutrition_df.select(ranking_type).filter(col(ranking_type) > 0).rdd.map(lambda row: row[ranking_type]).collect()
        percentile_75 = float(np.percentile(percentile_analysis, 75))
        percentile_25 = float(np.percentile(percentile_analysis, 25))
        median_value = float(np.median(percentile_analysis))
        top_bottom_comparison = nutrition_df.select("food_name", ranking_type, "category").filter(col(ranking_type) > 0).orderBy(desc(ranking_type))
        top_10 = top_bottom_comparison.limit(10).collect()
        bottom_10 = top_bottom_comparison.orderBy(asc(ranking_type)).limit(10).collect()
        seasonal_ranking = nutrition_df.filter(col("season").isNotNull()).groupBy("season").agg(avg(ranking_type).alias(f"avg_{ranking_type}"), count("*").alias("seasonal_count")).orderBy(desc(f"avg_{ranking_type}"))
        result_data = {"ranking_list": [{"food_name": row["food_name"], "value": float(row[ranking_type]) if row[ranking_type] else 0, "category": row["category"], "calories": float(row["calories"]) if row["calories"] else 0} for row in ranked_foods.collect()], "statistics": {f"avg_{ranking_type}": float(ranking_stats[f"avg_{ranking_type}"]) if ranking_stats[f"avg_{ranking_type}"] else 0, f"max_{ranking_type}": float(ranking_stats[f"max_{ranking_type}"]) if ranking_stats[f"max_{ranking_type}"] else 0, f"min_{ranking_type}": float(ranking_stats[f"min_{ranking_type}"]) if ranking_stats[f"min_{ranking_type}"] else 0}, "category_ranking": [{"category": row["category"], "average": float(row[f"avg_{ranking_type}"]), "count": row["food_count"]} for row in category_ranking.collect()], "percentiles": {"p75": percentile_75, "p25": percentile_25, "median": median_value}, "top_bottom": {"top_10": [{"food_name": row["food_name"], "value": float(row[ranking_type]), "category": row["category"]} for row in top_10], "bottom_10": [{"food_name": row["food_name"], "value": float(row[ranking_type]), "category": row["category"]} for row in bottom_10]}, "seasonal_ranking": [{"season": row["season"], "average": float(row[f"avg_{ranking_type}"]), "count": row["seasonal_count"]} for row in seasonal_ranking.collect()]}
        return JsonResponse({"status": "success", "data": result_data, "ranking_type": ranking_type})
    except Exception as e:
        return JsonResponse({"status": "error", "message": str(e)})

def dietary_health_risk_analysis(request):
    try:
        user_id = request.GET.get('user_id', 1)
        analysis_period = request.GET.get('period', 'week')
        nutrition_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "food_nutrition").option("user", "root").option("password", "password").load()
        user_consumption = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "user_consumption").option("user", "root").option("password", "password").load().filter(col("user_id") == user_id)
        daily_intake = user_consumption.join(nutrition_df, "food_id").select("consumption_date", (col("consumption_amount") * col("calories") / 100).alias("daily_calories"), (col("consumption_amount") * col("sodium") / 100).alias("daily_sodium"), (col("consumption_amount") * col("sugar") / 100).alias("daily_sugar"), (col("consumption_amount") * col("fat") / 100).alias("daily_fat"), (col("consumption_amount") * col("protein") / 100).alias("daily_protein"))
        calorie_risk = daily_intake.filter(col("daily_calories") > 2500).select("consumption_date", "daily_calories").withColumn("risk_level", lit("高热量风险")).collect()
        sodium_risk = daily_intake.filter(col("daily_sodium") > 2300).select("consumption_date", "daily_sodium").withColumn("risk_level", lit("高钠风险")).collect()
        sugar_risk = daily_intake.filter(col("daily_sugar") > 50).select("consumption_date", "daily_sugar").withColumn("risk_level", lit("高糖风险")).collect()
        fat_risk = daily_intake.filter(col("daily_fat") > 65).select("consumption_date", "daily_fat").withColumn("risk_level", lit("高脂肪风险")).collect()
        weekly_average = daily_intake.agg(avg("daily_calories").alias("avg_calories"), avg("daily_sodium").alias("avg_sodium"), avg("daily_sugar").alias("avg_sugar"), avg("daily_fat").alias("avg_fat"), avg("daily_protein").alias("avg_protein")).collect()[0]
        nutrient_deficiency = daily_intake.filter((col("daily_protein") < 50) | (col("daily_calories") < 1200)).select("consumption_date", "daily_protein", "daily_calories").withColumn("deficiency_type", when(col("daily_protein") < 50, "蛋白质不足").when(col("daily_calories") < 1200, "热量不足").otherwise("营养不良")).collect()
        risk_score_calculation = daily_intake.select("consumption_date", ((col("daily_calories") - 2000) / 2000 * 100 + (col("daily_sodium") - 2000) / 2000 * 100 + (col("daily_sugar") - 25) / 25 * 100 + (col("daily_fat") - 44) / 44 * 100).alias("composite_risk_score")).filter(col("composite_risk_score") > 0)
        high_risk_days = risk_score_calculation.filter(col("composite_risk_score") > 150).collect()
        balanced_nutrition_score = daily_intake.select("consumption_date", (abs(col("daily_protein") - 50) + abs(col("daily_fat") - 44) + abs(col("daily_calories") - 2000)).alias("balance_deviation")).orderBy("balance_deviation")
        food_variety_analysis = user_consumption.join(nutrition_df, "food_id").groupBy("consumption_date").agg(count("food_id").alias("food_variety"), sum("consumption_amount").alias("total_amount")).filter(col("food_variety") < 5).collect()
        chronic_disease_risk = daily_intake.select("consumption_date", when((col("daily_sodium") > 2300) & (col("daily_calories") > 2500), "心血管疾病风险").when((col("daily_sugar") > 50) & (col("daily_calories") > 2200), "糖尿病风险").when(col("daily_fat") > 70, "肥胖风险").otherwise("风险较低").alias("disease_risk")).filter(col("disease_risk") != "风险较低")
        result_data = {"calorie_risks": [{"date": row["consumption_date"].strftime('%Y-%m-%d'), "calories": float(row["daily_calories"]), "risk": row["risk_level"]} for row in calorie_risk], "sodium_risks": [{"date": row["consumption_date"].strftime('%Y-%m-%d'), "sodium": float(row["daily_sodium"]), "risk": row["risk_level"]} for row in sodium_risk], "sugar_risks": [{"date": row["consumption_date"].strftime('%Y-%m-%d'), "sugar": float(row["daily_sugar"]), "risk": row["risk_level"]} for row in sugar_risk], "fat_risks": [{"date": row["consumption_date"].strftime('%Y-%m-%d'), "fat": float(row["daily_fat"]), "risk": row["risk_level"]} for row in fat_risk], "weekly_averages": {"avg_calories": float(weekly_average["avg_calories"]), "avg_sodium": float(weekly_average["avg_sodium"]), "avg_sugar": float(weekly_average["avg_sugar"]), "avg_fat": float(weekly_average["avg_fat"]), "avg_protein": float(weekly_average["avg_protein"])}, "nutrient_deficiencies": [{"date": row["consumption_date"].strftime('%Y-%m-%d'), "protein": float(row["daily_protein"]), "calories": float(row["daily_calories"]), "deficiency": row["deficiency_type"]} for row in nutrient_deficiency], "high_risk_days": [{"date": row["consumption_date"].strftime('%Y-%m-%d'), "risk_score": float(row["composite_risk_score"])} for row in high_risk_days], "balance_scores": [{"date": row["consumption_date"].strftime('%Y-%m-%d'), "deviation": float(row["balance_deviation"])} for row in balanced_nutrition_score.limit(30).collect()], "food_variety_issues": [{"date": row["consumption_date"].strftime('%Y-%m-%d'), "variety_count": row["food_variety"], "total_amount": float(row["total_amount"])} for row in food_variety_analysis], "disease_risks": [{"date": row["consumption_date"].strftime('%Y-%m-%d'), "risk_type": row["disease_risk"]} for row in chronic_disease_risk.collect()]}
        return JsonResponse({"status": "success", "data": result_data, "analysis_period": analysis_period})
    except Exception as e:
        return JsonResponse({"status": "error", "message": str(e)})

基于大数据的食物营养数据分析系统文档展示

在这里插入图片描述

💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目