基于大数据的帕金森病数据可视化分析系统 | Hadoop+Spark双引擎驱动:帕金森病数据可视化系统7大模块深度解析

35 阅读7分钟

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

@TOC

基于大数据的帕金森病数据可视化分析系统介绍

帕金森病数据可视化分析系统是一套基于Hadoop+Spark大数据架构的综合性数据分析平台,专门针对帕金森病患者的多维度数据进行深度挖掘和可视化展示。该系统采用分布式计算框架处理海量医疗数据,通过Spark SQL对帕金森病相关数据集进行高效查询和统计分析,结合Pandas和NumPy进行科学计算处理。系统前端基于Vue+ElementUI构建现代化用户界面,集成Echarts图表库实现数据的多维度可视化呈现,包括语音声学特征分析、多维特征关联性探索以及非线性动力学分析等专业功能模块。后端采用Python Django框架提供RESTful API接口,支持用户管理、数据管理、统计分析等核心业务功能,数据存储采用MySQL数据库确保数据的一致性和可靠性。整个系统架构充分发挥了大数据技术在医疗数据处理方面的优势,为帕金森病的数据分析研究提供了完整的技术解决方案。

基于大数据的帕金森病数据可视化分析系统演示视频

演示视频

基于大数据的帕金森病数据可视化分析系统演示图片

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

基于大数据的帕金森病数据可视化分析系统代码展示

from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *
import pandas as pd
import numpy as np
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
import mysql.connector

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

@csrf_exempt
def parkinson_data_analysis(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        patient_id = data.get('patient_id')
        analysis_type = data.get('analysis_type')
        connection = mysql.connector.connect(host='localhost', database='parkinson_db', user='root', password='password')
        cursor = connection.cursor(dictionary=True)
        if analysis_type == 'voice_analysis':
            query = "SELECT voice_frequency, voice_amplitude, voice_jitter, voice_shimmer, voice_hnr FROM parkinson_voice_data WHERE patient_id = %s"
            cursor.execute(query, (patient_id,))
            voice_data = cursor.fetchall()
            if voice_data:
                df_voice = pd.DataFrame(voice_data)
                spark_df = spark.createDataFrame(df_voice)
                spark_df.createOrReplaceTempView("voice_analysis")
                frequency_stats = spark.sql("SELECT AVG(voice_frequency) as avg_freq, MAX(voice_frequency) as max_freq, MIN(voice_frequency) as min_freq, STDDEV(voice_frequency) as std_freq FROM voice_analysis").collect()[0]
                amplitude_correlation = spark.sql("SELECT CORR(voice_frequency, voice_amplitude) as freq_amp_corr FROM voice_analysis").collect()[0]['freq_amp_corr']
                jitter_analysis = spark.sql("SELECT AVG(voice_jitter) as avg_jitter, PERCENTILE_APPROX(voice_jitter, 0.5) as median_jitter FROM voice_analysis").collect()[0]
                shimmer_variance = spark.sql("SELECT VARIANCE(voice_shimmer) as shimmer_var FROM voice_analysis").collect()[0]['shimmer_var']
                hnr_distribution = spark.sql("SELECT voice_hnr, COUNT(*) as frequency FROM voice_analysis GROUP BY voice_hnr ORDER BY voice_hnr").collect()
                voice_quality_score = (frequency_stats['avg_freq'] / 150.0) * 0.3 + (1 / (jitter_analysis['avg_jitter'] + 0.001)) * 0.4 + (amplitude_correlation if amplitude_correlation else 0.5) * 0.3
                abnormal_patterns = []
                if frequency_stats['std_freq'] > 15:
                    abnormal_patterns.append("频率变化异常")
                if jitter_analysis['avg_jitter'] > 0.02:
                    abnormal_patterns.append("语音抖动明显")
                if shimmer_variance > 0.1:
                    abnormal_patterns.append("幅度不稳定")
                result_data = {
                    'frequency_analysis': {
                        'average': round(frequency_stats['avg_freq'], 2),
                        'max': round(frequency_stats['max_freq'], 2),
                        'min': round(frequency_stats['min_freq'], 2),
                        'standard_deviation': round(frequency_stats['std_freq'], 2)
                    },
                    'correlation_analysis': {
                        'frequency_amplitude_correlation': round(amplitude_correlation if amplitude_correlation else 0, 3)
                    },
                    'jitter_analysis': {
                        'average_jitter': round(jitter_analysis['avg_jitter'], 4),
                        'median_jitter': round(jitter_analysis['median_jitter'], 4)
                    },
                    'quality_assessment': {
                        'voice_quality_score': round(voice_quality_score, 2),
                        'abnormal_patterns': abnormal_patterns,
                        'overall_status': '正常' if voice_quality_score > 0.7 else '异常' if voice_quality_score < 0.4 else '警戒'
                    }
                }
        cursor.close()
        connection.close()
        return JsonResponse({'success': True, 'analysis_result': result_data})
    return JsonResponse({'success': False, 'error': 'Invalid request method'})

@csrf_exempt  
def multi_dimensional_correlation_analysis(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        dataset_id = data.get('dataset_id')
        correlation_features = data.get('features', ['age', 'voice_frequency', 'motor_score', 'tremor_amplitude'])
        connection = mysql.connector.connect(host='localhost', database='parkinson_db', user='root', password='password')
        cursor = connection.cursor(dictionary=True)
        feature_columns = ', '.join(correlation_features)
        query = f"SELECT patient_id, {feature_columns}, disease_stage FROM parkinson_patient_data WHERE dataset_id = %s"
        cursor.execute(query, (dataset_id,))
        correlation_data = cursor.fetchall()
        if correlation_data:
            df_correlation = pd.DataFrame(correlation_data)
            numeric_columns = [col for col in correlation_features if df_correlation[col].dtype in ['int64', 'float64']]
            correlation_matrix = df_correlation[numeric_columns].corr()
            spark_df = spark.createDataFrame(df_correlation)
            spark_df.createOrReplaceTempView("correlation_analysis")
            stage_correlation = {}
            for stage in ['early', 'moderate', 'advanced']:
                stage_data = spark.sql(f"SELECT * FROM correlation_analysis WHERE disease_stage = '{stage}'")
                if stage_data.count() > 0:
                    stage_pandas = stage_data.toPandas()
                    stage_corr = stage_pandas[numeric_columns].corr()
                    stage_correlation[stage] = stage_corr.to_dict()
            feature_importance = {}
            for feature in numeric_columns:
                feature_stats = spark.sql(f"SELECT AVG({feature}) as avg_val, STDDEV({feature}) as std_val, COUNT(*) as count_val FROM correlation_analysis WHERE {feature} IS NOT NULL").collect()[0]
                coefficient_of_variation = feature_stats['std_val'] / feature_stats['avg_val'] if feature_stats['avg_val'] != 0 else 0
                correlation_sum = sum(abs(correlation_matrix[feature][other_feature]) for other_feature in numeric_columns if other_feature != feature)
                importance_score = correlation_sum * coefficient_of_variation
                feature_importance[feature] = {
                    'importance_score': round(importance_score, 4),
                    'avg_value': round(feature_stats['avg_val'], 2),
                    'std_deviation': round(feature_stats['std_val'], 2),
                    'sample_count': feature_stats['count_val']
                }
            strong_correlations = []
            for i, feature1 in enumerate(numeric_columns):
                for j, feature2 in enumerate(numeric_columns[i+1:], i+1):
                    corr_value = correlation_matrix.iloc[i, j]
                    if abs(corr_value) > 0.5:
                        strong_correlations.append({
                            'feature_pair': f"{feature1} - {feature2}",
                            'correlation_coefficient': round(corr_value, 3),
                            'correlation_strength': 'strong positive' if corr_value > 0.7 else 'strong negative' if corr_value < -0.7 else 'moderate'
                        })
            cluster_analysis = spark.sql("SELECT disease_stage, COUNT(*) as patient_count, AVG(age) as avg_age FROM correlation_analysis GROUP BY disease_stage ORDER BY patient_count DESC").collect()
            cluster_results = []
            for cluster in cluster_analysis:
                cluster_results.append({
                    'stage': cluster['disease_stage'],
                    'patient_count': cluster['patient_count'],
                    'average_age': round(cluster['avg_age'], 1)
                })
            result_data = {
                'correlation_matrix': correlation_matrix.round(3).to_dict(),
                'stage_correlations': stage_correlation,
                'feature_importance_ranking': dict(sorted(feature_importance.items(), key=lambda x: x[1]['importance_score'], reverse=True)),
                'strong_correlations': strong_correlations,
                'cluster_analysis': cluster_results,
                'analysis_summary': {
                    'total_features': len(numeric_columns),
                    'total_patients': len(correlation_data),
                    'significant_correlations': len(strong_correlations)
                }
            }
        cursor.close()
        connection.close()
        return JsonResponse({'success': True, 'correlation_analysis': result_data})
    return JsonResponse({'success': False, 'error': 'Invalid request method'})

@csrf_exempt
def nonlinear_dynamics_analysis(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        patient_id = data.get('patient_id')
        time_series_type = data.get('time_series_type', 'tremor_signal')
        window_size = data.get('window_size', 100)
        connection = mysql.connector.connect(host='localhost', database='parkinson_db', user='root', password='password')
        cursor = connection.cursor(dictionary=True)
        if time_series_type == 'tremor_signal':
            query = "SELECT timestamp, tremor_x, tremor_y, tremor_z FROM parkinson_tremor_data WHERE patient_id = %s ORDER BY timestamp"
            cursor.execute(query, (patient_id,))
            tremor_data = cursor.fetchall()
            if tremor_data:
                df_tremor = pd.DataFrame(tremor_data)
                df_tremor['tremor_magnitude'] = np.sqrt(df_tremor['tremor_x']**2 + df_tremor['tremor_y']**2 + df_tremor['tremor_z']**2)
                spark_df = spark.createDataFrame(df_tremor)
                spark_df.createOrReplaceTempView("tremor_dynamics")
                windowed_analysis = spark.sql(f"""
                    SELECT 
                        ROW_NUMBER() OVER (ORDER BY timestamp) as window_id,
                        AVG(tremor_magnitude) OVER (ROWS BETWEEN {window_size-1} PRECEDING AND CURRENT ROW) as moving_avg,
                        STDDEV(tremor_magnitude) OVER (ROWS BETWEEN {window_size-1} PRECEDING AND CURRENT ROW) as moving_std,
                        MAX(tremor_magnitude) OVER (ROWS BETWEEN {window_size-1} PRECEDING AND CURRENT ROW) as moving_max,
                        MIN(tremor_magnitude) OVER (ROWS BETWEEN {window_size-1} PRECEDING AND CURRENT ROW) as moving_min,
                        tremor_magnitude,
                        timestamp
                    FROM tremor_dynamics
                """).collect()
                lyapunov_estimates = []
                entropy_values = []
                fractal_dimensions = []
                for i in range(len(windowed_analysis) - window_size):
                    window_data = [row.tremor_magnitude for row in windowed_analysis[i:i+window_size]]
                    time_delayed_embedding = []
                    for j in range(len(window_data) - 3):
                        time_delayed_embedding.append([window_data[j], window_data[j+1], window_data[j+2]])
                    if len(time_delayed_embedding) > 10:
                        distances = []
                        for k in range(len(time_delayed_embedding) - 1):
                            dist = np.sqrt(sum((time_delayed_embedding[k][dim] - time_delayed_embedding[k+1][dim])**2 for dim in range(3)))
                            if dist > 0:
                                distances.append(dist)
                        if distances:
                            lyapunov_approx = np.mean([np.log(abs(d)) for d in distances if d > 0])
                            lyapunov_estimates.append(lyapunov_approx)
                    histogram, _ = np.histogram(window_data, bins=10)
                    probabilities = histogram / sum(histogram)
                    entropy = -sum(p * np.log2(p + 1e-10) for p in probabilities if p > 0)
                    entropy_values.append(entropy)
                    if len(window_data) > 20:
                        log_scales = np.log([2, 4, 8, 16])
                        log_counts = []
                        for scale in [2, 4, 8, 16]:
                            boxes = len(window_data) // scale
                            log_counts.append(np.log(max(1, boxes)))
                        if len(log_scales) > 1 and np.std(log_scales) > 0:
                            fractal_slope = np.polyfit(log_scales, log_counts, 1)[0]
                            fractal_dimensions.append(abs(fractal_slope))
                chaos_indicators = {
                    'lyapunov_exponent': np.mean(lyapunov_estimates) if lyapunov_estimates else 0,
                    'sample_entropy': np.mean(entropy_values) if entropy_values else 0,
                    'fractal_dimension': np.mean(fractal_dimensions) if fractal_dimensions else 1.0
                }
                phase_space_reconstruction = []
                tremor_values = [row.tremor_magnitude for row in windowed_analysis[-200:]]
                for i in range(len(tremor_values) - 2):
                    phase_space_reconstruction.append({
                        'x': tremor_values[i],
                        'y': tremor_values[i+1], 
                        'z': tremor_values[i+2]
                    })
                periodicity_analysis = spark.sql("""
                    SELECT 
                        COUNT(*) as total_points,
                        AVG(tremor_magnitude) as mean_amplitude,
                        PERCENTILE_APPROX(tremor_magnitude, 0.95) as amplitude_95th,
                        PERCENTILE_APPROX(tremor_magnitude, 0.05) as amplitude_5th
                    FROM tremor_dynamics
                """).collect()[0]
                amplitude_range = periodicity_analysis['amplitude_95th'] - periodicity_analysis['amplitude_5th']
                regularity_score = 1.0 / (1.0 + chaos_indicators['sample_entropy'])
                complexity_score = chaos_indicators['fractal_dimension'] * chaos_indicators['sample_entropy']
                system_classification = 'chaotic' if chaos_indicators['lyapunov_exponent'] > 0 else 'periodic' if regularity_score > 0.7 else 'quasi-periodic'
                result_data = {
                    'chaos_analysis': chaos_indicators,
                    'phase_space_points': phase_space_reconstruction[-50:],
                    'periodicity_metrics': {
                        'mean_amplitude': round(periodicity_analysis['mean_amplitude'], 3),
                        'amplitude_range': round(amplitude_range, 3),
                        'regularity_score': round(regularity_score, 3),
                        'complexity_score': round(complexity_score, 3)
                    },
                    'system_classification': {
                        'type': system_classification,
                        'confidence': round(abs(chaos_indicators['lyapunov_exponent']) * 100, 1),
                        'dominant_frequency': round(1.0 / (chaos_indicators['sample_entropy'] + 0.1), 2)
                    },
                    'temporal_patterns': {
                        'total_data_points': periodicity_analysis['total_points'],
                        'analysis_window_size': window_size,
                        'embedding_dimension': 3
                    }
                }
        cursor.close()
        connection.close()
        return JsonResponse({'success': True, 'nonlinear_analysis': result_data})
    return JsonResponse({'success': False, 'error': 'Invalid request method'})

基于大数据的帕金森病数据可视化分析系统文档展示

在这里插入图片描述

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