【任務(wù)一】顯卡日志
下面給出了3090顯卡的性能測(cè)評(píng)日志結(jié)果,每一條日志有如下結(jié)構(gòu):
Benchmarking #2# #4# precision type #1#
#1# model average #2# time : #3# ms
其中#1#代表的是模型名稱,#2#的值為train(ing)或inference,表示訓(xùn)練狀態(tài)或推斷狀態(tài),#3#表示耗時(shí),#4#表示精度,其中包含了float, half, double三種類型,下面是一個(gè)具體的例子:
Benchmarking Inference float precision type resnet50
resnet50 model average inference time : 13.426570892333984 ms
請(qǐng)把日志結(jié)果進(jìn)行整理,變換成如下狀態(tài),model_i用相應(yīng)模型名稱填充,按照字母順序排序,數(shù)值保留三位小數(shù):

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

可以看到原始數(shù)據(jù)中從第10行開始才是正式的數(shù)據(jù),可以把前面10行刪除
df_new = df.iloc[10: -2]
df_new.head()
結(jié)果為:

df_new.shape
>>>(384, 1)
step2: 思考一下,從上面的數(shù)據(jù)可以看到每兩行代碼一次記錄,共有384/2 = 191條。
沒兩條的數(shù)據(jù)和下面的類似:
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, 以及時(shí)間。
因?yàn)檫@些關(guān)鍵字的位置固定,考慮使用一個(gè)函數(shù)來完成。
- 這個(gè)函數(shù)接收一個(gè)行號(hào)作為參數(shù),然后處理該行和下面一行的數(shù)據(jù)(i = 0, 2 , 4...382)
- 從這兩行中提取需要的內(nèi)容,返回
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
下面測(cè)試一下:
get_info(0)
>>>('Training_float', 'mnasnet0_5', '28.527636528015137')
get_info(22)
>>>
('Training_float', 'wide_resnet50_2', '64.75635051727295')
OK, 可以完美運(yùn)行并提卻所需要的內(nèi)容
step3: 下面考慮批量化作業(yè),又到了我們最擅長的使用循環(huán)進(jìn)行辦公自動(dòng)化的內(nèi)容了。
設(shè)置i = range(0, 383, 2)并新建一個(gè)DataFrame。DataFrame的取值從get_info函數(shù)返回值中獲取
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)
結(jié)果如下:

至此,數(shù)據(jù)提取工作結(jié)束,下面考慮變形問題
- 先將time設(shè)置成數(shù)值形式,并保留3位小數(shù)
- 使用pivot_table搞定
res.time=pd.to_numeric(res.time, errors='coerce').round(3)
res.pivot_table(index = 'mold', columns = 'type', values = 'time')
結(jié)果如下:

完美搞定!
【任務(wù)二】水壓站點(diǎn)的特征工程
df1和df2中分別給出了18年和19年各個(gè)站點(diǎn)的數(shù)據(jù),其中列中的H0至H23分別代表當(dāng)天0點(diǎn)至23點(diǎn);df3中記錄了18-19年的每日該地區(qū)的天氣情況,請(qǐng)完成如下的任務(wù):
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構(gòu)造df,把時(shí)間設(shè)為索引,第一列為站點(diǎn)編號(hào),第二列為對(duì)應(yīng)時(shí)刻的壓力大小,排列方式如下(壓力數(shù)值請(qǐng)用正確的值替換):

step1: 變形,將所有時(shí)間放到一列
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: 格式調(diào)整,包括
- 將MeasName字段修改為站點(diǎn),同時(shí)值中刪除”站點(diǎn)‘字符
- Measure_time中的H干掉
- 設(shè)置時(shí)間為index
df1.MeasName=df1.MeasName.str.replace('站點(diǎn)','')
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':'站點(diǎn)'}).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('站點(diǎn)','')
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':'站點(diǎn)'}).drop(columns='Measure_time')
df2=df2.rename(columns={'Time':' '}).set_index(' ')
# 合并df1.df2
df = pd.concat([df1, df2])
df

第一問解決!
問題2:
表3為當(dāng)天的天氣情況:

- 在上一問構(gòu)造的df基礎(chǔ)上,構(gòu)造下面的特征序列或DataFrame,并把它們逐個(gè)拼接到df的右側(cè)
- 當(dāng)天最高溫、最低溫和它們的溫差
另外,更多精彩內(nèi)容也可以微信搜索,并關(guān)注公眾號(hào):‘Python數(shù)據(jù)科學(xué)家之路“ ,期待您的到來和我交流!