Files
jupyter/体测单位/体质检测数据处理.ipynb
T
2024-12-05 10:54:06 +08:00

2917 lines
86 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "19280f5c-8e34-4a64-8dfb-6353cbf597d2",
"metadata": {
"tags": [],
"toc-hr-collapsed": true
},
"source": [
"# 体质检测数据处理"
]
},
{
"cell_type": "markdown",
"id": "112d80f4-607b-41f9-bb30-ac2eb8f52ee2",
"metadata": {
"jp-MarkdownHeadingCollapsed": true,
"tags": []
},
"source": [
"## 基础数据管理"
]
},
{
"cell_type": "markdown",
"id": "9a06725f-248b-44dd-b029-c18e7c0689ee",
"metadata": {},
"source": [
"### 体测数据按编号汇总"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "47aa588c-1880-44a8-add0-6fad777065d6",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import time\n",
"import csv\n",
"\n",
"filename = '../item.json'\n",
"item = {}\n",
"bh = set()\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",
"list2 = []\n",
"rq = '20240612'\n",
"filename = f'data/places_result_{rq}.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",
" bh.add(line[2])\n",
" \n",
"#print(list1)\n",
"for result in list1:\n",
" user = str(result[2])\n",
" \n",
" m_item = str(result[3]) \n",
" re_ta.setdefault(user,{}) \n",
" \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",
"\n",
"\n",
"items = ['身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n",
"title = ['编号','身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n",
"list1 = []\n",
"for k, v in re_ta.items():\n",
" list2 = []\n",
" list2.append(str(k))\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",
" list1.append(list2)\n",
"filename = f'data/长炼医院体测情况表({rq}).xlsx'\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": "b7dfd50f-a614-497d-8f0a-fa1e4c89168a",
"metadata": {},
"source": [
"### 体测项目标准导入"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8cd73044-56a8-409b-a873-085feb63af17",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"\n",
"tcbz ={\n",
" 'HeightWeigh':'身高体重',\n",
" 'StepExperiment':'台阶指数',\n",
" 'Lung':'肺活量',\n",
" 'Proneness':'坐位体前屈',\n",
" 'PowerfullGrip':'握力',\n",
" 'OneMinutePushUp':'一分钟仰卧起坐',\n",
" 'PushUp':'俯卧撑',\n",
" 'VerticalJump':'纵跳',\n",
" 'ReactionTime':'选择反应时',\n",
" 'FootStand':'单脚站立'\n",
"}\n",
"wb = openpyxl.load_workbook('data/体质检测标准.xlsx')\n",
"sheet = wb.active\n",
"# sheets = wb.sheetnames\n",
"dict1 = {}\n",
"dict3 = {}\n",
"for k, v in tcbz.items():\n",
" dict3[v] = k\n",
"sheet = wb.active\n",
"data1 =list(sheet.values)\n",
"del data1[0]\n",
"for item in data1:\n",
" sex = item[0][6:]\n",
" if sex =='男':\n",
" age_sex = 'M'+item[0][:5]\n",
" else:\n",
" age_sex = 'F'+item[0][:5]\n",
" dict1.setdefault(age_sex,{})\n",
" if item[1] in dict3.keys():\n",
" xm = dict3[item[1]]\n",
" dict1[age_sex].setdefault(xm,[])\n",
" dict1[age_sex][xm].append(item[3]/item[4])\n",
"dict2 = {}\n",
"#print(dict1)\n",
"for k, v in dict1.items():\n",
" i1 = int(k[1:3])\n",
" i2 = int(k[-2:])\n",
" m_sex = k[:1]\n",
" for i in range(i1,i2+1):\n",
" dict2[m_sex+str(i)] = k\n",
"dict3 = {}\n",
"dict3['person'] = dict2\n",
"dict3['criteria'] = dict1\n",
"filename = 'data/体质检测标准.json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(dict3, fl, ensure_ascii=False)\n",
"print('ok')"
]
},
{
"cell_type": "markdown",
"id": "c36641d8-c54b-43d2-ad9d-ff4cb72deba9",
"metadata": {},
"source": [
"### 身高标准导入"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2ca52d7b-d77e-452f-98f6-95072a5a1934",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"\n",
"tcbz ={\n",
" 'HeightWeigh':'身高体重',\n",
" 'StepExperiment':'台阶指数',\n",
" 'Lung':'肺活量',\n",
" 'Proneness':'坐位体前屈',\n",
" 'PowerfullGrip':'握力',\n",
" 'OneMinutePushUp':'一分钟仰卧起坐',\n",
" 'PushUp':'俯卧撑',\n",
" 'VerticalJump':'纵跳',\n",
" 'ReactionTime':'选择反应时',\n",
" 'FootStand':'单脚站立'\n",
"}\n",
"wb = openpyxl.load_workbook('data/体质检测标准_BMI.xlsx')\n",
"sheet = wb.active\n",
"# sheets = wb.sheetnames\n",
"dict1 = {}\n",
"dict3 = {}\n",
"for k, v in tcbz.items():\n",
" dict3[v] = k\n",
"sheet = wb.active\n",
"data1 =list(sheet.values)\n",
"del data1[0]\n",
"for item in data1:\n",
" min_age = int(item[1]/12)\n",
" max_age = int((item[2]+1)/12) - 1\n",
" sex = item[0]\n",
" height = int(item[3])\n",
" if sex ==0:\n",
" age_sex = 'M'+str(min_age)+'~'+str(max_age)\n",
" else:\n",
" age_sex = 'F'+str(min_age)+'~'+str(max_age)\n",
" dict1.setdefault(age_sex,{})\n",
" \n",
" dict1[age_sex].setdefault(height,[])\n",
" dict1[age_sex][height].append(item[5]/1000)\n",
"dict2 = {}\n",
"#print(dict1)\n",
"for k, v in dict1.items():\n",
" i1 = int(k[1:3])\n",
" i2 = int(k[-2:])\n",
" m_sex = k[:1]\n",
" for i in range(i1,i2+1):\n",
" dict2[m_sex+str(i)] = k\n",
"dict3 = {}\n",
"dict3['person'] = dict2\n",
"dict3['criteria'] = dict1\n",
"filename = 'data/体质检测标准_BMI.json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(dict3, fl, ensure_ascii=False)\n",
"print('ok')"
]
},
{
"cell_type": "markdown",
"id": "ad5a702c-1503-463f-9d02-b78b881aad1b",
"metadata": {},
"source": [
"### 生成项目信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5071c245-3fdb-4c16-8f15-998af7c1d2fe",
"metadata": {},
"outputs": [],
"source": [
"import json\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",
" del item[k]['divisor']\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/体质检测项目信息.json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(item, fl, ensure_ascii=False)\n",
"print('ok')"
]
},
{
"cell_type": "markdown",
"id": "59f5708d-c2d0-4470-b2f4-b9face431865",
"metadata": {},
"source": [
"### 计算分数"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f32b266a-7e46-4703-ab61-7cbbc81b5ab1",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import time\n",
"import csv\n",
"\n",
"filename = 'data/体质检测标准.json'\n",
"item = {}\n",
"unit = {}\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"person = dict1['person']\n",
"criteria = dict1['criteria']\n",
"data = {'name':'张三','sex':'M','age':37,'item':'StepExperiment','result':46}\n",
"info = data['sex']+str(data['age'])\n",
"bz = person[info]\n",
"mx = criteria[bz][data['item']]\n",
"result = data['result']\n",
"score = -1\n",
"print(mx)\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",
"#if score == -1:\n",
" # score = 5\n",
"print(score)"
]
},
{
"cell_type": "markdown",
"id": "755f8b66-c71c-4138-bd12-dff24e85e36a",
"metadata": {},
"source": [
"### 计算BMI分数"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b32fbbdd-eb0a-4f0d-8901-e39a727c3ff8",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import time\n",
"import csv\n",
"\n",
"filename = 'data/体质检测标准_BMI.json'\n",
"item = {}\n",
"unit = {}\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"person = dict1['person']\n",
"criteria = dict1['criteria']\n",
"data = {'name':'张三','sex':'M','age':37,'item':'HeightWeight','result':'177.7,97.0'}\n",
"info = data['sex']+str(data['age'])\n",
"\n",
"bz = person[info]\n",
"print(bz)\n",
"result = data['result']\n",
"print(result)\n",
"height = int(float(result.split(',')[0]))\n",
"weight = float(result.split(',')[1])\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",
"print(score)"
]
},
{
"cell_type": "markdown",
"id": "7fe0ffe8-c3d1-4843-9765-87d4a12b7c39",
"metadata": {},
"source": [
"## 体测报告生成"
]
},
{
"cell_type": "markdown",
"id": "9fec0bfc-8a97-446f-95fe-6e9cf8e482d8",
"metadata": {},
"source": [
"### 转换报告格式"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3e614f4a-a623-48e2-97f8-b31f62c9a983",
"metadata": {
"tags": []
},
"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/天津石化人员2024.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"\n",
"filename = 'data/places_result_20241104.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_天津石化2024.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": "6741916c-deb6-496f-bc8f-5248e107e0e9",
"metadata": {},
"source": [
"### 生成完善得分"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "141b30dc-5975-4dcb-9bc3-9b20d26a0917",
"metadata": {
"tags": []
},
"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_天津石化2024.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_天津石化2024.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict2,fl , ensure_ascii=False) \n",
"print('ok!') "
]
},
{
"cell_type": "markdown",
"id": "ceef0742-f62a-4a7d-b0d5-be7ae7abb741",
"metadata": {},
"source": [
"### 生成报告"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "b123ee6b-85d2-4660-b226-321832a6b796",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-05T01:54:15.911722Z",
"iopub.status.busy": "2024-12-05T01:54:15.910983Z",
"iopub.status.idle": "2024-12-05T02:00:21.680493Z",
"shell.execute_reply": "2024-12-05T02:00:21.679283Z",
"shell.execute_reply.started": "2024-12-05T01:54:15.911657Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"738\n"
]
}
],
"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_北海炼化2024.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"list1 = []\n",
"file_path ='./北海炼化2024/'\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": "code",
"execution_count": null,
"id": "4c1b3696-ab24-44bd-894a-e271ecfe4e38",
"metadata": {
"tags": []
},
"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_东营工程设计院2024_all.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",
" \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": "4642faf7-52bf-40e9-9af3-7555d4eef10b",
"metadata": {},
"source": [
"## 体测报告按部门分类"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d913a531-51b3-4795-adc3-f4fc858d7401",
"metadata": {
"tags": []
},
"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/中石化石油工程设计有限公司1'\n",
"new_path = 'file/中石化石油工程设计有限公司1'\n",
"old = []\n",
"dict2 = {}\n",
"\n",
"filename = 'data/东营工程设计院2024.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": "1e6ece92-7845-49df-a84c-88a2befee570",
"metadata": {},
"source": [
"## 生成体测报告打印明细表"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "02319955-7fb6-4791-ae45-55b03bdadd54",
"metadata": {
"tags": []
},
"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/北海炼化2024'\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": "34ef7e0d-35ea-4739-a1cb-540c5039afb7",
"metadata": {},
"source": [
"## 检查报告错误人员"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "c464fa11-8a0d-44e9-8af0-8c1f50263ceb",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-05T02:12:16.971166Z",
"iopub.status.busy": "2024-12-05T02:12:16.970399Z",
"iopub.status.idle": "2024-12-05T02:12:16.991930Z",
"shell.execute_reply": "2024-12-05T02:12:16.991373Z",
"shell.execute_reply.started": "2024-12-05T02:12:16.971124Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"739\n",
"518\n",
"275\n",
"809\n"
]
}
],
"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/北海炼化2024'\n",
"\n",
"filename = 'data/result_北海炼化2024.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"print(len(dict1))\n",
"fls = glob.glob(f'{fi_path}/*.pdf')\n",
"list1 = []\n",
"for fn in fls: \n",
" fi_name =Path(fn).stem.split('-')[0] \n",
" code = int(fi_name)\n",
" list1.append(str(code))\n",
"for k, v in dict1.items():\n",
" if k not in list1:\n",
" print(k)"
]
},
{
"cell_type": "markdown",
"id": "732161bb-98f2-4861-ab66-7a374678bcd8",
"metadata": {
"jp-MarkdownHeadingCollapsed": true,
"tags": [],
"toc-hr-collapsed": true
},
"source": [
"# 体质检测数据管理"
]
},
{
"cell_type": "markdown",
"id": "bb2db5e8-5dc6-4366-a39c-a3600ee5007c",
"metadata": {},
"source": [
"## 数据导入Mycrm"
]
},
{
"cell_type": "markdown",
"id": "bc98d772-5841-41a3-ad8f-f7d1ff3b5fde",
"metadata": {},
"source": [
"### 导入系统人员信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2cd93f45-6613-4a3f-97e4-5236068e1860",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import time\n",
"import csv\n",
"\n",
"list1 = []\n",
"filename = 'data/person_134.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",
"dict1 = {}\n",
"for result in list1:\n",
" code = str(result[4])\n",
" if int(result[1]) == 0:\n",
" sex = '男'\n",
" else:\n",
" sex = '女'\n",
" \n",
" m_item = str(result[3]) \n",
" dict1.setdefault(code,{}) \n",
" dict1[code]['name'] = result[0]\n",
" dict1[code]['sex'] = sex\n",
" dict1[code]['birth'] = result[2]\n",
"filename = 'data/天津石化人员清单.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict1, fl, ensure_ascii=False) \n",
"print(len(dict1)) "
]
},
{
"cell_type": "markdown",
"id": "2eb50f19-c15f-4a36-87b7-cd02551d248d",
"metadata": {},
"source": [
"### 导入测试项目item"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0eb37435-9c15-40ef-bd4c-2dffc026f59e",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import psycopg2\n",
"from psycopg2 import extras as ex\n",
"\n",
"filename = '../item.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"data_list = []\n",
"for k, v in dict1.items():\n",
" data_list.append((int(k),v['name'])) \n",
"conn = psycopg2.connect(database=\"mycrm\", user=\"postgres\", password=\"songyi\", host=\"localhost\", port=\"5432\")\n",
"cursor = conn.cursor()\n",
"sql = 'insert into shijiazhuang_item (id,name) values %s'\n",
"ex.execute_values(cursor, sql, data_list, page_size=10000)\n",
"#conn.commit()\n",
"cursor.close()\n",
"conn.close()\n",
"print('ok!')"
]
},
{
"cell_type": "markdown",
"id": "2ba97298-1e7e-4192-8d69-ea59f98e071a",
"metadata": {},
"source": [
"### 导入一级部门"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9f7ed380-95f3-47d4-9eb5-74937af7811f",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import psycopg2\n",
"from psycopg2 import extras as ex\n",
"\n",
"conn = psycopg2.connect(database=\"mycrm\", user=\"postgres\", password=\"songyi\", host=\"localhost\", port=\"5432\")\n",
"cursor = conn.cursor()\n",
"filename = 'data/result_石家庄.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"unit = set()\n",
"for k, v in dict1.items():\n",
" #if 'sub_unit' not in v.keys():\n",
" # print(k,v['name'])\n",
" unit.add(v['unit'])\n",
"print(unit) \n",
"i = 1\n",
"dict2 = {}\n",
"for item in unit:\n",
" dict2[item] = i\n",
" i+=1\n",
"data_list = []\n",
"for k, v in dict2.items():\n",
" data_list.append((v,k)) \n",
" \n",
"sql = 'insert into shijiazhuang_unit (id,name) values %s'\n",
"ex.execute_values(cursor, sql, data_list, page_size=10000)\n",
"#conn.commit()\n",
"cursor.close()\n",
"conn.close()\n",
"print('ok!')"
]
},
{
"cell_type": "markdown",
"id": "b8a1fa7f-08ff-49bb-8052-9f86b1f2ac18",
"metadata": {},
"source": [
"### 导入二级部门"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a13e81f2-467f-42c7-bb46-b547ef7bdd6c",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import psycopg2\n",
"from psycopg2 import extras as ex\n",
"\n",
"conn = psycopg2.connect(database=\"mycrm\", user=\"postgres\", password=\"songyi\", host=\"localhost\", port=\"5432\")\n",
"cursor = conn.cursor()\n",
"filename = 'data/天津石化人员名单.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"unit = set()\n",
"for k, v in dict1.items():\n",
" #if 'sub_unit' not in v.keys():\n",
" # print(k,v['name'])\n",
" unit.add(v['unit'])\n",
"print(unit) \n",
"i = 1\n",
"dict2 = {}\n",
"for item in unit:\n",
" dict2[item] = i\n",
" i+=1\n",
"data_list = []\n",
"dict3 = {}\n",
"for k, v in dict1.items():\n",
" dict3.setdefault(v['unit'],set())\n",
" dict3[v['unit']].add(v['sub_unit'])\n",
"i = 1 \n",
"for k, v in dict3.items():\n",
" unit_id = dict2[k]\n",
" for item in v:\n",
" data_list.append((i,item,unit_id))\n",
" i+=1\n",
"sql = 'insert into tianjin_sub_unit (id,name,unit_id) values %s'\n",
"ex.execute_values(cursor, sql, data_list, page_size=10000)\n",
"#conn.commit()\n",
"cursor.close()\n",
"conn.close()\n",
"print('ok!')"
]
},
{
"cell_type": "markdown",
"id": "12917000-59e0-4f8a-beee-929c6d7b60a0",
"metadata": {},
"source": [
"### 生成部门JSON文件"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5446269c-d324-4a16-b10e-f24d87178d77",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import csv\n",
"\n",
"dict1 = {}\n",
"filename = 'data/shijiazhuang_unit_20230517.csv'\n",
"with open(filename,'r',newline='') as csv_file:\n",
" fl = csv.reader(csv_file,delimiter=',')\n",
" header = next(fl)\n",
" list1 = []\n",
" for line in fl:\n",
" #line = re.sub('[\\r\\n\\f ]{1,}', '', line)\n",
" list1.append({'id':int(line[0]),'name':line[1]})\n",
"dict1['unit'] = list1\n",
"\n",
"filename = 'data/sub_unit_134.csv'\n",
"with open(filename,'r',newline='') as csv_file:\n",
" fl = csv.reader(csv_file,delimiter=',')\n",
" header = next(fl)\n",
" list1 = []\n",
" for line in fl:\n",
" #line = re.sub('[\\r\\n\\f ]{1,}', '', line)\n",
" list1.append({'id':int(line[0]),'name':line[1],'unit_id':int(line[2])})\n",
"dict1['sub_unit'] = list1\n",
"print(dict1)\n",
"\n",
"filename = 'data/天津石化部门.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict1, fl, ensure_ascii=False) \n",
"print(len(dict1)) "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5e57329d-a0ef-47b2-9866-fe2a911ff01d",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import csv\n",
"\n",
"dict1 = {}\n",
"filename = 'data/shijiazhuang_unit_20230517.csv'\n",
"with open(filename,'r',newline='') as csv_file:\n",
" fl = csv.reader(csv_file,delimiter=',')\n",
" header = next(fl)\n",
" list1 = []\n",
" for line in fl:\n",
" #line = re.sub('[\\r\\n\\f ]{1,}', '', line)\n",
" list1.append({'id':int(line[0]),'name':line[1]})\n",
" dict1[int(line[0])] = line[1]\n",
"\n",
"\n",
"filename = 'data/石家庄石化部门.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict1, fl, ensure_ascii=False) \n",
"print(len(dict1)) "
]
},
{
"cell_type": "markdown",
"id": "53bf98fe-0ae9-402f-b8d8-495e8f31df3d",
"metadata": {},
"source": [
"### 导入人员信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6af82fd2-b1d6-44b7-8b13-58883b58f8b0",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import psycopg2\n",
"from psycopg2 import extras as ex\n",
"\n",
"conn = psycopg2.connect(database=\"mycrm\", user=\"postgres\", password=\"songyi\", host=\"localhost\", port=\"5432\")\n",
"cursor = conn.cursor()\n",
"filename = 'data/天津石化人员清单.json'\n",
"with open(filename,'r') as fl:\n",
" person = json.load(fl)\n",
" \n",
"filename = 'data/石家庄石化部门.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"i = 1\n",
"dict2 = {}\n",
"for item in unit:\n",
" dict2[item] = i\n",
" i+=1\n",
"data_list = []\n",
"dict3 = {}\n",
"dict4 = {}\n",
"for k, v in dict1.items():\n",
" dict3.setdefault(v['unit'],set())\n",
" dict3[v['unit']].add(v['sub_unit']) \n",
"i = 1 \n",
"for k, v in dict3.items():\n",
" unit_id = dict2[k]\n",
" for item in v:\n",
" data_list.append((i,item,unit_id))\n",
" i+=1\n",
"for item in data_list:\n",
" sub_id = item[0]\n",
" dict4[sub_id] = {'name':item[1],'unit':item[2]}\n",
"dict5 = {}\n",
"for k, v in dict1.items():\n",
" id_unit = dict2[v['unit']]\n",
" sub_name = v['sub_unit']\n",
" id_sub = 0\n",
" for k1, v1 in dict4.items():\n",
" if v1['name'] == sub_name and v1['unit'] == id_unit:\n",
" id_sub = int(k1)\n",
" if id_sub >0:\n",
" dict5[k] = {'unit':id_unit,'sub_unit':id_sub}\n",
" else:\n",
" print(k,'not fund')\n",
"data_list = []\n",
"for k, v in dict5.items():\n",
" id = int(k)\n",
" name = person[k]['name']\n",
" sex = person[k]['sex']\n",
" birth = person[k]['birth']\n",
" phone = ''\n",
" note = ''\n",
" unit = v['sub_unit']\n",
" data_list.append((id,name,sex,birth,unit))\n",
"sql = 'insert into tianjin_person (id,name,sex,birth,unit_id) values %s'\n",
"ex.execute_values(cursor, sql, data_list, page_size=10000)\n",
"#conn.commit()\n",
"cursor.close()\n",
"conn.close()\n",
"print('ok!') \n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c2007c46-38c8-4a20-9917-b0b8743fe2a9",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import psycopg2\n",
"from psycopg2 import extras as ex\n",
"\n",
"conn = psycopg2.connect(database=\"mycrm\", user=\"postgres\", password=\"songyi\", host=\"localhost\", port=\"5432\")\n",
"cursor = conn.cursor()\n",
" \n",
"filename = 'data/石家庄石化部门.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"dict3 = {}\n",
"for k,v in dict1.items():\n",
" dict3[v] = int(k)\n",
"filename = 'data/result_石家庄.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl)\n",
"data_list = []\n",
"for k, v in dict2.items():\n",
" id = int(k)\n",
" name = dict2[k]['name']\n",
" sex = dict2[k]['sex']\n",
" birth = dict2[k]['birth'] \n",
" unit = dict3[dict2[k]['unit']]\n",
" data_list.append((id,name,sex,birth,unit))\n",
"sql = 'insert into shijiazhuang_person (id,name,sex,birth,unit_id) values %s'\n",
"ex.execute_values(cursor, sql, data_list, page_size=10000)\n",
"#conn.commit()\n",
"cursor.close()\n",
"conn.close()\n",
"print('ok!') "
]
},
{
"cell_type": "markdown",
"id": "fd95a45a-c6df-47c3-9941-2d0579b2c5d9",
"metadata": {},
"source": [
"### 导入测试成绩及得分"
]
},
{
"cell_type": "markdown",
"id": "c989de3f-a8ab-47dc-9662-544e4b6a0e2f",
"metadata": {
"tags": []
},
"source": [
"#### 二级部门导入"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "360e61e9-7895-484b-a9d6-333bdefa1a86",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import psycopg2\n",
"from psycopg2 import extras as ex\n",
"\n",
"filename = '../item.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"dict2 = {}\n",
"for k, v in dict1.items():\n",
" dict2[v['name']] = int(k)\n",
"\n",
"filename = 'data/天津石化部门.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"unit = {}\n",
"for item in dict1['unit']:\n",
" unit[item['name']] = item['id']\n",
"\n",
"sub_unit = {}\n",
"for item in dict1['sub_unit']:\n",
" sub_unit.setdefault(item['unit_id'],[])\n",
" sub_unit[item['unit_id']].append({'id':item['id'],'name':item['name']})\n",
" \n",
"filename = 'data/天津石化人员名单.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"person = {}\n",
"for k, v in dict1.items():\n",
" person[k] = {'unit':v['unit'],'sub_unit':v['sub_unit']}\n",
"\n",
" \n",
"conn = psycopg2.connect(database=\"mycrm\", user=\"postgres\", password=\"songyi\", host=\"localhost\", port=\"5432\")\n",
"cursor = conn.cursor()\n",
"data_list = []\n",
"filename = 'data/result_天津.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"for k, v in dict1.items():\n",
" for item in v.keys():\n",
" if item in dict2.keys():\n",
" item_id = dict2[item]\n",
" if v[item]['得分'] == '\\\\N':\n",
" score = None\n",
" else:\n",
" score = int(v[item]['得分'])\n",
" unit_name = person[k]['unit'] \n",
" sub_unit_name = person[k]['sub_unit']\n",
" unit_id = unit[unit_name]\n",
" for items in sub_unit[unit_id]:\n",
" if items['name'] ==sub_unit_name:\n",
" sub_id = items['id'] \n",
" data_list.append((v[item]['成绩'],score,int(k),item_id,unit_id,sub_id))\n",
" \n",
"sql = 'insert into tianjin_records (performance,score,avatar_id_id,item_id_id,unit_id_id,sub_unit_id_id) values %s'\n",
"ex.execute_values(cursor, sql, data_list, page_size=10000)\n",
"#conn.commit()\n",
"cursor.close()\n",
"conn.close()\n",
"print('ok!') \n",
" "
]
},
{
"cell_type": "markdown",
"id": "4aeabbbc-5b51-4dd0-b428-83e2012e63c4",
"metadata": {},
"source": [
"#### 一级部门导入"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cb747368-d3ac-4b29-ae4f-ce207d5fcd43",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import psycopg2\n",
"from psycopg2 import extras as ex\n",
"\n",
"filename = '../item.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"dict2 = {}\n",
"for k, v in dict1.items():\n",
" dict2[v['name']] = int(k)\n",
"\n",
"filename = 'data/石家庄石化部门.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"dict3 = {}\n",
"for k,v in dict1.items():\n",
" dict3[v] = int(k)\n",
" \n",
"\n",
"conn = psycopg2.connect(database=\"mycrm\", user=\"postgres\", password=\"songyi\", host=\"localhost\", port=\"5432\")\n",
"cursor = conn.cursor()\n",
"data_list = []\n",
"filename = 'data/result_石家庄.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"for k, v in dict1.items():\n",
" for item in v.keys():\n",
" if item in dict2.keys():\n",
" item_id = dict2[item] \n",
" if v[item]['得分'] == '':\n",
" score = None\n",
" else:\n",
" score = int(v[item]['得分'])\n",
" unit_name = v['unit']\n",
" unit_id = dict3[unit_name]\n",
" data_list.append((v[item]['成绩'],score,int(k),item_id,unit_id))\n",
"sql = 'insert into shijiazhuang_records (performance,score,avatar_id_id,item_id_id,unit_id_id) values %s'\n",
"ex.execute_values(cursor, sql, data_list, page_size=10000)\n",
"#conn.commit()\n",
"cursor.close()\n",
"conn.close()\n",
"print('ok!')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "51dc35a5-dc07-40a4-9ea7-375ca7f983c3",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import psycopg2\n",
"from psycopg2 import extras as ex\n",
"\n",
"filename = '../item.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"dict2 = {}\n",
"for k, v in dict1.items():\n",
" dict2[v['name']] = int(k)\n",
"\n",
"filename = 'data/天津石化部门.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"unit = {}\n",
"for item in dict1['unit']:\n",
" unit[item['name']] = item['id']\n",
"print(unit)"
]
},
{
"cell_type": "markdown",
"id": "5780368e-59c7-4bc1-a130-21b2f7da23de",
"metadata": {},
"source": [
"# 体质测试综合报告数据分析"
]
},
{
"cell_type": "markdown",
"id": "0ddf1a23-5963-43ba-9166-c88be749d75d",
"metadata": {},
"source": [
"## 清理报告数据"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "46aa847d-e1fe-45bd-85b6-e2d792ec8842",
"metadata": {
"execution": {
"iopub.execute_input": "2024-11-07T11:47:37.575532Z",
"iopub.status.busy": "2024-11-07T11:47:37.574781Z",
"iopub.status.idle": "2024-11-07T11:47:37.780926Z",
"shell.execute_reply": "2024-11-07T11:47:37.780418Z",
"shell.execute_reply.started": "2024-11-07T11:47:37.575459Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4059\n"
]
}
],
"source": [
"import json\n",
"import openpyxl\n",
"\n",
"\n",
"filename = 'data/result_天津石化2024.json'\n",
"with open(filename,'r') 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_天津石化2024.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict2,fl , ensure_ascii=False) \n",
"print(len(dict2)) "
]
},
{
"cell_type": "markdown",
"id": "ed5f157a-3114-4221-907d-53ce62409d83",
"metadata": {},
"source": [
"## 计算平均成绩"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "63edd636-f034-4aa6-8575-63d5cdb84adb",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:02:47.958778Z",
"iopub.status.busy": "2024-12-04T15:02:47.958038Z",
"iopub.status.idle": "2024-12-04T15:02:47.975696Z",
"shell.execute_reply": "2024-12-04T15:02:47.974632Z",
"shell.execute_reply.started": "2024-12-04T15:02:47.958708Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"平均成绩:2.9551分,男性:598人\n",
"平均成绩:3.1705分,女性:140人\n",
"平均成绩:2.996分,总体:738人\n"
]
}
],
"source": [
"import json\n",
"\n",
"nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n",
"filename = 'data/data_北海炼化2024.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": "3277b104-9b53-41c4-9b9a-f9acb71dbce1",
"metadata": {},
"source": [
"## 计算测试等级"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "1b4a3f02-9b2e-41fc-ac6c-8163907a07f1",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:03:47.530784Z",
"iopub.status.busy": "2024-12-04T15:03:47.530057Z",
"iopub.status.idle": "2024-12-04T15:03:47.570098Z",
"shell.execute_reply": "2024-12-04T15:03:47.569570Z",
"shell.execute_reply.started": "2024-12-04T15:03:47.530717Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0~255分人数:130人,男性:116人,女性:14人\n",
"256~332分人数:368人,男性:306人,女性:62人\n",
"333~367分人数:170人,男性:125人,女性:45人\n",
"368~500分人数:70人,男性:51人,女性:19人\n",
"738\n",
"ok\n"
]
}
],
"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": "39a1239d-13d8-4583-a163-e6db98c3933b",
"metadata": {},
"source": [
"### 计算各年龄段测试等级(女)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "2d661ca6-6129-4da1-ac25-51d0156babb2",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:04:19.067670Z",
"iopub.status.busy": "2024-12-04T15:04:19.066925Z",
"iopub.status.idle": "2024-12-04T15:04:19.087808Z",
"shell.execute_reply": "2024-12-04T15:04:19.087242Z",
"shell.execute_reply.started": "2024-12-04T15:04:19.067602Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"20-24 {'不合格': 2, '良好': 6, '优秀': 0, '合格': 8}\n",
"25-29 {'良好': 11, '不合格': 2, '合格': 13, '优秀': 2}\n",
"30-34 {'合格': 8, '良好': 3, '优秀': 4, '不合格': 1}\n",
"35-39 {'优秀': 2, '良好': 7, '合格': 10, '不合格': 6}\n",
"40-44 {'优秀': 1, '良好': 4, '合格': 1, '不合格': 0}\n",
"45-49 {'合格': 20, '优秀': 5, '良好': 8, '不合格': 3}\n",
"50-54 {'合格': 2, '良好': 6, '优秀': 5, '不合格': 0}\n",
"55-80 {'优秀': 0, '合格': 0, '良好': 0, '不合格': 0}\n"
]
}
],
"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": "b7d10bef-405f-49a1-b423-2b972b4d1a44",
"metadata": {},
"source": [
"### 计算各年龄段测试等级(男)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "fc97df37-34ff-4a02-9d26-b5d81b706e46",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:07:08.531067Z",
"iopub.status.busy": "2024-12-04T15:07:08.530357Z",
"iopub.status.idle": "2024-12-04T15:07:08.545126Z",
"shell.execute_reply": "2024-12-04T15:07:08.544536Z",
"shell.execute_reply.started": "2024-12-04T15:07:08.531002Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"20-24 {'不合格': 26, '良好': 9, '优秀': 2, '合格': 35}\n",
"25-29 {'良好': 20, '不合格': 25, '合格': 48, '优秀': 3}\n",
"30-34 {'合格': 24, '良好': 5, '优秀': 2, '不合格': 5}\n",
"35-39 {'优秀': 11, '良好': 23, '合格': 29, '不合格': 10}\n",
"40-44 {'优秀': 6, '良好': 3, '合格': 17, '不合格': 1}\n",
"45-49 {'合格': 37, '优秀': 6, '良好': 16, '不合格': 4}\n",
"50-54 {'合格': 73, '良好': 31, '优秀': 12, '不合格': 28}\n",
"55-80 {'优秀': 9, '合格': 43, '良好': 18, '不合格': 17}\n"
]
}
],
"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": "466355fe-5939-463c-a31e-a3a1beb4e78b",
"metadata": {},
"source": [
"## 根据年龄汇总人员信息及成绩"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "dafb86f8-5ee0-4c87-a98f-c7ff0f631fe5",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:07:14.121761Z",
"iopub.status.busy": "2024-12-04T15:07:14.119927Z",
"iopub.status.idle": "2024-12-04T15:07:14.142357Z",
"shell.execute_reply": "2024-12-04T15:07:14.141727Z",
"shell.execute_reply.started": "2024-12-04T15:07:14.121677Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"16~24岁平均成绩:2.73分,人数:88人,男性:72人\n",
"25~29岁平均成绩:2.92分,人数:124人,男性:96人\n",
"30~34岁平均成绩:3.02分,人数:52人,男性:36人\n",
"35~39岁平均成绩:3.1分,人数:98人,男性:73人\n",
"40~44岁平均成绩:3.21分,人数:33人,男性:27人\n",
"45~49岁平均成绩:3.09分,人数:99人,男性:63人\n",
"50~54岁平均成绩:3.04分,人数:157人,男性:144人\n",
"55~69岁平均成绩:2.97分,人数:87人,男性:87人\n"
]
}
],
"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": "dafdffca-6543-4304-af61-4f7cd418ba24",
"metadata": {},
"source": [
"### 根据年龄汇总人员信息及成绩(男)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "347703a1-501b-4800-bd29-16e94f4a6793",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:10:04.572147Z",
"iopub.status.busy": "2024-12-04T15:10:04.571454Z",
"iopub.status.idle": "2024-12-04T15:10:04.596383Z",
"shell.execute_reply": "2024-12-04T15:10:04.595277Z",
"shell.execute_reply.started": "2024-12-04T15:10:04.572082Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"20~24岁平均成绩:2.68分,人数:72人\n",
"25~29岁平均成绩:2.86分,人数:96人\n",
"30~34岁平均成绩:2.94分,人数:36人\n",
"35~39岁平均成绩:3.12分,人数:73人\n",
"40~44岁平均成绩:3.15分,人数:27人\n",
"45~49岁平均成绩:3.06分,人数:63人\n",
"50~54岁平均成绩:2.98分,人数:144人\n",
"55~80岁平均成绩:2.97分,人数:87人\n"
]
}
],
"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": "9b63891e-824a-4772-83f9-0706381ffd14",
"metadata": {},
"source": [
"### 根据年龄汇总人员信息及成绩(女)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "5900d1c7-2f8c-4dfa-a60e-a577fb90f22d",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:09:34.523177Z",
"iopub.status.busy": "2024-12-04T15:09:34.522550Z",
"iopub.status.idle": "2024-12-04T15:09:34.543633Z",
"shell.execute_reply": "2024-12-04T15:09:34.542960Z",
"shell.execute_reply.started": "2024-12-04T15:09:34.523123Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"20~24岁平均成绩:2.94分,人数:16人\n",
"25~29岁平均成绩:3.13分,人数:28人\n",
"30~34岁平均成绩:3.19分,人数:16人\n",
"35~39岁平均成绩:3.07分,人数:25人\n",
"40~44岁平均成绩:3.49分,人数:6人\n",
"45~49岁平均成绩:3.15分,人数:36人\n",
"50~54岁平均成绩:3.64分,人数:13人\n",
"55~80岁平均成绩:0分,人数:0人\n"
]
}
],
"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": "ca546652-d275-46d3-9b9a-9cb1c3a09a78",
"metadata": {},
"source": [
"## 计算各项目成绩"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "ad69c45d-3f62-42df-894d-47424e759029",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:10:44.614467Z",
"iopub.status.busy": "2024-12-04T15:10:44.613711Z",
"iopub.status.idle": "2024-12-04T15:10:44.636541Z",
"shell.execute_reply": "2024-12-04T15:10:44.635981Z",
"shell.execute_reply.started": "2024-12-04T15:10:44.614399Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"BMI 3.6 738\n",
"肺活量 3.38 728\n",
"握力 2.55 737\n",
"坐位体前屈 2.73 699\n",
"纵跳 2.53 692\n",
"俯卧撑 3.29 523\n",
"一分钟仰卧起坐 3.82 109\n",
"单脚站立 2.73 726\n",
"选择反应时 3.32 737\n",
"台阶指数 2.79 540\n"
]
}
],
"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": "f005328b-1927-4f62-b530-e7750299c423",
"metadata": {},
"source": [
"## 按照部门计算平均成绩"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "dcf152e7-bbcc-47d1-9c5f-83854db35412",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:12:44.516371Z",
"iopub.status.busy": "2024-12-04T15:12:44.515637Z",
"iopub.status.idle": "2024-12-04T15:12:44.537110Z",
"shell.execute_reply": "2024-12-04T15:12:44.536346Z",
"shell.execute_reply.started": "2024-12-04T15:12:44.516304Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"炼油二部 2.96 136\n",
"公用工程部 2.99 53\n",
"储运部 2.9 101\n",
"炼油一部 3.0 122\n",
"炼油三部 2.92 74\n",
"物资采购中心 3.17 16\n",
"科技发展部 3.0 9\n",
"设备工程部 3.1 19\n",
"检验计量中心 3.02 39\n",
"财务资产部 3.4 12\n",
"党群工作部 3.33 6\n",
"恒大化工 2.98 39\n",
"发展计划部 3.23 8\n",
"安全环保部 2.98 16\n",
"生产技术部(总调度室) 3.03 17\n",
"党委组织部(人力资源部) 3.15 12\n",
"电气仪表中心 2.94 37\n",
"综合管理部 3.21 14\n",
"本部 3.34 8\n"
]
}
],
"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",
" print(item,round(score/n,2),n)"
]
},
{
"cell_type": "markdown",
"id": "83ca1488-9b2d-493c-b540-904a5f0af114",
"metadata": {},
"source": [
"## 按照部门计算平均成绩(女性)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "d1977ca9-bf12-4f09-ae7b-e8af9eaa82f2",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:16:38.052997Z",
"iopub.status.busy": "2024-12-04T15:16:38.052411Z",
"iopub.status.idle": "2024-12-04T15:16:38.070279Z",
"shell.execute_reply": "2024-12-04T15:16:38.069338Z",
"shell.execute_reply.started": "2024-12-04T15:16:38.052942Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"炼油二部 3.17 13\n",
"公用工程部 3.33 11\n",
"储运部 2.98 6\n",
"炼油一部 3.21 15\n",
"炼油三部 2.82 6\n",
"物资采购中心 3.05 5\n",
"科技发展部 2.67 1\n",
"设备工程部 3.72 2\n",
"检验计量中心 2.97 19\n",
"财务资产部 3.46 10\n",
"党群工作部 3.67 2\n",
"恒大化工 2.98 26\n",
"发展计划部 3.61 5\n",
"安全环保部 3.25 2\n",
"生产技术部(总调度室) 3.67 1\n",
"党委组织部(人力资源部) 3.3 7\n",
"电气仪表中心 3.28 2\n",
"综合管理部 3.42 7\n",
"本部 0 0\n"
]
}
],
"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": "9f111ad0-dfbe-408e-8652-b8f31fc910cb",
"metadata": {},
"source": [
"## 计算部门等级"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "d507c7f7-6a91-4695-b700-5e2f77e6dea3",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:17:22.384324Z",
"iopub.status.busy": "2024-12-04T15:17:22.383584Z",
"iopub.status.idle": "2024-12-04T15:17:22.404238Z",
"shell.execute_reply": "2024-12-04T15:17:22.403084Z",
"shell.execute_reply.started": "2024-12-04T15:17:22.384258Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"炼油二部 14 29 67 26\n",
"公用工程部 8 11 25 9\n",
"储运部 8 25 42 26\n",
"炼油一部 7 27 69 19\n",
"炼油三部 5 11 43 15\n",
"物资采购中心 3 3 9 1\n",
"科技发展部 1 0 7 1\n",
"设备工程部 2 5 10 2\n",
"检验计量中心 4 11 18 6\n",
"财务资产部 3 3 5 1\n",
"党群工作部 2 1 3 0\n",
"恒大化工 3 9 20 7\n",
"发展计划部 1 3 3 1\n",
"安全环保部 1 5 7 3\n",
"生产技术部(总调度室) 2 4 9 2\n",
"党委组织部(人力资源部) 0 5 6 1\n",
"电气仪表中心 1 9 19 8\n",
"综合管理部 4 4 4 2\n",
"本部 1 5 2 0\n"
]
}
],
"source": [
"import json\n",
"\n",
"items = ['优秀','良好','合格','不合格'] \n",
"\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": "6345e3dc-509c-4a6f-8a0a-5c972d6f5828",
"metadata": {},
"source": [
"## 计算部门成绩"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "90bc66cd-9f01-410e-9abc-e6f15ada293f",
"metadata": {
"execution": {
"iopub.execute_input": "2024-12-04T15:19:48.512361Z",
"iopub.status.busy": "2024-12-04T15:19:48.511640Z",
"iopub.status.idle": "2024-12-04T15:19:48.542915Z",
"shell.execute_reply": "2024-12-04T15:19:48.542354Z",
"shell.execute_reply.started": "2024-12-04T15:19:48.512295Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"炼油二部\n",
"BMI 444 136\n",
"肺活量 478 134\n",
"握力 365 136\n",
"坐位体前屈 345 130\n",
"纵跳 347 133\n",
"俯卧撑 352 106\n",
"一分钟仰卧起坐 50 12\n",
"单脚站立 356 134\n",
"选择反应时 432 136\n",
"台阶指数 284 102\n",
"公用工程部\n",
"BMI 199 53\n",
"肺活量 190 53\n",
"握力 133 53\n",
"坐位体前屈 138 51\n",
"纵跳 127 52\n",
"俯卧撑 120 39\n",
"一分钟仰卧起坐 33 9\n",
"单脚站立 134 53\n",
"选择反应时 186 53\n",
"台阶指数 101 38\n",
"储运部\n",
"BMI 351 101\n",
"肺活量 321 99\n",
"握力 281 101\n",
"坐位体前屈 245 91\n",
"纵跳 220 91\n",
"俯卧撑 238 80\n",
"一分钟仰卧起坐 10 4\n",
"单脚站立 237 97\n",
"选择反应时 324 100\n",
"台阶指数 163 57\n",
"炼油一部\n",
"BMI 408 122\n",
"肺活量 414 121\n",
"握力 313 122\n",
"坐位体前屈 329 117\n",
"纵跳 298 115\n",
"俯卧撑 327 97\n",
"一分钟仰卧起坐 40 10\n",
"单脚站立 336 120\n",
"选择反应时 393 122\n",
"台阶指数 275 97\n",
"炼油三部\n",
"BMI 262 74\n",
"肺活量 246 72\n",
"握力 186 74\n",
"坐位体前屈 188 72\n",
"纵跳 169 70\n",
"俯卧撑 206 63\n",
"一分钟仰卧起坐 15 5\n",
"单脚站立 185 73\n",
"选择反应时 217 74\n",
"台阶指数 183 59\n",
"物资采购中心\n",
"BMI 60 16\n",
"肺活量 50 16\n",
"握力 41 16\n",
"坐位体前屈 54 16\n",
"纵跳 45 16\n",
"俯卧撑 44 11\n",
"一分钟仰卧起坐 21 5\n",
"单脚站立 44 16\n",
"选择反应时 55 16\n",
"台阶指数 36 14\n",
"科技发展部\n",
"BMI 31 9\n",
"肺活量 30 9\n",
"握力 23 9\n",
"坐位体前屈 21 9\n",
"纵跳 26 9\n",
"俯卧撑 19 7\n",
"一分钟仰卧起坐 3 1\n",
"单脚站立 22 9\n",
"选择反应时 38 9\n",
"台阶指数 25 8\n",
"设备工程部\n",
"BMI 87 19\n",
"肺活量 63 19\n",
"握力 45 19\n",
"坐位体前屈 49 18\n",
"纵跳 45 18\n",
"俯卧撑 50 14\n",
"一分钟仰卧起坐 9 2\n",
"单脚站立 54 19\n",
"选择反应时 64 19\n",
"台阶指数 32 13\n",
"检验计量中心\n",
"BMI 153 39\n",
"肺活量 124 39\n",
"握力 80 38\n",
"坐位体前屈 109 35\n",
"纵跳 68 32\n",
"俯卧撑 50 14\n",
"一分钟仰卧起坐 48 13\n",
"单脚站立 111 37\n",
"选择反应时 130 39\n",
"台阶指数 61 23\n",
"财务资产部\n",
"BMI 50 12\n",
"肺活量 44 12\n",
"握力 30 12\n",
"坐位体前屈 33 11\n",
"纵跳 34 12\n",
"俯卧撑 7 2\n",
"一分钟仰卧起坐 22 6\n",
"单脚站立 51 12\n",
"选择反应时 42 12\n",
"台阶指数 16 6\n",
"党群工作部\n",
"BMI 28 6\n",
"肺活量 16 6\n",
"握力 14 6\n",
"坐位体前屈 21 6\n",
"纵跳 17 6\n",
"俯卧撑 15 4\n",
"一分钟仰卧起坐 10 2\n",
"单脚站立 21 6\n",
"选择反应时 21 6\n",
"台阶指数 17 6\n",
"恒大化工\n",
"BMI 157 39\n",
"肺活量 121 38\n",
"握力 89 39\n",
"坐位体前屈 87 35\n",
"纵跳 91 34\n",
"俯卧撑 35 10\n",
"一分钟仰卧起坐 69 19\n",
"单脚站立 105 39\n",
"选择反应时 121 39\n",
"台阶指数 86 29\n",
"发展计划部\n",
"BMI 34 8\n",
"肺活量 24 8\n",
"握力 18 8\n",
"坐位体前屈 24 8\n",
"纵跳 21 8\n",
"俯卧撑 6 3\n",
"一分钟仰卧起坐 22 5\n",
"单脚站立 29 8\n",
"选择反应时 30 8\n",
"台阶指数 18 6\n",
"安全环保部\n",
"BMI 50 16\n",
"肺活量 49 15\n",
"握力 43 16\n",
"坐位体前屈 47 16\n",
"纵跳 41 16\n",
"俯卧撑 38 12\n",
"一分钟仰卧起坐 7 2\n",
"单脚站立 39 16\n",
"选择反应时 62 16\n",
"台阶指数 36 13\n",
"生产技术部(总调度室)\n",
"BMI 63 17\n",
"肺活量 56 17\n",
"握力 46 17\n",
"坐位体前屈 43 17\n",
"纵跳 37 16\n",
"俯卧撑 44 13\n",
"一分钟仰卧起坐 5 1\n",
"单脚站立 54 17\n",
"选择反应时 62 17\n",
"台阶指数 39 15\n",
"党委组织部(人力资源部)\n",
"BMI 44 12\n",
"肺活量 39 12\n",
"握力 29 12\n",
"坐位体前屈 31 11\n",
"纵跳 23 9\n",
"俯卧撑 17 5\n",
"一分钟仰卧起坐 24 6\n",
"单脚站立 36 11\n",
"选择反应时 47 12\n",
"台阶指数 23 9\n",
"电气仪表中心\n",
"BMI 145 37\n",
"肺活量 107 36\n",
"握力 89 37\n",
"坐位体前屈 86 35\n",
"纵跳 92 35\n",
"俯卧撑 106 30\n",
"一分钟仰卧起坐 9 2\n",
"单脚站立 92 37\n",
"选择反应时 133 37\n",
"台阶指数 64 28\n",
"综合管理部\n",
"BMI 56 14\n",
"肺活量 49 14\n",
"握力 31 14\n",
"坐位体前屈 40 13\n",
"纵跳 29 12\n",
"俯卧撑 14 5\n",
"一分钟仰卧起坐 19 5\n",
"单脚站立 47 14\n",
"选择反应时 57 14\n",
"台阶指数 31 10\n",
"本部\n",
"BMI 32 8\n",
"肺活量 36 8\n",
"握力 20 8\n",
"坐位体前屈 18 8\n",
"纵跳 22 8\n",
"俯卧撑 34 8\n",
"一分钟仰卧起坐 0 0\n",
"单脚站立 27 8\n",
"选择反应时 30 8\n",
"台阶指数 19 7\n"
]
}
],
"source": [
"import json\n",
"\n",
"items = ['BMI','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数'] \n",
"filename = 'data/data_北海炼化2024.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"filename = 'data/北海炼化人员2024.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": "bdb81e20-32ec-4e0e-b2ac-13dac2060068",
"metadata": {
"tags": []
},
"source": [
"# 问卷数据处理分析"
]
},
{
"cell_type": "markdown",
"id": "1485fc89-4fc2-437d-a29e-b4a0aab12aa0",
"metadata": {},
"source": [
"## 常用参数及自定义函数"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6f9768ce-2ef5-4253-9fc6-49dbdcf00a19",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"questions = [\n",
" [1],\n",
" [-1, 2],\n",
" [-1, 2],\n",
" [-1, 8],\n",
" [-1, 3],\n",
" [1],\n",
" [-1],\n",
" [-1, 7],\n",
" [2],\n",
" [2],\n",
" [2],\n",
" [2, 3],\n",
" [2],\n",
" [2],\n",
" [3],\n",
" [3],\n",
" [3],\n",
" [3],\n",
" [3],\n",
" [4],\n",
" [4],\n",
" [4],\n",
" [4],\n",
" [4],\n",
" [4],\n",
" [4],\n",
" [4],\n",
" [5],\n",
" [5],\n",
" [5],\n",
" [5],\n",
" [5],\n",
" [5],\n",
" [5],\n",
" [5],\n",
" [6],\n",
" [6],\n",
" [6],\n",
" [6],\n",
" [6],\n",
" [6],\n",
" [7],\n",
" [7],\n",
" [7],\n",
" [7],\n",
" [7],\n",
" [7],\n",
" [8],\n",
" [8],\n",
" [8],\n",
" [8],\n",
" [8],\n",
" [8],\n",
" [9],\n",
" [9],\n",
" [9],\n",
" [9],\n",
" [9],\n",
" [9],\n",
" [9]\n",
"]\n",
"\n",
"kinds = [\n",
" '平和',\n",
" '气虚',\n",
" '阳虚',\n",
" '阴虚',\n",
" '痰湿',\n",
" '湿热',\n",
" '血瘀',\n",
" '气郁',\n",
" '特禀'\n",
"]\n",
"\n",
"def tcm_calc(arr):\n",
" qa = [8, 8, 7, 8, 8, 6, 7, 7, 7]\n",
" # 成绩数组\n",
" s = [0] * 9\n",
" # 遍历五进制\n",
" for i in range(len(questions)):\n",
" m = arr[i] - 1\n",
" for v in questions[i]:\n",
" if v < 0:\n",
" s[-v - 1] += 4 - m\n",
" else:\n",
" s[v - 1] += m\n",
" return [int((v / qa[i]) * 25) for i, v in enumerate(s)]\n",
"\n",
"def tcm_kind(score):\n",
" kind = 0\n",
" near = False\n",
" max_kind = 0\n",
" max_score = 0\n",
" for i in range(1, 9):\n",
" if score[i] > max_score:\n",
" max_kind = i\n",
" max_score = score[i]\n",
" if score[0] >= 60 and max_score < 40:\n",
" if max_score >= 30:\n",
" near = True\n",
" kind = max_kind\n",
" else:\n",
" kind = max_kind\n",
" return {\n",
" \"kind\": kind,\n",
" \"near\": near\n",
" }\n",
"list2 = ['成就感','愉快心境','放松程度','压力应对','体力充沛','情感充沛度']\n",
"list3 = [[5,7],[7,4],[7,4],[7,4],[8,1],[6,1]] \n",
"list4 = ['颈椎','胸椎','腰椎','骶尾椎']\n",
"list5 = [[0,10,10],[10,17,7],[17,24,6],[24,26,2]]"
]
},
{
"cell_type": "markdown",
"id": "df2d18e2-d2e4-499e-876a-59d8550a8201",
"metadata": {},
"source": [
"## 计算中医体质"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1acaf159-637e-4101-9881-f6bb79400136",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import openpyxl\n",
"\n",
"filename = 'data/result_东营工程设计院2024_all.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"i = 1\n",
"list2 = []\n",
"for k, v in dict1.items():\n",
" if 'tcm' in v.keys():\n",
" list1 = []\n",
" tcm =v['tcm']\n",
" for item in tcm:\n",
" list1.append(item)\n",
" score = tcm_calc(list1)\n",
"\n",
" result = tcm_kind(score)\n",
" kind = result['kind']\n",
" near = result['near']\n",
" #print(i,k,kinds[kind], near, score)\n",
" #i+=1\n",
" list3 = []\n",
" list3.append(k)\n",
" list3.append(kinds[kind])\n",
" list3.append(near)\n",
" for item in score:\n",
" list3.append(item)\n",
" list2.append(list3)\n",
"print(list2)\n",
"filename = 'data/东营工程设计院中医情况明细表.xlsx'\n",
"wb = openpyxl.Workbook()\n",
"sheet = wb.active\n",
"\n",
"for row in list2:\n",
" sheet.append(row)\n",
" \n",
"wb.save(filename)\n",
"print('ok') "
]
},
{
"cell_type": "markdown",
"id": "cfb5661f-fd37-4372-9d22-3708d61680f9",
"metadata": {},
"source": [
"## 计算心理"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ad3078ac-ae53-4bb4-95bd-387631092bf1",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"list2 = ['成就感','愉快心境','放松程度','压力应对','体力充沛','情感充沛度']\n",
"list3 = [[5,7],[7,4],[7,4],[7,4],[8,1],[6,1]]\n",
"qb = [\n",
" 1, 1, 1, 1, 1,\n",
" 4, 3, 2, 3, 2, 4, 3,\n",
" 4, 3, 2, 4, 4, 2, 4,\n",
" 3, 2, 2, 4, 3, 3, 2,\n",
" 5, 5, 5, 5, 5, 5, 5, 5,\n",
" 6, 6, 6, 6, 6, 6\n",
" ]\n",
"filename = 'data/result_青海all_2.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"for k, v in dict1.items():\n",
" if 'psy' in v.keys():\n",
" psy=v['psy']\n",
" for i in range(26,40):\n",
" new_valve = psy[i]-1\n",
" psy[i] = new_valve\n",
" dict3 = {}\n",
" \n",
" i = 0\n",
" for item in qb:\n",
" dict3.setdefault(item,0)\n",
" dict3[item] +=psy[i]\n",
" i+=1\n",
" print(dict3)\n",
" print(k)\n",
" for i in range(0,6):\n",
" score = int(dict3[i+1]/list3[i][0]/list3[i][1]*100)\n",
" print(list2[i],score)"
]
},
{
"cell_type": "markdown",
"id": "20ef0e26-0f7b-4ee8-8b52-005e2d5ad0d4",
"metadata": {},
"source": [
"## 计算脊柱"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "122f19fb-3531-4074-94e4-e2afdb8af51a",
"metadata": {},
"outputs": [],
"source": [
"list4 = ['颈椎','胸椎','腰椎','骶尾椎']\n",
"list5 = [[0,10,10],[10,17,7],[17,24,6],[24,26,2]]\n",
"filename = 'data/result_青海all_2.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"for k, v in dict1.items():\n",
" if 'spine' in v.keys():\n",
" spine = v['spine']\n",
" for i in range(0,4):\n",
" score = 0\n",
" for ii in range(list5[i][0],list5[i][1]):\n",
" score+= spine[ii]\n",
" print(k,list4[i],int(score/list5[i][2]*100)-100)"
]
}
],
"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
}