计算机毕 设 指导师
⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。
大家都可点赞、收藏、关注、有问题都可留言评论交流
实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!
⚡⚡如果遇到具体的技术问题或计算机毕设方面需求!你也可以在个人主页上咨询我~~
药品数据可视化分析系统 - 简介
本系统聚焦国家药品集中采购领域的海量数据处理与多维度分析需求,采用Hadoop+Spark大数据技术架构实现药品价格、供应结构、分类特征及成本效益的深度挖掘。系统底层基于HDFS分布式文件系统存储药品采集原始数据,利用Spark SQL对药品通用名、生产企业、剂型规格、价格等字段进行批量清洗与标准化处理,通过Pandas与NumPy完成单位价格计算、剂型归一化等数据预处理工作。后端采用Django框架构建RESTful API接口,前端使用Vue+ElementUI搭建交互界面,结合Echarts图表库实现药品价格分布直方图、企业市场份额饼图、剂型对比柱状图、价格区间占比环形图等14项可视化分析维度。系统支持药品单位价格整体分布分析、不同剂型平均价格对比、高价药品Top20排行、头部企业市场集中度分析、通用名高频词云展示、一品多厂竞争格局热力图、同规格单位成本效益计算等核心功能,为医疗机构采购决策、药企竞争格局研判、政策效果评估提供数据支撑,完整展现了大数据技术在医药领域的实际应用价值。
药品数据可视化分析系统 -技术
开发语言:java或Python
数据库:MySQL
系统架构:B/S
前端:Vue+ElementUI+HTML+CSS+JavaScript+jQuery+Echarts
大数据框架:Hadoop+Spark(本次没用Hive,支持定制)
后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)
药品数据可视化分析系统 - 背景
选题背景 随着国家医疗保障局持续推进药品集中带量采购工作,越来越多的常用药品被纳入集采范围,这个过程积累了包含药品名称、生产企业、剂型规格、中标价格等在内的大量结构化数据。这些数据原本分散存储在各批次采购文档中,传统的Excel表格处理方式面对数万条记录时查询效率低下,难以快速完成跨批次的价格趋势分析和企业竞争格局研判。与此同时,医疗机构在实际采购时需要对比同类药品的不同厂家报价,医保部门要评估集采政策对药价的实际影响,药企也希望了解市场竞争态势,这些需求都依赖对海量药品数据的高效处理能力。现有的数据分析工具要么停留在简单的统计汇总层面,要么缺乏直观的可视化展示,无法满足多角度深度挖掘的实际需要。在这样的背景下,运用Hadoop分布式存储解决数据量增长带来的存储压力,借助Spark内存计算框架提升复杂查询的响应速度,结合现代Web可视化技术构建交互式分析平台,成为解决药品采集数据管理痛点的可行方案。
选题意义 开发这套基于Spark的药品数据可视化分析系统,实际意义主要体现在几个方面。对于医疗机构采购人员来说,系统提供的同通用名多厂商价格对比功能能帮助他们快速找到性价比最优的药品选项,单位成本效益分析模块可以排除包装规格干扰科学评估实际采购成本,这些都是日常采购决策中确实需要但手工处理很费时的工作。从医保监管角度看,价格区间分布、头部企业市场集中度等分析维度能够直观反映集采政策在引导药价回归合理水平方面的执行效果,为后续政策调整提供一些数据参考。药品生产企业通过系统的市场竞争格局分析和剂型专业化热力图,可以了解自身产品在集采中的位置,发现可能的市场机会或供应链风险点。从技术实现层面讲,本课题将Hadoop分布式存储、Spark内存计算、Spark SQL结构化查询等大数据核心组件整合到一个完整应用场景中,涉及数据清洗、字段标准化、多维聚合分析、可视化渲染等完整开发流程,对于掌握大数据技术栈的实际工程应用有比较好的练手价值,也能加深对分布式计算优势的理解。
药品数据可视化分析系统 -图片展示
药品数据可视化分析系统 -代码展示
from pyspark.sql.functions import col, avg, count, sum, desc, when, regexp_extract, lower, trim
from pyspark.sql.types import DoubleType
import pandas as pd
import numpy as np
from django.http import JsonResponse
from django.views import View
spark = SparkSession.builder.appName("DrugAnalysis").config("spark.sql.shuffle.partitions", "10").getOrCreate()
def price_distribution_analysis(request):
df = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load("hdfs://localhost:9000/drug_data/national_procurement.csv")
df = df.withColumn("unit_price", (col("price") / col("package_quantity")).cast(DoubleType()))
df = df.filter(col("unit_price").isNotNull() & (col("unit_price") > 0))
price_bins = [0, 10, 50, 200, 500, float('inf')]
bin_labels = ["0-10元", "10-50元", "50-200元", "200-500元", "500元以上"]
price_distribution = df.select("unit_price").toPandas()
price_distribution['price_range'] = pd.cut(price_distribution['unit_price'], bins=price_bins, labels=bin_labels, include_lowest=True)
distribution_count = price_distribution['price_range'].value_counts().to_dict()
total_count = sum(distribution_count.values())
distribution_percent = {k: round(v / total_count * 100, 2) for k, v in distribution_count.items()}
avg_price = df.select(avg("unit_price")).collect()[0][0]
max_price = df.select(col("unit_price")).orderBy(desc("unit_price")).limit(1).collect()[0][0]
min_price = df.select(col("unit_price")).orderBy(col("unit_price")).limit(1).collect()[0][0]
histogram_data = df.select("unit_price").rdd.flatMap(lambda x: x).histogram(20)
histogram_bins = histogram_data[0]
histogram_counts = histogram_data[1]
histogram_result = [{"range": f"{round(histogram_bins[i], 2)}-{round(histogram_bins[i+1], 2)}", "count": histogram_counts[i]} for i in range(len(histogram_counts))]
return JsonResponse({"distribution": distribution_percent, "avg_price": round(avg_price, 2), "max_price": round(max_price, 2), "min_price": round(min_price, 2), "histogram": histogram_result}, safe=False)
def manufacturer_market_analysis(request):
df = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load("hdfs://localhost:9000/drug_data/national_procurement.csv")
df = df.withColumn("manufacturer", trim(col("manufacturer")))
df = df.filter(col("manufacturer").isNotNull() & (col("manufacturer") != ""))
manufacturer_count = df.groupBy("manufacturer").agg(count("*").alias("drug_count")).orderBy(desc("drug_count"))
top10_manufacturers = manufacturer_count.limit(10).toPandas()
total_drugs = df.count()
top10_total = top10_manufacturers['drug_count'].sum()
others_count = total_drugs - top10_total
market_share_data = top10_manufacturers.to_dict('records')
market_share_data.append({"manufacturer": "其他企业", "drug_count": int(others_count)})
concentration_ratio = round(top10_total / total_drugs * 100, 2)
top5_manufacturers = manufacturer_count.limit(5).select("manufacturer").rdd.flatMap(lambda x: x).collect()
df_filtered = df.filter(col("manufacturer").isin(top5_manufacturers))
df_filtered = df_filtered.withColumn("standard_dosage_form", when(lower(col("dosage_form")).contains("片"), "片剂").when(lower(col("dosage_form")).contains("胶囊"), "胶囊剂").when(lower(col("dosage_form")).contains("注射"), "注射剂").when(lower(col("dosage_form")).contains("颗粒"), "颗粒剂").otherwise("其他"))
manufacturer_dosage_analysis = df_filtered.groupBy("manufacturer", "standard_dosage_form").agg(count("*").alias("count"))
dosage_pivot = manufacturer_dosage_analysis.toPandas().pivot(index='manufacturer', columns='standard_dosage_form', values='count').fillna(0)
heatmap_data = []
for manufacturer in dosage_pivot.index:
for dosage_form in dosage_pivot.columns:
heatmap_data.append({"manufacturer": manufacturer, "dosage_form": dosage_form, "count": int(dosage_pivot.loc[manufacturer, dosage_form])})
return JsonResponse({"market_share": market_share_data, "concentration_ratio": concentration_ratio, "heatmap": heatmap_data}, safe=False)
def cost_effectiveness_comparison(request):
generic_name = request.GET.get('generic_name', '阿莫西林')
df = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load("hdfs://localhost:9000/drug_data/national_procurement.csv")
df = df.withColumn("unit_price", (col("price") / col("package_quantity")).cast(DoubleType()))
df = df.withColumn("standard_dose_mg", regexp_extract(col("specification"), r"(\d+(?:\.\d+)?)", 1).cast(DoubleType()))
df_filtered = df.filter((col("generic_name") == generic_name) & (col("unit_price").isNotNull()) & (col("standard_dose_mg").isNotNull()) & (col("standard_dose_mg") > 0))
df_cost_per_mg = df_filtered.withColumn("cost_per_mg", (col("unit_price") / col("standard_dose_mg")))
multi_manufacturer = df_cost_per_mg.groupBy("generic_name").agg(count("manufacturer").alias("manufacturer_count")).filter(col("manufacturer_count") > 1)
if multi_manufacturer.count() == 0:
return JsonResponse({"error": "该药品仅有单一厂商供应,无法进行对比分析"}, status=400)
price_comparison = df_cost_per_mg.select("manufacturer", "unit_price", "specification").orderBy("unit_price").toPandas()
cost_effectiveness = df_cost_per_mg.select("manufacturer", "specification", "standard_dose_mg", "unit_price", "cost_per_mg").orderBy("cost_per_mg").toPandas()
best_value = cost_effectiveness.iloc[0].to_dict()
best_value['cost_per_mg'] = round(best_value['cost_per_mg'], 4)
price_range_stats = df_cost_per_mg.select(avg("unit_price").alias("avg_price"), col("unit_price")).orderBy(desc("unit_price")).limit(1).select(col("unit_price").alias("max_price"))
min_price_row = df_cost_per_mg.select(col("unit_price")).orderBy(col("unit_price")).limit(1)
stats_data = {"avg_price": round(df_cost_per_mg.select(avg("unit_price")).collect()[0][0], 2), "max_price": round(price_range_stats.collect()[0][0], 2), "min_price": round(min_price_row.collect()[0][0], 2)}
price_variance = round(stats_data['max_price'] - stats_data['min_price'], 2)
variance_percent = round((price_variance / stats_data['avg_price']) * 100, 2) if stats_data['avg_price'] > 0 else 0
return JsonResponse({"generic_name": generic_name, "price_comparison": price_comparison.to_dict('records'), "cost_effectiveness": cost_effectiveness.to_dict('records'), "best_value": best_value, "stats": stats_data, "price_variance": price_variance, "variance_percent": variance_percent}, safe=False)
药品数据可视化分析系统 -结语
大数据毕设不会Spark?国家药品采集数据可视化分析系统完整源码+部署教程拯救你
选错大数据毕设延毕vs选对Spark项目保研:药品数据可视化分析系统让导师眼前一亮
大数据毕设项目源码:基于Spark SQL的药品数据分析系统Python开发全流程指导
支持我记得一键三连,再点个关注,学习不迷路!如果遇到有技术问题或者获取源代码,欢迎在评论区留言!
⚡⚡如果遇到具体的技术问题或计算机毕设方面需求!你也可以在个人主页上咨询我~~