985高校热门毕设:基于Spark的心衰数据特征分析系统技术解析

51 阅读9分钟

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

💕💕文末获取源码

@TOC

基于Spark的心衰数据特征分析系统技术解析-系统功能介绍

基于Spark的心衰数据特征分析系统是一个集大数据处理、机器学习分析和数据可视化于一体的综合性医疗数据分析平台。该系统采用Hadoop分布式文件系统作为底层存储架构,利用Apache Spark强大的内存计算能力对海量心衰患者临床数据进行高效处理和深度挖掘。系统前端基于Vue框架构建,结合ElementUI组件库和ECharts图表库,为用户提供直观友好的交互界面和丰富的数据可视化展示。后端采用Spring Boot微服务架构,通过Spark SQL进行复杂的数据查询和统计分析,支持患者基础特征分布、生理指标水平评估、死亡风险关联因素探索、多维特征相关性分析以及生存周期预测等多个维度的深入分析。系统能够处理包括年龄、性别、心脏射血分数、血清肌酐、血小板计数等13个核心医疗指标,通过Pandas和NumPy进行数据预处理,运用统计学方法和机器学习算法识别影响心衰患者预后的关键因素,为临床医生提供科学的决策支持和风险评估依据。

基于Spark的心衰数据特征分析系统技术解析-系统技术介绍

大数据框架: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

基于Spark的心衰数据特征分析系统技术解析-系统背景意义

心力衰竭作为多种心血管疾病的终末阶段,已成为当前医疗卫生领域面临的重大挑战。随着人口老龄化趋势加剧和生活方式的改变,心衰发病率呈现逐年上升趋势,患者数量不断增长,医疗资源需求日益紧张。传统的心衰患者管理主要依赖医生的临床经验和单一指标判断,缺乏对患者多维度特征的综合分析和科学评估。现有的医疗信息系统大多只能处理结构化的基础数据,面对复杂多样的患者临床指标时,往往存在处理效率低下、分析深度不足、预测准确性有限等问题。同时,随着医疗数据量的爆炸式增长和数据类型的日趋复杂,传统的数据处理方法已经难以满足现代医疗决策对精准性和时效性的要求。在此背景下,运用大数据技术构建智能化的心衰患者特征分析系统,实现对海量医疗数据的高效处理和深度挖掘,成为提升医疗服务质量和患者预后管理水平的迫切需要。 本课题的研究具有重要的实际应用价值和技术创新意义。通过构建基于Spark的大数据分析平台,能够有效整合心衰患者的多维度临床数据,实现对患者基础特征、生理指标和风险因素的全面分析,为临床医生提供更加科学准确的诊疗依据。系统采用先进的数据可视化技术,将复杂的统计分析结果以直观的图表形式呈现,有助于医护人员快速理解患者病情特点和发展趋势,提高临床决策效率。从技术层面来看,该系统充分发挥了Hadoop分布式存储和Spark内存计算的优势,解决了传统医疗信息系统在处理大规模数据时面临的性能瓶颈问题,为医疗大数据分析提供了可行的技术方案。对于医疗机构而言,系统能够帮助建立标准化的患者风险评估流程,优化医疗资源配置,降低医疗成本的同时提升服务质量。虽然作为毕业设计项目,系统在功能完善程度和实际部署规模方面还存在一定局限性,但其设计理念和技术架构为后续的深入研究和实际应用奠定了良好基础,对推动医疗信息化和智能化发展具有一定的参考价值。

基于Spark的心衰数据特征分析系统技术解析-系统演示视频

演示视频

基于Spark的心衰数据特征分析系统技术解析-系统演示图片

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

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

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

基于Spark的心衰数据特征分析系统技术解析-系统部分代码

from pyspark.sql import SparkSession

from pyspark.sql.functions import col, when, count, avg, max, min, desc, asc, sum as spark_sum

from pyspark.sql.types import IntegerType, DoubleType

import pandas as pd

import numpy as np

from scipy import stats

from lifelines import KaplanMeierFitter

import json

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

def analyze_patient_basic_characteristics(data_path):

    df = spark.read.csv(data_path, header=True, inferSchema=True)

    age_distribution = df.groupBy("age").count().orderBy("age")

    age_ranges = df.withColumn("age_group", when(col("age") <= 60, "40-60岁").when(col("age") <= 80, "61-80岁").otherwise("80岁以上"))

    age_group_stats = age_ranges.groupBy("age_group").count().orderBy("count", ascending=False)

    gender_distribution = df.groupBy("sex").agg(count("*").alias("patient_count"), (count("*") * 100.0 / df.count()).alias("percentage"))

    gender_stats = gender_distribution.withColumn("gender_label", when(col("sex") == 1, "男性").otherwise("女性"))

    comorbidity_analysis = df.select(spark_sum(col("anaemia")).alias("贫血患者数"), spark_sum(col("diabetes")).alias("糖尿病患者数"), spark_sum(col("high_blood_pressure")).alias("高血压患者数"), spark_sum(col("smoking")).alias("吸烟患者数"))

    comorbidity_rates = comorbidity_analysis.withColumn("贫血发病率", col("贫血患者数") / df.count() * 100).withColumn("糖尿病发病率", col("糖尿病患者数") / df.count() * 100).withColumn("高血压发病率", col("高血压患者数") / df.count() * 100).withColumn("吸烟率", col("吸烟患者数") / df.count() * 100)

    smoking_by_gender = df.groupBy("sex", "smoking").count().withColumn("gender", when(col("sex") == 1, "男性").otherwise("女性")).withColumn("smoking_status", when(col("smoking") == 1, "吸烟").otherwise("不吸烟"))

    age_stats = df.agg(avg("age").alias("平均年龄"), min("age").alias("最小年龄"), max("age").alias("最大年龄"))

    result_dict = {"年龄分布": age_distribution.collect(), "年龄分段统计": age_group_stats.collect(), "性别分布": gender_stats.collect(), "合并症统计": comorbidity_rates.collect(), "吸烟与性别关联": smoking_by_gender.collect(), "年龄统计指标": age_stats.collect()}

    return result_dict

def analyze_physiological_indicators(data_path):

    df = spark.read.csv(data_path, header=True, inferSchema=True)

    ejection_fraction_ranges = df.withColumn("ef_level", when(col("ejection_fraction") < 40, "严重心衰").when(col("ejection_fraction") < 50, "中度心衰").otherwise("轻度心衰"))

    ef_distribution = ejection_fraction_ranges.groupBy("ef_level").agg(count("*").alias("patient_count"), avg("ejection_fraction").alias("平均射血分数"))

    creatinine_ranges = df.withColumn("creatinine_level", when(col("serum_creatinine") <= 1.2, "正常").when(col("serum_creatinine") <= 2.0, "轻度异常").otherwise("严重异常"))

    creatinine_distribution = creatinine_ranges.groupBy("creatinine_level").agg(count("*").alias("patient_count"), avg("serum_creatinine").alias("平均肌酐值"))

    platelets_ranges = df.withColumn("platelets_level", when(col("platelets") < 150000, "血小板减少").when(col("platelets") > 450000, "血小板增多").otherwise("正常"))

    platelets_distribution = platelets_ranges.groupBy("platelets_level").agg(count("*").alias("patient_count"), avg("platelets").alias("平均血小板"))

    cpk_ranges = df.withColumn("cpk_level", when(col("creatinine_phosphokinase") <= 200, "正常").when(col("creatinine_phosphokinase") <= 1000, "轻度升高").otherwise("显著升高"))

    cpk_distribution = cpk_ranges.groupBy("cpk_level").agg(count("*").alias("patient_count"), avg("creatinine_phosphokinase").alias("平均CPK"))

    overall_stats = df.agg(avg("ejection_fraction").alias("平均射血分数"), avg("serum_creatinine").alias("平均血清肌酐"), avg("platelets").alias("平均血小板"), avg("creatinine_phosphokinase").alias("平均CPK"), avg("serum_sodium").alias("平均血钠"))

    indicator_correlations = df.select("ejection_fraction", "serum_creatinine", "platelets", "creatinine_phosphokinase").toPandas().corr()

    abnormal_indicators = df.filter((col("ejection_fraction") < 40) | (col("serum_creatinine") > 1.5) | (col("platelets") < 150000)).count()

    result_dict = {"射血分数分布": ef_distribution.collect(), "血清肌酐分布": creatinine_distribution.collect(), "血小板分布": platelets_distribution.collect(), "CPK分布": cpk_distribution.collect(), "整体指标统计": overall_stats.collect(), "指标相关性": indicator_correlations.to_dict(), "异常指标患者数": abnormal_indicators}

    return result_dict

def analyze_death_risk_factors(data_path):

    df = spark.read.csv(data_path, header=True, inferSchema=True)

    age_death_analysis = df.groupBy("DEATH_EVENT").agg(avg("age").alias("平均年龄"), count("*").alias("患者数量"))

    age_survival_stats = age_death_analysis.withColumn("生存状态", when(col("DEATH_EVENT") == 1, "死亡").otherwise("存活"))

    ef_death_analysis = df.groupBy("DEATH_EVENT").agg(avg("ejection_fraction").alias("平均射血分数"), min("ejection_fraction").alias("最低射血分数"), max("ejection_fraction").alias("最高射血分数"))

    hypertension_death = df.groupBy("high_blood_pressure", "DEATH_EVENT").count().withColumn("高血压状态", when(col("high_blood_pressure") == 1, "有高血压").otherwise("无高血压")).withColumn("生存状态", when(col("DEATH_EVENT") == 1, "死亡").otherwise("存活"))

    hypertension_mortality = df.groupBy("high_blood_pressure").agg((spark_sum("DEATH_EVENT") / count("*") * 100).alias("死亡率")).withColumn("高血压状态", when(col("high_blood_pressure") == 1, "有高血压").otherwise("无高血压"))

    diabetes_death = df.groupBy("diabetes", "DEATH_EVENT").count().withColumn("糖尿病状态", when(col("diabetes") == 1, "有糖尿病").otherwise("无糖尿病")).withColumn("生存状态", when(col("DEATH_EVENT") == 1, "死亡").otherwise("存活"))

    diabetes_mortality = df.groupBy("diabetes").agg((spark_sum("DEATH_EVENT") / count("*") * 100).alias("死亡率")).withColumn("糖尿病状态", when(col("diabetes") == 1, "有糖尿病").otherwise("无糖尿病"))

    smoking_death = df.groupBy("smoking", "DEATH_EVENT").count().withColumn("吸烟状态", when(col("smoking") == 1, "吸烟").otherwise("不吸烟")).withColumn("生存状态", when(col("DEATH_EVENT") == 1, "死亡").otherwise("存活"))

    smoking_mortality = df.groupBy("smoking").agg((spark_sum("DEATH_EVENT") / count("*") * 100).alias("死亡率")).withColumn("吸烟状态", when(col("smoking") == 1, "吸烟").otherwise("不吸烟"))

    creatinine_death_analysis = df.groupBy("DEATH_EVENT").agg(avg("serum_creatinine").alias("平均肌酐"), min("serum_creatinine").alias("最低肌酐"), max("serum_creatinine").alias("最高肌酐"))

    gender_mortality = df.groupBy("sex").agg((spark_sum("DEATH_EVENT") / count("*") * 100).alias("死亡率")).withColumn("性别", when(col("sex") == 1, "男性").otherwise("女性"))

    high_risk_patients = df.filter((col("ejection_fraction") < 35) & (col("serum_creatinine") > 1.5) & (col("age") > 70)).count()

    survival_factors_correlation = df.select("age", "ejection_fraction", "serum_creatinine", "DEATH_EVENT").toPandas()

    correlation_with_death = survival_factors_correlation.corr()["DEATH_EVENT"].to_dict()

    result_dict = {"年龄与死亡关系": age_survival_stats.collect(), "射血分数与死亡关系": ef_death_analysis.collect(), "高血压死亡率": hypertension_mortality.collect(), "糖尿病死亡率": diabetes_mortality.collect(), "吸烟死亡率": smoking_mortality.collect(), "肌酐与死亡关系": creatinine_death_analysis.collect(), "性别死亡率": gender_mortality.collect(), "高危患者数量": high_risk_patients, "死亡风险相关性": correlation_with_death}

    return result_dict

基于Spark的心衰数据特征分析系统技术解析-结语

💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。