Python数据分析

Pandas从入门到精通(11)- 综合练习

2021-01-13  本文已影响0人  木头里有虫911

【任务一】显卡日志

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


image.png

step1: 查看原始文档:

df=pd.read_table('benchmark.txt', header=None)
df.head(15)
image.png

可以看到原始数据中从第10行开始才是正式的数据,可以把前面10行删除

df_new = df.iloc[10: -2]
df_new.head()

结果为:


image.png
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, 以及时间。
因为这些关键字的位置固定,考虑使用一个函数来完成。

  1. 这个函数接收一个行号作为参数,然后处理该行和下面一行的数据(i = 0, 2 , 4...382)
  2. 从这两行中提取需要的内容,返回
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)

结果如下:


image.png

至此,数据提取工作结束,下面考虑变形问题

  1. 先将time设置成数值形式,并保留3位小数
  2. 使用pivot_table搞定
res.time=pd.to_numeric(res.time, errors='coerce').round(3)
res.pivot_table(index = 'mold', columns = 'type', values = 'time')

结果如下:


image.png

完美搞定!

【任务二】水压站点的特征工程

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,把时间设为索引,第一列为站点编号,第二列为对应时刻的压力大小,排列方式如下(压力数值请用正确的值替换):


image.png

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
image.png

step2: 格式调整,包括

  1. 将MeasName字段修改为站点,同时值中删除”站点‘字符
  2. Measure_time中的H干掉
  3. 设置时间为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
image.png

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
image.png

第一问解决!

问题2:

表3为当天的天气情况:


image.png

另外,更多精彩内容也可以微信搜索,并关注公众号:‘Python数据科学家之路“ ,期待您的到来和我交流!

上一篇 下一篇

猜你喜欢

热点阅读