计算机毕业设计选题大数据毕设 Hadoop+Spark驱动食物营养数据可视化分析系统Python版本高通过率 毕业设计/选题推荐/深度学习/数据分析/机器学习

60 阅读9分钟

计算机编程指导师

⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏、爬虫、深度学习、机器学习、预测等实战项目。

⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!

⚡⚡如果遇到具体的技术问题或计算机毕设方面需求,你也可以在主页上↑↑联系我~~

⚡⚡获取源码主页--> space.bilibili.com/35463818075…

食物营养数据可视化分析系统- 简介

基于Hadoop+Spark的食物营养数据可视化分析系统是一个专门针对食物营养数据进行大数据处理和可视化展示的综合性平台。该系统充分利用Hadoop分布式存储架构的稳定性和Spark内存计算框架的高效性,对大规模食物营养数据集进行深度挖掘和智能分析。系统前端采用Vue+ElementUI+Echarts技术栈构建用户交互界面,后端基于Django/SpringBoot框架提供API服务支持,通过Python/Java双语言版本满足不同开发需求。核心功能涵盖宏观营养格局分析、特定营养素排名筛选、食物分类对比分析、膳食健康风险因素分析以及基于机器学习的食物聚类探索等五大模块。系统运用Spark SQL进行复杂数据查询,结合Pandas和NumPy进行数据处理,通过K-Means聚类算法发现食物营养模式,最终以直观的图表形式展现分析结果,为用户提供科学的膳食营养参考和健康饮食指导。  

食物营养数据可视化分析系统-技术

开发语言:Python或Java(两个版本都支持)

大数据框架:Hadoop+Spark(本次没用Hive,支持定制)

后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持)

前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery

详细技术点:Hadoop、HDFS、Spark、Spark SQL、Pandas、NumPy

数据库:MySQL 

食物营养数据可视化分析系统- 背景

随着人们生活水平的不断提升和健康意识的普遍增强,科学合理的膳食营养搭配已经成为现代人关注的焦点话题。传统的营养分析方法往往依赖于单一的数据处理方式,难以应对日益增长的食物种类和复杂的营养成分数据。面对包含数千种食物及其详细营养信息的大规模数据集,传统的关系型数据库和普通的数据分析工具在处理效率和分析深度方面都存在明显的局限性。特别是当需要进行跨类别的食物营养对比、复杂的关联性分析以及基于多维度营养指标的聚类分析时,传统方法更是显得力不从心。与此同时,大数据技术的快速发展为解决这一问题提供了新的思路和技术支撑,Hadoop分布式存储和Spark内存计算框架的结合使得海量食物营养数据的高效处理成为可能,这为构建更加智能和全面的食物营养分析系统奠定了技术基础。

本课题的实施具有多层次的实际意义和应用价值。从技术角度来看,该系统将大数据处理技术与营养学领域相结合,探索了Hadoop+Spark框架在食物营养数据分析中的应用可能性,为类似的数据分析场景提供了技术参考和实现思路。系统通过实际的大数据处理流程验证了分布式计算在营养数据分析中的可行性和优势,这对于推动大数据技术在健康管理领域的应用具有一定的示范作用。从实用价值来看,系统能够帮助营养师、健身教练等专业人士快速获取食物的营养信息对比,为制定个性化的膳食方案提供数据支持。普通用户也可以通过系统的可视化界面直观地了解不同食物的营养特点,从而做出更加科学的饮食选择。系统的聚类分析功能能够发现食物之间隐藏的营养相似性,这种数据驱动的分析方法可能会揭示一些传统分类方法未能发现的食物营养规律,为营养学研究提供新的视角。当然,作为一个毕业设计项目,该系统主要是对现有技术的学习和应用,其意义更多体现在技术实践和能力培养方面。  

食物营养数据可视化分析系统-视频展示

www.bilibili.com/video/BV1sS…  

食物营养数据可视化分析系统-图片展示

1 计算机毕业设计选题大数据毕设:Hadoop+Spark驱动食物营养数据可视化分析系统Python版本高通过率.png

登录.png

高级算法探索分析.png

宏观营养格局分析.png

膳食健康风险分析.png

食物分类对比分析.png

食物营养排行分析.png

食物营养信息.png

数据大屏.png

用户.png

食物营养数据可视化分析系统-代码展示

from pyspark.ml.feature import VectorAssembler, StandardScaler
from pyspark.ml.clustering import KMeans
from pyspark.sql.functions import col, avg, max, min, count, desc, asc
import pandas as pd
import numpy as np
from django.http import JsonResponse
import json

spark = SparkSession.builder.appName("FoodNutritionAnalysis").master("local[*]").getOrCreate()

def macro_nutrition_analysis(request):
    df = spark.read.option("header", "true").option("inferSchema", "true").csv("cleaned_nutrition_dataset_per100g.csv")
    
    protein_stats = df.agg(
        avg("蛋白质").alias("protein_avg"),
        max("蛋白质").alias("protein_max"),
        min("蛋白质").alias("protein_min")
    ).collect()[0]
    
    fat_stats = df.agg(
        avg("脂肪").alias("fat_avg"),
        max("脂肪").alias("fat_max"),
        min("脂肪").alias("fat_min")
    ).collect()[0]
    
    carb_stats = df.agg(
        avg("碳水化合物").alias("carb_avg"),
        max("碳水化合物").alias("carb_max"),
        min("碳水化合物").alias("carb_min")
    ).collect()[0]
    
    calorie_distribution = df.select(
        (col("热量") < 100).alias("low_calorie"),
        ((col("热量") >= 100) & (col("热量") < 300)).alias("medium_calorie"),
        (col("热量") >= 300).alias("high_calorie")
    )
    
    low_cal_count = calorie_distribution.filter(col("low_calorie") == True).count()
    medium_cal_count = calorie_distribution.filter(col("medium_calorie") == True).count()
    high_cal_count = calorie_distribution.filter(col("high_calorie") == True).count()
    
    macro_composition = df.select(
        avg("蛋白质").alias("avg_protein"),
        avg("脂肪").alias("avg_fat"),
        avg("碳水化合物").alias("avg_carb")
    ).collect()[0]
    
    mineral_stats = df.agg(
        avg("钙").alias("calcium_avg"),
        avg("铁").alias("iron_avg"),
        avg("钠").alias("sodium_avg")
    ).collect()[0]
    
    vitamin_stats = df.agg(
        avg("维生素C").alias("vitc_avg"),
        avg("维生素B11").alias("vitb11_avg")
    ).collect()[0]
    
    total_protein = macro_composition["avg_protein"]
    total_fat = macro_composition["avg_fat"] 
    total_carb = macro_composition["avg_carb"]
    total_macro = total_protein + total_fat + total_carb
    
    protein_ratio = (total_protein / total_macro) * 100 if total_macro > 0 else 0
    fat_ratio = (total_fat / total_macro) * 100 if total_macro > 0 else 0
    carb_ratio = (total_carb / total_macro) * 100 if total_macro > 0 else 0
    
    result = {
        "nutrition_stats": {
            "protein": {
                "average": round(protein_stats["protein_avg"], 2),
                "maximum": round(protein_stats["protein_max"], 2),
                "minimum": round(protein_stats["protein_min"], 2)
            },
            "fat": {
                "average": round(fat_stats["fat_avg"], 2),
                "maximum": round(fat_stats["fat_max"], 2),
                "minimum": round(fat_stats["fat_min"], 2)
            },
            "carbohydrate": {
                "average": round(carb_stats["carb_avg"], 2),
                "maximum": round(carb_stats["carb_max"], 2),
                "minimum": round(carb_stats["carb_min"], 2)
            }
        },
        "calorie_distribution": {
            "low_calorie": low_cal_count,
            "medium_calorie": medium_cal_count,
            "high_calorie": high_cal_count
        },
        "macro_composition": {
            "protein_ratio": round(protein_ratio, 2),
            "fat_ratio": round(fat_ratio, 2),
            "carb_ratio": round(carb_ratio, 2)
        },
        "mineral_content": {
            "calcium_avg": round(mineral_stats["calcium_avg"], 2),
            "iron_avg": round(mineral_stats["iron_avg"], 2),
            "sodium_avg": round(mineral_stats["sodium_avg"], 2)
        },
        "vitamin_content": {
            "vitamin_c_avg": round(vitamin_stats["vitc_avg"], 2),
            "vitamin_b11_avg": round(vitamin_stats["vitb11_avg"], 2)
        }
    }
    
    return JsonResponse(result)

def nutrition_ranking_analysis(request):
    nutrient_type = request.GET.get('type', 'protein')
    df = spark.read.option("header", "true").option("inferSchema", "true").csv("cleaned_nutrition_dataset_per100g.csv")
    
    ranking_configs = {
        'protein': {'column': '蛋白质', 'order': 'desc', 'name': '蛋白质之王'},
        'fiber': {'column': '膳食纤维', 'order': 'desc', 'name': '膳食纤维之星'},
        'calcium': {'column': '钙', 'order': 'desc', 'name': '补钙能手'},
        'iron': {'column': '铁', 'order': 'desc', 'name': '补铁尖兵'},
        'low_calorie': {'column': '热量', 'order': 'asc', 'name': '低热量轻食'},
        'low_sodium': {'column': '钠', 'order': 'asc', 'name': '减盐优选'}
    }
    
    config = ranking_configs.get(nutrient_type, ranking_configs['protein'])
    column_name = config['column']
    order_type = config['order']
    ranking_name = config['name']
    
    if order_type == 'desc':
        top_foods = df.select("食物名称", column_name).orderBy(desc(column_name)).limit(20)
    else:
        top_foods = df.select("食物名称", column_name).orderBy(asc(column_name)).limit(20)
    
    food_list = []
    for row in top_foods.collect():
        food_dict = {
            "food_name": row["食物名称"],
            "nutrient_value": round(float(row[column_name]), 2),
            "nutrient_type": column_name
        }
        food_list.append(food_dict)
    
    nutrient_stats = df.agg(
        avg(column_name).alias("avg_value"),
        max(column_name).alias("max_value"),
        min(column_name).alias("min_value")
    ).collect()[0]
    
    percentile_95 = df.approxQuantile(column_name, [0.95], 0.01)[0]
    percentile_5 = df.approxQuantile(column_name, [0.05], 0.01)[0]
    
    high_nutrient_count = df.filter(col(column_name) > percentile_95).count()
    low_nutrient_count = df.filter(col(column_name) < percentile_5).count()
    
    category_analysis = df.groupBy().agg(
        count("*").alias("total_foods"),
        avg(column_name).alias("overall_avg")
    ).collect()[0]
    
    result = {
        "ranking_info": {
            "type": nutrient_type,
            "name": ranking_name,
            "column": column_name,
            "order": order_type
        },
        "top_foods": food_list,
        "statistics": {
            "average": round(nutrient_stats["avg_value"], 2),
            "maximum": round(nutrient_stats["max_value"], 2),
            "minimum": round(nutrient_stats["min_value"], 2),
            "percentile_95": round(percentile_95, 2),
            "percentile_5": round(percentile_5, 2)
        },
        "distribution_analysis": {
            "high_nutrient_foods": high_nutrient_count,
            "low_nutrient_foods": low_nutrient_count,
            "total_foods": category_analysis["total_foods"],
            "overall_average": round(category_analysis["overall_avg"], 2)
        }
    }
    
    return JsonResponse(result)

def food_clustering_analysis(request):
    df = spark.read.option("header", "true").option("inferSchema", "true").csv("cleaned_nutrition_dataset_per100g.csv")
    
    feature_columns = ["蛋白质", "脂肪", "碳水化合物", "膳食纤维", "钠", "糖"]
    df_clean = df.select("食物名称", *feature_columns).na.drop()
    
    assembler = VectorAssembler(inputCols=feature_columns, outputCol="features")
    df_features = assembler.transform(df_clean)
    
    scaler = StandardScaler(inputCol="features", outputCol="scaled_features")
    scaler_model = scaler.fit(df_features)
    df_scaled = scaler_model.transform(df_features)
    
    k = 5
    kmeans = KMeans(featuresCol="scaled_features", predictionCol="cluster", k=k, seed=42)
    model = kmeans.fit(df_scaled)
    clustered_df = model.transform(df_scaled)
    
    cluster_centers = model.clusterCenters()
    cluster_stats = []
    
    for i in range(k):
        cluster_data = clustered_df.filter(col("cluster") == i)
        cluster_size = cluster_data.count()
        
        avg_nutrients = cluster_data.agg(
            avg("蛋白质").alias("avg_protein"),
            avg("脂肪").alias("avg_fat"),
            avg("碳水化合物").alias("avg_carb"),
            avg("膳食纤维").alias("avg_fiber"),
            avg("钠").alias("avg_sodium"),
            avg("糖").alias("avg_sugar")
        ).collect()[0]
        
        representative_foods = cluster_data.select("食物名称").limit(5).collect()
        food_names = [row["食物名称"] for row in representative_foods]
        
        cluster_profile = {
            "cluster_id": i,
            "size": cluster_size,
            "avg_nutrition": {
                "protein": round(avg_nutrients["avg_protein"], 2),
                "fat": round(avg_nutrients["avg_fat"], 2),
                "carbohydrate": round(avg_nutrients["avg_carb"], 2),
                "fiber": round(avg_nutrients["avg_fiber"], 2),
                "sodium": round(avg_nutrients["avg_sodium"], 2),
                "sugar": round(avg_nutrients["avg_sugar"], 2)
            },
            "representative_foods": food_names,
            "center_coordinates": [round(float(x), 4) for x in cluster_centers[i]]
        }
        cluster_stats.append(cluster_profile)
    
    total_within_ss = model.summary.trainingCost
    silhouette_score = 0.0
    
    cluster_distribution = clustered_df.groupBy("cluster").count().orderBy("cluster").collect()
    distribution_data = [{"cluster": row["cluster"], "count": row["count"]} for row in cluster_distribution]
    
    feature_importance = []
    for idx, feature in enumerate(feature_columns):
        variance = 0.0
        for center in cluster_centers:
            variance += (center[idx] - np.mean([c[idx] for c in cluster_centers])) ** 2
        feature_importance.append({
            "feature": feature,
            "importance": round(variance, 4)
        })
    
    feature_importance = sorted(feature_importance, key=lambda x: x["importance"], reverse=True)
    
    result = {
        "clustering_summary": {
            "total_clusters": k,
            "total_foods": df_clean.count(),
            "within_cluster_sum_of_squares": round(total_within_ss, 2),
            "silhouette_score": round(silhouette_score, 4)
        },
        "cluster_profiles": cluster_stats,
        "cluster_distribution": distribution_data,
        "feature_importance": feature_importance,
        "clustering_parameters": {
            "algorithm": "K-Means",
            "features_used": feature_columns,
            "preprocessing": "StandardScaler normalization"
        }
    }
    
    return JsonResponse(result)

 

食物营养数据可视化分析系统-结语

大数据不会+框架不熟+算法头疼?基于Spark+Django的食物口味分析系统一站式解决方案

如果你觉得本文有用,一键三连(点赞、评论、转发)欢迎关注我,就是对我最大支持~~

也期待在评论区或私信看到你的想法和建议,一起交流探讨!谢谢大家!

 

⚡⚡获取源码主页--> **space.bilibili.com/35463818075…

⚡⚡如果遇到具体的技术问题或计算机毕设方面需求,你也可以在主页上↑↑联系我~~