{ "cells": [ { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pywebio.input import *\n", "from pywebio.output import *\n", "from pywebio.session import *\n", "import pywebio.pin as pin\n", "from pywebio import start_server\n", "import pandas as pd\n", "from io import StringIO\n", "\n", "# field: v:[字段名, 单位, 数据类型, 格式, 默认空值填充规则, 默认无效值填充规则]\n", "fields = {\n", " '设备码': ['sn', ['-'], '-', '-', '-', '-'], \n", " '时间': ['time', ['-'], '-', ['2023-01-01 00:00:00', '-'],'删除整行', '删除整行'], \n", " '电池包电流': ['pack_crnt', ['A', 'mA'], '-', '-', '向上临近填充', '向上临近填充'], \n", " '电池包电压': ['pack_volt', ['V', 'mV'], '-', '-', '向上临近填充', '向上临近填充'], \n", " '电池包soc': ['soc', ['%', '-'], '-', '-', '向上临近填充', '向上临近填充'],\n", " '电池包soh': ['soh', ['%', '-'], '-', '-', '向上临近填充', '向上临近填充'], \n", " '单体电压列表': ['cell_voltage', ['V', 'mV'], '-', [\"*,*,*,...\", \"[*,*,*,...]\"], '向上临近填充', '向上临近填充'], \n", " '单体温度列表': ['cell_temp', ['℃'], '-', [\"*,*,*,...\", \"[*,*,*,...]\"], '向上临近填充', '向上临近填充'],\n", " '绝缘电阻': ['ins_resis', ['Ω', 'kΩ'], '-', '-', '向上临近填充', '向上临近填充'], \n", " # '速度': ['speed', ['m/s', 'Km/h'], '-', '-', '向上临近填充', '向上临近填充'], \n", " # '海拔': ['altitude', ['Km', 'm'], '-', '-', '向上临近填充', '向上临近填充'],\n", " # '经度': ['longitude', ['-'], '-', '-', '向上临近填充', '向上临近填充'], \n", " # '纬度': ['latitude', ['-'] ,'-', '-', '向上临近填充', '向上临近填充'], \n", " # '累积行驶里程': ['mileage', ['Km', 'm'], '-', '-', '向上临近填充', '向上临近填充']\n", " }\n", "\n", "def t(a):\n", " print(a)\n", "def main():\n", " set_env(title='神目电池安全卫士', output_animation=False)\n", " pin.pin_on_change('none_assign_1', onchange=t)\n", " # while True:\n", " # 上传文件要求: 需要有表头,单体信息格式为 “**,**,**”\n", " file = file_upload(accept=['.csv', '.xlsx','.xls'], placeholder=\"请上传文件,支持 .csv, .xlsx, .xls 文件\")\n", " # filename = '001PB047000001B230100075_2101TS_20230328171402_20230328193302.csv'\n", " # df = pd.read_csv(filename)\n", " filename = file['filename']\n", " put_markdown(f\"## {filename} 文件读取成功,展示前5条数据如下\")\n", " if filename.endswith(\".csv\"):\n", " df = pd.read_csv(StringIO(file['content'].decode('utf-8')))\n", " elif filename.endswith(\".xlsx\"):\n", " df = pd.read_excel(file['content'])\n", " elif filename.endswith(\".xls\"):\n", " df = pd.read_excel(file['content'])\n", " with use_scope('show_data'):\n", " # 展示文件的数据\n", " columns = list(df.columns)\n", " put_table(tdata=df.to_dict(orient='records')[0:5],header=columns)\n", " with use_scope('set_field'):\n", " # 对文件的列进行选择\n", " put_markdown(f\"## 字段自动化识别结果如下,可人工进行修改\")\n", " \n", " header = ['列名','字段','单位','格式']\n", " values = []\n", " i = 0\n", " for k,v in fields.items():\n", " values.append({\n", " '列名': k,\n", " '字段': pin.put_select(name=f\"field_{i}\", options=columns),\n", " '单位': pin.put_select(name=f\"unit_{i}\", options=v[1]),\n", " '格式': pin.put_select(name=f\"format_{i}\", options=v[3]),\n", " })\n", " i = i + 1\n", " put_table(values,header=header)\n", " with use_scope('data_claen'):\n", " # 对文件的列进行选择\n", " put_markdown(f\"## 数据清洗规则\")\n", " header = ['列名', '空值处理', '空值指定值', '无效值处理', '无效值判定值', '无效值指定值']\n", " clean_rule = ['-', '删除整行', '向上临近填充', '向下临近填充', '中位数填充', '平均值填充', '指定值填充']\n", " values = []\n", " i = 0\n", " for k,v in fields.items():\n", " values.append({\n", " '列名': k,\n", " '空值处理': pin.put_select(name=f\"none_{i}\", options=clean_rule, value=v[4]),\n", " '空值指定值': pin.put_input(name=f\"none_assign_{i}\", type='float'),\n", " '无效值处理': pin.put_select(name=f\"invalid_{i}\", options=clean_rule, value=v[5]),\n", " '无效值判定值': pin.put_input(name=f\"invalid_judge_{i}\", type='float'),\n", " '无效值指定值': pin.put_input(name=f\"invalie_assign_{i}\", type='float'),\n", " })\n", " i = i + 1\n", " put_table(values,header=header)\n", " \n", " with use_scope('data_download'):\n", " # 对文件的列进行选择\n", " put_markdown(f\"## 导出清洗后的数据\")\n", " df.to_csv(\"after_clean.csv\")\n", " with open(\"./after_clean.csv\", 'rb') as f:\n", " content = f.read()\n", " put_file('data.csv', content, '下载清洗后的数据文件')\n", " \n", " with use_scope('algo_invoke'):\n", " # 对文件的列进行选择\n", " put_markdown(f\"## 算法模块\")\n", " put_markdown(f\"**1. 基本信息统计模块**\")\n", " header = ['数据包内电池包数', '数据起始时间', '数据结束时间', '数据时长(天)', '电池包最高活跃度', '电池包平均活跃度', \n", " '总数据量', '日最大数据量']\n", " values = [None] * len(header)\n", " put_table([values],header=header)\n", " \n", " put_markdown(f\"**2. 电池信息分析模块**\")\n", " header = ['SN', '电池类型', '电池包电芯串联数', '温度采样个数']\n", " values = [None] * len(header)\n", " put_table([values],header=header)\n", " \n", " put_markdown(f\"**3. 电池安全诊断模块**\")\n", " header = ['诊断指标', '数值', '诊断结果', '推荐数值']\n", " values = [None] * len(header)\n", " put_table([values],header=header)\n", " put_text('''\n", "xxxxxxxx电池于xxxx年xx月xx日发生电芯过压故障 ,故障电芯为xx号电芯,故障发生时最高电芯电压为xxV\n", "xxxxxxxx电池于xxxx年xx月xx日发生绝缘离群故障 ,故障发生时绝缘值为xxxxx\n", "\n", "电池是否存在热失控特征\n", "电池是否存在析锂特征\n", "电池是否存在内短路特征''')\n", " \n", " put_markdown(f\"**4. 电池性能诊断模块**\")\n", " put_markdown(f\" 4.1 SOH衰减信息\")\n", " put_text('''***''')\n", " put_markdown(f\" 4.2 一致性信息\")\n", " header = ['SOC一致性', '内阻一致性', 'SOH一致性', '温度一致性']\n", " values = [None] * len(header)\n", " put_table([values],header=header)\n", " put_markdown(\"**一致性绘图**\")\n", " \n", " put_markdown(f\"**5. 电池画像模块**\")\n", " put_markdown(f\" 5.1 电池充电习惯\")\n", " header = ['日均充电次数', '累计充电安时量', '累计充电次数']\n", " values = [None] * len(header)\n", " put_table([values],header=header)\n", " put_markdown(\"**充电时间段分布图**\")\n", " put_markdown(\"**充电起始soc分布图**\")\n", " put_markdown(\"**充电结束soc分布图**\")\n", " \n", " put_markdown(f\" 5.2 电池放电习惯\")\n", " header = ['日均放电次数', '累计放电安时量', '累计放电次数']\n", " values = [None] * len(header)\n", " put_table([values],header=header)\n", " put_markdown(\"**放电时间段分布图**\")\n", " put_markdown(\"**放电起始soc分布图**\")\n", " put_markdown(\"**放电结束soc分布图**\")\n", " \n", " put_markdown(f\"5.3 电池存储习惯\")\n", " header = ['存储soc均值', '存储温度均值', '最大存储时长']\n", " values = [None] * len(header)\n", " put_table([values],header=header)\n", " put_markdown(\"**存储温度分布**\")\n", " \n", " \n", "\n", " \n", "from utils import common\n", "common.State(5) == common.State.data_clean_exec\n", "# start_server(main, port=8080, debug=True)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "\n", "from pywebio import start_server\n", "from pywebio.output import put_table\n", "from pywebio.input import input\n", "import os\n", "\n", "\n", "def main():\n", " while True:\n", " question = input('Ask something')\n", " put_table([\n", " ['Q:', question],\n", " ['A:', \"answer\"]\n", " ])\n", "\n", "if __name__ == '__main__':\n", " start_server(main, port=8080, debug=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "from utils import image\n", "image.plot_example().render_notebook()\n", "\n", "# 根据列名筛选\n", "\n", " \n", "# 通过数据内容验证已确认的字段\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "map_res" ] } ], "metadata": { "kernelspec": { "display_name": "py3916", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.16" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }