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

news2024/12/24 8:53:44

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

项目背景

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

数据读取与清洗

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

from pyspark.sql import SparkSession

def 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 frequency
    FROM
        heart
    GROUP BY
    age_group;
    """)

    df.show()

    return df

在这里插入图片描述

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

def sex_ana(spark):
    df = spark.sql("""
        SELECT
    sex,
    COUNT(*) AS count
FROM
    heart
GROUP BY
    sex;
        """)

    df.show()

    return df

在这里插入图片描述

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

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

    df.show()
    return df

在这里插入图片描述

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

#4.每个时间段的死亡事件数量
def death_sum(spark):
    df = spark.sql("""
        SELECT
        time,
        COUNT(*) AS death_count
    FROM heart
    WHERE death_event = 1
    GROUP BY time
    ORDER 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_count
        FROM heart
        GROUP BY ef_range
        ORDER 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("""
        SELECT
      diabetes,
      SUM(death_event) AS death_events
    FROM
      heart
    GROUP BY
    diabetes;
                        """)

    df.show()

    return df

在这里插入图片描述

机器学习模型

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

数据预处理

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

from sklearn.preprocessing import StandardScaler

scaler = 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)
    # 计算WCSS
    wcss = 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)
    # 计算WCSS
    wcss = 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 json

from service.task_service import get_age_death, get_diabetes_cpk, get_death_sum, get_hypertension_prevalence, \
    get_sex_ana, get_diabetes_death


class 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},
            ]
        }

    @property
    def echart1(self):
        data = self.echart1_data
        echart = {
            '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

    @property
    def echart2(self):
        data = self.echart2_data
        echart = {
            '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

    @property
    def echarts3_1(self):
        data = self.echarts3_1_data
        echart = {
            'title': data.get('title'),
            'xAxis': [i.get("name") for i in data.get('data')],
            'data': data.get('data'),
        }
        return echart

    @property
    def echarts3_2(self):
        data = self.echarts3_2_data
        echart = {
            'title': data.get('title'),
            'xAxis': [i.get("name") for i in data.get('data')],
            'data': data.get('data'),
        }
        return echart

    @property
    def echarts3_3(self):
        data = self.echarts3_3_data
        echart = {
            'title': data.get('title'),
            'xAxis': [i.get("name") for i in data.get('data')],
            'data': data.get('data'),
        }
        return echart

    @property
    def echart4(self):
        data = self.echart4_data
        echart = {
            'title': data.get('title'),
            'names': [i.get("name") for i in data.get('data')],
            'xAxis': data.get('xAxis'),
            'data': data.get('data'),
        }
        return echart

    @property
    def echart5(self):
        data = self.echart5_data
        echart = {
            '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

    @property
    def echart6(self):
        data = self.echart6_data
        echart = {
            'title': data.get('title'),
            'xAxis': [i.get("name") for i in data.get('data')],
            'data': data.get('data'),
        }
        return echart

    @property
    def map_1(self):
        data = self.map_1_data
        echart = {
            'symbolSize': data.get('symbolSize'),
            'data': data.get('data'),
        }
        return echart


class SourceData(SourceDataDemo):

    def __init__(self):
        """
        按照 SourceDataDemo 的格式覆盖数据即可
        """
        super().__init__()
        self.title = '心力衰竭数据可视化大屏'


if __name__ == '__main__':
    sd = SourceData()
    print(sd.echart1())

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单例模式与反射创建对象

单例模式 饿汉式单例模式 单例模式&#xff0c;就是自己先把自己创建了&#xff0c;整个程序都只有这一个实例&#xff0c;别人都没有办法创建实例&#xff0c;因为他的构造方法是private的 一次性把全部都创建了 public class HungryMan {private static int [][] s new …

linux的编译器vim

vim简介 之前我们在win下写代码&#xff0c;都是下载一些编译器VS/eclipse等 他们不仅可以写代码&#xff0c;还可以实现代码的运行调试&#xff0c;开发。这样的编译器叫做集成编译器 而linux中虽然也有这样的编译器&#xff0c;但不管是从下载&#xff0c;还是使用中都会显…

利用Opencv4.9为图像添加边框

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇利用OpenCV4.9制作自己的线性滤波器&#xff01; 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 …

Java基于微信小程序的讲座预约系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

拿捏 顺序表(1)

目录 1. 顺序表的分类2. 顺序表实现3. 顺序表实现完整代码4. 总结 前言: 一天xxx想存储一组数据, 并且能够轻松的实现删除和增加, 此时数组大胆站出, 但是每次都需要遍历一遍数组, 来确定已经存储的元素个数, 太麻烦了, 于是迎来了顺序表不屑的调侃: 数组你不行啊… 顺序表是一…

学习亚马逊云科技AWS云计算技术的三款官方免费3A游戏大作

玩3A大作免费电脑游戏&#xff0c;就能成为AWS云架构师、云开发大&#x1f42e;&#xff1f;这么好的事尊的假的&#xff1f;小李哥今天就来给大家介绍&#xff0c;如何通过玩AWS官方的定制版虚拟人生、炉石传说和密室逃脱游戏学习AWS。这三个游戏完全免费&#xff0c;没有任何…

react之组件与JSX

第一章 - 描述用户界面 概述&#xff1a;React是一个用于构建用户界面&#xff08;UI&#xff09;的JavaScript库&#xff0c;用户界面由按钮&#xff0c;文本和图像等小单元内容构建而成。React帮助你把它们组合成可重用&#xff0c;可嵌套的组件。从web端网站到移动端应用&a…

利用Django中的缓存系统提升Web应用性能

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在构建现代Web应用时&#xff0c;性能通常是至关重要的考虑因素之一。为了提高用户体验和应…

云原生Kubernetes: K8S 1.29版本 部署ingress-nginx

目录 一、实验 1.环境 2. K8S 1.29版本 部署ingress-nginx 二、问题 1.kubectl 如何强制删除 Pod、Namespace 资源 2.创建pod失败 3.pod报错ImagePullBackOff 4.docker如何将镜像上传到官方仓库 5.创建ingress报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表…

linux 下的 sqlite数据库

SQLite 认识 SQLite简介 轻量化&#xff0c;易用的嵌入式数据库&#xff0c;用于设备端的数据管理&#xff0c;可以理解成单点的数据库。传统服务器型数据库用于管理多端设备&#xff0c;更加复杂 SQLite是一个无服务器的数据库&#xff0c;是自包含的。这也称为嵌入式数据库&…

【免费源码下载】完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城php+uniapp

简介 完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本&am…

随机游走的艺术-图嵌入表示学习

图嵌入引入 机器学习算法&#xff1a; 厨师 样本集&#xff1a; 食材 只有好的食材才能做出好的饭菜 我们需要把数据变成计算机能够读懂的形式&#xff08;将数据映射成为向量&#xff09; 图嵌入概述 传统图机器学习 图表示学习 自动学习特征&#xff0c;将…

【Linux驱动层】iTOP-RK3568学习之路(三):字符设备驱动框架

一、总体框架图 二、字符设备相关函数 静态申请设备号 register_chrdev_region 函数原型&#xff1a;register_chrdev_region(dev_t from, unsigned count, const char *name) 函数作用&#xff1a;静态申请设备号&#xff0c;可以一次性申请多个连续的号&#xff0c;count指定…

从头开始构建自己的 GPT 大型语言模型

图片来源&#xff1a; Tatev Aslanyan 一、说明 我们将使用 PyTorch 从头开始构建生成式 AI、大型语言模型——包括嵌入、位置编码、多头自注意、残差连接、层归一化&#xff0c;Baby GPT 是一个探索性项目&#xff0c;旨在逐步构建类似 GPT 的语言模型。在这个项目中&#xff…

【教程】MySQL数据库学习笔记(五)——约束(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 第四章 《数据操…

R: 阿尔法α多样性计算和箱图制作,以及差异分析

# install.packages("vegan") library(vegan) library(ggplot2) library(ggpubr)setwd("xxx") # 使用read.table()函数读取数据 df <- read.table("xxx", header TRUE, row.names 1)# 转置数据框 df <- t(df)# 计算每个样品的香农多样性…

【论文笔记】基于预训练模型的持续学习(Continual Learning)(增量学习,Incremental Learning)

论文链接&#xff1a;Continual Learning with Pre-Trained Models: A Survey 代码链接&#xff1a;Github: LAMDA-PILOT 持续学习&#xff08;Continual Learning, CL&#xff09;旨在使模型在学习新知识的同时能够保留原来的知识信息了&#xff0c;然而现实任务中&#xff…

《Linux运维总结:Kylin V10+ARM架构CPU基于docker-compose一键离线部署mongodb4.0.11之副本集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

前后端交互概念

前后端交互概念 1前后端分离开发概念2搭建后端环境2.1配置文件commomcommon-utilservice-utilmodelservice gitee使用 1前后端分离开发概念 前段&#xff1a;运用html、css、js和现成库&#xff0c;对数据作展示。 后端&#xff1a;运用Java和Java框架&#xff0c;提供数据或操…

【树莓派】如何刷个系统给树莓派4B,如何ssh登陆到树莓派

文章目录 下载树莓派镜像下载烧写软件烧写编辑设置连接树莓派4B重启ssh查看树莓派IPssh远程连接问询、帮助 下载树莓派镜像 https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit 下载烧写软件 https://www.raspberrypi.com/software/ 烧写 编辑…