Datawhale Pandas 综合练习2

【任务四】显卡日志

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

Datawhale Pandas 综合练习2

import numpy as np
import pandas as pd
data = pd.read_table("../data/benchmark.txt")
data.head(20)

Datawhale Pandas 综合练习2
发现是一个字符串数据集,那使用正则表达式来提取需要的数据
这里由于需要的数据再两行中,所以用两个pattern来提取

pattern1 = "Benchmarking (\w+) (\w+) precision type (\w+)"
pattern2 = "(\w+)  model average (\w+) time :  (\d+\.\d+) ms"
df1 = data.start.str.extract(pattern1).dropna()
df1.columns = ["T_or_I", "precision", "model"]
df1.reset_index(drop=True, inplace=True)
df2 = data.start.str.extract(pattern2).dropna()
df2.columns = ["model", "T_or_I", "time"]
df2.reset_index(drop=True, inplace=True)

提取出两组数据放在两个df中

df1["T_or_I"].unique()
array(['Training', 'Inference'], dtype=object)

df2["T_or_I"].unique()
array(['train', 'inference'], dtype=object)

df2["T_or_I"] = df2["T_or_I"].str.title()
df1["T_or_I"].replace("Training", "Train", inplace=True)

对两组数据中的Train和Inference进行清洗
然后将两个数据集横向合并,注意这里不能用merge,因为对于model和T_or_I这两列,两组数据中都有多个行,merge会进行排列组合

df = pd.concat([df1,df2["time"]], axis=1)

处理一下时间

df["time"] = df["time"].astype(float).round(3)
df

Datawhale Pandas 综合练习2
长表转为横表

df = df.pivot(index=["model", "T_or_I"],
              columns="precision",
              values="time")

Datawhale Pandas 综合练习2
把内层行索引压缩到列索引中

df = df.unstack()

Datawhale Pandas 综合练习2
对列名进行处理

df.columns = df.columns.map(lambda x: x[0]+"_"+x[1])
df.reset_index()

Datawhale Pandas 综合练习2
【任务五】水压站点的特征工程

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

先观察一下数据

df1.head()

Datawhale Pandas 综合练习2
纵向合并:

df = pd.concat([df1,df2])

处理一下站点数据:

df["站点"] = df.MeasName.str.split("站点").map(lambda x:x[1])
df.drop(["MeasName"], axis=1, inplace=True)

对数据变换一下:

df = df.melt(id_vars=["Time", "站点"],
             value_vars=df.columns[1:-1],
             var_name = "hour",
             value_name = "压力")

处理一下时间数据

df.hour = df.hour.str.split("H").map(lambda x:x[1])
df.Time = df.Time + " "+ df.hour + ":00:00"
df.Time = pd.to_datetime(df.Time)
df = df.set_index(df.Time)
del df["Time"]
del df["hour"]
df

Datawhale Pandas 综合练习2

  • 在上一问构造的df基础上,构造下面的特征序列或DataFrame,并把它们逐个拼接到df的右侧
    • 当天最高温、最低温和它们的温差
    • 当天是否有沙暴、是否有雾、是否有雨、是否有雪、是否为晴天
    • 选择一种合适的方法度量雨量/下雪量的大小(构造两个序列分别表示二者大小)
    • 限制只用4列,对风向进行0-1编码(只考虑风向,不考虑大小)

有点懵。。。

上一篇:pandas学习笔记(六)


下一篇:【12月DW打卡】joyful-pandas - 06 - joyful-pands - pandas连接(join、concat、compare连接、combine连接)