Files
jupyter/体测单位/体质检测数据处理.ipynb
T
2024-11-22 15:50:59 +08:00

85 KiB

体质检测数据处理

基础数据管理

体测数据按编号汇总

In [ ]:
import json
import time
import csv

filename = '../item.json'
item = {}
bh = set()
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
for k,v in dict1.items():
    item[k] = v
re_ta = {}
dict1 = {}
list1 = []
list2 = []
rq = '20240612'
filename = f'data/places_result_{rq}.csv'
with open(filename,'r',newline='') as csv_file:
    fl = csv.reader(csv_file,delimiter=',')
    header = next(fl)    
    for line in fl:
        #line = re.sub('[\r\n\f ]{1,}', '', line)
        list1.append(line)
        bh.add(line[2])
        
#print(list1)
for result in list1:
    user = str(result[2])
        
    m_item = str(result[3])    
    re_ta.setdefault(user,{})    
    
    item_name = item[m_item]['name']
    re_ta[user].setdefault(item_name,{})  
    score = int(result[4])/item[m_item]['divisor']    
    re_ta[user][item_name]['成绩'] = f'{score} {item[m_item]["unit"]}'
print(len(re_ta))


items = ['身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']
title = ['编号','身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']
list1 = []
for k, v in re_ta.items():
    list2 = []
    list2.append(str(k))
    for item in items:
        if item in v.keys():
            list2.append(v[item]['成绩'])            
        elif item =='name':
            list2.append(v[item])
        else:
            list2.append('') 
    list1.append(list2)
filename = f'data/长炼医院体测情况表({rq}).xlsx'
wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(title)
for row in list1:
    sheet.append(row)
wb.save(filename)

体测项目标准导入

In [ ]:
import openpyxl
import json

tcbz ={
    'HeightWeigh':'身高体重',
    'StepExperiment':'台阶指数',
    'Lung':'肺活量',
    'Proneness':'坐位体前屈',
    'PowerfullGrip':'握力',
    'OneMinutePushUp':'一分钟仰卧起坐',
    'PushUp':'俯卧撑',
    'VerticalJump':'纵跳',
    'ReactionTime':'选择反应时',
    'FootStand':'单脚站立'
}
wb = openpyxl.load_workbook('data/体质检测标准.xlsx')
sheet = wb.active
# sheets = wb.sheetnames
dict1 = {}
dict3 = {}
for k, v in tcbz.items():
    dict3[v] = k
sheet = wb.active
data1 =list(sheet.values)
del data1[0]
for item in data1:
    sex = item[0][6:]
    if sex =='男':
        age_sex = 'M'+item[0][:5]
    else:
        age_sex = 'F'+item[0][:5]
    dict1.setdefault(age_sex,{})
    if item[1] in dict3.keys():
        xm = dict3[item[1]]
    dict1[age_sex].setdefault(xm,[])
    dict1[age_sex][xm].append(item[3]/item[4])
dict2 = {}
#print(dict1)
for k, v in dict1.items():
    i1 = int(k[1:3])
    i2 = int(k[-2:])
    m_sex = k[:1]
    for i in range(i1,i2+1):
        dict2[m_sex+str(i)] = k
dict3 = {}
dict3['person'] = dict2
dict3['criteria'] = dict1
filename = 'data/体质检测标准.json'
with open(filename, 'w') as fl:
    json.dump(dict3, fl, ensure_ascii=False)
print('ok')

身高标准导入

In [ ]:
import openpyxl
import json

tcbz ={
    'HeightWeigh':'身高体重',
    'StepExperiment':'台阶指数',
    'Lung':'肺活量',
    'Proneness':'坐位体前屈',
    'PowerfullGrip':'握力',
    'OneMinutePushUp':'一分钟仰卧起坐',
    'PushUp':'俯卧撑',
    'VerticalJump':'纵跳',
    'ReactionTime':'选择反应时',
    'FootStand':'单脚站立'
}
wb = openpyxl.load_workbook('data/体质检测标准_BMI.xlsx')
sheet = wb.active
# sheets = wb.sheetnames
dict1 = {}
dict3 = {}
for k, v in tcbz.items():
    dict3[v] = k
sheet = wb.active
data1 =list(sheet.values)
del data1[0]
for item in data1:
    min_age = int(item[1]/12)
    max_age = int((item[2]+1)/12) - 1
    sex = item[0]
    height = int(item[3])
    if sex ==0:
        age_sex = 'M'+str(min_age)+'~'+str(max_age)
    else:
        age_sex = 'F'+str(min_age)+'~'+str(max_age)
    dict1.setdefault(age_sex,{})
    
    dict1[age_sex].setdefault(height,[])
    dict1[age_sex][height].append(item[5]/1000)
dict2 = {}
#print(dict1)
for k, v in dict1.items():
    i1 = int(k[1:3])
    i2 = int(k[-2:])
    m_sex = k[:1]
    for i in range(i1,i2+1):
        dict2[m_sex+str(i)] = k
dict3 = {}
dict3['person'] = dict2
dict3['criteria'] = dict1
filename = 'data/体质检测标准_BMI.json'
with open(filename, 'w') as fl:
    json.dump(dict3, fl, ensure_ascii=False)
print('ok')

生成项目信息

In [ ]:
import json

filename = '../item.json'
item = {}
unit = {}
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
for k,v in dict1.items():
    item[k] = v
    del item[k]['divisor']
item['1']['en'] = 'lung'
item['2']['en'] = 'grip'
item['3']['en'] = 'flexion'
item['4']['en'] = 'jump'
item['5']['en'] = 'pushup'
item['6']['en'] = 'balance'
item['7']['en'] = 'reaction'
item['8']['en'] = 'step'
item['9']['en'] = 'situp'
item['10']['en'] = 'height'
item['11']['en'] = 'weight'

filename = 'data/体质检测项目信息.json'
with open(filename, 'w') as fl:
    json.dump(item, fl, ensure_ascii=False)
print('ok')

计算分数

In [ ]:
import json
import time
import csv

filename = 'data/体质检测标准.json'
item = {}
unit = {}
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
person = dict1['person']
criteria = dict1['criteria']
data = {'name':'张三','sex':'M','age':37,'item':'StepExperiment','result':46}
info = data['sex']+str(data['age'])
bz = person[info]
mx = criteria[bz][data['item']]
result = data['result']
score = -1
print(mx)
for bz1 in mx:
    if result < bz1:
        print(bz1)
        score = mx.index(bz1,0)
        break
    else:
        score = 5
#if score == -1:
 #   score = 5
print(score)

计算BMI分数

In [ ]:
import json
import time
import csv

filename = 'data/体质检测标准_BMI.json'
item = {}
unit = {}
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
person = dict1['person']
criteria = dict1['criteria']
data = {'name':'张三','sex':'M','age':37,'item':'HeightWeight','result':'177.7,97.0'}
info = data['sex']+str(data['age'])

bz = person[info]
print(bz)
result = data['result']
print(result)
height = int(float(result.split(',')[0]))
weight = float(result.split(',')[1])
mx = criteria[bz][str(height)]
if weight < mx[0]:
    score = 1
elif weight < mx[1]:
    score = 3
elif weight < mx[2]:
    score = 5    
elif weight <= mx[3]:
    score = 3  
elif weight > mx[3]:
    score = 1
print(score)

体测报告生成

转换报告格式

In [ ]:
import json
import datetime
import csv
from datetime import date

filename = '../item.json'
item = {}
unit = {}
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
for k,v in dict1.items():
    item[k] = v
item['1']['en'] = 'lung'
item['2']['en'] = 'grip'
item['3']['en'] = 'flexion'
item['4']['en'] = 'jump'
item['5']['en'] = 'pushup'
item['6']['en'] = 'balance'
item['7']['en'] = 'reaction'
item['8']['en'] = 'step'
item['9']['en'] = 'situp'
item['10']['en'] = 'height'
item['11']['en'] = 'weight'


re_ta = {}
dict1 = {}
list1 = []
filename = 'data/天津石化人员2024.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 

filename = 'data/places_result_20241104.csv'
with open(filename,'r',newline='') as csv_file:
    fl = csv.reader(csv_file,delimiter=',')
    header = next(fl)    
    for line in fl:
        #line = re.sub('[\r\n\f ]{1,}', '', line)
        list1.append(line)
#f_item = ['lung','grip','flexion','jump','balance','reaction','step','situp']
#m_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step']
for result in list1:
    user = str(result[2])
    rq = date.fromisoformat(result[6].replace('/','-'))
    if user in dict1.keys():
        l_xm = []
        m_item = str(result[3])    
        re_ta.setdefault(user,{})    
        re_ta[user]['name'] = dict1[user]['name']
        re_ta[user]['sex'] = dict1[user]['sex']
        if dict1[user]['sex'] == '男':
            l_xm = ['weight','height','lung','grip','flexion','jump','pushup','balance','reaction','step']
        else:
            l_xm = ['weight','height','lung','grip','flexion','jump','balance','reaction','step','situp']
        re_ta[user]['unit'] = dict1[user]['unit']
        #birth = date.fromisoformat(dict1[user]['birth'].replace('/','-'))
        birth = date.fromisoformat(dict1[user]['birth'])
        #nian = int(birth[0].strip())
        #yue = int(birth[1].strip())
        #ri = int(birth[2].strip())
        #print(k,nian,yue,ri)
        item_name = item[m_item]['en']        
        if item_name in l_xm:            
            days = (rq-birth).days        
            re_ta[user]['age'] = int(days/365)
            re_ta[user]['month'] = int(days/365*12)
            re_ta[user]['rq'] = result[6]


            re_ta[user].setdefault(item_name,{})  
            score = int(result[4])/item[m_item]['divisor']    
            re_ta[user][item_name]['成绩'] = f'{score} {item[m_item]["unit"]}'
print(len(re_ta))
filename = 'data/result_天津石化2024.json'

with open(filename,'w') as fl:
    json.dump(re_ta, fl, ensure_ascii=False) 
print(len(re_ta))

生成完善得分

In [ ]:
import json
import time

filename = '../item.json'
item = {}
unit = {}
with open(filename,'r') as fl:
    dict3 = json.load(fl) 
for k,v in dict3.items():
    item[k] = v
item['1']['en'] = 'lung'
item['2']['en'] = 'grip'
item['3']['en'] = 'flexion'
item['4']['en'] = 'jump'
item['5']['en'] = 'pushup'
item['6']['en'] = 'balance'
item['7']['en'] = 'reaction'
item['8']['en'] = 'step'
item['9']['en'] = 'situp'
item['10']['en'] = 'height'
item['11']['en'] = 'weight'

filename = 'data/体质检测标准 (1).json'    
with open(filename,'r') as fl:
    dict1 = json.load(fl)



def cal_score(data1):
    #data = {'name':'张三','sex':'M','age':37,'item':'StepExperiment','result':46}     
    person = dict1['person']
    criteria = dict1['criteria']
    if data1['age'] >59:
        data1['age'] = 59
    if data1['age'] <20:
        data1['age'] = 20
    info = data1['sex']+str(data1['age'])
    bz = person[info]
    mx = criteria[bz][data1['item']]
    result = data1['result']    
    if data1['item'] == 'reaction':
        for bz1 in mx:
            if result > bz1:
                #print(bz1)
                score = mx.index(bz1,0)
                break
            else:
                score = 5
    else:
        for bz1 in mx:
            if result < bz1:
                #print(bz1)
                score = mx.index(bz1,0)
                break
            else:
                score = 5
    return(score)
filename = 'data/体质检测标准_BMI.json'
with open(filename,'r') as fl:
    dict4 = json.load(fl) 
    
def cal_bmi(data1):
   # data = {'name':'张三','sex':'M','age':37,'item':'HeightWeight','result':'177.7,97.0'}
    person = dict4['person']
    criteria = dict4['criteria']
    if data1['age'] > 59:
        data1['age'] = 59
    if data1['age'] <20:
        data1['age'] = 20
    info = data1['sex']+str(data1['age'])
    bz = person[info]
    #print(bz)
    result = data1['result']
    #print(data1['code'],result)
    height = int(float(result.split(',')[0]))
    weight = float(result.split(',')[1])
    if str(height) not in criteria[bz]:
        score = 1
    else:   
        mx = criteria[bz][str(height)]
        if weight < mx[0]:
            score = 1
        elif weight < mx[1]:
            score = 3
        elif weight < mx[2]:
            score = 5    
        elif weight <= mx[3]:
            score = 3  
        elif weight > mx[3]:
            score = 1
    return score
    
    

#list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','height','weight']
list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp']
filename = 'data/result_天津石化2024.json'
with open(filename,'r') as fl:
    dict2 = json.load(fl) 
for k, v in dict2.items():
    #print(k)
    if v['sex'] == '男':
        sex = 'M'
    else:
        sex = 'F'            
    if 'height' in v.keys() and 'weight' in v.keys():
        bmi_data = v['height']['成绩'].split()[0]+','+ v['weight']['成绩'].split()[0]
        data1 = {'code':k,'sex':sex,'age':v['age'],'item':'HeightWeight','result':bmi_data}
        dict2[k]['bmi'] = {}
        dict2[k]['bmi']['成绩'] = bmi_data
        dict2[k]['bmi']['score'] = cal_bmi(data1)
    for item_en in list_item:
        if item_en in v.keys():            
            data1 = {'code':k,'sex':sex,'age':v['age'],'item':item_en,'result':float(v[item_en]['成绩'].split()[0])}
            dict2[k][item_en]['score'] = cal_score(data1)
            #print(k,v[item_en]['成绩'],cal_score(data1))

filename = f'data/result_天津石化2024.json'
with open(filename,'w') as fl:
    json.dump(dict2,fl , ensure_ascii=False) 
print('ok!')        

生成报告

In [ ]:
import requests
import json
import openpyxl


headers = {
    "Content-Type": "application/json; charset=UTF-8"
    }
filename = 'data/result_天津2024(部门).json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)
list1 = []
file_path ='./天津石化2024/'
list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','bmi']
i=0
list2 = []
for  k, v in dict1.items():
    list1 = []
    mydata = {}
    
    id = str(k).rjust(4,"0")
    mydata['path'] = file_path+id+'-'+ v['name']+'.pdf'
    mydata['title'] = '中石化(天津)石油化工\n有限公司'
    mydata['subtitle'] = v['unit']+' '+v['sub_unit']
    mydata['id'] = id
    mydata['name'] = v['name']
    if v['sex'] == '男':
        mydata['gender'] = 'male'
    else:
        mydata['gender'] = 'female'
    
    mydata['month'] = v['month']
    mydata['fits'] = {}
    survey_list = ['tcm','psy','spine']
    for item in survey_list:
        if item in  v.keys():
            mydata.setdefault('surveys',{})
            mydata['surveys'][item] = v[item]
            
    
    #mydata['fits'] = {}
    for item in list_item:
        if item in v.keys():
            mydata.setdefault('fits',{})
            if item in ['lung','pushup','step','situp']:
                mark = v[item]['成绩'].split()[0].split('.')[0]
            else:
                mark = v[item]['成绩'].split()[0]
            mydata['fits'][item] = {'mark':mark,'score':v[item]['score']}
    #if len(mydata['fits']) >2 or len(mydata['surveys']) >0:
    if len(mydata['fits']) >2 :    
        list1.append(mydata)
        list2.append([k,v['name']])
        i+=1
        x = requests.post('http://localhost:3003', data = json.dumps(list1), headers=headers)
        #print(id,v['name'],x.text)
        #print(mydata)
        #x.close()
print(i)
In [ ]:
import requests
import json
import openpyxl


headers = {
    "Content-Type": "application/json; charset=UTF-8"
    }
filename = 'data/result_东营工程设计院2024_all.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)
list1 = []
file_path ='./中石化石油工程设计有限公司/'
list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','bmi']
i=0
list2 = []
for  k, v in dict1.items():
    list1 = []
    mydata = {}
    
    id = str(k).rjust(4,"0")
    mydata['path'] = file_path+id+'-'+ v['name']+'.pdf'
    mydata['title'] = '中石化石油工程设计有限公司'
    mydata['subtitle'] = v['unit']
    mydata['id'] = id
    mydata['name'] = v['name']
    if v['sex'] == '男':
        mydata['gender'] = 'male'
    else:
        mydata['gender'] = 'female'
    
    mydata['month'] = v['month']
    mydata['fits'] = {}
    survey_list = ['tcm','psy','spine']
    for item in survey_list:
        if item in  v.keys():
            mydata.setdefault('surveys',{})
            mydata['surveys'][item] = v[item]
            
    
    #mydata['fits'] = {}
    for item in list_item:
        if item in v.keys():
            mydata.setdefault('fits',{})
            if item in ['lung','pushup','step','situp']:
                mark = v[item]['成绩'].split()[0].split('.')[0]
            else:
                mark = v[item]['成绩'].split()[0]
            mydata['fits'][item] = {'mark':mark,'score':v[item]['score']}
    #if len(mydata['fits']) >2 or len(mydata['surveys']) >0:
      
    list1.append(mydata)
    list2.append([k,v['name']])
    i+=1
    x = requests.post('http://localhost:3003', data = json.dumps(list1), headers=headers)
    #print(id,v['name'],x.text)
    #print(mydata)
    #x.close()
print(i)

体测报告按部门分类

In [ ]:
import os,sys,shutil
import json
import glob
from pathlib import Path

fi_path = '/home/songyi/pdf-typescript/中石化石油工程设计有限公司1'
new_path = 'file/中石化石油工程设计有限公司1'
old = []
dict2 = {}

filename = 'data/东营工程设计院2024.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)
fls = glob.glob(f'{fi_path}/*.pdf')
for fn in fls:
    fi_name =Path(fn).stem.split('-')[0]
    code = int(fi_name)
    unit_path = Path(new_path,dict1[str(code)]['unit'])
    unit_path.mkdir(parents = True, exist_ok = True)
    n_name = Path(unit_path,Path(fn).stem+'.pdf')
    if not os.path.exists(n_name):
        shutil.copyfile(fn,n_name)

生成体测报告打印明细表

In [ ]:
import os,sys,shutil
import json
import glob
from pathlib import Path
import openpyxl

fi_path = '/home/songyi/pdf-typescript/中安联合'

filename = 'data/中安联合.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)
fls = glob.glob(f'{fi_path}/*.pdf')
list1 = []
title = ['测试编号','姓名','性别','部门']
for fn in fls:
    list2 = []
    fi_name =Path(fn).stem.split('-')[0]    
    code = int(fi_name)
    sex = dict1[str(code)]['sex']
    unit = dict1[str(code)]['unit']
    list2 = [fi_name,Path(fn).stem.split('-')[1],sex,unit]
    
    list1.append(list2)

filename = 'data/中安联合体测报告明细表.xlsx'
wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(title)
for row in list1:
    sheet.append(row)
    
wb.save(filename) 
print('ok')
In [ ]:

体质检测数据管理

数据导入Mycrm

导入系统人员信息

In [ ]:
import json
import time
import csv

list1 = []
filename = 'data/person_134.csv'
with open(filename,'r',newline='') as csv_file:
    fl = csv.reader(csv_file,delimiter=',')
    header = next(fl)    
    for line in fl:
        #line = re.sub('[\r\n\f ]{1,}', '', line)
        list1.append(line)
#print(list1)
dict1 = {}
for result in list1:
    code = str(result[4])
    if int(result[1]) == 0:
        sex = '男'
    else:
        sex = '女'
    
    m_item = str(result[3])    
    dict1.setdefault(code,{})    
    dict1[code]['name'] = result[0]
    dict1[code]['sex'] = sex
    dict1[code]['birth'] = result[2]
filename = 'data/天津石化人员清单.json'
with open(filename,'w') as fl:
    json.dump(dict1, fl, ensure_ascii=False) 
print(len(dict1))    

导入测试项目item

In [ ]:
import json
import psycopg2
from psycopg2 import extras as ex

filename = '../item.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
data_list = []
for k, v in dict1.items():
    data_list.append((int(k),v['name'])) 
conn = psycopg2.connect(database="mycrm", user="postgres", password="songyi", host="localhost", port="5432")
cursor = conn.cursor()
sql = 'insert into shijiazhuang_item (id,name) values %s'
ex.execute_values(cursor, sql, data_list, page_size=10000)
#conn.commit()
cursor.close()
conn.close()
print('ok!')

导入一级部门

In [ ]:
import json
import psycopg2
from psycopg2 import extras as ex

conn = psycopg2.connect(database="mycrm", user="postgres", password="songyi", host="localhost", port="5432")
cursor = conn.cursor()
filename = 'data/result_石家庄.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)
unit = set()
for k, v in dict1.items():
    #if 'sub_unit' not in v.keys():
    #    print(k,v['name'])
    unit.add(v['unit'])
print(unit)    
i = 1
dict2 = {}
for item in unit:
    dict2[item] = i
    i+=1
data_list = []
for k,  v in dict2.items():
    data_list.append((v,k)) 
    
sql = 'insert into shijiazhuang_unit (id,name) values %s'
ex.execute_values(cursor, sql, data_list, page_size=10000)
#conn.commit()
cursor.close()
conn.close()
print('ok!')

导入二级部门

In [ ]:
import json
import psycopg2
from psycopg2 import extras as ex

conn = psycopg2.connect(database="mycrm", user="postgres", password="songyi", host="localhost", port="5432")
cursor = conn.cursor()
filename = 'data/天津石化人员名单.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)
unit = set()
for k, v in dict1.items():
    #if 'sub_unit' not in v.keys():
    #    print(k,v['name'])
    unit.add(v['unit'])
print(unit)    
i = 1
dict2 = {}
for item in unit:
    dict2[item] = i
    i+=1
data_list = []
dict3 = {}
for k,  v in dict1.items():
    dict3.setdefault(v['unit'],set())
    dict3[v['unit']].add(v['sub_unit'])
i = 1    
for k, v in dict3.items():
    unit_id = dict2[k]
    for item in v:
        data_list.append((i,item,unit_id))
        i+=1
sql = 'insert into tianjin_sub_unit (id,name,unit_id) values %s'
ex.execute_values(cursor, sql, data_list, page_size=10000)
#conn.commit()
cursor.close()
conn.close()
print('ok!')

生成部门JSON文件

In [ ]:
import json
import csv

dict1 = {}
filename = 'data/shijiazhuang_unit_20230517.csv'
with open(filename,'r',newline='') as csv_file:
    fl = csv.reader(csv_file,delimiter=',')
    header = next(fl)
    list1 = []
    for line in fl:
        #line = re.sub('[\r\n\f ]{1,}', '', line)
        list1.append({'id':int(line[0]),'name':line[1]})
dict1['unit'] = list1

filename = 'data/sub_unit_134.csv'
with open(filename,'r',newline='') as csv_file:
    fl = csv.reader(csv_file,delimiter=',')
    header = next(fl)
    list1 = []
    for line in fl:
        #line = re.sub('[\r\n\f ]{1,}', '', line)
        list1.append({'id':int(line[0]),'name':line[1],'unit_id':int(line[2])})
dict1['sub_unit'] = list1
print(dict1)

filename = 'data/天津石化部门.json'
with open(filename,'w') as fl:
    json.dump(dict1, fl, ensure_ascii=False) 
print(len(dict1))    
In [ ]:
import json
import csv

dict1 = {}
filename = 'data/shijiazhuang_unit_20230517.csv'
with open(filename,'r',newline='') as csv_file:
    fl = csv.reader(csv_file,delimiter=',')
    header = next(fl)
    list1 = []
    for line in fl:
        #line = re.sub('[\r\n\f ]{1,}', '', line)
        list1.append({'id':int(line[0]),'name':line[1]})
        dict1[int(line[0])] = line[1]


filename = 'data/石家庄石化部门.json'
with open(filename,'w') as fl:
    json.dump(dict1, fl, ensure_ascii=False) 
print(len(dict1))    

导入人员信息

In [ ]:
import json
import psycopg2
from psycopg2 import extras as ex

conn = psycopg2.connect(database="mycrm", user="postgres", password="songyi", host="localhost", port="5432")
cursor = conn.cursor()
filename = 'data/天津石化人员清单.json'
with open(filename,'r') as fl:
    person = json.load(fl)
    
filename = 'data/石家庄石化部门.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)

i = 1
dict2 = {}
for item in unit:
    dict2[item] = i
    i+=1
data_list = []
dict3 = {}
dict4 = {}
for k,  v in dict1.items():
    dict3.setdefault(v['unit'],set())
    dict3[v['unit']].add(v['sub_unit'])    
i = 1    
for k, v in dict3.items():
    unit_id = dict2[k]
    for item in v:
        data_list.append((i,item,unit_id))
        i+=1
for item in data_list:
    sub_id = item[0]
    dict4[sub_id] = {'name':item[1],'unit':item[2]}
dict5 = {}
for k, v in dict1.items():
    id_unit = dict2[v['unit']]
    sub_name = v['sub_unit']
    id_sub = 0
    for k1, v1 in dict4.items():
        if v1['name'] == sub_name and v1['unit'] == id_unit:
            id_sub = int(k1)
    if id_sub >0:
        dict5[k] = {'unit':id_unit,'sub_unit':id_sub}
    else:
        print(k,'not fund')
data_list = []
for k, v in dict5.items():
    id = int(k)
    name = person[k]['name']
    sex = person[k]['sex']
    birth = person[k]['birth']
    phone = ''
    note = ''
    unit = v['sub_unit']
    data_list.append((id,name,sex,birth,unit))
sql = 'insert into tianjin_person (id,name,sex,birth,unit_id) values %s'
ex.execute_values(cursor, sql, data_list, page_size=10000)
#conn.commit()
cursor.close()
conn.close()
print('ok!')   
    
In [ ]:
import json
import psycopg2
from psycopg2 import extras as ex

conn = psycopg2.connect(database="mycrm", user="postgres", password="songyi", host="localhost", port="5432")
cursor = conn.cursor()
    
filename = 'data/石家庄石化部门.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)
dict3 = {}
for k,v in dict1.items():
    dict3[v] = int(k)
filename = 'data/result_石家庄.json'
with open(filename,'r') as fl:
    dict2 = json.load(fl)
data_list = []
for k, v in dict2.items():
    id = int(k)
    name = dict2[k]['name']
    sex = dict2[k]['sex']
    birth = dict2[k]['birth']    
    unit = dict3[dict2[k]['unit']]
    data_list.append((id,name,sex,birth,unit))
sql = 'insert into shijiazhuang_person (id,name,sex,birth,unit_id) values %s'
ex.execute_values(cursor, sql, data_list, page_size=10000)
#conn.commit()
cursor.close()
conn.close()
print('ok!')   

导入测试成绩及得分

二级部门导入

In [ ]:
import json
import psycopg2
from psycopg2 import extras as ex

filename = '../item.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
dict2 = {}
for k, v in dict1.items():
    dict2[v['name']] = int(k)

filename = 'data/天津石化部门.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
unit = {}
for item in dict1['unit']:
    unit[item['name']] = item['id']

sub_unit = {}
for item in dict1['sub_unit']:
    sub_unit.setdefault(item['unit_id'],[])
    sub_unit[item['unit_id']].append({'id':item['id'],'name':item['name']})
    
filename = 'data/天津石化人员名单.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)
person = {}
for k, v in dict1.items():
    person[k] = {'unit':v['unit'],'sub_unit':v['sub_unit']}

    
conn = psycopg2.connect(database="mycrm", user="postgres", password="songyi", host="localhost", port="5432")
cursor = conn.cursor()
data_list = []
filename = 'data/result_天津.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
for k, v in dict1.items():
    for item in v.keys():
        if item in dict2.keys():
            item_id = dict2[item]
            if v[item]['得分'] == '\\N':
                score = None
            else:
                score = int(v[item]['得分'])
            unit_name = person[k]['unit']  
            sub_unit_name = person[k]['sub_unit']
            unit_id = unit[unit_name]
            for items in sub_unit[unit_id]:
                if items['name'] ==sub_unit_name:
                    sub_id = items['id'] 
            data_list.append((v[item]['成绩'],score,int(k),item_id,unit_id,sub_id))
         
sql = 'insert into tianjin_records (performance,score,avatar_id_id,item_id_id,unit_id_id,sub_unit_id_id) values %s'
ex.execute_values(cursor, sql, data_list, page_size=10000)
#conn.commit()
cursor.close()
conn.close()
print('ok!')           
    

一级部门导入

In [ ]:
import json
import psycopg2
from psycopg2 import extras as ex

filename = '../item.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
dict2 = {}
for k, v in dict1.items():
    dict2[v['name']] = int(k)

filename = 'data/石家庄石化部门.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)
dict3 = {}
for k,v in dict1.items():
    dict3[v] = int(k)
    

conn = psycopg2.connect(database="mycrm", user="postgres", password="songyi", host="localhost", port="5432")
cursor = conn.cursor()
data_list = []
filename = 'data/result_石家庄.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
for k, v in dict1.items():
    for item in v.keys():
        if item in dict2.keys():
            item_id = dict2[item]            
            if v[item]['得分'] == '':
                score = None
            else:
                score = int(v[item]['得分'])
            unit_name = v['unit']
            unit_id = dict3[unit_name]
            data_list.append((v[item]['成绩'],score,int(k),item_id,unit_id))
sql = 'insert into shijiazhuang_records (performance,score,avatar_id_id,item_id_id,unit_id_id) values %s'
ex.execute_values(cursor, sql, data_list, page_size=10000)
#conn.commit()
cursor.close()
conn.close()
print('ok!')
In [ ]:
import json
import psycopg2
from psycopg2 import extras as ex

filename = '../item.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
dict2 = {}
for k, v in dict1.items():
    dict2[v['name']] = int(k)

filename = 'data/天津石化部门.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
unit = {}
for item in dict1['unit']:
    unit[item['name']] = item['id']
print(unit)

体质测试综合报告数据分析

清理报告数据

In [35]:
import json
import openpyxl


filename = 'data/result_天津石化2024.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)

    
#items = ['身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']
items = {}
items['lung'] = '肺活量'
items['grip'] ='握力'
items['flexion'] ='坐位体前屈'
items['jump'] ='纵跳'
items['pushup'] ='俯卧撑'
items['balance'] ='单脚站立'
items['reaction'] ='选择反应时'
items['step'] ='台阶指数'
items['situp'] ='一分钟仰卧起坐'
items['bmi'] ='BMI'


list1 = []
#fiie_path ='./138/'
list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','bmi']
i=1
list2 = []
dict2 = {}
for  k, v in dict1.items():
    list1 = []
    mydata = {}
    
    id = str(k).rjust(8,"0")
    mydata['unit'] = v['unit']
    mydata['name'] = v['name']
    mydata['sex'] = v['sex']
    mydata['month'] = v['month']
    age = int(v['month']/12)
    if age <20:
        mydata['age'] = 20
    else:
        mydata['age'] = int(v['month']/12)
    
    mydata['fits'] = {}
    score = 0
    for item in list_item:
        if item in v.keys():
            if item in ['lung','pushup','step','situp']:
                mark = v[item]['成绩'].split()[0].split('.')[0]
            else:
                mark = v[item]['成绩'].split()[0]
            mydata['fits'][items[item]] = {'mark':mark,'score':v[item]['score']}
            score = score + v[item]['score']
    mydata['score'] = round(score/len(mydata['fits']),2)
    if len(mydata['fits']) >2:
        dict2[str(k)] = mydata
filename = f'data/data_天津石化2024.json'
with open(filename,'w') as fl:
    json.dump(dict2,fl , ensure_ascii=False) 
print(len(dict2))        
4059

计算平均成绩

In [36]:
nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]
filename = 'data/data_天津石化2024.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
i = 1
m = 0
f = 0
score = 0
t_score = 0
for k,v in dict1.items():
    if v['sex'] == '男':
        m = m +1
        score = score+v['score']
print(f'平均成绩:{round(score/m,4)}分,男性:{m}人')
t_score = t_score + score
score = 0
for k,v in dict1.items():
    if v['sex'] == '女':
        f = f +1
        score = score+v['score']
print(f'平均成绩:{round(score/f,4)}分,女性:{f}人')
t_score = t_score + score
print(f'平均成绩:{round(t_score/(f+m),4)}分,总体:{(f+m)}人')
平均成绩:2.4229分,男性:2879人
平均成绩:2.9036分,女性:1180人
平均成绩:2.5627分,总体:4059人

计算测试等级

In [37]:
import json

items = ['体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']

#filename = 'data/data_长炼医院.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
dict2 = {}
dict2['不合格'] = [0,255]
dict2['合格'] = [256,332]
dict2['良好'] = [333,367]
dict2['优秀'] = [368,500]

for k1, v1 in dict2.items():
    di = v1[0]
    gao = v1[1]
    i = 0    
    m = 0
    f = 0
    for k,v in dict1.items():
        if int(v['score']*100) in range(di,gao+1):
            dict1[k]['level'] = k1
            i+=1
            if v['sex'] == '男':
                m = m +1
            else:
                f = f+1
    print(f'{di}~{gao}分人数:{i}人,男性:{m}人,女性:{f}人')
print(len(dict1))
with open(filename,'w') as fl:
    json.dump(dict1, fl) 
print('ok')
0~255分人数:1925人,男性:1627人,女性:298人
256~332分人数:1582人,男性:1007人,女性:575人
333~367分人数:392人,男性:192人,女性:200人
368~500分人数:160人,男性:53人,女性:107人
4059
ok

计算各年龄段测试等级(女)

In [38]:
nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]

with open(filename,'r') as fl:
    dict1 = json.load(fl) 
dict2 = {}
dict2['不合格'] = [0,255]
dict2['合格'] = [256,332]
dict2['良好'] = [333,367]
dict2['优秀'] = [368,500]
dict3 = {}
for item in nld:
    di = item[0]
    gao = item[1]
    age = f'{di}-{gao}'
    dict3.setdefault(age,{})
    i = 0    
    m = 0
    f = 0
    for k,v in dict1.items():
        if v['age'] in range(di,gao+1):              
            dict3[age].setdefault(v['level'],0)
            if v['sex'] == '女':
                dict3[age][v['level']] = dict3[age][v['level']]+1
            
for k, v in dict3.items():
    print(k,v)
20-24 {'合格': 105, '不合格': 70, '良好': 20, '优秀': 4}
25-29 {'合格': 70, '不合格': 44, '良好': 18, '优秀': 4}
30-34 {'合格': 26, '不合格': 15, '优秀': 7, '良好': 11}
35-39 {'不合格': 28, '合格': 63, '良好': 26, '优秀': 16}
40-44 {'不合格': 23, '良好': 24, '合格': 47, '优秀': 9}
45-49 {'合格': 156, '不合格': 73, '优秀': 30, '良好': 67}
50-54 {'合格': 108, '不合格': 45, '良好': 34, '优秀': 37}
55-80 {'良好': 0, '不合格': 0, '合格': 0, '优秀': 0}

计算各年龄段测试等级(男)

In [39]:
nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]

with open(filename,'r') as fl:
    dict1 = json.load(fl) 
dict2 = {}
dict2['不合格'] = [0,255]
dict2['合格'] = [256,332]
dict2['良好'] = [333,367]
dict2['优秀'] = [368,500]
dict3 = {}
for item in nld:
    di = item[0]
    gao = item[1]
    age = f'{di}-{gao}'
    dict3.setdefault(age,{})
    i = 0    
    m = 0
    f = 0
    for k,v in dict1.items():
        if v['age'] in range(di,gao+1):            
            dict3[age].setdefault(v['level'],0)
            if v['sex'] == '男':
                dict3[age][v['level']] = dict3[age][v['level']]+1
            
for k, v in dict3.items():
    print(k,v)
20-24 {'合格': 148, '不合格': 264, '良好': 18, '优秀': 4}
25-29 {'合格': 90, '不合格': 181, '良好': 19, '优秀': 3}
30-34 {'合格': 34, '不合格': 68, '优秀': 1, '良好': 6}
35-39 {'不合格': 137, '合格': 95, '良好': 23, '优秀': 5}
40-44 {'不合格': 76, '良好': 24, '合格': 78, '优秀': 7}
45-49 {'合格': 112, '不合格': 185, '优秀': 6, '良好': 24}
50-54 {'合格': 266, '不合格': 407, '良好': 49, '优秀': 19}
55-80 {'良好': 29, '不合格': 309, '合格': 184, '优秀': 8}

根据年龄汇总人员信息及成绩

In [40]:
nld = [[16,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,69]]

with open(filename,'r') as fl:
    dict1 = json.load(fl) 
for item in nld:
    di = item[0]
    gao = item[1]
    i = 0
    score = 0
    m = 0
    f = 0
    for k,v in dict1.items():
        if v['age'] in range(di,gao+1):
            score = score+v['score']
            i+=1
            if v['sex'] == '男':
                m = m +1
    if i ==0:
        print(f'{di}~{gao}岁平均成绩:0分,人数:0人,男性:{m}人')
    else:
        print(f'{di}~{gao}岁平均成绩:{round(score/i,2)}分,人数:{i}人,男性:{m}人')
16~24岁平均成绩:2.46分,人数:633人,男性:434人
25~29岁平均成绩:2.48分,人数:429人,男性:293人
30~34岁平均成绩:2.59分,人数:168人,男性:109人
35~39岁平均成绩:2.66分,人数:393人,男性:260人
40~44岁平均成绩:2.75分,人数:288人,男性:185人
45~49岁平均成绩:2.68分,人数:653人,男性:327人
50~54岁平均成绩:2.57分,人数:965人,男性:741人
55~69岁平均成绩:2.4分,人数:530人,男性:530人

根据年龄汇总人员信息及成绩(男)

In [41]:
import json

nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]

with open(filename,'r') as fl:
    dict1 = json.load(fl) 
for item in nld:
    di = item[0]
    gao = item[1]
    i = 0
    score = 0
    m = 0
    f = 0
    for k,v in dict1.items():
        if v['age'] in range(di,gao+1) and v['sex'] == '男':
            score = score+v['score']
            i+=1
    if i ==0:
        print(f'{di}~{gao}岁平均成绩:0分,人数:{i}人') 
    else:
        print(f'{di}~{gao}岁平均成绩:{round(score/i,2)}分,人数:{i}人')
20~24岁平均成绩:2.36分,人数:434人
25~29岁平均成绩:2.36分,人数:293人
30~34岁平均成绩:2.38分,人数:109人
35~39岁平均成绩:2.51分,人数:260人
40~44岁平均成绩:2.63分,人数:185人
45~49岁平均成绩:2.41分,人数:327人
50~54岁平均成绩:2.43分,人数:741人
55~80岁平均成绩:2.4分,人数:530人

根据年龄汇总人员信息及成绩(女)

In [42]:
nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]

with open(filename,'r') as fl:
    dict1 = json.load(fl) 
for item in nld:
    di = item[0]
    gao = item[1]
    i = 0
    score = 0
    m = 0
    f = 0
    for k,v in dict1.items():
        if v['age'] in range(di,gao+1) and v['sex'] == '女':
            score = score+v['score']
            i+=1
    if i ==0:
        print(f'{di}~{gao}岁平均成绩:0分,人数:{i}人') 
    else:
        print(f'{di}~{gao}岁平均成绩:{round(score/i,2)}分,人数:{i}人')
20~24岁平均成绩:2.69分,人数:199人
25~29岁平均成绩:2.74分,人数:136人
30~34岁平均成绩:2.96分,人数:59人
35~39岁平均成绩:2.97分,人数:133人
40~44岁平均成绩:2.96分,人数:103人
45~49岁平均成绩:2.96分,人数:326人
50~54岁平均成绩:3.03分,人数:224人
55~80岁平均成绩:0分,人数:0人

计算各项目成绩

In [43]:
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
items = ['BMI','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']
for item in items:
    score = 0
    n = 0
    for k, v in dict1.items():        
        if item in v['fits'].keys():
            n = n + 1
            score =score + int(v['fits'][item]['score'])
    print(item,round(score/n,2),n)
BMI 3.4 4044
肺活量 3.09 3995
握力 1.3 4005
坐位体前屈 2.97 3592
纵跳 1.98 3690
俯卧撑 2.22 2160
一分钟仰卧起坐 4.02 771
单脚站立 2.44 3732
选择反应时 2.73 4030
台阶指数 2.76 1547

按照部门计算平均成绩

In [44]:
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
depart = []
for k, v in dict1.items():
    if v['unit'] not in depart:
        depart.append(v['unit'])

for item in depart:
    score = 0
    n = 0
    for k, v in dict1.items():
        if item == v['unit']:
            score = score + v['score']
            n = n +1 
    print(item,round(score/n,2),n)
炼油部 2.48 1131
行政事务中心 2.55 17
烯烃部 2.54 292
党委党校(培训中心) 2.84 29
原油储运部 2.52 198
公司机关 2.64 82
研究院 2.82 89
消防支队 2.61 77
热电部 2.61 366
信息档案管理中心 2.87 54
水务部 2.55 303
化工部 2.57 479
装备研究院 2.92 39
化验计量部 2.65 339
电仪部 2.49 244
物资采购中心 2.79 51
聚醚部 2.76 46
南港烯烃部 2.49 54
运输销售部 2.54 169

按照部门计算平均成绩(女性)

In [48]:
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
depart = []
for k, v in dict1.items():
    if v['unit'] not in depart:
        depart.append(v['unit'])

for item in depart:
    score = 0
    n = 0
    for k, v in dict1.items():
        if item == v['unit'] and v['sex'] == '男':
            score = score + v['score']
            n = n +1 
    if n>0:
        print(item,round(score/n,2),n)
    else:
        print(item,0,n)
炼油部 2.37 866
行政事务中心 2.48 11
烯烃部 2.38 208
党委党校(培训中心) 2.74 14
原油储运部 2.41 148
公司机关 2.43 45
研究院 2.67 60
消防支队 2.54 64
热电部 2.53 306
信息档案管理中心 2.8 24
水务部 2.4 218
化工部 2.42 327
装备研究院 2.71 21
化验计量部 2.35 149
电仪部 2.4 193
物资采购中心 2.45 23
聚醚部 2.4 27
南港烯烃部 2.4 37
运输销售部 2.43 138

计算部门等级

In [47]:
import json

items = ['优秀','良好','合格','不合格'] 

with open(filename,'r') as fl:
    dict1 = json.load(fl)


dict3 = {}
for k, v in dict1.items():
    unit = v['unit']
    dict3.setdefault(unit,{})
    for item in items:
        dict3[unit].setdefault(item,0)

for k, v in dict1.items():
    unit = v['unit']
    #dict3.setdefault(unit,{})
    #for item in items:
    #dict3[unit].setdefault(v['level'],0)
    dict3[unit][v['level']] +=1
for k, v in dict3.items():
    print(k,v['优秀'],v['良好'],v['合格'],v['不合格'])
炼油部 27 92 395 617
行政事务中心 1 2 6 8
烯烃部 13 29 107 143
党委党校(培训中心) 3 4 13 9
原油储运部 5 14 78 101
公司机关 2 11 34 35
研究院 7 15 39 28
消防支队 2 10 29 36
热电部 23 47 136 160
信息档案管理中心 1 11 28 14
水务部 15 22 124 142
化工部 20 42 210 207
装备研究院 4 5 19 11
化验计量部 15 36 157 131
电仪部 3 18 91 132
物资采购中心 5 11 16 19
聚醚部 6 5 14 21
南港烯烃部 1 4 20 29
运输销售部 7 14 66 82

计算部门成绩

In [49]:
import json

items = ['BMI','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数'] 
filename = 'data/data_天津石化2024.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl)

filename = 'data/天津石化人员2024.json'
with open(filename,'r') as fl:
    dict2 = json.load(fl)
dict3 = {}

for k, v in dict1.items():
    unit = v['unit']
    dict3.setdefault(unit,{})
    for item in items:
        dict3[unit].setdefault(item,{})
        dict3[unit][item].setdefault('score',0)
        dict3[unit][item].setdefault('count',0)
    for k1,v1 in v['fits'].items():
        if k1 in items:
            dict3[unit][k1]['score']+=v1['score']
            dict3[unit][k1]['count']+=1

for k, v in dict3.items():
    print(k)
    for k1, v1 in v.items():
        print(k1,v1['score'],v1['count'])
炼油部
BMI 3704 1128
肺活量 3450 1111
握力 1463 1115
坐位体前屈 2890 1023
纵跳 2119 1040
俯卧撑 1317 686
一分钟仰卧起坐 759 196
单脚站立 2205 1035
选择反应时 3087 1123
台阶指数 1333 482
行政事务中心
BMI 57 17
肺活量 41 16
握力 22 16
坐位体前屈 49 17
纵跳 34 17
俯卧撑 15 9
一分钟仰卧起坐 28 6
单脚站立 35 15
选择反应时 43 17
台阶指数 39 13
烯烃部
BMI 1000 290
肺活量 875 287
握力 387 290
坐位体前屈 737 251
纵跳 508 250
俯卧撑 320 153
一分钟仰卧起坐 215 51
单脚站立 593 271
选择反应时 819 291
台阶指数 312 110
党委党校(培训中心)
BMI 111 29
肺活量 90 26
握力 31 28
坐位体前屈 92 27
纵跳 65 27
俯卧撑 15 10
一分钟仰卧起坐 51 13
单脚站立 74 26
选择反应时 80 28
台阶指数 18 5
原油储运部
BMI 656 198
肺活量 594 196
握力 252 197
坐位体前屈 491 171
纵跳 318 181
俯卧撑 243 108
一分钟仰卧起坐 152 41
单脚站立 462 185
选择反应时 552 197
台阶指数 203 78
公司机关
BMI 314 82
肺活量 262 81
握力 77 82
坐位体前屈 215 74
纵跳 164 80
俯卧撑 91 36
一分钟仰卧起坐 114 28
单脚站立 208 79
选择反应时 210 82
台阶指数 146 53
研究院
BMI 333 89
肺活量 289 86
握力 126 87
坐位体前屈 262 82
纵跳 209 83
俯卧撑 128 53
一分钟仰卧起坐 83 21
单脚站立 223 86
选择反应时 253 89
台阶指数 102 34
消防支队
BMI 273 77
肺活量 212 77
握力 113 77
坐位体前屈 216 70
纵跳 106 73
俯卧撑 149 50
一分钟仰卧起坐 37 9
单脚站立 177 65
选择反应时 234 75
台阶指数 70 28
热电部
BMI 1184 362
肺活量 1148 364
握力 506 361
坐位体前屈 948 312
纵跳 714 330
俯卧撑 551 219
一分钟仰卧起坐 164 40
单脚站立 858 335
选择反应时 1012 366
台阶指数 432 152
信息档案管理中心
BMI 218 54
肺活量 182 53
握力 62 54
坐位体前屈 170 49
纵跳 107 52
俯卧撑 60 23
一分钟仰卧起坐 85 21
单脚站立 155 54
选择反应时 155 54
台阶指数 83 30
水务部
BMI 1017 303
肺活量 883 296
握力 378 298
坐位体前屈 751 256
纵跳 547 276
俯卧撑 383 153
一分钟仰卧起坐 250 61
单脚站立 679 279
选择反应时 822 300
台阶指数 260 99
化工部
BMI 1601 477
肺活量 1437 473
握力 568 468
坐位体前屈 1311 423
纵跳 867 440
俯卧撑 572 249
一分钟仰卧起坐 358 86
单脚站立 1119 443
选择反应时 1271 473
台阶指数 491 166
装备研究院
BMI 167 39
肺活量 124 38
握力 45 38
坐位体前屈 115 38
纵跳 94 36
俯卧撑 39 17
一分钟仰卧起坐 47 11
单脚站立 121 38
选择反应时 102 39
台阶指数 34 12
化验计量部
BMI 1231 339
肺活量 1022 333
握力 435 334
坐位体前屈 901 295
纵跳 519 290
俯卧撑 177 87
一分钟仰卧起坐 329 84
单脚站立 828 299
选择反应时 919 333
台阶指数 228 86
电仪部
BMI 793 243
肺活量 762 240
握力 312 244
坐位体前屈 667 232
纵跳 407 230
俯卧撑 358 153
一分钟仰卧起坐 136 36
单脚站立 617 237
选择反应时 590 244
台阶指数 281 113
物资采购中心
BMI 184 50
肺活量 150 51
握力 62 51
坐位体前屈 128 39
纵跳 101 43
俯卧撑 36 15
一分钟仰卧起坐 90 20
单脚站立 139 43
选择反应时 143 51
台阶指数 49 16
聚醚部
BMI 159 45
肺活量 163 46
握力 67 43
坐位体前屈 125 41
纵跳 84 41
俯卧撑 53 21
一分钟仰卧起坐 61 13
单脚站立 121 44
选择反应时 122 46
台阶指数 49 19
南港烯烃部
BMI 170 54
肺活量 170 54
握力 72 54
坐位体前屈 163 54
纵跳 117 53
俯卧撑 78 32
一分钟仰卧起坐 42 10
单脚站立 124 54
选择反应时 122 54
台阶指数 34 18
运输销售部
BMI 590 168
肺活量 475 167
握力 242 168
坐位体前屈 444 138
纵跳 226 148
俯卧撑 214 86
一分钟仰卧起坐 100 24
单脚站立 353 144
选择反应时 463 168
台阶指数 98 33

问卷数据处理分析

常用参数及自定义函数

In [ ]:
import json

questions = [
  [1],
  [-1, 2],
  [-1, 2],
  [-1, 8],
  [-1, 3],
  [1],
  [-1],
  [-1, 7],
  [2],
  [2],
  [2],
  [2, 3],
  [2],
  [2],
  [3],
  [3],
  [3],
  [3],
  [3],
  [4],
  [4],
  [4],
  [4],
  [4],
  [4],
  [4],
  [4],
  [5],
  [5],
  [5],
  [5],
  [5],
  [5],
  [5],
  [5],
  [6],
  [6],
  [6],
  [6],
  [6],
  [6],
  [7],
  [7],
  [7],
  [7],
  [7],
  [7],
  [8],
  [8],
  [8],
  [8],
  [8],
  [8],
  [9],
  [9],
  [9],
  [9],
  [9],
  [9],
  [9]
]

kinds = [
  '平和',
  '气虚',
  '阳虚',
  '阴虚',
  '痰湿',
  '湿热',
  '血瘀',
  '气郁',
  '特禀'
]

def tcm_calc(arr):
  qa = [8, 8, 7, 8, 8, 6, 7, 7, 7]
  # 成绩数组
  s = [0] * 9
  # 遍历五进制
  for i in range(len(questions)):
    m = arr[i] - 1
    for v in questions[i]:
      if v < 0:
        s[-v - 1] += 4 - m
      else:
        s[v - 1] += m
  return [int((v / qa[i]) * 25) for i, v in enumerate(s)]

def tcm_kind(score):
  kind = 0
  near = False
  max_kind = 0
  max_score = 0
  for i in range(1, 9):
    if score[i] > max_score:
      max_kind = i
      max_score = score[i]
  if score[0] >= 60 and max_score < 40:
    if max_score >= 30:
      near = True
      kind = max_kind
  else:
    kind = max_kind
  return {
    "kind": kind,
    "near": near
  }
list2 = ['成就感','愉快心境','放松程度','压力应对','体力充沛','情感充沛度']
list3 = [[5,7],[7,4],[7,4],[7,4],[8,1],[6,1]] 
list4 = ['颈椎','胸椎','腰椎','骶尾椎']
list5 = [[0,10,10],[10,17,7],[17,24,6],[24,26,2]]

计算中医体质

In [ ]:
import openpyxl

filename = 'data/result_东营工程设计院2024_all.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
i = 1
list2 = []
for k, v in dict1.items():
    if 'tcm' in v.keys():
        list1 = []
        tcm =v['tcm']
        for item in tcm:
            list1.append(item)
        score = tcm_calc(list1)

        result = tcm_kind(score)
        kind = result['kind']
        near = result['near']
        #print(i,k,kinds[kind], near, score)
        #i+=1
        list3 = []
        list3.append(k)
        list3.append(kinds[kind])
        list3.append(near)
        for item in score:
            list3.append(item)
        list2.append(list3)
print(list2)
filename = 'data/东营工程设计院中医情况明细表.xlsx'
wb = openpyxl.Workbook()
sheet = wb.active

for row in list2:
    sheet.append(row)
    
wb.save(filename)
print('ok')       

计算心理

In [ ]:
list2 = ['成就感','愉快心境','放松程度','压力应对','体力充沛','情感充沛度']
list3 = [[5,7],[7,4],[7,4],[7,4],[8,1],[6,1]]
qb = [
      1, 1, 1, 1, 1,
      4, 3, 2, 3, 2, 4, 3,
      4, 3, 2, 4, 4, 2, 4,
      3, 2, 2, 4, 3, 3, 2,
      5, 5, 5, 5, 5, 5, 5, 5,
      6, 6, 6, 6, 6, 6
    ]
filename = 'data/result_青海all_2.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
for k, v in dict1.items():
    if 'psy' in v.keys():
        psy=v['psy']
        for i in range(26,40):
            new_valve = psy[i]-1
            psy[i] = new_valve
        dict3 = {}
        
        i = 0
        for item in qb:
            dict3.setdefault(item,0)
            dict3[item] +=psy[i]
            i+=1
        print(dict3)
        print(k)
        for i in range(0,6):
            score = int(dict3[i+1]/list3[i][0]/list3[i][1]*100)
            print(list2[i],score)

计算脊柱

In [ ]:
list4 = ['颈椎','胸椎','腰椎','骶尾椎']
list5 = [[0,10,10],[10,17,7],[17,24,6],[24,26,2]]
filename = 'data/result_青海all_2.json'
with open(filename,'r') as fl:
    dict1 = json.load(fl) 
for k, v in dict1.items():
    if 'spine' in v.keys():
        spine = v['spine']
        for i in range(0,4):
            score = 0
            for ii in range(list5[i][0],list5[i][1]):
                score+= spine[ii]
            print(k,list4[i],int(score/list5[i][2]*100)-100)