机器学习 | 预备内容 | Pandas数据分析库(实战)
824
2023.07.19
2023.07.19
发布于 未知归属地

一. 体测数据处理和分析:
1.数据描述:
学生体测成绩保存在 18级高一体测成绩汇总.xls 中,部分数据展示如下:
image.png
体测成绩评分保存在 体侧成绩评分表.xls 中,部分数据展示如下:
image.png
2.求所有学生体测分数。
答案:

# 1. 观察表数据发现有些数据需要预处理:
# 1)将成绩表中 男1000米跑,评分表中 男1000米跑成绩,女800米跑成绩:str -> float,才能进行分组计算;
# 2)评分表中 男引体成绩 有空值,需转换为前后两项的平均值;
# 3)所有数值类型的值,都要转换为float类型的值。
# 2. 通过数据分箱计算所有学生体测分数。

#coding=utf8

import math
import numpy as np
import pandas as pd

MAX = 1000000000
MIN = 0

def time2float(x): 
	temp = str(x).split("'")
	res = float(temp[0])
	if len(temp) > 1:
		if temp[1][-1] == '"':
			temp[1] = temp[1][:-1]
		res += float(temp[1]) / 60.0
	return np.round(res, 2)

def format_score(s):
	for i, item in enumerate(s):
		if math.isnan(item):
			s.iat[i] = (s[i - 1] + s[i + 1]) / 2.0
	return s

def calculate_score(df, score_std, start, end):
	columns = df.columns.tolist()
	for item in columns[start:end]:
		#print(i, item)
		if '跑' in item:
			data = [MIN]
			labels = score_std[item]['分数']
			right = True
		else:
			data = [MAX]
			labels = score_std[item]['分数'].sort_values()
			right = False
		result = pd.concat([pd.Series(data = data), score_std[item]['成绩']], axis = 0).sort_values()
		score = pd.cut(df[item], bins = result, labels = labels, right = right)
		df.insert(df.columns.tolist().index(item) + 1, item + '成绩', score)
	df.replace(np.nan, 0, inplace = True)
	print(df.head(n = 10))

if __name__ == '__main__':
	# 数据加载
	score_male = pd.read_excel('./data/18级高一体测成绩汇总.xls')
	score_female = pd.read_excel('./data/18级高一体测成绩汇总.xls', sheet_name = 1)
	score_std = pd.read_excel('./data/体侧成绩评分表.xls',header = [0,1])

	# 数据预处理
	score_male['男1000米跑'] = score_male['男1000米跑'].apply(time2float)
	score_male.iloc[:, 3:] = score_male.iloc[:, 3:].astype(float).round(2)
	score_female.iloc[:, 3:] = score_female.iloc[:, 3:].astype(float).round(2)	
	score_std.loc[:, ('男1000米跑', '成绩')] = score_std['男1000米跑']['成绩'].apply(time2float)
	score_std.loc[:, ('女800米跑', '成绩')] =  score_std['女800米跑']['成绩'].apply(time2float)
	score_std.loc[:, ('男引体', '成绩')] = format_score(score_std['男引体']['成绩'])
	#print(score_std)

	calculate_score(score_male, score_std, 2, -3)
	calculate_score(score_female, score_std, 2, -3)

运行结果展示:
image.png

评论 (0)