numpy pandas matplotlib和django结合,将matplotlib图片显示到HTML上

本文介绍了一个使用Django框架实现的数据可视化系统,该系统能够从Excel文件读取数据,进行数据清洗和处理,并利用matplotlib生成多图表展示。系统还具备异常检测功能,能够识别连续三笔数据的异常趋势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先进行效果展示:

Django文件布局:

views.py

from django.shortcuts import render,HttpResponse
from app1 import BPLackAnalysis
import pandas as pd
import matplotlib.pyplot as plt
import base64
from io import BytesIO

def multiChart(data,sigma_spec):
    plt.figure(figsize=(12,9))
    plt.subplot(311)
    plt.title("CTC Array FAB H3PO4 Monitor for BP Lack")
    plt.plot(data["time"],data["mean"],color="b",marker="*")
    plt.subplot(312)
    data["slope_spec"]=0
    plt.title("$mean{(y2-y1)}$")
    plt.plot(data["time"],data["slope"],color="b")
    plt.plot(data["time"],data["slope_spec"],color="r")
    plt.subplot(313)
    data["sigma_spec"]=sigma_spec
    plt.title("3$sigma$")
    plt.plot(data["time"],data["3sigma"],color="b")
    plt.plot(data["time"],data["sigma_spec"],color="r")
    buffer = BytesIO()
    plt.savefig(buffer)
    plot_data = buffer.getvalue()
    return plot_data

def aaa():
    pass

def index(request):
    if request.method=="POST":
        group_num = 120
        sigma_spec = 0.5
        file_in_path = request.POST.get("file_in_path")
        file_out_path = request.POST.get("file_out_path")
        group_num = request.POST.get("group_num")
        sigma_spec = request.POST.get("sigma_spec")
        print(file_in_path)
        print(group_num)
        try:
            in_file = pd.read_excel(file_in_path)
            print("123")
            data = BPLackAnalysis.dataArrange(in_file,int(group_num))
            data["time"] = data["time"].astype(str)
            print(data.head())
            #将matplotlib图片转换为HTML
            plot_data = multiChart(data,sigma_spec)
            imb = base64.b64encode(plot_data)#对plot_data进行编码
            ims = imb.decode()
            imd = "data:image/png;base64,"+ims
            #iris_im = """<img src="%s">""" % imd
            temp_time = []
            temp_H3PO4 = []
            cnt=0
            for i in range(len(data["slope"])-3):
                if data["slope"][i] < 0 and data["slope"][i+1] < 0 and data["slope"][i+2] < 0:
                    cnt+=1
                    temp_time.insert(0,data["time"][i+2])
                    #只保留两位小数
                    temp_H3PO4.insert(0,round(data["mean"][i+2],2))
                    i+=3
            # 保存清洗后数据
            data.to_excel(file_out_path, sheet_name="data")
            print("OK",temp_time,cnt)
            return render(request, "bplack.html",{"img":imd,"temp_time":temp_time,"cnt":cnt,"temp_H3PO4":temp_H3PO4})
        except:
            ret= "文件读取失败,请确认文件路径是否正确!"+r"正确格式示范:C:\Users\raylu\Desktop\ArrayBP\BPLack.xlsx"
            return HttpResponse(ret)
    else:
        return render(request, "index.html")

 

BPLackAnalysis.py

import numpy as np
import pandas as pd
import xlrd
import datetime
import matplotlib.pyplot as plt

#数据清洗,num为定义母数
def dataArrange(data,num):
    new_data = pd.DataFrame({"time":data["start"],"mean":data["mean"]})
    ls1,ls2,ls3,ls4 = [],[],[],[]
    len_data = len(new_data["time"])
    for i in range(0,int(len_data/num)):
        ls1.insert(0,new_data["time"][len_data-1-i*num])
        #H3PO4 mean
        ls2.insert(0,new_data["mean"][(len_data-1-(i+1)*num):(len_data-1-i*num)].mean())
        #H3PO4 mean: this - last
        if i == 0:
            ls3.insert(0,0)
        else:
            ls3.insert(0,ls2[1]-ls2[0])
        #3 sigma
        ls4.insert(0,new_data["mean"][(len_data-1-(i+1)*num):(len_data-1-i*num)].std()*3)
    return pd.DataFrame({"time":ls1,"mean":ls2,"slope":ls3,"3sigma":ls4})

#时间转换
def timeTrans(data):
    data["time"] = data["time"].apply(
        lambda x:datetime.datetime.strptime(
            x[0:4]+"-"+x[4:6]+"-"+x[6:8]+" "+x[8:10]+":"+x[10:12]+":"+x[12:14],
            "%Y-%m-%d %H:%M:%S")
    )
    return data

#多图绘制
def multiChart(data,sigma_spec):
    plt.figure(figsize=(12,10))
    plt.subplot(311)
    plt.title("CTC Array FAB H3PO4 Monitor for BP Lack")
    plt.plot(data["time"],data["mean"],color="b",marker="*")
    plt.subplot(312)
    data["slope_spec"]=0
    plt.title("$mean{(y2-y1)}$")
    plt.plot(data["time"],data["slope"],color="b")
    plt.plot(data["time"],data["slope_spec"],color="r")
    plt.subplot(313)
    data["sigma_spec"]=sigma_spec
    plt.title("3$sigma$")
    plt.plot(data["time"],data["3sigma"],color="b")
    plt.plot(data["time"],data["sigma_spec"],color="r")
    return plt

if __name__ == "__main__":
    file = r"C:\Users\mayn\Desktop\ArrayBP\BPLack.xlsx"
    read_file = pd.read_excel(file)
    print(read_file.head())
    data = dataArrange(read_file,120)
    print(data.head())
    data["time"] = data["time"].astype(str)
    # data = timeTrans(data)
    # print(data.head())
    #输出清洗后数据
    file_path=r"C:\Users\mayn\Desktop\ArrayBP\new_data.xlsx"
    data.to_excel(file_path,sheet_name="data")
    multiChart(data,0.5)

 

index.html

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>CTC Array FAB H3PO4监控系统</title>

    <!-- Bootstrap -->
    <link href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
    <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
    <!--[if lt IE 9]>
      <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
    <![endif]-->
  </head>
  <body class="container text-center">

    <h3>欢迎使用CTC Array FAB H3PO4监控系统,首先进行您的数据配置</h3>

    <p>
    <form action="/index.html/" method="post">
    {% csrf_token %}
        <table class="table">
            <tr>
                <td class="col-md-3">原始文件路径</td>
                <td class="col-md-9" style="text-align: left"><input type="text" name="file_in_path" style="width: 600px;" placeholder="C:\Users\raylu\Desktop\ArrayBP"></td>
            </tr>
              <tr>
                <td class="col-md-3">输出文件路径</td>
                <td class="col-md-9" style="text-align: left"><input type="text" name="file_out_path" style="width: 600px;" placeholder="C:\Users\raylu\Desktop\ArrayBP"></td>
            </tr>
              <tr>
                <td class="col-md-3">group笔数</td>
                <td class="col-md-9" style="text-align: left"><input type="number" name="group_num" style="width: 600px;" placeholder="120"></td>
            </tr>
              <tr>
                <td class="col-md-3">sigma_spec</td>
                <td class="col-md-9" style="text-align: left"><input type="number" step="0.1" name="sigma_spec" style="width: 600px;" placeholder="0.5"></td>
            </tr>
        </table>
        <p><input type="reset" value="重置">&nbsp;<input type="submit" value="提交配置"></p>
    </form>
    </p>
    <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
    <script src="/static/js/jquery-3.3.1.min.js"></script>
    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
    <script src="/static/plugins/bootstrap/js/bootstrap.min.js"></script>
  </body>
</html>

 

bplack.html

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>CTC Array FAB H3PO4监控系统</title>

    <!-- Bootstrap -->
    <link href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
    <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
    <!--[if lt IE 9]>
      <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
    <![endif]-->
  </head>
  <body class="container text-center">

  <h4>欢迎使用<span style="color: blue; font-size: 30px">CTC Array FAB H3PO4</span>监控系统,
      <a onclick="show_persons(this)">本案技术支持人员:</a></h4>
        <table class="table table-hover table-striped" id="persons">
            <thead class="info">
                <td>No</td>
                <td>Dept.</td>
                <td>Name</td>
                <td>Tele</td>
                <td>email</td>
            </thead>
            <tbody>
                <tr class="warning">
                    <td class="col-md-1">1</td>
                    <td class="col-md-2">QA/QS</td>
                    <td class="col-md-2">王玉</td>
                    <td class="col-md-2">12345</td>
                    <td class="col-md-5">357837067@qq.com</td>
                </tr>
                <tr class="info">
                    <td>2</td>
                    <td>CF/INSP</td>
                    <td>路XX</td>
                    <td>12345</td>
                    <td>357837067@qq.com</td>
                </tr>
            </tbody>
        </table>
        {% if cnt >= 1 %}
        <h4 style="text-align: left">
            连续3笔数据mean(y2-y1)<0笔数:
            <span style="color: red; font-size: 30px">{{ cnt }}</span>&nbsp;
            最近一笔发生时间:
            <span style="color: red; font-size: 20px">{{ temp_time.0 }}</span>&nbsp;
            H3PO4值为:
            <span style="color: red; font-size: 20px">{{ temp_H3PO4.0 }}</span>&nbsp;
            请立即确认是否有异常!</h4>
        {% endif %}
    <p>
        <img src="{{ img }}">
    </p>
    <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
    <script src="/static/js/jquery-3.3.1.min.js"></script>
    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
    <script src="/static/plugins/bootstrap/js/bootstrap.min.js"></script>
    <script>
        function show_persons(ths){

            if ($("#persons").css("display")=="none"){
                $("#persons").show();
            }else{
                $("#persons").hide();
            }
        }
    </script>
  </body>
</html>

 

<think>嗯,用户现在想学习如何使用这些库:Django、mysqlclient、MNE、MNE-BIDS、NumPyPandasMatplotlib、TensorFlow、Celery、Redis。我需要先理清每个库的用途,然后看看他们可能的学习路径应用场景。 首先,用户可能是在开发一个涉及Web应用、数据处理、机器学习任务队列的综合项目。比如,可能是一个科研项目,需要处理神经科学数据(MNEMNE-BIDS),用Django搭建前端,用TensorFlow进行机器学习,用CeleryRedis处理异步任务,同时用PandasNumPy处理数据,Matplotlib可视化结果,mysqlclient作为数据库驱动。 接下来,我需要为每个库给出学习步骤资源。比如,Django需要了解MTV模式,数据库配置,REST框架。mysqlclient是Django连接MySQL的驱动,需要安装配置。MNEMNE-BIDS处理神经数据,可能需要学习加载、处理EEG/MEG数据,以及BIDS标准。NumPyPandas是数据处理基础,Matplotlib用于可视化,TensorFlow涉及深度学习模型,CeleryRedis处理异步任务缓存。 需要确认用户是否有特定的项目需求,或者只是泛泛学习。如果是前者,可能需要更针对性的建议,比如如何整合这些库。但用户没有明确说明,所以保持一般性的学习路径。 另外,注意用户之前的问题是关于依赖解析错误的,可能在使用这些库时遇到了环境配置问题,所以在建议中可以提到虚拟环境的重要性,比如使用venv或conda管理依赖,避免版本冲突。 还要考虑学习资源的推荐,比如官方文档、教程、书籍、视频课程等。例如,Django官方教程,TensorFlow的官方指南,Pandas的文档等。对于MNEMNE-BIDS,可能相对小众,需要更专业的资源,比如官方示例学术论文。 最后,整合所有库到一个项目中可能需要分步骤,先学习单个库,再逐步整合。比如先搭建Django应用,连接MySQL,然后导入数据处理部分,再加入机器学习模型,最后用Celery处理异步任务,Redis做缓存或消息代理。 需要检查是否有库之间的依赖或常见整合问题,比如DjangoCelery的配合使用,TensorFlowNumPy的数据交互,MNE数据的预处理流程等。可能还需要提到常见的错误,比如版本不兼容,如何解决依赖问题,以及调试技巧。 总之,回答需要结构清晰,分库介绍,每个库的学习要点、资源推荐,然后整体项目整合的建议,最后加上环境管理调试提示,帮助用户系统地学习这些库并应用到实际项目中。</think>学习如何高效使用这些库需要结合其用途分阶段实践。以下是各库的核心功能、学习路径及整合建议,助你快速构建全栈应用(Web + 数据分析 + 机器学习 + 异步任务): --- ### **1. Web开发 & 数据库** #### **Django** - **定位**:Python 全功能 Web 框架 - **学习重点**: - **MTV 模式**:理解 Model-Template-View 架构 - **ORM 操作**:使用 `models.py` 定义数据库结构,替代 SQL 语句 - **路由配置**:`urls.py` 设计 URL 映射,`views.py` 处理业务逻辑 - **REST API**:结合 `Django REST Framework` 构建后端接口 - **资源推荐**: - 官方教程:[Django 入门教程](https://docs.djangoproject.com/zh-hans/4.2/intro/) - 实战项目:博客系统、电商平台 #### **mysqlclient** - **定位**:Django 连接 MySQL 的数据库驱动 - **关键步骤**: ```python # settings.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'your_db', 'USER': 'user', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '3306', } } ``` - 安装依赖:`pip install mysqlclient`(需系统安装 MySQL 开发库) --- ### **2. 神经科学数据处理** #### **MNE & MNE-BIDS** - **定位**:EEG/MEG 神经信号处理 BIDS 标准支持 - **核心功能**: - **数据读取**:支持 EDF、BrainVision 等格式 - **预处理**:滤波、去噪、伪迹剔除(如 `mne.filter.notch_filter()`) - **可视化**:绘制脑电拓扑图、时频分析 - **BIDS 集成**:自动生成符合标准的数据集元数据 - **学习资源**: - 官方文档:[MNE 教程](https://mne.tools/stable/auto_tutorials/index.html) - 案例:分析公开数据集(如 [OpenNeuro](https://openneuro.org/)) --- ### **3. 数据分析可视化** #### **NumPy & Pandas** - **NumPy**:数值计算基础库 - 重点:数组操作(`ndarray`)、广播机制、线性代数 ```python import numpy as np data = np.array([[1, 2], [3, 4]]) print(data.T) # 转置矩阵 ``` - **Pandas**:结构化数据分析 - 核心对象:`DataFrame` `Series` - 常用操作:数据清洗、分组聚合(`groupby`)、时间序列处理 ```python import pandas as pd df = pd.read_csv('data.csv') df.groupby('category')['value'].mean() ``` #### **Matplotlib** - **定位**:数据可视化 - **关键功能**: - 绘制折线图、散点图、直方图 - 子图布局(`subplots`)、样式定制(标题、标签、图例) ```python import matplotlib.pyplot as plt plt.plot([1, 2, 3], [4, 5, 1]) plt.xlabel('X轴'); plt.title('示例图') plt.show() ``` --- ### **4. 机器学习深度学习** #### **TensorFlow** - **定位**:端到端深度学习框架 - **学习路径**: 1. **基础 API**:张量操作(`tf.Tensor`)、自动求导(`GradientTape`) 2. **高阶 API**:`Keras` 快速构建模型(`Sequential`/函数式 API) 3. **实战案例**: - 图像分类(CNN) - 时序预测(LSTM) - 自定义模型训练循环 - **资源推荐**: - 官方指南:[TensorFlow 入门教程](https://www.tensorflow.org/tutorials) - 经典教材:《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》 --- ### **5. 异步任务缓存** #### **Celery & Redis** - **Celery**:分布式任务队列 - **核心概念**: - **任务定义**:`@app.task` 装饰器创建异步任务 - **Broker**:使用 Redis 作为消息中间件 - **Worker**:启动 worker 进程处理任务 - **典型场景**: - 后台发送邮件 - 定时任务(`celery beat`) - 耗时计算(如模型推理) - **Redis**:内存数据库(兼消息队列) - **常用功能**: - 缓存加速(如存储会话、高频查询结果) - 发布/订阅模式(Pub/Sub) - 数据结构:字符串、哈希、列表、有序集合 - **整合示例**: ```python # Django 配置 Celery from celery import Celery app = Celery('proj', broker='redis://localhost:6379/0') @app.task def process_data(data): # 调用 TensorFlow 模型处理 return result ``` --- ### **整合建议:构建一个完整项目** 1. **用户通过 Django 前端上传神经数据(EEG)** 2. **Celery 异步调用 MNE 进行预处理** 3. **使用 TensorFlow 模型分析数据并生成报告** 4. **Pandas/Matplotlib 生成可视化图表** 5. **Redis 缓存高频访问数据(如用户配置)** 6. **MySQL 存储结构化数据(用户信息、分析记录)** --- ### **环境管理提示** - **使用虚拟环境**: ```bash python -m venv myenv source myenv/bin/activate # Linux/Mac .\myenv\Scripts\activate # Windows ``` - **依赖文件**:通过 `pip freeze > requirements.txt` 确保环境一致性 --- 通过分模块学习后,逐步将这些库整合到一个实际项目中(如科研数据分析平台),你将掌握从数据采集到智能分析的全流程开发能力。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值