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

spark_0">基于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.ppmy.cn/devtools/7884.html

相关文章

react17+antd4.18 动态实现面包屑导航Breadcrumb-----需改善

1、已经定义好的全部的路由配置&#xff0c;需要是这种格式的&#xff0c;可以再加上关于icon的内容. const routerMap [{path: /home,breadcrumbName: Home,},{path: /page1,breadcrumbName: Page 1,children: [{path: /page1/page101,breadcrumbName: Page 101,children: […

计算机网络中的一些基本概念

ip地址&#xff1a;IP地址是ip协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&#xff0c;以此来屏蔽物理地址的差异。是用来区分主机的。 端口号&#xff1a;每个应用程序对应一个端口号&#xff0c;通过类似门牌号的端口号…

简介:Asp.Net Core进阶高级编程教程

课程简介目录 &#x1f680;前言一、课程背景二、课程目的三、课程特点四、课程适合人员六、最后 &#x1f680;前言 本文是《.Net Core进阶编程课程》教程专栏的导航站&#xff08;点击链接&#xff0c;跳转到专栏主页&#xff0c;欢迎订阅&#xff0c;持续更新…&#xff09…

ICLR 2024 | FTS-Diffusion: 用于合成具有不规则和尺度不变模式的金融时间序列的生成框架

ICLR 2024 | FTS-Diffusion: 用于合成具有不规则和尺度不变模式的金融时间序列的生成框架 原创 QuantML QuantML 2024-04-17 09:53 上海 Content 本文提出了一个名为FTS-Diffusion的新颖生成框架&#xff0c;用于模拟金融时间序列中的不规则和尺度不变模式。这些模式由于其独…

【Linux】NFS网络文件系统搭建

一、服务端配置 #软件包安装 [roothadoop01 ~]# yum install rpcbind nfs-utils.x86_64 -y [roothadoop01 ~]# mkdir /share#配置文件修改 #格式为 共享资源路径 [主机地址] [选项] # [roothadoop01 ~]# vi /etc/exports /share 192.168.10.0/24(rw,sync,no_root_squash) #…

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

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

【数据结构】08排序

08 排序 1. 冒泡排序&#xff08;BubbleSort&#xff09;1.1 循环嵌套实现1.2 递归实现 2. 选择排序2.1 嵌套循环实现2.2 递归实现 3. 插入排序4. 希尔排序4.1 代码实现 5. 快速排序5.1 代码实现6. 归并排序6.1 递归实现6.2 循环实现 7. 堆排序7.1 构建大顶堆7.2 堆排序7.3 代码…

【大模型应用极简开发入门(2)】GPT模型简史:从GPT-1到GPT-4:从小数据量的微调到大数据量的强化学习不断优化模型

文章目录 一. GPT-1&#xff1a;无监督与微调1. 在GPT-1之前的监督学习的问题2. GPT-1中新的学习过程-无监督的预训练3. 复杂任务下的微调4. GPT-1为更强大的模型铺平了道路 二. GPT-2&#xff1a;context learning1. 核心思想&#xff1a;context learning2. GPT-2的数据集 三…

JAVA 整合 亚马逊AWS S3(文件上传,文件下载等)

JAVA 整合 亚马逊AWS S3(文件上传,文件下载) 1.添加依赖 因为aws需要发送请求上传、下载等api,所以需要加上httpclient相关的依赖 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>1.12…

数据结构--双向链表

在讲双向链表之前&#xff0c;我们先了解一下链表的分类&#xff1a; 链表的结构⾮常多样&#xff0c;主要分为带头与不带头、单向与双向、循环与不循环。三个种类可以任意搭配&#xff0c;所以总共可以形成八种链表&#xff0c;但是最常用的是单向不带头不循环链表和双向带头循…

政安晨:【Keras机器学习示例演绎】(七)—— 利用 NeRF 进行 3D 体积渲染

目录 简介 设置 下载并加载数据 NeRF 模型 训练 可视化训练步骤 推理 渲染三维场景 可视化视频 结论 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0…

springboot实现图片防盗链功能

前言&#xff1a; 出于安全考虑&#xff0c;我们需要后端返回的图片只允许在某个网站内展示&#xff0c;不想被爬虫拿到图片地址后被下载。或者&#xff0c;不想浏览器直接访问图片链接。 出于性能考虑&#xff0c;不想要别人的网站&#xff0c;拿着我们的图片链接去展示&…

基于Hadoop的电商用户行为分析系统设计与实现的系统架构设计

采集层&#xff1a;利用Flume采集电商服务器端用户行为数据&#xff0c;把数据处理后发送至HDFS。 存储层&#xff1a;用户行为数据采集上传至HDFS存储&#xff0c; 导入到数据仓库Hive进行计算处理&#xff0c;分析结果保存至MySql数据库中。 计算层&#xff1a;根据分析需求建…

【Linux】系统安全及应用

目录 一、账号安全基本措施 1.系统账号清理 2.密码安全控制 3.历史命令安全管理 4.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 5.ssh远程登录输入三次密码错误则锁定用户 二、Linux中的PAM安全认证 1.su命令的…

《深入浅出.NET框架设计与实现》笔记1——.NET CLI 概述

.NET CLI&#xff08;NET 命令行接口&#xff09;工具是用于开发生成运行和发布.NET应用程序的跨平台工具链。 一、CLI命令 默认安装的命令有 1、基本命令 new restore build publish run test vstest pack migrate clean sln help store 2、项目修改命令 add package add …

IDEA中添加servlet模板

官方代码链接 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException…

【Redis(7)】缓存技术的挑战及设计方案

缓存是计算机科学中用于提升系统性能的一种关键技术。在本文中&#xff0c;我们将针对缓存的基本概念、可能遇到的问题、优缺点、常见策略以及设计一个高可用、高性能、高并发缓存方案的思路进行探讨。 缓存是什么&#xff1f; 缓存是一种数据存储实践&#xff0c;它将频繁访问…

安装IntelliJ IDEA

文章目录 一、前言二、下载IDEA三、安装四、破解 一、前言 工欲善其事必先利其器&#xff0c;学习JAVA的第一步&#xff0c;首先是安装IDE&#xff0c;配置环境&#xff1b; 常用的JAVA IDE是IntelliJ IDEA和eclipse&#xff0c;我选择IntelliJ IDEA 二、下载IDEA 官网下载&…

Python --- 在python中安装NumPy,SciPy,Matplotlib以及scikit-learn(Windows平台)

在python中安装NumPy&#xff0c;SciPy&#xff0c;Matplotlib以及scikit-learn(Windows平台) 本文是针对(像我一样的)python新用户所写的&#xff0c;刚刚在电脑上装好python之后&#xff0c;所需的一些常见/常用的python第三方库/软件包的快速安装指引。包括了这些常用安装包…

Mac电池管理软件 Batteries for Mac v2.2.9直装版

Batteries for Mac&#xff0c;作为一款专为Mac用户设计的电池管理软件&#xff0c;以其强大的功能和智能的监测机制&#xff0c;为用户提供了便捷、高效的电池使用体验。 Batteries for Mac(Mac电池)v2.2.9直装版下载 首先&#xff0c;Batteries for Mac具备实时电池监测功能&…