从零基础到大数据高手:基于大数据的结核病数据可视化分析系统让你的毕设脱颖而出

66 阅读5分钟

前言

一.开发工具简介

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

二.系统内容简介

基于大数据的结核病数据可视化分析系统是一套集数据处理、分析与可视化展示于一体的综合性医疗大数据分析平台。该系统采用Hadoop分布式存储架构作为底层数据存储基础,结合Spark大数据处理引擎实现海量结核病相关数据的高效处理与分析,通过HDFS分布式文件系统确保数据的可靠性和可扩展性。系统支持Python和Java两种开发语言实现,分别基于Django和Spring Boot框架构建后端服务,前端采用Vue+ElementUI框架结合Echarts图表库打造直观的用户交互界面。系统核心功能涵盖系统首页、用户中心、用户管理、结核病信息管理等基础模块,重点突出可视化大屏展示功能,通过综合健康特征分析、典型临床症状分析、生活方式风险分析、患者基本特征分析四大专业分析模块,深度挖掘结核病患者的健康数据规律。系统运用Spark SQL进行复杂查询分析,结合Pandas和NumPy进行数据预处理和统计计算,将处理结果以多维度图表形式在可视化大屏中动态展示,为医疗机构提供结核病流行趋势分析、患者特征分布、风险因素识别等决策支持,实现了从数据采集、存储、处理到可视化展示的完整大数据分析流程,为结核病防控工作提供了有力的技术支撑。

三.系统功能演示

从零基础到大数据高手:基于大数据的结核病数据可视化分析系统让你的毕设脱颖而出

四.系统界面展示

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

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

五.系统源码展示



# 功能1:结核病信息管理 - 患者信息录入与管理
def add_tuberculosis_patient(request):
    patient_name = request.POST.get('patient_name')
    age = int(request.POST.get('age'))
    gender = request.POST.get('gender')
    contact_info = request.POST.get('contact_info')
    diagnosis_date = request.POST.get('diagnosis_date')
    clinical_symptoms = request.POST.get('clinical_symptoms')
    treatment_status = request.POST.get('treatment_status')
    risk_factors = request.POST.get('risk_factors')
    
    # 数据验证
    if not patient_name or age <= 0:
        return JsonResponse({'status': 'error', 'message': '患者姓名和年龄不能为空'})
    
    # 创建患者记录
    patient = TuberculosisPatient.objects.create(
        patient_name=patient_name,
        age=age,
        gender=gender,
        contact_info=contact_info,
        diagnosis_date=datetime.strptime(diagnosis_date, '%Y-%m-%d'),
        clinical_symptoms=clinical_symptoms,
        treatment_status=treatment_status,
        risk_factors=risk_factors,
        create_time=datetime.now()
    )
    
    # 同步数据到Hadoop集群
    hdfs_client = InsecureClient('http://localhost:9870')
    patient_data = {
        'patient_id': patient.id,
        'patient_name': patient_name,
        'age': age,
        'gender': gender,
        'diagnosis_date': diagnosis_date,
        'symptoms': clinical_symptoms.split(','),
        'treatment_status': treatment_status
    }
    
    hdfs_path = f'/tuberculosis/patients/{patient.id}.json'
    with hdfs_client.write(hdfs_path) as writer:
        writer.write(json.dumps(patient_data, ensure_ascii=False).encode('utf-8'))
    
    return JsonResponse({'status': 'success', 'patient_id': patient.id})

# 功能2:患者基本特征分析 - 基于Spark的大数据分析
def analyze_patient_characteristics():
    spark = SparkSession.builder.appName("TuberculosisAnalysis").getOrCreate()
    
    # 从HDFS读取患者数据
    df = spark.read.json("hdfs://localhost:9000/tuberculosis/patients/*.json")
    
    # 年龄分布分析
    age_distribution = df.groupBy(
        when(col("age") < 18, "青少年")
        .when(col("age") < 35, "青年")
        .when(col("age") < 60, "中年")
        .otherwise("老年").alias("age_group")
    ).count().collect()
    
    # 性别比例分析
    gender_ratio = df.groupBy("gender").count().collect()
    
    # 治疗状态统计
    treatment_stats = df.groupBy("treatment_status").count().collect()
    
    # 计算各年龄段治愈率
    cure_rate_by_age = df.filter(col("treatment_status").isin(["治愈", "完成治疗"])).groupBy(
        when(col("age") < 18, "青少年")
        .when(col("age") < 35, "青年")
        .when(col("age") < 60, "中年")
        .otherwise("老年").alias("age_group")
    ).count().collect()
    
    # 使用Pandas进行进一步数据处理
    age_df = pd.DataFrame([(row.age_group, row.count) for row in age_distribution], 
                         columns=['age_group', 'count'])
    gender_df = pd.DataFrame([(row.gender, row.count) for row in gender_ratio], 
                           columns=['gender', 'count'])
    
    # 计算统计指标
    total_patients = df.count()
    male_ratio = gender_df[gender_df['gender'] == '男']['count'].values[0] / total_patients * 100
    female_ratio = gender_df[gender_df['gender'] == '女']['count'].values[0] / total_patients * 100
    
    analysis_result = {
        'total_patients': total_patients,
        'age_distribution': age_df.to_dict('records'),
        'gender_distribution': {'male_ratio': round(male_ratio, 2), 'female_ratio': round(female_ratio, 2)},
        'treatment_statistics': [(row.treatment_status, row.count) for row in treatment_stats]
    }
    
    spark.stop()
    return analysis_result

# 功能3:可视化大屏数据生成 - 综合数据处理与可视化
def generate_dashboard_data():
    spark = SparkSession.builder.appName("DashboardData").getOrCreate()
    
    # 读取患者数据
    patients_df = spark.read.json("hdfs://localhost:9000/tuberculosis/patients/*.json")
    
    # 时间趋势分析 - 按月统计新增患者数
    monthly_trend = patients_df.withColumn("month", date_format(col("diagnosis_date"), "yyyy-MM")) \
        .groupBy("month").count().orderBy("month").collect()
    
    # 地区分布分析(假设contact_info包含地区信息)
    region_data = patients_df.withColumn("region", 
        when(col("contact_info").contains("北京"), "北京")
        .when(col("contact_info").contains("上海"), "上海")
        .when(col("contact_info").contains("广州"), "广州")
        .otherwise("其他").alias("region")
    ).groupBy("region").count().collect()
    
    # 症状频次统计
    symptoms_analysis = patients_df.select(explode(split(col("symptoms"), ",")).alias("symptom")) \
        .groupBy("symptom").count().orderBy(desc("count")).limit(10).collect()
    
    # 使用NumPy进行数值计算
    monthly_counts = np.array([row.count for row in monthly_trend])
    trend_slope = np.polyfit(range(len(monthly_counts)), monthly_counts, 1)[0]
    
    # 治疗效果分析
    treatment_effectiveness = patients_df.filter(col("treatment_status").isNotNull()) \
        .groupBy("treatment_status").count().collect()
    
    total_treated = sum([row.count for row in treatment_effectiveness])
    cure_count = sum([row.count for row in treatment_effectiveness if row.treatment_status in ["治愈", "完成治疗"]])
    cure_rate = (cure_count / total_treated * 100) if total_treated > 0 else 0
    
    # 生成Echarts配置数据
    dashboard_data = {
        'patient_trend': {
            'months': [row.month for row in monthly_trend],
            'counts': [row.count for row in monthly_trend],
            'trend_direction': 'up' if trend_slope > 0 else 'down'
        },
        'region_distribution': {
            'regions': [row.region for row in region_data],
            'values': [row.count for row in region_data]
        },
        'top_symptoms': {
            'symptoms': [row.symptom for row in symptoms_analysis],
            'frequencies': [row.count for row in symptoms_analysis]
        },
        'treatment_summary': {
            'total_patients': patients_df.count(),
            'cure_rate': round(cure_rate, 2),
            'treatment_distribution': [(row.treatment_status, row.count) for row in treatment_effectiveness]
        }
    }
    
    # 将结果存储到MySQL
    connection = mysql.connector.connect(
        host='localhost',
        user='root',
        password='password',
        database='tuberculosis_db'
    )
    cursor = connection.cursor()
    
    insert_query = """INSERT INTO dashboard_cache (data_type, data_content, update_time) 
                     VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE 
                     data_content = VALUES(data_content), update_time = VALUES(update_time)"""
    
    cursor.execute(insert_query, ('dashboard_summary', json.dumps(dashboard_data, ensure_ascii=False), datetime.now()))
    connection.commit()
    cursor.close()
    connection.close()
    
    spark.stop()
    return dashboard_data

六.系统文档展示

在这里插入图片描述

结束

在这里插入图片描述

💕💕文末获取源码联系 计算机程序员小杨