基于spark进行数据分析的心力衰竭可视化大屏项目

基于spark进行数据分析的心力衰竭可视化大屏项目

项目背景

在当今的医疗领域,数据驱动的决策变得日益重要。心力衰竭作为常见的心血管疾病,其临床数据的分析对于改善患者治疗结果至关重要。本文将介绍如何利用Apache Spark进行大规模心力衰竭临床数据的分析,并结合机器学习模型,构建一个交互式的可视化大屏,以直观展示数据分析结果。

数据读取与清洗

使用PySpark库,我们首先读取CSV文件中的心力衰竭临床记录数据,并进行必要的数据清洗工作,包括处理缺失值和异常值。

from pyspark.sql import SparkSessiondef read_data_csv(spark):df = spark.read.csv("heart_failure_clinical_records_dataset.csv", header=True, inferSchema=True)df.show()return df

在这里插入图片描述

数据分析

我们设计了多个SQL查询,以分析心力衰竭患者的不同临床特征:

1、患者年龄分布:分析不同年龄段患者的死亡事件频率。

def age_death(spark):df = spark.sql("""SELECT(CASE WHEN age >= 0 AND age < 50 THEN '0-49'WHEN age >= 50 AND age < 70 THEN '50-69'WHEN age >= 70 THEN '70+'END) AS age_group,sum(DEATH_EVENT) AS frequencyFROMheartGROUP BYage_group;""")df.show()return df

在这里插入图片描述

2、性别比例:统计患者性别分布。

def sex_ana(spark):df = spark.sql("""SELECTsex,COUNT(*) AS count
FROMheart
GROUP BYsex;""")df.show()return df

在这里插入图片描述

3、糖尿病与CPK水平:对比糖尿病与非糖尿病患者的肌酸磷酸激酶(CPK)水平。

#3.糖尿病与非糖尿病患者的肌酸磷酸激酶(CPK)水平对比
def average_cpk(spark):df = spark.sql("""SELECTdiabetes,AVG(creatinine_phosphokinase) AS average_cpk
FROM heart
GROUP BY diabetes;""")df.show()return df

在这里插入图片描述

4、死亡事件时间分布:统计每个时间段内的死亡事件数量。

#4.每个时间段的死亡事件数量
def death_sum(spark):df = spark.sql("""SELECTtime,COUNT(*) AS death_countFROM heartWHERE death_event = 1GROUP BY timeORDER BY time;""")df.show()return df

在这里插入图片描述

5、射血分数区间分布:分析不同射血分数区间的患者数量。

def hypertension_prevalence(spark):df = spark.sql("""SELECT(CASE WHEN ejection_fraction < 30 THEN '< 30%'WHEN ejection_fraction >= 30 AND ejection_fraction < 40 THEN '30-39%'WHEN ejection_fraction >= 40 AND ejection_fraction < 50 THEN '40-49%'WHEN ejection_fraction >= 50 AND ejection_fraction < 60 THEN '50-59%'WHEN ejection_fraction >= 60 THEN '60% and Above'END) AS ef_range,COUNT(*) AS patient_countFROM heartGROUP BY ef_rangeORDER BY ef_range;""")df.show()return df

在这里插入图片描述

6、血小板计数与死亡事件:探索血小板计数与死亡事件之间的关系。

#6.血小板计数与死亡事件的关系
def platelet_range_count(spark):df = spark.sql("""SELECT(CASE WHEN platelets < 100000 THEN '< 100000'WHEN platelets >= 100000 AND platelets < 150000 THEN '100000-150000'WHEN platelets >= 1500000 AND platelets < 300000 THEN '150000-300000'WHEN platelets >= 300000 AND platelets < 450000 THEN '300000-450000'WHEN platelets >= 450000 THEN '450000 and Above'END) AS platelet_range,SUM(CASE WHEN death_event = 1 THEN 1 ELSE 0 END) AS death_count
FROM heart
GROUP BY platelet_range;""")df.show()return df

在这里插入图片描述

7、糖尿病与死亡事件:分析糖尿病患者的死亡事件数量。

#7.糖尿病与死亡事件的关系
def death_rate_diabetes(spark):df = spark.sql("""SELECTdiabetes,SUM(death_event) AS death_eventsFROMheartGROUP BYdiabetes;""")df.show()return df

在这里插入图片描述

机器学习模型

使用Pandas和Scikit-learn库对数据进行预处理,并应用KMeans聚类算法来识别心力衰竭患者中的不同亚群。

数据预处理

我们选择特征列,使用StandardScaler进行数据标准化处理。

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
scaled_features = scaler.fit_transform(features)

确定最优聚类数

通过Elbow Method和轮廓系数(Silhouette Score)分析,我们确定最佳的聚类数。

K_values = range(2, 50)
wcss_values = []for K in K_values:# 创建KMeans实例kmeans = KMeans(n_clusters=K, random_state=2)# 拟合模型kmeans.fit(scaled_features)# 计算WCSSwcss = kmeans.inertia_wcss_values.append(wcss)

绘制WCSS与K值的关系图

K_values = range(2, 50)
wcss_values = []for K in K_values:# 创建KMeans实例kmeans = KMeans(n_clusters=K, random_state=2)# 拟合模型kmeans.fit(scaled_features)# 计算WCSSwcss = kmeans.inertia_wcss_values.append(wcss)# 绘制WCSS与K值的关系图
plt.plot(K_values, wcss_values, 'bo-')
plt.xlabel('Number of clusters (K)')
plt.ylabel('WCSS')
plt.title('The Elbow Method showing the optimal k')
plt.show()

在这里插入图片描述

绘制轮廓系数与K值的关系图

# 计算每个K值的轮廓系数
silhouette_scores = []
for K in K_values:kmeans = KMeans(n_clusters=K, random_state=42)kmeans.fit(scaled_features)labels = kmeans.labels_score = silhouette_score(scaled_features, labels)silhouette_scores.append(score)# 绘制轮廓系数与K值的关系图
plt.plot(K_values, silhouette_scores, 'ro-')
plt.xlabel('Number of clusters (K)')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Scores for varying K')
plt.show()

在这里插入图片描述

可视化大屏设计

结合Spark分析结果和机器学习模型的输出,我们设计了一个可视化大屏,该大屏包括以下组件:

年龄分布图表:展示不同年龄段患者的死亡事件频率。
性别比例饼图:直观展示患者性别分布。
CPK水平对比图:通过箱线图展示糖尿病与非糖尿病患者的CPK水平对比。
时间序列图表:展示随时间变化的死亡事件数量。
射血分数分布图:条形图展示不同射血分数区间的患者数量。
血小板计数与死亡事件:通过堆叠条形图展示不同血小板计数范围的死亡事件数量。
糖尿病与死亡事件图表:散点图展示糖尿病患者的死亡事件数量。

import jsonfrom service.task_service import get_age_death, get_diabetes_cpk, get_death_sum, get_hypertension_prevalence, \get_sex_ana, get_diabetes_deathclass SourceDataDemo:def __init__(self):self.title = ''a,b = get_sex_ana()self.counter = {'name': '女性患者数量', 'value': b}self.counter2 = {'name': '男性患者数量', 'value': a}self.echart1_data = {'title': '患者年龄分布','data': get_age_death()}self.echart2_data = {'title': '糖尿病与非糖尿病患者的(CPK)水平对比','data': get_diabetes_cpk()}self.echarts3_1_data = {'title': '死亡情况','data': get_death_sum()}self.echarts3_2_data = {'title': '性别分布','data': [{"name": "男性", "value": a},{"name": "女性", "value": b},]}self.echarts3_3_data = {'title': '糖尿病情况','data': get_diabetes_death()}self.echart4_data = {'title': '患者死亡时间','data': [{"name": "女性", "value": [3, 4, 3, 4, 3, 4, 3, 6, 2, 4, 2, 4, 3, 4, 3, 4, 3, 4, 3, 6, 2, 4, 4]},{"name": "男性", "value": [5, 3, 5, 6, 1, 5, 3, 5, 6, 4, 6, 4, 8, 3, 5, 6, 1, 5, 3, 7, 2, 5, 8]},],'xAxis': ['01', '02', '03', '04', '05', '06', '07', '08', '09', '11', '12', '13', '14', '15', '16', '17','18', '19', '20', '21', '22', '23', '24'],}self.echart5_data = {'title': '不同射血分数区间的患者分布','data': get_hypertension_prevalence()}self.echart6_data = {'title': '血小板计数与死亡事件的关系','data': get_diabetes_death()}self.map_1_data = {'symbolSize': 100,'data': [{'name': '海门', 'value': 239},{'name': '鄂尔多斯', 'value': 231},{'name': '招远', 'value': 203},]}@propertydef echart1(self):data = self.echart1_dataechart = {'title': data.get('title'),'xAxis': [i.get("name") for i in data.get('data')],'series': [i.get("value") for i in data.get('data')]}return echart@propertydef echart2(self):data = self.echart2_dataechart = {'title': data.get('title'),'xAxis': [i.get("name") for i in data.get('data')],'series': [i.get("value") for i in data.get('data')]}return echart@propertydef echarts3_1(self):data = self.echarts3_1_dataechart = {'title': data.get('title'),'xAxis': [i.get("name") for i in data.get('data')],'data': data.get('data'),}return echart@propertydef echarts3_2(self):data = self.echarts3_2_dataechart = {'title': data.get('title'),'xAxis': [i.get("name") for i in data.get('data')],'data': data.get('data'),}return echart@propertydef echarts3_3(self):data = self.echarts3_3_dataechart = {'title': data.get('title'),'xAxis': [i.get("name") for i in data.get('data')],'data': data.get('data'),}return echart@propertydef echart4(self):data = self.echart4_dataechart = {'title': data.get('title'),'names': [i.get("name") for i in data.get('data')],'xAxis': data.get('xAxis'),'data': data.get('data'),}return echart@propertydef echart5(self):data = self.echart5_dataechart = {'title': data.get('title'),'xAxis': [i.get("name") for i in data.get('data')],'series': [i.get("value") for i in data.get('data')],'data': data.get('data'),}return echart@propertydef echart6(self):data = self.echart6_dataechart = {'title': data.get('title'),'xAxis': [i.get("name") for i in data.get('data')],'data': data.get('data'),}return echart@propertydef map_1(self):data = self.map_1_dataechart = {'symbolSize': data.get('symbolSize'),'data': data.get('data'),}return echartclass SourceData(SourceDataDemo):def __init__(self):"""按照 SourceDataDemo 的格式覆盖数据即可"""super().__init__()self.title = '心力衰竭数据可视化大屏'if __name__ == '__main__':sd = SourceData()print(sd.echart1())

在这里插入图片描述
如有遇到问题可以找小编沟通交流哦。另外小编帮忙辅导大课作业,学生毕设等。不限于python,java,大数据,模型训练等。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/637616.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS 32位调试环境搭建

一、背景 调试IOS程序经常使用gdb&#xff0c;目前gdb只支持32位程序调试&#xff0c;暂不支持IOS 64位程序调试。IOS 32位程序使用GDB调试之前&#xff0c;必须确保手机已越狱&#xff0c;否则无法安装和使用GDB调试软件。下面详细介绍GDB调试IOS 32位程序的环境搭建。 二、I…

SpringCloud 与 Dubbo 的区别详解

一、Spring Cloud 和 Dubbo 的概述 1.1 SpringCloud 简介 SpringCloud 是一个用于构建云原生应用的框架集合&#xff0c;它为开发者提供了一套完整的工具链&#xff0c;用于快速搭建分布式系统。SpringCloud 基于 SpringBoot 开发&#xff0c;具有如下特点&#xff1a; 提供…

智慧园区引领未来产业趋势:科技创新驱动园区发展,构建智慧化产业新体系

目录 一、引言 二、智慧园区引领未来产业趋势 1、产业集聚与协同发展 2、智能化生产与服务 3、绿色可持续发展 三、科技创新驱动园区发展 1、创新资源的集聚与整合 2、创新成果的转化与应用 3、创新文化的培育与弘扬 四、构建智慧化产业新体系 1、优化产业布局与结构…

TBWeb开发版V3.2.6免授权无后门Chatgpt系统源码下载及详细安装教程

TBWeb系统是基于 NineAI 二开的可商业化 TB Web 应用&#xff08;免授权&#xff0c;无后门&#xff0c;非盗版&#xff0c;已整合前后端&#xff0c;支持快速部署&#xff09;。相比稳定版&#xff0c;开发版进度更快一些。前端改进&#xff1a;对话页UI重构&#xff0c;参考C…

年如何在不丢失数据的情况下解锁锁定的 Android 手机?

当您忘记密码、PIN 码或图案并且想要解锁 Android 手机时&#xff0c;您可能会丢失 Android 手机上的数据。但您无需再担心&#xff0c;因为在这里&#xff0c;我们想出了几种解锁锁定的 Android 手机而不丢失数据的方法。 方法 1. 使用 Android Unlock 解锁锁定的 Android 且不…

网络原理-UDP和TCP

在传输层中有两个非常重要的协议&#xff0c;UDP和TCP&#xff0c;现在就来研究一下这两个协议。 UDP 报文格式 我们观察可以发现&#xff0c;里面UDP报文长度为2个字节&#xff0c;那么是多少呢&#xff1f;我们需要快速反应如下固定字节数据类型的取值范围&#xff1a; 字…

【大语言模型LLM】-使用大语言模型搭建点餐机器人

关于作者 行业&#xff1a;人工智能训练师/LLM 学者/LLM微调乙方PM发展&#xff1a;大模型微调/增强检索RAG分享国内大模型前沿动态&#xff0c;共同成长&#xff0c;欢迎关注交流… 大语言模型LLM基础-系列文章 【大语言模型LLM】-大语言模型如何编写Prompt?【大语言模型LL…

微信小程序vue.js+uniapp服装商城销售管理系统nodejs-java

本技术是java平台的开源应用框架&#xff0c;其目的是简化Sping的初始搭建和开发过程。默认配置了很多框架的使用方式&#xff0c;自动加载Jar包&#xff0c;为了让用户尽可能快的跑起来spring应用程序。 SpinrgBoot的主要优点有&#xff1a; 1、为所有spring开发提供了一个更快…

第七周C语言编程题

第七周C语言编程题 第一题 题目&#xff1a;循环结构练习05 用for语句输出倒三角图案 这是一个编程题模板。 要求用for语句&#xff0c;输出指定的由“*”符号组成的倒三角图案。 输入格式: 本题目没有输入。 输出格式: 按照下列格式输出由“*”符号组成的倒三角图案。…

随机森林计算指标重要性—从决策树到随机森林Python实现

文章目录 前言一、节点二、决策树2.1 案例分析——优良的水稻2.2 案例分析——家庭财富水平 三、随机森林三、Python代码实现3.1 关键问题3.1.1 节点的表示3.1.2 决策树的表示** 根节点划分左右子树的依据 **3.1.3 随机森林的构造与重要性的表示 3.2 节点类3.2 决策树类3.2.1 初…

【硬十宝典】——1.4【基础知识】电源完整性——理解与设计

定义&#xff1a; 电源完整性&#xff08;Power integrity&#xff09;简称PI&#xff0c;是确认电源来源及目的端的电压及电流是否符合需求。 电源完整性在现今的电子产品中相当重要。有几个有关电源完整性的层面&#xff1a;芯片层面、芯片封装层面、电路板层面及系统层面。…

Spring Boot集成zipkin快速入门Demo

1.什么zipkin Zipkin是一款开源的分布式实时数据追踪系统&#xff08;Distributed Tracking System&#xff09;&#xff0c;基于 Google Dapper的论文设计而来&#xff0c;由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。Zipkin默认支持Http协议&…