【任务一】显卡日志
下面给出了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用相应模型名称填充,按照字母顺序排序,数值保留三位小数:

step1: 查看原始文档:
df=pd.read_table('benchmark.txt', header=None)
df.head(15)

可以看到原始数据中从第10行开始才是正式的数据,可以把前面10行删除
df_new = df.iloc[10: -2]
df_new.head()
结果为:

df_new.shape
>>>(384, 1)
step2: 思考一下,从上面的数据可以看到每两行代码一次记录,共有384/2 = 191条。
没两条的数据和下面的类似:
Benchmarking Training float precision type mnasnet0_5
mnasnet0_5 model average train time : 28.527636528015137 ms
其中,需要从第一行中提取 Training(或者为interence),float(或者为half/double), 并且要按照要求拼接成train_float形式。从第二行中提却模型名称mnasnet0_5, 以及时间。
因为这些关键字的位置固定,考虑使用一个函数来完成。
- 这个函数接收一个行号作为参数,然后处理该行和下面一行的数据(i = 0, 2 , 4...382)
- 从这两行中提取需要的内容,返回
def get_info(i):
first_row = df_new.iloc[i, 0]
res1 = first_row.split(' ')
test_type = res1[1]
precision_type = res1[2]
precision = '_'.join([test_type,precision_type])
second_row = df_new.iloc[i+1, 0]
res2 = second_row.split(' ')
name = res2[0]
test_time = res2[-2]
return precision, name, test_time
下面测试一下:
get_info(0)
>>>('Training_float', 'mnasnet0_5', '28.527636528015137')
get_info(22)
>>>
('Training_float', 'wide_resnet50_2', '64.75635051727295')
OK, 可以完美运行并提却所需要的内容
step3: 下面考虑批量化作业,又到了我们最擅长的使用循环进行办公自动化的内容了。
设置i = range(0, 383, 2)并新建一个DataFrame。DataFrame的取值从get_info函数返回值中获取
res_type = []
res_mold = []
res_time = []
for i in range(0,383, 2):
res_type.append(get_info(i)[0])
res_mold.append(get_info(i)[1])
res_time.append(get_info(i)[2])
print(res_type[:5])
print(res_mold[:5])
print(res_time[:5])
>>>
['Training_float', 'Training_float', 'Training_float', 'Training_float', 'Training_float']
['mnasnet0_5', 'mnasnet0_75', 'mnasnet1_0', 'mnasnet1_3', 'resnet18']
['28.527636528015137', '34.10548686981201', '34.31377410888672', '35.556888580322266', '18.660082817077637']
In [38]:
将这些值赋给新建的dataframe即可
res = pd.DataFrame()
res['type'] = pd.Series(res_type)
res['time'] = pd.Series(res_time)
res['mold'] = pd.Series(res_mold)
res.head(10)
结果如下:

至此,数据提取工作结束,下面考虑变形问题
- 先将time设置成数值形式,并保留3位小数
- 使用pivot_table搞定
res.time=pd.to_numeric(res.time, errors='coerce').round(3)
res.pivot_table(index = 'mold', columns = 'type', values = 'time')
结果如下:

完美搞定!
【任务二】水压站点的特征工程
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')
问题1:
通过df1和df2构造df,把时间设为索引,第一列为站点编号,第二列为对应时刻的压力大小,排列方式如下(压力数值请用正确的值替换):

step1: 变形,将所有时间放到一列
time_list=['H'+str(i) for i in range(24)]
df1=df1.melt(id_vars =['Time','MeasName'],
value_vars =time_list,var_name = 'H',
value_name = '压力')
df1

step2: 格式调整,包括
- 将MeasName字段修改为站点,同时值中删除”站点‘字符
- Measure_time中的H干掉
- 设置时间为index
df1.MeasName=df1.MeasName.str.replace('站点','')
df1.Measure_time=df1.Measure_time.str.replace('H','')
df1.Time=df1.Time+'-'+df1.Measure_time
df1.Time=pd.to_datetime(df1.Time,format='%Y-%m-%d-%H')
df1=df1.rename(columns={'MeasName':'站点'}).drop(columns='Measure_time')
df1=df1.rename(columns={'Time':' '}).set_index(' ')
df1

step3: 将df2按照同样的处理方法走一遍,之后再将二者合并即可
df2=df2.melt(id_vars =['Time','MeasName'],
value_vars =time_list,var_name = 'Measure_time',
value_name = '压力')
df2.MeasName=df2.MeasName.str.replace('站点','')
df2.Measure_time=df2.Measure_time.str.replace('H','')
df2.Time=df2.Time+'-'+df2.Measure_time
df2.Time=pd.to_datetime(df2.Time,format='%Y-%m-%d-%H')
df2=df2.rename(columns={'MeasName':'站点'}).drop(columns='Measure_time')
df2=df2.rename(columns={'Time':' '}).set_index(' ')
# 合并df1.df2
df = pd.concat([df1, df2])
df

第一问解决!
问题2:
表3为当天的天气情况:

- 在上一问构造的df基础上,构造下面的特征序列或DataFrame,并把它们逐个拼接到df的右侧
- 当天最高温、最低温和它们的温差
另外,更多精彩内容也可以微信搜索,并关注公众号:‘Python数据科学家之路“ ,期待您的到来和我交流!
网友评论