【大数据】健康饮食营养数据分析系统 计算机毕业设计项目 Hadoop+Spark环境配置 数据科学与大数据技术 附源码+文档+讲解

50 阅读6分钟

前言

💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。热爱技术,喜欢钻研新工具和框架,也乐于通过代码解决实际问题,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💕💕文末获取源码联系 计算机程序员小杨 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目 计算机毕业设计选题 💜💜

一.开发工具简介

大数据框架:Hadoop+Spark(本次没用Hive,支持定制) 开发语言:Python+Java(两个版本都支持) 后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持) 前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery 详细技术点:Hadoop、HDFS、Spark、Spark SQL、Pandas、NumPy 数据库:MySQL

二.系统内容简介

健康饮食营养数据分析系统是一个基于大数据技术的营养分析平台,采用Hadoop+Spark分布式计算框架处理海量饮食数据,通过Python语言开发,后端使用Django框架构建RESTful API服务,前端采用Vue+ElementUI+Echarts技术栈实现交互式数据可视化界面。系统核心功能涵盖用户管理、健康饮食营养数据管理、营养成分分析、烹饪方式分析、菜系饮食分析、膳食复杂度分析以及可视化大屏展示。通过HDFS分布式文件系统存储大规模营养数据,利用Spark SQL进行高效数据查询和分析,结合Pandas和NumPy进行数据处理和统计计算,MySQL数据库管理结构化数据,为用户提供全方位的饮食营养分析服务,帮助用户科学制定饮食计划,提升健康管理水平。

三.系统功能演示

健康饮食营养数据分析系统

四.系统界面展示

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

五.系统源码展示


from pyspark.sql import SparkSession
from pyspark.sql.functions import col, avg, sum, count, when, round
import pandas as pd
import numpy as np
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
from datetime import datetime

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

@csrf_exempt
def nutrition_component_analysis(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        food_list = data.get('food_list', [])
        user_id = data.get('user_id')
        analysis_date = data.get('date', datetime.now().strftime('%Y-%m-%d'))
        nutrition_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "nutrition_data").option("user", "root").option("password", "password").load()
        user_intake_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "user_food_intake").option("user", "root").option("password", "password").load()
        filtered_data = user_intake_df.filter((col("user_id") == user_id) & (col("intake_date") == analysis_date))
        joined_data = filtered_data.join(nutrition_df, filtered_data.food_id == nutrition_df.food_id, "inner")
        daily_nutrition = joined_data.groupBy("user_id").agg(
            round(sum(col("calories_per_100g") * col("intake_amount") / 100), 2).alias("total_calories"),
            round(sum(col("protein_per_100g") * col("intake_amount") / 100), 2).alias("total_protein"),
            round(sum(col("fat_per_100g") * col("intake_amount") / 100), 2).alias("total_fat"),
            round(sum(col("carbs_per_100g") * col("intake_amount") / 100), 2).alias("total_carbs"),
            round(sum(col("fiber_per_100g") * col("intake_amount") / 100), 2).alias("total_fiber"),
            round(sum(col("vitamin_c_per_100g") * col("intake_amount") / 100), 2).alias("total_vitamin_c"),
            round(sum(col("calcium_per_100g") * col("intake_amount") / 100), 2).alias("total_calcium")
        )
        nutrition_result = daily_nutrition.collect()[0] if daily_nutrition.count() > 0 else None
        if nutrition_result:
            calories_ratio = min(nutrition_result.total_calories / 2000 * 100, 100)
            protein_ratio = min(nutrition_result.total_protein / 60 * 100, 100)
            fat_ratio = min(nutrition_result.total_fat / 65 * 100, 100)
            carbs_ratio = min(nutrition_result.total_carbs / 300 * 100, 100)
            analysis_result = {
                'total_calories': nutrition_result.total_calories,
                'total_protein': nutrition_result.total_protein,
                'total_fat': nutrition_result.total_fat,
                'total_carbs': nutrition_result.total_carbs,
                'calories_percentage': round(calories_ratio, 1),
                'protein_percentage': round(protein_ratio, 1),
                'fat_percentage': round(fat_ratio, 1),
                'carbs_percentage': round(carbs_ratio, 1),
                'nutrition_balance_score': calculate_nutrition_balance_score(nutrition_result)
            }
            return JsonResponse({'status': 'success', 'data': analysis_result})
        return JsonResponse({'status': 'error', 'message': '未找到用户当日摄入数据'})

@csrf_exempt
def cooking_method_analysis(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        time_range = data.get('time_range', 30)
        region_filter = data.get('region', 'all')
        cooking_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "cooking_methods").option("user", "root").option("password", "password").load()
        food_cooking_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "food_cooking_relation").option("user", "root").option("password", "password").load()
        user_preferences_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "user_cooking_preferences").option("user", "root").option("password", "password").load()
        if region_filter != 'all':
            cooking_df = cooking_df.filter(col("region") == region_filter)
        cooking_stats = food_cooking_df.join(cooking_df, "cooking_method_id").groupBy("cooking_method_name", "health_impact_score").agg(
            count("food_id").alias("food_count"),
            avg("cooking_time_minutes").alias("avg_cooking_time"),
            avg("oil_usage_ml").alias("avg_oil_usage"),
            avg("salt_usage_g").alias("avg_salt_usage")
        )
        health_ranking = cooking_stats.orderBy(col("health_impact_score").desc(), col("avg_oil_usage").asc())
        popularity_stats = user_preferences_df.groupBy("cooking_method_id").agg(
            count("user_id").alias("user_count"),
            avg("preference_score").alias("avg_preference_score")
        ).join(cooking_df, "cooking_method_id")
        cooking_efficiency = cooking_stats.withColumn("efficiency_score", 
            round((col("health_impact_score") * 0.4 + (100 - col("avg_cooking_time")) * 0.3 + (100 - col("avg_oil_usage")) * 0.3), 2))
        nutrition_impact = food_cooking_df.join(cooking_df, "cooking_method_id").groupBy("cooking_method_name").agg(
            avg("nutrient_retention_rate").alias("avg_nutrient_retention"),
            avg("calorie_increase_rate").alias("avg_calorie_increase")
        )
        final_analysis = cooking_stats.join(popularity_stats, cooking_stats.cooking_method_name == popularity_stats.cooking_method_name, "left").join(nutrition_impact, "cooking_method_name")
        result_data = []
        for row in final_analysis.collect():
            result_data.append({
                'cooking_method': row.cooking_method_name,
                'health_score': row.health_impact_score,
                'food_count': row.food_count,
                'avg_cooking_time': round(row.avg_cooking_time, 1),
                'avg_oil_usage': round(row.avg_oil_usage, 1),
                'user_popularity': row.user_count if row.user_count else 0,
                'nutrient_retention': round(row.avg_nutrient_retention, 2),
                'calorie_impact': round(row.avg_calorie_increase, 2)
            })
        return JsonResponse({'status': 'success', 'data': result_data})

@csrf_exempt
def cuisine_dietary_analysis(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        analysis_type = data.get('analysis_type', 'comprehensive')
        target_cuisine = data.get('cuisine_type', 'all')
        cuisine_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "cuisine_types").option("user", "root").option("password", "password").load()
        food_cuisine_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "food_cuisine_mapping").option("user", "root").option("password", "password").load()
        nutrition_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "nutrition_data").option("user", "root").option("password", "password").load()
        user_consumption_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/nutrition_db").option("dbtable", "user_cuisine_consumption").option("user", "root").option("password", "password").load()
        if target_cuisine != 'all':
            cuisine_df = cuisine_df.filter(col("cuisine_name") == target_cuisine)
        cuisine_nutrition = food_cuisine_df.join(cuisine_df, "cuisine_id").join(nutrition_df, "food_id").groupBy("cuisine_name", "cuisine_origin_region").agg(
            round(avg("calories_per_100g"), 2).alias("avg_calories"),
            round(avg("protein_per_100g"), 2).alias("avg_protein"),
            round(avg("fat_per_100g"), 2).alias("avg_fat"),
            round(avg("carbs_per_100g"), 2).alias("avg_carbs"),
            round(avg("sodium_per_100g"), 2).alias("avg_sodium"),
            round(avg("sugar_per_100g"), 2).alias("avg_sugar"),
            count("food_id").alias("dish_count")
        )
        cuisine_popularity = user_consumption_df.join(cuisine_df, "cuisine_id").groupBy("cuisine_name").agg(
            count("user_id").alias("consumer_count"),
            round(avg("consumption_frequency"), 2).alias("avg_frequency"),
            round(sum("monthly_consumption_amount"), 2).alias("total_consumption")
        )
        health_assessment = cuisine_nutrition.withColumn("health_score", 
            round(when(col("avg_calories") <= 200, 25).otherwise(when(col("avg_calories") <= 300, 20).otherwise(15)) +
                  when(col("avg_protein") >= 15, 25).otherwise(when(col("avg_protein") >= 10, 20).otherwise(15)) +
                  when(col("avg_fat") <= 10, 25).otherwise(when(col("avg_fat") <= 15, 20).otherwise(15)) +
                  when(col("avg_sodium") <= 500, 25).otherwise(when(col("avg_sodium") <= 800, 20).otherwise(15)), 2))
        dietary_balance = cuisine_nutrition.withColumn("protein_fat_ratio", round(col("avg_protein") / col("avg_fat"), 2)).withColumn("carbs_protein_ratio", round(col("avg_carbs") / col("avg_protein"), 2))
        regional_comparison = cuisine_nutrition.groupBy("cuisine_origin_region").agg(
            round(avg("avg_calories"), 2).alias("region_avg_calories"),
            round(avg("avg_protein"), 2).alias("region_avg_protein"),
            round(avg("avg_fat"), 2).alias("region_avg_fat"),
            count("cuisine_name").alias("cuisine_count_in_region")
        )
        comprehensive_analysis = cuisine_nutrition.join(cuisine_popularity, "cuisine_name", "left").join(health_assessment.select("cuisine_name", "health_score"), "cuisine_name").join(dietary_balance.select("cuisine_name", "protein_fat_ratio", "carbs_protein_ratio"), "cuisine_name")
        analysis_results = []
        for row in comprehensive_analysis.collect():
            analysis_results.append({
                'cuisine_name': row.cuisine_name,
                'origin_region': row.cuisine_origin_region,
                'avg_calories': row.avg_calories,
                'avg_protein': row.avg_protein,
                'avg_fat': row.avg_fat,
                'avg_carbs': row.avg_carbs,
                'health_score': row.health_score,
                'consumer_count': row.consumer_count if row.consumer_count else 0,
                'popularity_frequency': row.avg_frequency if row.avg_frequency else 0,
                'protein_fat_ratio': row.protein_fat_ratio,
                'dish_variety': row.dish_count,
                'nutritional_balance_rating': calculate_balance_rating(row.avg_protein, row.avg_fat, row.avg_carbs)
            })
        return JsonResponse({'status': 'success', 'data': analysis_results, 'total_cuisines_analyzed': len(analysis_results)})

def calculate_nutrition_balance_score(nutrition_data):
    protein_score = min(nutrition_data.total_protein / 60 * 30, 30)
    fat_score = max(30 - (nutrition_data.total_fat - 65) / 65 * 30, 0) if nutrition_data.total_fat > 65 else 30
    carbs_score = min(nutrition_data.total_carbs / 300 * 25, 25)
    fiber_score = min(nutrition_data.total_fiber / 25 * 15, 15)
    return round(protein_score + fat_score + carbs_score + fiber_score, 1)

def calculate_balance_rating(protein, fat, carbs):
    total_macros = protein + fat + carbs
    protein_ratio = protein / total_macros
    fat_ratio = fat / total_macros
    carbs_ratio = carbs / total_macros
    ideal_protein = 0.25
    ideal_fat = 0.30
    ideal_carbs = 0.45
    deviation = abs(protein_ratio - ideal_protein) + abs(fat_ratio - ideal_fat) + abs(carbs_ratio - ideal_carbs)
    balance_score = max(100 - deviation * 100, 0)
    return round(balance_score, 1)

六.系统文档展示

在这里插入图片描述

结束

💕💕文末获取源码联系 计算机程序员小杨