{ "cells": [ { "cell_type": "markdown", "id": "92891af2-e909-4b8e-a08a-b5b5e4a1c732", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "# 体质测试2024年" ] }, { "cell_type": "markdown", "id": "338fb8da-815a-4536-ae91-4f461ba9401f", "metadata": {}, "source": [ "## 体测人员导入" ] }, { "cell_type": "code", "execution_count": null, "id": "ba24132c-133f-4508-8fe7-e68d1908b6e9", "metadata": {}, "outputs": [], "source": [ "import openpyxl\n", "import json\n", "from datetime import date\n", "\n", "wb = openpyxl.load_workbook('data/镇海参加测试人员名单(合并).xlsx')\n", "sheet = wb.active\n", "# sheets = wb.sheetnames\n", "person = {}\n", "\n", "for n in range(2, sheet.max_row+1):\n", " code = int(sheet.cell(n, 1).value)\n", " person.setdefault(code, {})\n", " dict1 = {}\n", " dict1['name'] = sheet.cell(n, 2).value\n", " dict1['sex'] = sheet.cell(n, 3).value\n", " dict1['unit'] = sheet.cell(n, 5).value\n", " if sheet.cell(n, 6).value is not None:\n", " dict1['gh'] = sheet.cell(n, 6).value\n", " dict1['birth'] = str(sheet.cell(n, 4).value).replace('/','-').split(' ')[0] \n", " if sheet.cell(n, 7).value is not None:\n", " dict1['phone'] = str(sheet.cell(n,7).value)\n", " person[code] = dict1\n", "filename = 'data/镇海(合并).json'\n", "with open(filename, 'w') as fl:\n", " json.dump(person, fl, ensure_ascii=False)\n", "print('ok')" ] }, { "cell_type": "markdown", "id": "10ddfd3b-697c-4459-8bed-147b22f88239", "metadata": {}, "source": [ "## 生成读卡系统文件" ] }, { "cell_type": "code", "execution_count": 6, "id": "63ab2d5b-3a0a-4ac7-a3e7-b3a34e621e98", "metadata": { "execution": { "iopub.execute_input": "2025-10-27T12:38:36.648112Z", "iopub.status.busy": "2025-10-27T12:38:36.647778Z", "iopub.status.idle": "2025-10-27T12:38:36.692128Z", "shell.execute_reply": "2025-10-27T12:38:36.691382Z", "shell.execute_reply.started": "2025-10-27T12:38:36.648082Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ok\n" ] } ], "source": [ "import json\n", "\n", "filename = 'data/镇海.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "list1 = []\n", "for k, v in dict1.items():\n", " dict2 = {}\n", " #if dict1['sex'] =='男':\n", " # sex = 1\n", " \n", " dict2 = {'id':k,'name':v['name'],'gender':v['sex'],'birth':v['birth'],'unit':v['unit']}\n", " list1.append(dict2)\n", "json_data = json.dumps(list1,ensure_ascii=False, indent=4) \n", "\n", "# 将 json 数据写入文件\n", "with open(\"data/card_镇海.json\", \"w\",encoding = 'utf-8') as file:\n", " file.write(json_data) \n", "print('ok')" ] }, { "cell_type": "markdown", "id": "b6dd08b0-f58c-4dc1-86a9-e7b2b84478c3", "metadata": {}, "source": [ "## 获取人员测试成绩" ] }, { "cell_type": "code", "execution_count": null, "id": "5d864909-d10f-461d-8e6e-dc5c43613576", "metadata": {}, "outputs": [], "source": [ "import json\n", "import time\n", "import csv\n", "\n", "filename = '../item.json'\n", "item = {}\n", "unit = {}\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "for k,v in dict1.items():\n", " item[k] = v\n", "re_ta = {}\n", "dict1 = {}\n", "list1 = []\n", "filename = 'data/镇海(合并).json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "\n", "filename = 'data/places_result_20240922.csv'\n", "with open(filename,'r',newline='') as csv_file:\n", " fl = csv.reader(csv_file,delimiter=',')\n", " header = next(fl) \n", " for line in fl:\n", " #line = re.sub('[\\r\\n\\f ]{1,}', '', line)\n", " list1.append(line)\n", "#print(list1)\n", "for result in list1:\n", " user = str(result[2])\n", " if user in dict1.keys(): \n", " m_item = str(result[3]) \n", " re_ta.setdefault(user,{}) \n", " re_ta[user]['name'] = dict1[user]['name']\n", " re_ta[user]['sex'] = dict1[user]['sex'] \n", " re_ta[user]['unit'] = dict1[user]['unit']\n", " #re_ta[user]['sub_unit'] = dict1[user]['sub_unit']\n", " item_name = item[m_item]['name']\n", " re_ta[user].setdefault(item_name,{}) \n", " score = int(result[4])/item[m_item]['divisor'] \n", " re_ta[user][item_name]['成绩'] = f'{score} {item[m_item][\"unit\"]}'\n", "print(len(re_ta))\n", "filename = 'data/result_镇海(合并).json'\n", "\n", "with open(filename,'w') as fl:\n", " json.dump(re_ta, fl, ensure_ascii=False) \n", "print(len(re_ta))" ] }, { "cell_type": "markdown", "id": "a08c6b65-a390-451b-b1a5-fc474db40035", "metadata": {}, "source": [ "## 导出测试人员信息" ] }, { "cell_type": "code", "execution_count": null, "id": "bc79f0d2-62a2-40c8-bd74-9c7ff17bec8e", "metadata": {}, "outputs": [], "source": [ "import json\n", "import openpyxl\n", "\n", "items = ['身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n", "title = ['编号','姓名','性别','单位','部门','身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n", "\n", "filename = 'data/result_镇海.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "\n", "filename = 'data/镇海体测人员.json'\n", "with open(filename,'r') as fl:\n", " dict2 = json.load(fl)\n", " \n", "list1 = []\n", "for k, v in dict1.items():\n", " list2 = []\n", " list2.append(str(k).rjust(5,'0'))\n", " list2.append(v['name']) \n", " list2.append(dict2[k]['sex'])\n", " list2.append(dict2[k]['unit']) \n", " for item in items:\n", " if item in v.keys():\n", " list2.append(v[item]['成绩']) \n", " elif item =='name':\n", " list2.append(v[item])\n", " else:\n", " list2.append('')\n", " list2.append(dict2[k]['gwxl'])\n", " list2.append(dict2[k]['gzz'])\n", " list1.append(list2)\n", "filename = 'data/镇海体测情况表.xlsx'\n", "wb = openpyxl.Workbook()\n", "sheet = wb.active\n", "sheet.append(title)\n", "for row in list1:\n", " sheet.append(row)\n", " \n", "wb.save(filename)" ] }, { "cell_type": "markdown", "id": "0c2dfa71-8680-4ec6-938d-d37eeba4d4f9", "metadata": {}, "source": [ "## 统计未体测人员明细表" ] }, { "cell_type": "code", "execution_count": null, "id": "cf22739a-5cf3-47fd-b87a-158a2e2d5a95", "metadata": {}, "outputs": [], "source": [ "import json\n", "import openpyxl\n", "\n", "filename = 'data/result_镇海.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "\n", "filename = 'data/镇海1.json'\n", "with open(filename,'r') as fl:\n", " dict2 = json.load(fl)\n", "\n", "list1 = []\n", "\n", "i = 1\n", "for k, v in dict2.items(): \n", " if k not in dict1.keys():\n", " list2 = [i,k,v['name'],v['unit']]\n", " i+=1\n", " list1.append(list2)\n", "#print(list1)\n", "filename = f'data/镇海未测试人员名单(截至20240922).xlsx'\n", "title = ['序号','员工编号','姓名','部门']\n", "wb = openpyxl.Workbook()\n", "sheet = wb.active\n", "sheet.append(title)\n", "for row in list1:\n", " sheet.append(row) \n", "wb.save(filename)" ] }, { "cell_type": "markdown", "id": "286a65eb-995f-4183-a4e5-6d907ba21151", "metadata": {}, "source": [ "## 清理重复人员" ] }, { "cell_type": "code", "execution_count": null, "id": "f4dade65-f760-4220-8a65-39843688a60a", "metadata": {}, "outputs": [], "source": [ "import json\n", "\n", "filename = 'data/镇海.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "print(len(dict1))\n", "dict2 = {}\n", "for k, v in dict1.items():\n", " if 'phone' in v.keys():\n", " dict2.setdefault(k,{})\n", " dict2[k]['name'] = v['name']\n", " dict2[k]['phone'] = v['phone']\n", "\n", "list1 = []\n", "for k, v in dict2.items():\n", " i = 0\n", " for k1, v1 in dict1.items():\n", " if v['name']== v1['name'] and v['phone'] == v1['phone'] and k1 != k:\n", " list1.append(max(int(k),int(k1)))\n", "for item in set(list1):\n", " del dict1[str(item)]\n", "print(len(dict1))\n", "filename = 'data/镇海1.json'\n", "\n", "with open(filename,'w') as fl:\n", " json.dump(dict1, fl, ensure_ascii=False) \n" ] }, { "cell_type": "markdown", "id": "e513b5bb-8a4e-412a-880b-1ae36e059bfd", "metadata": {}, "source": [ "## 转换报告格式" ] }, { "cell_type": "code", "execution_count": null, "id": "7f038e8d-dd57-4880-8726-6dfa86fbc4a2", "metadata": {}, "outputs": [], "source": [ "import json\n", "import datetime\n", "import csv\n", "from datetime import date\n", "\n", "filename = '../item.json'\n", "item = {}\n", "unit = {}\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "for k,v in dict1.items():\n", " item[k] = v\n", "item['1']['en'] = 'lung'\n", "item['2']['en'] = 'grip'\n", "item['3']['en'] = 'flexion'\n", "item['4']['en'] = 'jump'\n", "item['5']['en'] = 'pushup'\n", "item['6']['en'] = 'balance'\n", "item['7']['en'] = 'reaction'\n", "item['8']['en'] = 'step'\n", "item['9']['en'] = 'situp'\n", "item['10']['en'] = 'height'\n", "item['11']['en'] = 'weight'\n", "\n", "\n", "re_ta = {}\n", "dict1 = {}\n", "list1 = []\n", "filename = 'data/镇海(合并).json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "\n", "filename = 'data/places_result_20240922.csv'\n", "with open(filename,'r',newline='') as csv_file:\n", " fl = csv.reader(csv_file,delimiter=',')\n", " header = next(fl) \n", " for line in fl:\n", " #line = re.sub('[\\r\\n\\f ]{1,}', '', line)\n", " list1.append(line)\n", "#f_item = ['lung','grip','flexion','jump','balance','reaction','step','situp']\n", "#m_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step']\n", "for result in list1:\n", " user = str(result[2])\n", " rq = date.fromisoformat(result[6].replace('/','-'))\n", " if user in dict1.keys():\n", " l_xm = []\n", " m_item = str(result[3]) \n", " re_ta.setdefault(user,{}) \n", " re_ta[user]['name'] = dict1[user]['name']\n", " re_ta[user]['sex'] = dict1[user]['sex']\n", " if dict1[user]['sex'] == '男':\n", " l_xm = ['weight','height','lung','grip','flexion','jump','pushup','balance','reaction','step']\n", " else:\n", " l_xm = ['weight','height','lung','grip','flexion','jump','balance','reaction','step','situp']\n", " re_ta[user]['unit'] = dict1[user]['unit']\n", " #birth = date.fromisoformat(dict1[user]['birth'].replace('/','-'))\n", " birth = date.fromisoformat(dict1[user]['birth'])\n", " #nian = int(birth[0].strip())\n", " #yue = int(birth[1].strip())\n", " #ri = int(birth[2].strip())\n", " #print(k,nian,yue,ri)\n", " item_name = item[m_item]['en'] \n", " if item_name in l_xm: \n", " days = (rq-birth).days \n", " re_ta[user]['age'] = int(days/365)\n", " re_ta[user]['month'] = int(days/365*12)\n", " re_ta[user]['rq'] = result[6]\n", "\n", "\n", " re_ta[user].setdefault(item_name,{}) \n", " score = int(result[4])/item[m_item]['divisor'] \n", " re_ta[user][item_name]['成绩'] = f'{score} {item[m_item][\"unit\"]}'\n", "print(len(re_ta))\n", "filename = 'data/result_镇海(合并).json'\n", "\n", "with open(filename,'w') as fl:\n", " json.dump(re_ta, fl, ensure_ascii=False) \n", "print(len(re_ta))" ] }, { "cell_type": "markdown", "id": "de2eec6d-a74e-47e1-ab7a-c7f6eda80a20", "metadata": {}, "source": [ "## 生成完善得分" ] }, { "cell_type": "code", "execution_count": null, "id": "763aa68a-da54-4745-a759-4399aba10f7e", "metadata": {}, "outputs": [], "source": [ "import json\n", "import time\n", "\n", "filename = '../item.json'\n", "item = {}\n", "unit = {}\n", "with open(filename,'r') as fl:\n", " dict3 = json.load(fl) \n", "for k,v in dict3.items():\n", " item[k] = v\n", "item['1']['en'] = 'lung'\n", "item['2']['en'] = 'grip'\n", "item['3']['en'] = 'flexion'\n", "item['4']['en'] = 'jump'\n", "item['5']['en'] = 'pushup'\n", "item['6']['en'] = 'balance'\n", "item['7']['en'] = 'reaction'\n", "item['8']['en'] = 'step'\n", "item['9']['en'] = 'situp'\n", "item['10']['en'] = 'height'\n", "item['11']['en'] = 'weight'\n", "\n", "filename = 'data/体质检测标准 (1).json' \n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "\n", "\n", "\n", "def cal_score(data1):\n", " #data = {'name':'张三','sex':'M','age':37,'item':'StepExperiment','result':46} \n", " person = dict1['person']\n", " criteria = dict1['criteria']\n", " if data1['age'] >59:\n", " data1['age'] = 59\n", " if data1['age'] <20:\n", " data1['age'] = 20\n", " info = data1['sex']+str(data1['age'])\n", " bz = person[info]\n", " mx = criteria[bz][data1['item']]\n", " result = data1['result'] \n", " if data1['item'] == 'reaction':\n", " for bz1 in mx:\n", " if result > bz1:\n", " #print(bz1)\n", " score = mx.index(bz1,0)\n", " break\n", " else:\n", " score = 5\n", " else:\n", " for bz1 in mx:\n", " if result < bz1:\n", " #print(bz1)\n", " score = mx.index(bz1,0)\n", " break\n", " else:\n", " score = 5\n", " return(score)\n", "filename = 'data/体质检测标准_BMI.json'\n", "with open(filename,'r') as fl:\n", " dict4 = json.load(fl) \n", " \n", "def cal_bmi(data1):\n", " # data = {'name':'张三','sex':'M','age':37,'item':'HeightWeight','result':'177.7,97.0'}\n", " person = dict4['person']\n", " criteria = dict4['criteria']\n", " if data1['age'] > 59:\n", " data1['age'] = 59\n", " if data1['age'] <20:\n", " data1['age'] = 20\n", " info = data1['sex']+str(data1['age'])\n", " bz = person[info]\n", " #print(bz)\n", " result = data1['result']\n", " #print(data1['code'],result)\n", " height = int(float(result.split(',')[0]))\n", " weight = float(result.split(',')[1])\n", " if str(height) not in criteria[bz]:\n", " score = 1\n", " else: \n", " mx = criteria[bz][str(height)]\n", " if weight < mx[0]:\n", " score = 1\n", " elif weight < mx[1]:\n", " score = 3\n", " elif weight < mx[2]:\n", " score = 5 \n", " elif weight <= mx[3]:\n", " score = 3 \n", " elif weight > mx[3]:\n", " score = 1\n", " return score\n", " \n", " \n", "\n", "#list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','height','weight']\n", "list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp']\n", "filename = 'data/result_镇海(合并).json'\n", "with open(filename,'r') as fl:\n", " dict2 = json.load(fl) \n", "for k, v in dict2.items():\n", " #print(k)\n", " if v['sex'] == '男':\n", " sex = 'M'\n", " else:\n", " sex = 'F' \n", " if 'height' in v.keys() and 'weight' in v.keys():\n", " bmi_data = v['height']['成绩'].split()[0]+','+ v['weight']['成绩'].split()[0]\n", " data1 = {'code':k,'sex':sex,'age':v['age'],'item':'HeightWeight','result':bmi_data}\n", " dict2[k]['bmi'] = {}\n", " dict2[k]['bmi']['成绩'] = bmi_data\n", " dict2[k]['bmi']['score'] = cal_bmi(data1)\n", " for item_en in list_item:\n", " if item_en in v.keys(): \n", " data1 = {'code':k,'sex':sex,'age':v['age'],'item':item_en,'result':float(v[item_en]['成绩'].split()[0])}\n", " dict2[k][item_en]['score'] = cal_score(data1)\n", " #print(k,v[item_en]['成绩'],cal_score(data1))\n", "\n", "filename = f'data/result_镇海(合并).json'\n", "with open(filename,'w') as fl:\n", " json.dump(dict2,fl , ensure_ascii=False) \n", "print('ok!') " ] }, { "cell_type": "markdown", "id": "bb0f8c6f-5088-4c4d-a253-9c207745ef25", "metadata": {}, "source": [ "## 生成体测成绩明细表" ] }, { "cell_type": "code", "execution_count": null, "id": "5cff3c83-b3cb-4c69-97a9-82e523374f6b", "metadata": {}, "outputs": [], "source": [ "import json\n", "import openpyxl\n", "\n", "items = ['lung','grip','flexion','jump','pushup','situp','balance','reaction','step']\n", "bmi = ['height','weight']\n", "title = ['编号','姓名','性别','单位/部门','身高','体重','bmi','肺活量','','握力','','坐位体前屈','','纵跳','','俯卧撑','','一分钟仰卧起坐','','单脚站立','','选择反应时','','台阶指数']\n", "\n", "filename = 'data/result_镇海(合并).json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "\n", "list1 = []\n", "for k, v in dict1.items(): #print(k,dict2[str(k)]['name'])\n", " list2 = []\n", " list2.append(str(k).rjust(5,'0'))\n", " list2.append(dict1[k]['name']) \n", " list2.append(dict1[k]['sex'])\n", " list2.append(dict1[k]['unit'])\n", " i = 0\n", " if 'bmi' in dict1[k].keys():\n", " list2.append(dict1[k]['height']['成绩'])\n", " list2.append(dict1[k]['weight']['成绩'])\n", " list2.append(dict1[k]['bmi']['score'])\n", " i+=1\n", " else:\n", " list2.append('') \n", " list2.append('') \n", " list2.append('') \n", " \n", " \n", " for item in items:\n", " if item in dict1[k].keys():\n", " list2.append(dict1[k][item]['成绩'])\n", " list2.append(dict1[k][item]['score']) \n", " i+=1\n", " elif item =='name':\n", " list2.append(dict1[k][item])\n", " else:\n", " list2.append('') \n", " list2.append('') \n", " if i>2:\n", " list1.append(list2)\n", "filename = 'data/镇海体测情况明细表.xlsx'\n", "wb = openpyxl.Workbook()\n", "sheet = wb.active\n", "sheet.append(title)\n", "for row in list1:\n", " sheet.append(row)\n", " \n", "wb.save(filename)\n", "print('ok') " ] }, { "cell_type": "markdown", "id": "723ae3d7-ec16-4dc6-91e2-eeeea6ffe081", "metadata": {}, "source": [ "## 生成报告" ] }, { "cell_type": "code", "execution_count": null, "id": "90faac13-492d-4b3d-bb21-c228af6d9864", "metadata": {}, "outputs": [], "source": [ "import requests\n", "import json\n", "import openpyxl\n", "\n", "\n", "headers = {\n", " \"Content-Type\": \"application/json; charset=UTF-8\"\n", " }\n", "filename = 'data/result_镇海(合并).json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "list1 = []\n", "file_path ='./镇海石化/'\n", "list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','bmi']\n", "i=0\n", "list2 = []\n", "for k, v in dict1.items():\n", " list1 = []\n", " mydata = {}\n", " \n", " id = str(k).rjust(4,\"0\")\n", " mydata['path'] = file_path+id+'-'+ v['name']+'.pdf'\n", " mydata['title'] = '中国石化镇海炼化公司'\n", " mydata['subtitle'] = v['unit']\n", " mydata['id'] = id\n", " mydata['name'] = v['name']\n", " if v['sex'] == '男':\n", " mydata['gender'] = 'male'\n", " else:\n", " mydata['gender'] = 'female'\n", " \n", " mydata['month'] = v['month']\n", " mydata['fits'] = {}\n", " survey_list = ['tcm','psy','spine']\n", " for item in survey_list:\n", " if item in v.keys():\n", " mydata.setdefault('surveys',{})\n", " mydata['surveys'][item] = v[item]\n", " \n", " \n", " #mydata['fits'] = {}\n", " for item in list_item:\n", " if item in v.keys():\n", " mydata.setdefault('fits',{})\n", " if item in ['lung','pushup','step','situp']:\n", " mark = v[item]['成绩'].split()[0].split('.')[0]\n", " else:\n", " mark = v[item]['成绩'].split()[0]\n", " mydata['fits'][item] = {'mark':mark,'score':v[item]['score']}\n", " #if len(mydata['fits']) >2 or len(mydata['surveys']) >0:\n", " if len(mydata['fits']) >2 : \n", " list1.append(mydata)\n", " list2.append([k,v['name']])\n", " i+=1\n", " x = requests.post('http://localhost:3003', data = json.dumps(list1), headers=headers)\n", " #print(id,v['name'],x.text)\n", " #print(mydata)\n", " #x.close()\n", "print(i)" ] }, { "cell_type": "markdown", "id": "82c1eaea-89ad-444a-8dad-07f438c739cc", "metadata": {}, "source": [ "## 统计报告人员信息" ] }, { "cell_type": "code", "execution_count": null, "id": "61c731bc-6117-4a9f-8bfa-66f820e49fc4", "metadata": {}, "outputs": [], "source": [ "import json\n", "import glob\n", "from pathlib import Path\n", "import openpyxl\n", "\n", "filename = 'data/镇海.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "fi_path = '/home/songyi/python/mycrm/flask/pdf/files/345321'\n", "fls = glob.glob(f'{fi_path}/*.pdf')\n", "dict2 = {}\n", "for fn in fls:\n", " \n", " fi_name =Path(fn).stem.split('-')[0]\n", " #fi_name =Path(fn).stem\n", " code = int(fi_name)\n", " dict2[str(code)] = dict1[str(code)]\n", "filename = 'data/镇海体测人员.json'\n", "with open(filename,'w') as fl:\n", " json.dump(dict2,fl , ensure_ascii=False) \n", "print(len(dict2)) \n", "list1 = []\n", "for k, v in dict2.items(): \n", " list2 = []\n", " if 'gh' in v.keys():\n", " gh = v['gh']\n", " else:\n", " gh = ''\n", " if 'phone' in v.keys():\n", " phone = v['phone']\n", " else:\n", " phone = ''\n", " list2 = [k,v['name'],v['sex'],v['birth'],v['unit'],gh,phone]\n", " list1.append(list2)\n", "#print(list1)\n", "filename = 'data/镇海参加测试人员名单.xlsx'\n", "title = ['序号','员工编号','姓名','部门']\n", "wb = openpyxl.Workbook()\n", "sheet = wb.active\n", "sheet.append(title)\n", "for row in list1:\n", " sheet.append(row) \n", "wb.save(filename)" ] }, { "cell_type": "markdown", "id": "fc0f353c-1021-4c8c-bb7c-7a4abb609836", "metadata": {}, "source": [ "## 补充报告人员信息" ] }, { "cell_type": "code", "execution_count": null, "id": "fa963fb6-b47d-4b75-9109-6cda89218182", "metadata": { "scrolled": true }, "outputs": [], "source": [ "import json\n", "import glob\n", "from pathlib import Path\n", "import openpyxl\n", "\n", "\n", "filename = 'data/镇海体测人员.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "wb = openpyxl.load_workbook('data/镇海炼化参加测试人员名单(分析用).xlsx')\n", "sheet = wb.active\n", "for n in range(2, sheet.max_row+1):\n", " if sheet.cell(n, 12).value is not None:\n", " code = int(sheet.cell(n, 1).value)\n", " if sheet.cell(n, 12).value is not None:\n", " dict1[str(code)]['gwlb'] = sheet.cell(n, 12).value\n", " dict1[str(code)]['gwxl'] = sheet.cell(n, 9).value\n", " dict1[str(code)]['gzz'] = sheet.cell(n, 11).value\n", "\n", "with open(filename, 'w') as fl:\n", " json.dump(dict1, fl, ensure_ascii=False) \n", "print('ok!') \n" ] }, { "cell_type": "markdown", "id": "385285b8-fdb3-421d-afbf-c13e4f55bb46", "metadata": {}, "source": [ "## 核验报告人员信息" ] }, { "cell_type": "code", "execution_count": null, "id": "c6195bc3-64bc-4f52-8ebc-ba16fd222f85", "metadata": {}, "outputs": [], "source": [ "import openpyxl\n", "import json\n", "from datetime import date\n", "\n", "wb = openpyxl.load_workbook('data/镇海炼化参加测试人员名单.xlsx')\n", "sheet = wb.active\n", "# sheets = wb.sheetnames\n", "person = {}\n", "\n", "for n in range(2, sheet.max_row+1):\n", " code = int(sheet.cell(n, 1).value)\n", " person.setdefault(code, {})\n", " dict1 = {}\n", " dict1['name'] = sheet.cell(n, 2).value\n", " dict1['sex'] = sheet.cell(n, 3).value\n", " dict1['unit'] = sheet.cell(n, 5).value\n", " if sheet.cell(n, 6).value is not None:\n", " dict1['gh'] = sheet.cell(n, 6).value\n", " dict1['birth'] = str(sheet.cell(n, 4).value).replace('/','-').split(' ')[0] \n", " if sheet.cell(n, 7).value is not None:\n", " dict1['phone'] = str(sheet.cell(n,7).value)\n", " if len(str(sheet.cell(n,7).value))<11:\n", " print(code,sheet.cell(n, 2).value)\n", " person[code] = dict1\n", "filename = 'data/镇海炼化参加测试人员.json'\n", "with open(filename, 'w') as fl:\n", " json.dump(person, fl, ensure_ascii=False)\n", "print(len(person))" ] }, { "cell_type": "markdown", "id": "7e551660-e85f-4da2-8224-042784033ed5", "metadata": {}, "source": [ "## 生成查询信息" ] }, { "cell_type": "code", "execution_count": null, "id": "299c1d41-7634-4703-8411-08f175df4e16", "metadata": {}, "outputs": [], "source": [ "import openpyxl\n", "import os,sys,shutil\n", "import json\n", "import math\n", "import glob\n", "import random\n", "from pathlib import Path\n", "import pymongo\n", "\n", "myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n", "mydb = myclient[\"baogao\"]\n", "mycol = mydb[\"pdf\"]\n", "\n", "place_id = 345321\n", "\n", "fi_path = '/home/songyi/python/mycrm/flask/pdf/files'\n", "fls = glob.glob(f'{fi_path}/{str(place_id)}/*.pdf')\n", "\n", "filename = 'data/镇海炼化参加测试人员.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "for fn in fls:\n", " dict2 = {}\n", " fi_name =Path(fn).stem.split('-')[0]\n", " #fi_name =Path(fn).stem\n", " code = int(fi_name)\n", " dxm = dict1[str(code)]['gh']\n", " dict2 = {'place_id':place_id,'code':dxm,'fn':Path(fn).name}\n", " list2.append(dict2)\n", " i +=1\n", "x = mycol.insert_many(list2)\n", "print('ok') " ] }, { "cell_type": "markdown", "id": "e923022e-aef7-4c8e-84f9-b853e53ff820", "metadata": {}, "source": [ "## 根据工号生成查询信息" ] }, { "cell_type": "code", "execution_count": null, "id": "f709fd4a-d0b0-44a9-a782-0c1ffd43f6b8", "metadata": {}, "outputs": [], "source": [ "import json\n", "filename = 'data/镇海炼化参加测试人员.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "list1 = []\n", "list2 = []\n", "set1 = set()\n", "for k, v in dict1.items():\n", " if 'gh' in v.keys():\n", " gh = v['gh']\n", " if gh not in list1:\n", " list1.append(v['gh'])\n", " else:\n", " list2.append(gh)\n", "print(list2)" ] }, { "cell_type": "markdown", "id": "d9464f81-9228-403a-9d78-090fb4ce0faa", "metadata": {}, "source": [ "## 体测报告按部门分类" ] }, { "cell_type": "code", "execution_count": null, "id": "7eac364f-0fde-4853-9d2b-8c4c0c59a341", "metadata": {}, "outputs": [], "source": [ "import os,sys,shutil\n", "import json\n", "import glob\n", "from pathlib import Path\n", "\n", "fi_path = '/home/songyi/pdf-typescript/镇海石化'\n", "new_path = 'file/镇海石化'\n", "old = []\n", "dict2 = {}\n", "\n", "filename = 'data/镇海炼化参加测试人员.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "fls = glob.glob(f'{fi_path}/*.pdf')\n", "for fn in fls:\n", " fi_name =Path(fn).stem.split('-')[0]\n", " code = int(fi_name)\n", " unit_path = Path(new_path,dict1[str(code)]['unit'])\n", " unit_path.mkdir(parents = True, exist_ok = True)\n", " n_name = Path(unit_path,Path(fn).stem+'.pdf')\n", " if not os.path.exists(n_name):\n", " shutil.copyfile(fn,n_name)" ] }, { "cell_type": "markdown", "id": "d7bb270c-cc9e-413b-af36-17c33692e289", "metadata": {}, "source": [ "## 生成体测报告打印明细表" ] }, { "cell_type": "code", "execution_count": null, "id": "d88bd5c4-1df3-457b-b65d-61692c45e7bd", "metadata": {}, "outputs": [], "source": [ "import os,sys,shutil\n", "import json\n", "import glob\n", "from pathlib import Path\n", "import openpyxl\n", "\n", "fi_path = '/home/songyi/pdf-typescript/镇海石化'\n", "\n", "filename = 'data/镇海炼化参加测试人员.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "fls = glob.glob(f'{fi_path}/*.pdf')\n", "list1 = []\n", "title = ['测试编号','姓名','性别','部门']\n", "for fn in fls:\n", " list2 = []\n", " fi_name =Path(fn).stem.split('-')[0] \n", " code = int(fi_name)\n", " sex = dict1[str(code)]['sex']\n", " unit = dict1[str(code)]['unit']\n", " list2 = [fi_name,Path(fn).stem.split('-')[1],sex,unit]\n", " \n", " list1.append(list2)\n", "\n", "filename = 'data/镇海石化体测报告明细表.xlsx'\n", "wb = openpyxl.Workbook()\n", "sheet = wb.active\n", "sheet.append(title)\n", "for row in list1:\n", " sheet.append(row)\n", " \n", "wb.save(filename) \n", "print('ok')" ] }, { "cell_type": "markdown", "id": "6b521daf-f9dc-4579-9400-d8ab857bb166", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "# 体质测试综合报告数据分析" ] }, { "cell_type": "markdown", "id": "83203d08-46ca-45f6-8204-0c8e35f754b6", "metadata": {}, "source": [ "## 清理报告数据" ] }, { "cell_type": "code", "execution_count": null, "id": "cccc2e43-7a73-48ec-8540-06b4d59f8ceb", "metadata": {}, "outputs": [], "source": [ "import json\n", "import openpyxl\n", "\n", "\n", "filename = 'data/result_镇海(合并).json'\n", "with open(filename,'r',encoding = 'utf-8') as fl:\n", " dict1 = json.load(fl)\n", "\n", " \n", "#items = ['身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n", "items = {}\n", "items['lung'] = '肺活量'\n", "items['grip'] ='握力'\n", "items['flexion'] ='坐位体前屈'\n", "items['jump'] ='纵跳'\n", "items['pushup'] ='俯卧撑'\n", "items['balance'] ='单脚站立'\n", "items['reaction'] ='选择反应时'\n", "items['step'] ='台阶指数'\n", "items['situp'] ='一分钟仰卧起坐'\n", "items['bmi'] ='BMI'\n", "\n", "\n", "list1 = []\n", "#fiie_path ='./138/'\n", "list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','bmi']\n", "i=1\n", "list2 = []\n", "dict2 = {}\n", "for k, v in dict1.items():\n", " list1 = []\n", " mydata = {}\n", " \n", " id = str(k).rjust(8,\"0\")\n", " mydata['unit'] = v['unit']\n", " mydata['name'] = v['name']\n", " mydata['sex'] = v['sex']\n", " mydata['month'] = v['month']\n", " age = int(v['month']/12)\n", " if age <20:\n", " mydata['age'] = 20\n", " else:\n", " mydata['age'] = int(v['month']/12)\n", " \n", " mydata['fits'] = {}\n", " score = 0\n", " for item in list_item:\n", " if item in v.keys():\n", " if item in ['lung','pushup','step','situp']:\n", " mark = v[item]['成绩'].split()[0].split('.')[0]\n", " else:\n", " mark = v[item]['成绩'].split()[0]\n", " mydata['fits'][items[item]] = {'mark':mark,'score':v[item]['score']}\n", " score = score + v[item]['score']\n", " mydata['score'] = round(score/len(mydata['fits']),2)\n", " if len(mydata['fits']) >2:\n", " dict2[str(k)] = mydata\n", "filename = f'data/data_镇海(合并).json'\n", "with open(filename,'w') as fl:\n", " json.dump(dict2,fl , ensure_ascii=False) \n", "print('ok!') " ] }, { "cell_type": "markdown", "id": "1c0bca93-d8a7-42ba-9a2c-50d3493c802f", "metadata": {}, "source": [ "## 报告按照工作制分类" ] }, { "cell_type": "code", "execution_count": null, "id": "a550ecd7-da8e-41b6-8b8f-8bc144d48bfe", "metadata": {}, "outputs": [], "source": [ "import json\n", "import openpyxl\n", "\n", "\n", "filename = 'data/result_镇海2.json'\n", "with open(filename,'r',encoding = 'utf-8') as fl:\n", " dict1 = json.load(fl)\n", "filename = 'data/镇海体测人员.json'\n", "with open(filename,'r',encoding = 'utf-8') as fl:\n", " dict3 = json.load(fl)\n", "\n", "\n", "#items = ['身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n", "items = {}\n", "items['lung'] = '肺活量'\n", "items['grip'] ='握力'\n", "items['flexion'] ='坐位体前屈'\n", "items['jump'] ='纵跳'\n", "items['pushup'] ='俯卧撑'\n", "items['balance'] ='单脚站立'\n", "items['reaction'] ='选择反应时'\n", "items['step'] ='台阶指数'\n", "items['situp'] ='一分钟仰卧起坐'\n", "items['bmi'] ='BMI'\n", "\n", "\n", "list1 = []\n", "#fiie_path ='./138/'\n", "list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','bmi']\n", "i=1\n", "list2 = []\n", "dict2 = {}\n", "for k, v in dict1.items():\n", " if dict3[k]['gzz'] == '倒班':\n", " list1 = []\n", " mydata = {}\n", " \n", " id = str(k).rjust(8,\"0\")\n", " mydata['unit'] = v['unit']\n", " mydata['name'] = v['name']\n", " mydata['sex'] = v['sex']\n", " mydata['month'] = v['month']\n", " age = int(v['month']/12)\n", " if age <20:\n", " mydata['age'] = 20\n", " else:\n", " mydata['age'] = int(v['month']/12)\n", " \n", " mydata['fits'] = {}\n", " score = 0\n", " for item in list_item:\n", " if item in v.keys():\n", " if item in ['lung','pushup','step','situp']:\n", " mark = v[item]['成绩'].split()[0].split('.')[0]\n", " else:\n", " mark = v[item]['成绩'].split()[0]\n", " mydata['fits'][items[item]] = {'mark':mark,'score':v[item]['score']}\n", " score = score + v[item]['score']\n", " mydata['score'] = round(score/len(mydata['fits']),2)\n", " if len(mydata['fits']) >2:\n", " dict2[str(k)] = mydata\n", "filename = f'data/data_镇海_倒班.json'\n", "with open(filename,'w') as fl:\n", " json.dump(dict2,fl , ensure_ascii=False) \n", "print(len(dict2)) " ] }, { "cell_type": "markdown", "id": "c3bcd7ec-1d66-40c6-a27d-1c73e6eef695", "metadata": {}, "source": [ "## 计算平均成绩" ] }, { "cell_type": "code", "execution_count": null, "id": "d5721244-b5f5-4577-bae8-2e6c5bd8e4da", "metadata": {}, "outputs": [], "source": [ "nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n", "filename = 'data/data_镇海(合并).json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "i = 1\n", "m = 0\n", "f = 0\n", "score = 0\n", "t_score = 0\n", "for k,v in dict1.items():\n", " if v['sex'] == '男':\n", " m = m +1\n", " score = score+v['score']\n", "print(f'平均成绩:{round(score/m,4)}分,男性:{m}人')\n", "t_score = t_score + score\n", "score = 0\n", "for k,v in dict1.items():\n", " if v['sex'] == '女':\n", " f = f +1\n", " score = score+v['score']\n", "print(f'平均成绩:{round(score/f,4)}分,女性:{f}人')\n", "t_score = t_score + score\n", "print(f'平均成绩:{round(t_score/(f+m),4)}分,总体:{(f+m)}人')" ] }, { "cell_type": "markdown", "id": "a7ba7d25-b7a0-4641-a218-b4569d31acb1", "metadata": {}, "source": [ "## 计算测试等级" ] }, { "cell_type": "code", "execution_count": null, "id": "cff50f06-3221-4340-950f-3a24073b8565", "metadata": {}, "outputs": [], "source": [ "import json\n", "\n", "items = ['体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n", "\n", "#filename = 'data/data_长炼医院.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "dict2 = {}\n", "dict2['不合格'] = [0,255]\n", "dict2['合格'] = [256,332]\n", "dict2['良好'] = [333,367]\n", "dict2['优秀'] = [368,500]\n", "\n", "for k1, v1 in dict2.items():\n", " di = v1[0]\n", " gao = v1[1]\n", " i = 0 \n", " m = 0\n", " f = 0\n", " for k,v in dict1.items():\n", " if int(v['score']*100) in range(di,gao+1):\n", " dict1[k]['level'] = k1\n", " i+=1\n", " if v['sex'] == '男':\n", " m = m +1\n", " else:\n", " f = f+1\n", " print(f'{di}~{gao}分人数:{i}人,男性:{m}人,女性:{f}人')\n", "print(len(dict1))\n", "with open(filename,'w') as fl:\n", " json.dump(dict1, fl) \n", "print('ok')" ] }, { "cell_type": "markdown", "id": "16a0d09b-2128-4df4-9745-954f48384244", "metadata": {}, "source": [ "### 计算各年龄段测试等级(女)" ] }, { "cell_type": "code", "execution_count": null, "id": "6baf0ff2-cdfa-4396-bcf8-3e23a18670dc", "metadata": {}, "outputs": [], "source": [ "nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n", "\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "dict2 = {}\n", "dict2['不合格'] = [0,255]\n", "dict2['合格'] = [256,332]\n", "dict2['良好'] = [333,367]\n", "dict2['优秀'] = [368,500]\n", "dict3 = {}\n", "for item in nld:\n", " di = item[0]\n", " gao = item[1]\n", " age = f'{di}-{gao}'\n", " dict3.setdefault(age,{})\n", " i = 0 \n", " m = 0\n", " f = 0\n", " for k,v in dict1.items():\n", " if v['age'] in range(di,gao+1): \n", " dict3[age].setdefault(v['level'],0)\n", " if v['sex'] == '女':\n", " dict3[age][v['level']] = dict3[age][v['level']]+1\n", " \n", "for k, v in dict3.items():\n", " print(k,v)" ] }, { "cell_type": "markdown", "id": "79fb3eab-e8d4-42bb-9ba4-8402f3b82b54", "metadata": {}, "source": [ "### 计算各年龄段测试等级(男)" ] }, { "cell_type": "code", "execution_count": null, "id": "2979cf80-5268-4754-ab8a-11a539315e92", "metadata": {}, "outputs": [], "source": [ "nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n", "\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "dict2 = {}\n", "dict2['不合格'] = [0,255]\n", "dict2['合格'] = [256,332]\n", "dict2['良好'] = [333,367]\n", "dict2['优秀'] = [368,500]\n", "dict3 = {}\n", "for item in nld:\n", " di = item[0]\n", " gao = item[1]\n", " age = f'{di}-{gao}'\n", " dict3.setdefault(age,{})\n", " i = 0 \n", " m = 0\n", " f = 0\n", " for k,v in dict1.items():\n", " if v['age'] in range(di,gao+1): \n", " dict3[age].setdefault(v['level'],0)\n", " if v['sex'] == '男':\n", " dict3[age][v['level']] = dict3[age][v['level']]+1\n", " \n", "for k, v in dict3.items():\n", " print(k,v)" ] }, { "cell_type": "markdown", "id": "9a38fc15-579c-42e9-a23c-1050a96e0cf8", "metadata": {}, "source": [ "## 根据年龄汇总人员信息及成绩" ] }, { "cell_type": "code", "execution_count": null, "id": "8a7cb3b0-d7be-44ac-a1ec-40bdcf29e83b", "metadata": {}, "outputs": [], "source": [ "nld = [[16,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,69]]\n", "\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "for item in nld:\n", " di = item[0]\n", " gao = item[1]\n", " i = 0\n", " score = 0\n", " m = 0\n", " f = 0\n", " for k,v in dict1.items():\n", " if v['age'] in range(di,gao+1):\n", " score = score+v['score']\n", " i+=1\n", " if v['sex'] == '男':\n", " m = m +1\n", " if i ==0:\n", " print(f'{di}~{gao}岁平均成绩:0分,人数:0人,男性:{m}人')\n", " else:\n", " print(f'{di}~{gao}岁平均成绩:{round(score/i,2)}分,人数:{i}人,男性:{m}人')" ] }, { "cell_type": "markdown", "id": "48debe3b-d0ec-41e8-93ef-921b8e013aa7", "metadata": {}, "source": [ "### 根据年龄汇总人员信息及成绩(男)" ] }, { "cell_type": "code", "execution_count": null, "id": "c5bb03ca-b7ee-4564-b425-8513e1bff081", "metadata": {}, "outputs": [], "source": [ "import json\n", "\n", "nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n", "\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "for item in nld:\n", " di = item[0]\n", " gao = item[1]\n", " i = 0\n", " score = 0\n", " m = 0\n", " f = 0\n", " for k,v in dict1.items():\n", " if v['age'] in range(di,gao+1) and v['sex'] == '男':\n", " score = score+v['score']\n", " i+=1\n", " if i ==0:\n", " print(f'{di}~{gao}岁平均成绩:0分,人数:{i}人') \n", " else:\n", " print(f'{di}~{gao}岁平均成绩:{round(score/i,2)}分,人数:{i}人')" ] }, { "cell_type": "markdown", "id": "92bb0683-81ea-4b90-8b74-4a2f43b4835c", "metadata": {}, "source": [ "### 根据年龄汇总人员信息及成绩(女)" ] }, { "cell_type": "code", "execution_count": null, "id": "bf333998-230c-4365-aadc-b0d1be073b39", "metadata": {}, "outputs": [], "source": [ "nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n", "\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "for item in nld:\n", " di = item[0]\n", " gao = item[1]\n", " i = 0\n", " score = 0\n", " m = 0\n", " f = 0\n", " for k,v in dict1.items():\n", " if v['age'] in range(di,gao+1) and v['sex'] == '女':\n", " score = score+v['score']\n", " i+=1\n", " if i ==0:\n", " print(f'{di}~{gao}岁平均成绩:0分,人数:{i}人') \n", " else:\n", " print(f'{di}~{gao}岁平均成绩:{round(score/i,2)}分,人数:{i}人')" ] }, { "cell_type": "markdown", "id": "026d11e4-7f3d-4be5-9fa0-fa3699969c6b", "metadata": {}, "source": [ "## 计算各项目成绩" ] }, { "cell_type": "code", "execution_count": null, "id": "352c6c29-8929-4210-84c5-8dbc3d5ffeee", "metadata": {}, "outputs": [], "source": [ "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "items = ['BMI','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n", "for item in items:\n", " score = 0\n", " n = 0\n", " for k, v in dict1.items(): \n", " if item in v['fits'].keys():\n", " n = n + 1\n", " score =score + int(v['fits'][item]['score'])\n", " print(item,round(score/n,2),n)" ] }, { "cell_type": "markdown", "id": "a13d5644-7cd1-4943-bce9-c6863f75b986", "metadata": {}, "source": [ "## 按照部门计算平均成绩" ] }, { "cell_type": "code", "execution_count": null, "id": "97f5a1cf-341e-4b99-9549-b6a3fb165849", "metadata": {}, "outputs": [], "source": [ "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "depart = []\n", "for k, v in dict1.items():\n", " if v['unit'] not in depart:\n", " depart.append(v['unit'])\n", "\n", "for item in depart:\n", " score = 0\n", " n = 0\n", " for k, v in dict1.items():\n", " if item == v['unit']:\n", " score = score + v['score']\n", " n = n +1\n", " if n>0:\n", " print(item,round(score/n,2),n)\n", " else:\n", " print(item,0,n)" ] }, { "cell_type": "markdown", "id": "85b3a695-86db-4aec-95f4-33f3b628e548", "metadata": {}, "source": [ "### 按照部门计算平均成绩(男性)" ] }, { "cell_type": "code", "execution_count": null, "id": "3beaab27-ca90-4e09-b2d2-590fd7bac51d", "metadata": {}, "outputs": [], "source": [ "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "depart = []\n", "for k, v in dict1.items():\n", " if v['unit'] not in depart:\n", " depart.append(v['unit'])\n", "\n", "for item in depart:\n", " score = 0\n", " n = 0\n", " for k, v in dict1.items():\n", " if item == v['unit'] and v['sex'] == '男':\n", " score = score + v['score']\n", " n = n +1 \n", " if n>0:\n", " print(item,round(score/n,2),n)\n", " else:\n", " print(item,0,n)" ] }, { "cell_type": "markdown", "id": "d8e995d6-3ddb-4b92-8255-530e8a3da179", "metadata": {}, "source": [ "## 计算部门成绩" ] }, { "cell_type": "code", "execution_count": null, "id": "a959c1b8-86fc-4fca-8595-4278135e95b8", "metadata": {}, "outputs": [], "source": [ "import json\n", "\n", "items = ['BMI','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数'] \n", "filename = 'data/data_镇海(合并).json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "\n", "filename = 'data/镇海(合并).json'\n", "with open(filename,'r') as fl:\n", " dict2 = json.load(fl)\n", "dict3 = {}\n", "\n", "for k, v in dict1.items():\n", " unit = v['unit']\n", " dict3.setdefault(unit,{})\n", " for item in items:\n", " dict3[unit].setdefault(item,{})\n", " dict3[unit][item].setdefault('score',0)\n", " dict3[unit][item].setdefault('count',0)\n", " for k1,v1 in v['fits'].items():\n", " if k1 in items:\n", " dict3[unit][k1]['score']+=v1['score']\n", " dict3[unit][k1]['count']+=1\n", "\n", "for k, v in dict3.items():\n", " print(k)\n", " for k1, v1 in v.items():\n", " print(k1,v1['score'],v1['count'])" ] }, { "cell_type": "markdown", "id": "7092779e-ce30-4d1c-8e7b-a14011daee93", "metadata": {}, "source": [ "## 计算部门等级" ] }, { "cell_type": "code", "execution_count": null, "id": "81195537-5a43-4822-a1b9-a08b7baee05e", "metadata": {}, "outputs": [], "source": [ "import json\n", "\n", "items = ['优秀','良好','合格','不合格'] \n", "filename = 'data/data_镇海(合并).json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "\n", "\n", "dict3 = {}\n", "for k, v in dict1.items():\n", " unit = v['unit']\n", " dict3.setdefault(unit,{})\n", " for item in items:\n", " dict3[unit].setdefault(item,0)\n", "\n", "for k, v in dict1.items():\n", " unit = v['unit']\n", " #dict3.setdefault(unit,{})\n", " #for item in items:\n", " #dict3[unit].setdefault(v['level'],0)\n", " dict3[unit][v['level']] +=1\n", "for k, v in dict3.items():\n", " print(k,v['优秀'],v['良好'],v['合格'],v['不合格'])" ] }, { "cell_type": "markdown", "id": "4df1e70c-e359-4b4a-b2ae-2900ae25ded2", "metadata": { "execution": { "iopub.execute_input": "2025-10-25T08:36:22.140778Z", "iopub.status.busy": "2025-10-25T08:36:22.140431Z", "iopub.status.idle": "2025-10-25T08:36:22.145537Z", "shell.execute_reply": "2025-10-25T08:36:22.144522Z", "shell.execute_reply.started": "2025-10-25T08:36:22.140742Z" } }, "source": [ "# 体质测试2025年" ] }, { "cell_type": "markdown", "id": "0dbcde66-5a57-4b6d-97d3-30159b606807", "metadata": {}, "source": [ "## 体测人员导入" ] }, { "cell_type": "code", "execution_count": null, "id": "0a6a661d-3780-4ae4-a975-821eae376f7a", "metadata": {}, "outputs": [], "source": [ "import openpyxl\n", "import json\n", "from datetime import date\n", "\n", "wb = openpyxl.load_workbook('data/镇海人员2025.xlsx')\n", "sheet = wb.active\n", "# sheets = wb.sheetnames\n", "person = {}\n", "\n", "for n in range(2, sheet.max_row+1):\n", " code = sheet.cell(n, 5).value\n", " person.setdefault(code, {})\n", " dict1 = {}\n", " dict1['name'] = sheet.cell(n, 2).value\n", " dict1['sex'] = sheet.cell(n, 3).value\n", " dict1['birth'] = str(sheet.cell(n, 6).value).replace('/','-').split(' ')[0] \n", " dict1['unit'] = sheet.cell(n, 7).value\n", " dict1['phone'] = sheet.cell(n, 4).value\n", " person[code] = dict1\n", "filename = 'data/镇海人员2025.json'\n", "with open(filename, 'w') as fl:\n", " json.dump(person, fl, ensure_ascii=False)\n", "print(len(person),'ok')" ] }, { "cell_type": "markdown", "id": "c938346f-711c-4cd7-b2f1-3776df5a00b8", "metadata": {}, "source": [ "## 生成读卡系统文件" ] }, { "cell_type": "code", "execution_count": 7, "id": "da037e81-96a8-475e-9ad7-21ab92285b85", "metadata": { "execution": { "iopub.execute_input": "2025-10-27T12:41:31.242485Z", "iopub.status.busy": "2025-10-27T12:41:31.240445Z", "iopub.status.idle": "2025-10-27T12:41:31.282456Z", "shell.execute_reply": "2025-10-27T12:41:31.281601Z", "shell.execute_reply.started": "2025-10-27T12:41:31.242428Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1383 ok\n" ] } ], "source": [ "import json\n", "\n", "filename = 'data/镇海人员2025.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "list1 = []\n", "for k, v in dict1.items():\n", " dict2 = {}\n", " #if dict1['sex'] =='男':\n", " # sex = 1\n", " \n", " dict2 = {'id':k,'name':v['name'],'gender':v['sex'],'birth':v['birth'],'unit':v['unit']}\n", " list1.append(dict2)\n", "json_data = json.dumps(list1,ensure_ascii=False, indent=4) \n", "\n", "# 将 json 数据写入文件\n", "with open(\"data/card_镇海2025.json\", \"w\",encoding = 'utf-8') as file:\n", " file.write(json_data) \n", "print(len(list1),'ok')" ] }, { "cell_type": "markdown", "id": "165f14d8-a973-463c-87cd-8c0c0de6a177", "metadata": {}, "source": [ "## 合并读卡系统文件" ] }, { "cell_type": "code", "execution_count": 13, "id": "505fce63-ed92-4f63-82da-7207b015dab4", "metadata": { "execution": { "iopub.execute_input": "2025-10-29T08:42:44.713490Z", "iopub.status.busy": "2025-10-29T08:42:44.709542Z", "iopub.status.idle": "2025-10-29T08:42:44.770204Z", "shell.execute_reply": "2025-10-29T08:42:44.769358Z", "shell.execute_reply.started": "2025-10-29T08:42:44.713433Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "019698 张毅 公用工程二部\n", "019210 张雨婷 公用工程二部\n", "022238 赵若程 电气中心\n", "019810 孟玫 油库中心\n", "021551 朱浩 炼油一部\n", "010517 胡明 烯烃一部\n", "015967 牛姗 烯烃一部\n", "012920 娄形宇 电气中心\n", "019130 魏巍 电气中心\n", "012233 方健 烯烃一部\n", "014585 杨恒平 质管中心\n", "012785 乐幸 烯烃一部\n", "021124 吴焕妍 炼油二部\n", "021532 范展鹏 储运一部\n", "011878 王可 公用工程一部\n", "020838 王安东 电气中心\n", "021429 张博伟 电气中心\n", "016333 姜媚媚 公司机关\n", "015474 万忠荣 化学制品部\n", "015869 李萌萌 炼油四部\n", "007608 汪海渊 储运一部\n", "010250 王国维 氢能制造部\n", "019332 严偲浩 公司机关\n", "015859 罗信 采购中心\n", "018940 李云鹏 炼油四部\n", "012240 邵晓 采购中心\n", "010536 陈炜敏 采购中心\n", "015693 邵金燕 公司机关\n", "019268 邹兆宁 公司机关\n", "020208 孙书伟 采购中心\n", "019167 吴涵华 新材料研究院\n", "012067 阮继春 炼油五部\n", "021192 舒润发 化学制品部\n", "015086 王东伟 公司机关\n", "019042 李刚 储运一部\n", "011455 任奇伟 炼油四部\n", "014748 王静 公用工程一部\n", "015669 周慧芬 公用工程一部\n", "021804 蓝海涛 储运一部\n", "020138 牛丙波 新材料研究院\n", "023552 李宇 烯烃二部\n", "012802 胡庆球 公司机关\n", "019017 周靖 烯烃一部\n", "016056 于海 储运一部\n", "015919 冯辉 烯烃二部\n", "019764 曹华林 油库中心\n", "019668 覃江宜 电气中心\n", "023169 王武 电气中心\n", "018979 林冠宇 合成材料部\n", "023027 邓孜瑶 炼油一部\n", "015512 王娜 烯烃一部\n", "020194 徐梦莹 油库中心\n", "019760 常亚男 油库中心\n", "020801 陈冲 炼油三部\n", "1464 ok\n" ] } ], "source": [ "import json\n", "\n", "filename = 'data/镇海人员2025.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "\n", "filename = 'data/data_镇海2025.json'\n", "with open(filename,'r') as fl:\n", " list1 = json.load(fl)\n", "for item in list1:\n", " code = item['id'].lower()\n", " if code not in dict1.keys():\n", " print(code,item['name'],item['unit'])\n", " code = code.lower()\n", " dict1.setdefault(code,{})\n", " dict1[code]['name'] = item['name']\n", " dict1[code]['sex'] = item['gender']\n", " dict1[code]['unit'] = item['unit']\n", " dict1[code]['birth'] = item['birth']\n", "filename = 'data/镇海人员2025.json'\n", "with open(filename, 'w') as fl:\n", " json.dump(dict1, fl, ensure_ascii=False)\n", "print(len(dict1),'ok')" ] }, { "cell_type": "markdown", "id": "0e9316d6-7f54-4c12-898f-11d635377059", "metadata": {}, "source": [ "## 规范人员编号" ] }, { "cell_type": "code", "execution_count": null, "id": "7f4df663-4767-4a1b-9e2f-14c97a2926f7", "metadata": {}, "outputs": [], "source": [ "import json\n", "\n", "filename = 'data/镇海人员2025.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "dict2 = {}\n", "for k, v in dict1.items():\n", " new_k = k.lower()\n", " dict2[new_k] = v\n", "filename = 'data/镇海人员2025-1.json'\n", "with open(filename, 'w') as fl:\n", " json.dump(dict2, fl, ensure_ascii=False)\n", "print(len(dict1),'ok')" ] }, { "cell_type": "markdown", "id": "065cb133-3c61-46bd-bf81-7afa2c9be9e0", "metadata": {}, "source": [ "## 获取人员测试成绩" ] }, { "cell_type": "code", "execution_count": 15, "id": "289e4e1d-c80d-46f9-9015-fc4c139bc99d", "metadata": { "execution": { "iopub.execute_input": "2025-10-29T08:50:32.458008Z", "iopub.status.busy": "2025-10-29T08:50:32.455735Z", "iopub.status.idle": "2025-10-29T08:50:32.674774Z", "shell.execute_reply": "2025-10-29T08:50:32.672087Z", "shell.execute_reply.started": "2025-10-29T08:50:32.457968Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1025\n" ] } ], "source": [ "import json\n", "import datetime\n", "import csv\n", "from datetime import date\n", "import my_module1 as My\n", "\n", "filename = 'data/镇海人员2025.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "filename = 'data/marks_20251029.csv'\n", "re_ta = My.get_result(filename,dict1)\n", "\n", "\n", "filename = 'data/result_镇海2025.json'\n", "with open(filename,'w') as fl:\n", " json.dump(re_ta, fl, ensure_ascii=False) \n", "print(len(re_ta))" ] }, { "cell_type": "markdown", "id": "09c60f09-e35b-424a-85a8-804dd3644a0f", "metadata": {}, "source": [ "## 获取人员测试成绩(上午)" ] }, { "cell_type": "code", "execution_count": null, "id": "9a6a8ce6-5c8b-47c4-a597-cd0c9eb8a9fb", "metadata": {}, "outputs": [], "source": [ "import json\n", "import datetime\n", "import csv\n", "from datetime import date\n", "import my_module1 as My\n", "\n", "filename = 'data/镇海人员2025.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl) \n", "filename = 'data/marks_20251027-1.csv'\n", "re_ta = My.get_result(filename,dict1)\n", "\n", "\n", "filename = 'data/result_镇海2025.json'\n", "with open(filename,'w') as fl:\n", " json.dump(re_ta, fl, ensure_ascii=False) \n", "print(len(re_ta))" ] }, { "cell_type": "markdown", "id": "15d7fae0-76a3-4443-8c2c-94ec7b8f052c", "metadata": {}, "source": [ "## 生成测试得分" ] }, { "cell_type": "code", "execution_count": null, "id": "49d15e27-6029-4557-a17a-7e7a426f7e5f", "metadata": {}, "outputs": [], "source": [ "import json\n", "import time\n", "import my_module as My\n", "\n", "#list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','height','weight']\n", "list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp']\n", "filename = 'data/result_镇海2025.json'\n", "with open(filename,'r') as fl:\n", " dict2 = json.load(fl) \n", "for k, v in dict2.items():\n", " #print(k)\n", " if v['sex'] == '男':\n", " sex = 'M'\n", " else:\n", " sex = 'F' \n", " if 'bmi' in v.keys():\n", " #bmi_data = v['height']['成绩'].split()[0]+','+ v['weight']['成绩'].split()[0]\n", " bmi_data = v['bmi']['成绩']\n", " data1 = {'code':k,'sex':sex,'age':v['age'],'item':'HeightWeight','result':bmi_data}\n", " dict2[k]['bmi'] = {}\n", " dict2[k]['bmi']['成绩'] = bmi_data\n", " dict2[k]['bmi']['score'] = My.cal_bmi(data1)\n", " for item_en in list_item:\n", " if item_en in v.keys(): \n", " data1 = {'code':k,'sex':sex,'age':v['age'],'item':item_en,'result':float(v[item_en]['成绩'].split()[0])}\n", " #print(k,v['name'])\n", " dict2[k][item_en]['score'] = My.cal_score(data1)\n", " #print(k,v[item_en]['成绩'],cal_score(data1))\n", "\n", "filename = f'data/result_镇海2025.json'\n", "with open(filename,'w') as fl:\n", " json.dump(dict2,fl , ensure_ascii=False) \n", "print('ok!') " ] }, { "cell_type": "markdown", "id": "c1ef03ac-6970-4d33-9d30-fc2ffe4e7c52", "metadata": {}, "source": [ "## 导出测试人员信息" ] }, { "cell_type": "code", "execution_count": null, "id": "8ed6705e-b4f6-419e-b94b-4c391fed4551", "metadata": {}, "outputs": [], "source": [ "import json\n", "import openpyxl\n", "\n", "items = ['身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n", "title = ['编号','姓名','性别','单位','部门','身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n", "\n", "filename = 'data/result_镇海2025.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "\n", "filename = 'data/镇海人员2025.json'\n", "with open(filename,'r') as fl:\n", " dict2 = json.load(fl)\n", " \n", "list1 = []\n", "for k, v in dict1.items():\n", " list2 = []\n", " list2.append(str(k).rjust(5,'0'))\n", " list2.append(v['name']) \n", " list2.append(dict2[k]['sex'])\n", " list2.append(dict2[k]['unit']) \n", " for item in items:\n", " if item in v.keys():\n", " list2.append(v[item]['成绩']) \n", " elif item =='name':\n", " list2.append(v[item])\n", " else:\n", " list2.append('')\n", " #list2.append(dict2[k]['gwxl'])\n", " #list2.append(dict2[k]['gzz'])\n", " list1.append(list2)\n", "filename = 'data/镇海体测情况表(截至20251027)-1.xlsx'\n", "wb = openpyxl.Workbook()\n", "sheet = wb.active\n", "sheet.append(title)\n", "for row in list1:\n", " sheet.append(row)\n", " \n", "wb.save(filename)" ] }, { "cell_type": "markdown", "id": "d6d6b47e-386c-4cee-a4d6-6dbe4f415490", "metadata": {}, "source": [ "## 统计各部门测试情况" ] }, { "cell_type": "code", "execution_count": 16, "id": "a0c85107-7c75-462c-8f77-aea787d2100f", "metadata": { "execution": { "iopub.execute_input": "2025-10-29T08:51:39.051506Z", "iopub.status.busy": "2025-10-29T08:51:39.048537Z", "iopub.status.idle": "2025-10-29T08:51:39.126940Z", "shell.execute_reply": "2025-10-29T08:51:39.122609Z", "shell.execute_reply.started": "2025-10-29T08:51:39.051458Z" } }, "outputs": [], "source": [ "import json\n", "\n", "filename = 'data/result_镇海2025.json'\n", "with open(filename,'r') as fl:\n", " dict1 = json.load(fl)\n", "\n", "filename = 'data/镇海人员2025.json'\n", "with open(filename,'r') as fl:\n", " dict2 = json.load(fl)\n", "\n", "dict3 = {}\n", "for k, v in dict2.items():\n", " unit = v['unit']\n", " #sub_unit = v['sub_unit']\n", " dict3.setdefault(unit,{})\n", " dict3[unit].setdefault('人数',0)\n", " dict3[unit].setdefault('体测人数',0)\n", " #dict3[unit].setdefault(sub_unit,0)\n", " #dict3[unit][sub_unit] = dict3[unit][sub_unit] + 1\n", " dict3[unit]['人数'] = dict3[unit]['人数'] + 1\n", "\n", "title =['单位','体测人数']\n", "list1 = []\n", "for k,v in dict1.items(): \n", " unit = v['unit']\n", " #sub_unit = v['sub_unit']\n", " #dict3[unit][sub_unit] = dict3[unit][sub_unit] - 1\n", " dict3[unit].setdefault('体测人数',0)\n", " dict3[unit]['体测人数'] = dict3[unit]['体测人数'] + 1\n", "for k, v in dict3.items():\n", " list2 = [k,v['人数'],v['体测人数']]\n", " list1.append(list2)\n", "\n", "filename = 'data/镇海部门测试情况(截至20251029).xlsx'\n", "wb = openpyxl.Workbook()\n", "sheet = wb.active\n", "sheet.append(title)\n", "for row in list1:\n", " sheet.append(row)\n", " \n", "wb.save(filename)" ] }, { "cell_type": "code", "execution_count": null, "id": "bea9e53e-96e7-4006-9674-48c91e8ab0c7", "metadata": {}, "outputs": [], "source": [ "filename = 'data/result_镇海2025.json'\n", "with open(filename,'r') as fl:\n", " dict2 = json.load(fl) \n", "i = 1\n", "for k, v in dict2.items():\n", " if 'bmi' in v.keys():\n", " print(i,k,v['name'])\n", " i+=1" ] }, { "cell_type": "code", "execution_count": null, "id": "7b538b1b-9f02-4f77-82bf-f8084066003f", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }