一、大作业四
下面给出了3090显卡的性能测评日志结果,每一条日志有如下结构:
Benchmarking #2# #4# precision type #1#
#1# model average #2# time : #3# ms
其中#1#代表的是模型名称,#2#的值为train(ing)或inference,表示训练状态或推断状态,#3#表示耗时,#4#表示精度,其中包含了float, half, double三种类型,下面是一个具体的例子:
Benchmarking Inference float precision type resnet50
resnet50 model average inference time : 13.426570892333984 ms
请把日志结果进行整理,变换成如下状态,model_i用相应模型名称填充,按照字母顺序排序,数值保留三位小数:
Train_half Train_float Train_double Inference_half Inference_float Inference_double
model_1 0.954 0.901 0.357 0.281 0.978 1.130
model_2 0.360 0.794 0.011 1.083 1.137 0.394
… … … … … … …
解答
# 大作业4
import pandas as pd
import re
import numpy as np
# 1 读取数据,只提取含有'Benchmarking'的两行
data = []
with open('../joyful-pandas-master/data/benchmark.txt', 'r', encoding='utf8') as f:
temp = 1
while temp:
temp = f.readline().strip()
if 'Benchmarking' in temp:
data.append(temp + ' ' + f.readline().strip())
# 2 通过str对象,使用子组的方法,利用正则匹配提取信息
pat = 'Benchmarking (?P<state>\S+) (?P<ACC>\S+) precision type (?P<model>\S+) (?P<model1>\S+) model average (?P<state1>\S+) time : (?P<time>\S+) ms'
data = pd.DataFrame(data=data, columns=['col'])
data_temp = data.col.str.extract(pat)
data_temp.head()
# 去除重复的列
data_temp = data_temp.drop(labels=['model1', 'state1'], axis=1)
# 修改state列的值
data_temp.state[data_temp.state == 'Training'] = 'Train'
# 将时间值格式化为保留3位小数
data_temp.time = data_temp.time.apply(lambda x: '%.3f'%eval(x))
data_temp.head()
# 使用pivot方法将长表转化为宽表
data = data_temp.copy()
data_ed2 = data.pivot(index='model',
columns = ['state', 'ACC'],
values = 'time')
data_ed2.head()
# 通过对索引的map方法,将双层列索引压缩为一层索引
data_ed2.columns = data_ed2.columns.map(lambda x: '_'.join(x))
data_ed2.head()
二、大作业五
【任务五】水压站点的特征工程
df1和df2中分别给出了18年和19年各个站点的数据,其中列中的H0至H23分别代表当天0点至23点;df3中记录了18-19年的每日该地区的天气情况,请完成如下的任务:
import pandas as pd
import numpy as np
df1 = pd.read_csv(‘yali18.csv’)
df2 = pd.read_csv(‘yali19.csv’)
df3 = pd.read_csv(‘qx1819.csv’)
通过df1和df2构造df,把时间设为索引,第一列为站点编号,第二列为对应时刻的压力大小,排列方式如下(压力数值请用正确的值替换):
站点 压力
2018-01-01 00:00:00 1 1.0 2018-01-01 00:00:00 2 1.0 … … … 2018-01-01 00:00:00 30 1.0 2018-01-01 01:00:00 1 1.0 2018-01-01 01:00:00 2 1.0 … … … 2019-12-31 23:00:00 30 1.0
在上一问构造的df基础上,构造下面的特征序列或DataFrame,并把它们逐个拼接到df的右侧
当天最高温、最低温和它们的温差
当天是否有沙暴、是否有雾、是否有雨、是否有雪、是否为晴天
选择一种合适的方法度量雨量/下雪量的大小(构造两个序列分别表示二者大小)
限制只用4列,对风向进行0-1编码(只考虑风向,不考虑大小)
对df的水压一列构造如下时序特征:
当前时刻该站点水压与本月的相同整点时间该站点水压均值的差,例如当前时刻为2018-05-20 17:00:00,那么对应需要减去的值为当前月所有17:00:00时间点水压值的均值
当前时刻所在周的周末该站点水压均值与工作日水压均值之差
当前时刻向前7日内,该站点水压的均值、标准差、0.95分位数、下雨天数与下雪天数的总和
当前时刻向前7日内,该站点同一整点时间水压的均值、标准差、0.95分位数
当前时刻所在日的该站点水压最高值与最低值出现时刻的时间差
# 大作业5
import pandas as pd
import numpy as np
df1 = pd.read_csv('../joyful-pandas-master/data/yali18.csv')
df2 = pd.read_csv('../joyful-pandas-master/data/yali19.csv')
df3 = pd.read_csv('../joyful-pandas-master/data/qx1819.csv')
def trans(df):
df_temp = df.melt(id_vars=[ 'Time' ,'MeasName'], var_name='hour', value_vars=df1.columns[2:], value_name= 'press')
df_temp.MeasName = df_temp.MeasName.str.extract(r'\D+(\d+)')
df1_2 = df_temp.set_index(['Time', 'hour'])
index = df1_2.index.map(lambda x: '_'.join(x))
# 创建时间戳
df1_2.index = pd.to_datetime(index, format='%Y-%m-%d_H%H')
df1_2 = df1_2.rename_axis(index='time')
df1_2.MeasName = df1_2.MeasName.apply(lambda x: eval(x))
df1_3 = df1_2.reset_index().sort_values(['time', 'MeasName'],ascending=[True, True])#.set_index('time')
df1_3 = df1_3.set_index('time')
df1_3.columns = ['站点', '压力']
df1_3 = df1_3.rename_axis(index='')
return df1_3
# 处理并连接df1与df2
df11 = trans(df1)
df22 = trans(df2)
df12 = pd.concat([df11,df22])
df12
# 当天最高温、最低温和它们的温差
#df3_1 = df3['气温'].str.extract(r'(?P<最高温>[^~]+)~(?P<最低温>[^~]+)') 这种方法提取的数据,没办法比较大小和运算。干脆直接提取数值
df3_1 = df3['气温'].str.extract(r'(?P<最高温>-?\d+)[^-]+(?P<最低温>-?\d+).+')
wencha = df3_1['最高温'].astype(np.float64) - df3_1['最低温'].astype(np.float64)
# 由于有的高温和低温数据是反的。因此将温差为负值的布尔结果作为索引,交换值,并重新赋值
high = df3_1['最低温'][wencha<0]
low = df3_1['最高温'][wencha<0]
df3_1['最低温'][wencha<0] = low
df3_1['最高温'][wencha<0] = high
df3_1['温差'] = (df3_1['最高温'].astype(np.float64) - df3_1['最低温'].astype(np.float64))
df3_2 = df3.join(df3_1)
df3_2
# 当天是否有沙暴、是否有雾、是否有雨、是否有雪、是否为晴天
df3_2['是否有沙暴'] = df3_2['天气'].str.contains('沙').astype(int)
df3_2['是否有雾'] = df3_2['天气'].str.contains('雾').astype(int)
df3_2['是否有雨'] = df3_2['天气'].str.contains('雨').astype(int)
df3_2['是否有雪'] = df3_2['天气'].str.contains('雪').astype(int)
df3_2['是否晴天'] = df3_2['天气'].str.contains('晴').astype(int)
# 限制只用4列,对风向进行0-1编码(只考虑风向,不考虑大小)
df3_2['东风'] = df3_2['风向'].str.contains('东').astype(int)
df3_2['西风'] = df3_2['风向'].str.contains('西').astype(int)
df3_2['南风'] = df3_2['风向'].str.contains('南').astype(int)
df3_2['北风'] = df3_2['风向'].str.contains('北').astype(int)
df3_2 = df3_2.drop(['天气', '气温', '风向'], axis=1)
df3_2['日期'] = pd.to_datetime(df3_2['日期'])
df3_2
# 直接merge连接df12与df3_2,同一天其他23个小时会显示nan,因此需要把原先的精确到小时的时间转化为日期
# 提取日期时间
newdate = df12.reset_index()['']
# 提取日期值,并获取具体值
newdate = newdate.dt.date.values
# 将具体值重新转化为时序对象
df12['date'] = pd.to_datetime(newdate)
# 连接成功
df_res = df12.reset_index().merge(df3_2, left_on='date', right_on='日期', how='left').drop('date', axis=1)
df_res