Pandas從入門到精通(11)- 綜合練習(xí)

【任務(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ù):


image.png

step1: 查看原始文檔:

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

可以看到原始數(shù)據(jù)中從第10行開始才是正式的數(shù)據(jù),可以把前面10行刪除

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

結(jié)果為:


image.png
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ù)來完成。

  1. 這個(gè)函數(shù)接收一個(gè)行號(hào)作為參數(shù),然后處理該行和下面一行的數(shù)據(jù)(i = 0, 2 , 4...382)
  2. 從這兩行中提取需要的內(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é)果如下:


image.png

至此,數(shù)據(jù)提取工作結(jié)束,下面考慮變形問題

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

結(jié)果如下:


image.png

完美搞定!

【任務(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)用正確的值替換):


image.png

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

step2: 格式調(diào)整,包括

  1. 將MeasName字段修改為站點(diǎn),同時(shí)值中刪除”站點(diǎn)‘字符
  2. Measure_time中的H干掉
  3. 設(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
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('站點(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
image.png

第一問解決!

問題2:

表3為當(dāng)天的天氣情況:


image.png
  • 在上一問構(gòu)造的df基礎(chǔ)上,構(gòu)造下面的特征序列或DataFrame,并把它們逐個(gè)拼接到df的右側(cè)
  • 當(dāng)天最高溫、最低溫和它們的溫差

另外,更多精彩內(nèi)容也可以微信搜索,并關(guān)注公眾號(hào):‘Python數(shù)據(jù)科學(xué)家之路“ ,期待您的到來和我交流!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容