【JP】Task Special & Task 11 综合练习(2020.12)

source: http://datawhale.club/t/topic/579
【任务四】显卡日志

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

Train_half Train_float Train_double Inference_half Inference_float Inference_double
model_1 0.954 0.901 0.357 0.281 0.978 1.130
model_2 0.360 0.794 0.011 1.083 1.137 0.394

【数据下载】链接:https://pan.baidu.com/s/1CjfdtavEywHtZeWSmCGv3A 20 提取码:4mui

df = pd.read_table('../data/exercise/benchmark.txt')
#删去前面和后面一部分没有用的数据,保留有格式的数据
df2 = df.drop(labels=range(9), axis=0).drop(labels=[393,394])
#增加一列tmp_index=(index+1)//2,方便后面把两行放到一行里
df2['tmp_index'] = (df2.index + 1)//2
#合并前后两行数据
df2 = df2.groupby('tmp_index')['start'].apply(lambda x: ' '.join(x)).to_frame()
#正则表达式
pat = 'Benchmarking (?P<status>\w+) (?P<accuracy>\w+) precision type (?P<name>\w+) \w+  model average (inference|train) time :  (?P<time>\d+\.\d{3})'
#提取数据
df2 = df2.start.str.extract(pat).drop(labels=3, axis=1).reset_index(drop=True)
#转换表格
df2 = df2.pivot(index="name", columns=['accuracy','status'],values='time')
#合并列
new_cols = df2.columns.map(lambda x: x[1].replace('Training', 'Train') + '_'+ x[0])
df2.columns = new_cols
#调整列的顺序并更换index的名字
df2 = df2[['Train_half', 'Train_float', 'Train_double', 'Inference_half','Inference_float','Inference_double']].rename_axis(index={'name':''})
df2.head()

结果:

image-20210112204909452.png

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

df1df2中分别给出了18年和19年各个站点的数据,其中列中的H0H23分别代表当天0点至23点;df 3中记录了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. 通过df1df2构造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

【数据下载】链接:https://pan.baidu.com/s/1Tqad4b7zN1HBbc-4t4xc6w 17 提取码:ijbd

#1.构造df 
df1 = pd.read_csv('../data/exercise/yali18.csv')
df2 = pd.read_csv('../data/exercise/yali19.csv')
df3 = pd.read_csv('../data/exercise/qx1819.csv')
#合并表格
df4 = df1.append(df2)
#转换宽表为长表
df4 = df4.melt(id_vars=['Time', 'MeasName'],
                            value_vars=df4.columns[2:],
                            var_name='time2',
                            value_name='压力')
#替换时间
df4.time2 = df4.time2.replace(dict(zip(df4.time2.unique(), list(map(lambda x: str(x).rjust(2,'0')+":00:00", range(24))))))
#改时间格式
df4['Date'] = pd.to_datetime(df4.Time + ' ' + df4.time2)
#替换站点编号
df4.MeasName = pd.to_numeric(df4.MeasName.str[2:])
#设置时间索引,并按站点排序
df4 = df4.drop(labels=['Time', 'time2'], axis=1).sort_values(['Date','MeasName']).set_index('Date').rename(columns={'MeasName':'站点'}).rename_axis(index={'Date':''})
df4

结果:

image-20210112222324528.png
  1. 在上一问构造的df基础上,构造下面的特征序列或DataFrame,并把它们逐个拼接到df的右侧
  • 当天最高温、最低温和它们的温差
  • 当天是否有沙暴、是否有雾、是否有雨、是否有雪、是否为晴天
  • 选择一种合适的方法度量雨量/下雪量的大小(构造两个序列分别表示二者大小)
  • 限制只用4列,对风向进行0-1编码(只考虑风向,不考虑大小)
#2.1当天最高温、最低温和它们的温差
#重新index,增加日期列,并改格式为string(datetime类型似乎不能直接合并)
df4 = df4.rename_axis(index={'':'Date'}).reset_index()
df4['日期'] = df4.Date.dt.date.astype(str)
#增加最高温,最低温,温差,通过日期合并
s1= df3.气温.str.replace('C|℃','').str.split('~',expand=True).rename(columns={0:'最高温',1:'最低温'})
s1['温差'] = pd.to_numeric(s1.最高温)-pd.to_numeric(s1.最低温)
s1['日期'] = df3.日期.astype(str)
df5 = df4.merge(s1, on='日期',how='left')
df5
image-20210113231004167.png
#2.2当天是否有沙暴、是否有雾、是否有雨、是否有雪、是否为晴天
#构造dataframe,合并到df5
df6 = pd.DataFrame(data={'是否有沙暴': df3.天气.str.contains('沙'),
                        '是否有雾': df3.天气.str.contains('雾'),
                        '是否有雨': df3.天气.str.contains('雨'),
                        '是否有雪':df3.天气.str.contains('雪'),
                        '是否为晴天': df3.天气.str.contains('晴'),
                        '日期': df3.日期.astype(str)})
df5 = df5.merge(df6, on='日期',how='left')
df5.head()
image-20210113152417648.png
#2.3统计降雪量降雨量的大小
s = pd.Series(df3.天气)
def updateRainLevel(x):
    if '阵雨' in x:
        return 1
    if '小雨' in x:
        return 2
    if '雷震雨' in x:
        return 3
    if '中雨' in x:
        return 4
    if '大雨' in x:
        return 5
    if '雨夹雪' in x:
        return 6
    if '暴雨' in x:
        return 7
    if '雨' in x:
        return 3
    return -1
def updateSnowLevel(x):
    if '雨夹雪' in x:
        return 1
    if '小雪' in x:
        return 2
    if '中雪' in x:
        return 3
    if '大雪' in x:
        return 4
    return -1

df6 = pd.DataFrame(data = {'降雨量': map(lambda x:updateRainLevel(x), s), '日期': df3.日期.astype(str)})
df5 = df5.merge(df6, on='日期',how='left')
df6 = pd.DataFrame(data = {'降雪量': map(lambda x:updateSnowLevel(x), s), '日期': df3.日期.astype(str)})
df5 = df5.merge(df6, on='日期',how='left')
df5
image-20210113173714708.png
#2.4限制只用4列,对风向进行`0-1`编码(只考虑风向,不考虑大小)
#群里大佬提供的思路,注意正则表达式的 | 放在括号的最后时(a|)可以代表这个括号可以取空,但放在括号的开头(|a)则不行
s = df3['风向'].str.extract('(?P<风向1>[东南西北]*[东南西北]+风).(?P<风向2>[东南西北]*[东南西北]+风|)')
s['日期'] = df3.日期.astype(str)
temp = dict(zip(['东风','南风','西风','北风','东北风','西北风','东南风','西南风',''], ['000','001','010','011','100','101','110','111',np.nan]))
#转换编码
s['风向1'] = list(map(lambda x:temp[x], s['风向1']))
s['风向2'] = list(map(lambda x:temp[x], s['风向2']))
df5 = df5.merge(s, on='日期',how='left').set_index('Date').drop(labels='日期', axis=1)
df5
image-20210113231253117.png
  1. df的水压一列构造如下时序特征:
  • 当前时刻该站点水压与本月的相同整点时间该站点水压均值的差,例如当前时刻为2018-05-20 17:00:00,那么对应需要减去的值为当前月所有17:00:00时间点水压值的均值
df6 = df5.reset_index()
df6.groupby(['站点',df6.Date.dt.year,df6.Date.dt.month, df6.Date.dt.time])['压力'].apply(lambda x:x-np.average(x))
image.png
  • 当前时刻所在周的周末该站点水压均值与工作日水压均值之差
df7 = df6.groupby(['站点',pd.Series(data=df6.Date.dt.weekofyear,name='week'),pd.Series(data=df6.Date.dt.year,name='year'), np.where(df6.Date.dt.dayofweek<=4,'工作日', '周末')])['压力'].agg('mean').to_frame().unstack().droplevel(0,axis=1)
s = pd.Series(data=df7['周末']-df7['工作日'],name='差值')
s
image.png
  • 当前时刻向前7日内,该站点水压的均值、标准差、0.95分位数、下雨天数与下雪天数的总和
  • 当前时刻向前7日内,该站点同一整点时间水压的均值、标准差、0.95分位数
  • 当前时刻所在日的该站点水压最高值与最低值出现时刻的时间差
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容