Data Whale第20期组队学习 Pandas学习—第二次综合练习
一、显卡日志
下面给出了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 | nference_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 3 提取码:4mui
解题思路:
1.读取文本数据,使用正则抽取,删除缺失值,对列进行重命名,并重置index;
2、合并表;
3、对表进行变型:长变宽
4、索引变型及多级索引的压缩
5、对列进行重新排序
参考代码:
import pandas as pd
import numpy as np
df=pd.read_table('D:/binchen/txzq/datatask/benchmark.txt', header=None)
pat1='Benchmarking (\w+) (\w+) precision type (\w+)'
pat2='(\w+) model average (\w+) time : (.+) ms'
"1.读取文本数据,使用正则抽取,删除缺失值,对列进行重命名,并重置index"
bench_info=df[0].str.extract(pat1).rename(columns={0:'type-x',1:'precision',
2:'model-name-x'}).dropna() .reset_index(drop=True)
print("bench_info=",bench_info)# 对应的第一行信息,去掉了缺失值,以及重置了index
# bench_info= type-x precision model-name-x
# 0 Training float mnasnet0_5
# 1 Training float mnasnet0_75
# 2 Training float mnasnet1_0
# 3 Training float mnasnet1_3
# 4 Training float resnet18
# .. ... ... ...
# 187 Inference double mobilenet_v2
# 188 Inference double shufflenet_v2_x0_5
# 189 Inference double shufflenet_v2_x1_0
# 190 Inference double shufflenet_v2_x1_5
# 191 Inference double shufflenet_v2_x2_0
#
# [192 rows x 3 columns]
model_info=df[0].str.extract(pat2).rename(columns={0:'model-name',
1:'type',2:'time-val'}).dropna().reset_index(drop=True)
print("model_info=\n",model_info)
# model_info=
# model-name type time-val
# 0 mnasnet0_5 train 28.527636528015137
# 1 mnasnet0_75 train 34.10548686981201
# 2 mnasnet1_0 train 34.31377410888672
# 3 mnasnet1_3 train 35.556888580322266
# 4 resnet18 train 18.660082817077637
# .. ... ... ...
# 187 mobilenet_v2 inference 25.47874927520752
# 188 shufflenet_v2_x0_5 inference 11.498098373413086
# 189 shufflenet_v2_x1_0 inference 12.888350486755371
# 190 shufflenet_v2_x1_5 inference 21.520133018493652
# 191 shufflenet_v2_x2_0 inference 37.01050281524658
#
# [192 rows x 3 columns]
"""
注意:
不能使用merge或merge_table,因为merge不唯一,使用merge_table会得到很多重复数据。
"""
"2、合并表"
table_concat=pd.concat([bench_info,model_info],axis=1).reset_index(drop=True)
print("table_concat=\n",table_concat)
# table_concat=
# type-x precision ... type time-val
# 0 Training float ... train 28.527636528015137
# 1 Training float ... train 34.10548686981201
# 2 Training float ... train 34.31377410888672
# 3 Training float ... train 35.556888580322266
# 4 Training float ... train 18.660082817077637
# .. ... ... ... ... ...
# 187 Inference double ... inference 25.47874927520752
# 188 Inference double ... inference 11.498098373413086
# 189 Inference double ... inference 12.888350486755371
# 190 Inference double ... inference 21.520133018493652
# 191 Inference double ... inference 37.01050281524658
#
# [192 rows x 6 columns]
" 3、对表进行变型:长变宽"
table_pivot=table_concat.pivot(index=['model-name','type'],columns='precision', values='time-val')
print("table_pivot=\n",table_pivot)
# table_pivot=
# precision double ... half
# model-name type ...
# densenet121 inference 144.11063194274902 ... 19.772343635559082
# train 417.2068214416504 ... 88.97632122039795
# densenet161 inference 511.17692470550537 ... 27.554516792297363
# train 1290.2865743637085 ... 144.31888580322266
# densenet169 inference 175.80758094787598 ... 26.370973587036133
# ... ... ... ...
# vgg19_bn train 2463.644018173218 ... 55.6095027923584
# wide_resnet101_2 inference 982.6636028289795 ... 20.251588821411133
# train 2940.3201007843018 ... 101.25351905822754
# wide_resnet50_2 inference 495.2166938781738 ... 10.985074043273926
# train 1509.8894834518433 ... 58.9246129989624
#
# [64 rows x 3 columns]
"4、索引变型及多级索引的压缩"
# 使用unstack,将最里面一层index进行行列转换
table_unstack=table_pivot.unstack()
print("table_unstack.head()=\n",table_unstack.head())
# table_unstack.head()=
# precision double ... half
# type inference ... train
# model-name ...
# densenet121 144.11063194274902 ... 88.97632122039795
# densenet161 511.17692470550537 ... 144.31888580322266
# densenet169 175.80758094787598 ... 121.55584335327148
# densenet201 223.960280418396 ... 118.94026756286621
# mnasnet0_5 11.870284080505371 ... 27.19778060913086
#
# [5 rows x 6 columns]
# 使用map函数对多级index进行组合变型
table_unstack.columns=table_unstack.columns.map(lambda x:(x[1]+'-'+x[0]))
table_reset=table_unstack.reset_index()
print("table_reset.head()=\n",table_reset.head())
# table_reset.head()=
# model-name inference-double ... inference-half train-half
# 0 densenet121 144.11063194274902 ... 19.772343635559082 88.97632122039795
# 1 densenet161 511.17692470550537 ... 27.554516792297363 144.31888580322266
# 2 densenet169 175.80758094787598 ... 26.370973587036133 121.55584335327148
# 3 densenet201 223.960280418396 ... 33.393821716308594 118.94026756286621
# 4 mnasnet0_5 11.870284080505371 ... 6.929464340209961 27.19778060913086
#
# [5 rows x 7 columns]
"5、对列进行重新排序"
table_reset1=table_reset[['model-name','train-half','train-float','train-double',
'inference-half','inference-float','inference-double']]
print("table_reset1.head()=\n",table_reset1.head())
# table_reset1.head()=
# model-name train-half ... inference-float inference-double
# 0 densenet121 88.97632122039795 ... 15.636520385742188 144.11063194274902
# 1 densenet161 144.31888580322266 ... 31.750259399414062 511.17692470550537
# 2 densenet169 121.55584335327148 ... 21.5982723236084 175.80758094787598
# 3 densenet201 118.94026756286621 ... 26.169095039367676 223.960280418396
# 4 mnasnet0_5 27.19778060913086 ... 8.03896427154541 11.870284080505371
#
# [5 rows x 7 columns]
二、水压站点的特征工程
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 |
在上一问构造的df基础上,构造下面的特征序列或DataFrame,并把它们逐个拼接到df的右侧
1) 当天最高温、最低温和它们的温差 当天是否有沙暴、是否有雾、是
2)有雨、是否有雪、是否为晴天
3) 选择一种合适的方法度量雨量/下雪量的大小(构造两个序列分别表示二者大小)
4)限制只用4列,对风向进行0-1编码
对df的水压一列构造如下时序特征:
1)当前时刻该站点水压与本月的相同整点时间水压均值的差,例如当前时刻为2018-05-20 17:00:00,那么对应需要减去的值为当前月所有17:00:00时间点水压值的均值
2)当前时刻所在周的周末该站点水压均值与工作日水压均值之差
3)当前时刻向前7日内,该站点水压的均值、标准差、0.95分位数、下雨天数与下雪天数的总和
4)当前时刻向前7日内,该站点同一整点时间水压的均值、标准差、0.95分位数
5)当前时刻所在日的该站点水压最高值与最低值出现时刻的时间差
【数据下载】链接:https://pan.baidu.com/s/1Tqad4b7zN1HBbc-4t4xc6w 1 提取码:ijbd
问题1:通过df1和df2构造df,把时间设为索引,第一列为站点编号,第二列为对应时刻的压力大小,排列方式如下(压力数值请用正确的值替换)
解题思路:
1、合并两个表 concat
2、对表进行变型:宽表变长表;
3、修改格式-文本正则,时间格式化;
4、将时间设置为index
参考代码:
import pandas as pd
import numpy as np
import re
df1 = pd.read_csv('D:/binchen/txzq/datatask/yali18.csv')
df2 = pd.read_csv('D:/binchen/txzq/datatask/yali19.csv')
df3 = pd.read_csv('D:/binchen/txzq/datatask/qx1819.csv')
print("df1=\n",df1)
# df1=
# Time MeasName H0 ... H21 H22 H23
# 0 2018-01-01 站点4 0.402750 ... 0.343875 0.356625 0.418875
# 1 2018-01-01 站点7 0.214375 ... 0.163375 0.165250 0.199375
# 2 2018-01-01 站点22 0.247000 ... 0.236500 0.241000 0.254500
# 3 2018-01-01 站点21 0.284250 ... 0.189000 0.217875 0.270000
# 4 2018-01-01 站点20 0.292875 ... 0.202125 0.219375 0.286500
# ... ... ... ... ... ... ... ...
# 10945 2018-12-31 站点12 0.215875 ... 0.152875 0.163750 0.179500
# 10946 2018-12-31 站点17 0.214500 ... 0.176625 0.181125 0.185625
# 10947 2018-12-31 站点2 0.267875 ... 0.236000 0.233000 0.234125
# 10948 2018-12-31 站点9 0.287250 ... 0.211500 0.241125 0.246375
# 10949 2018-12-31 站点6 0.313125 ... 0.239625 0.269250 0.269625
#
# [10950 rows x 26 columns]
df = pd.concat([df1, df2])
df['站点'] = df.MeasName.str.split('站点').apply(lambda x: x[1])
df.drop(['MeasName'], inplace=True, axis=1)
df_trans = df.melt(id_vars=['Time', '站点'],
value_vars=df.columns[1:-1],
var_name='Hour',
value_name='压力')
df_trans['Hour1'] = df_trans.Hour.str.split('H').apply(lambda x: x[1])
df_trans.drop(['Hour'], inplace=True, axis=1)
df_trans['Time'] = df_trans.Time + ' ' + df_trans['Hour1'] + ':00:00'
df_trans.drop(['Hour1'], inplace=True, axis=1)
df_trans['Time'] = pd.to_datetime(df_trans['Time'], format="%Y-%m-%d %H:%M:%S")
df_trans = df_trans.set_index('Time')
print("df_trans=\n",df_trans)
# df_trans=
# 站点 压力
# Time
# 2018-01-01 00:00:00 4 0.402750
# 2018-01-01 00:00:00 7 0.214375
# 2018-01-01 00:00:00 22 0.247000
# 2018-01-01 00:00:00 21 0.284250
# 2018-01-01 00:00:00 20 0.292875
# ... .. ...
# 2019-12-31 23:00:00 12 0.232000
# 2019-12-31 23:00:00 17 0.304875
# 2019-12-31 23:00:00 2 0.332000
# 2019-12-31 23:00:00 9 0.201375
# 2019-12-31 23:00:00 6 0.000000
#
# [525600 rows x 2 columns]
问题2:
在上一问构造的df基础上,构造下面的特征序列或DataFrame,并把它们逐个拼接到df的右侧
1) 当天最高温、最低温和它们的温差 当天是否有沙暴、是否有雾、是
2)有雨、是否有雪、是否为晴天
3) 选择一种合适的方法度量雨量/下雪量的大小(构造两个序列分别表示二者大小)
4)限制只用4列,对风向进行0-1编码
import pandas as pd
import numpy as np
import re
df1 = pd.read_csv('D:/binchen/txzq/datatask/yali18.csv')
df2 = pd.read_csv('D:/binchen/txzq/datatask/yali19.csv')
df3 = pd.read_csv('D:/binchen/txzq/datatask/qx1819.csv')
# 使用str对象的split方法将某列的值拆开为两列
df3[['最高温', '最低温']] = df3['气温'].str.split('~', n=1, expand=True)
print("df3=\n",df3)
# df3=
# 日期 天气 气温 风向 最高温 最低温
# 0 2018-01-01 多云 1C~-4C 东南风 微风 1C -4C
# 1 2018-01-02 阴转多云 8C~0C 东北风 3-4级 8C 0C
# 2 2018-01-03 阴转小雪 1C~-1C 东北风 4-5级转4-5级 1C -1C
# 3 2018-01-04 阴 0C~-4C 东北风转北风 3-4级转3-4级 0C -4C
# 4 2018-01-05 阴转多云 3C~-4C 西风转北风 3-4级转3-4级 3C -4C
# .. ... ... ... ... ... ...
# 724 2019-12-27 多云转晴 6℃~-1℃ 西南风转南风 3-4级转3-4级 6℃ -1℃
# 725 2019-12-28 多云转小雨 10℃~4℃ 西南风转南风 3-4级转3-4级 10℃ 4℃
# 726 2019-12-29 多云 11℃~2℃ 西南风转北风 <3级转<3级 11℃ 2℃
# 727 2019-12-30 阴转晴 4℃~-6℃ 东北风转北风 4-5级转4-5级 4℃ -6℃
# 728 2019-12-31 晴转多云 0℃~-5℃ 西风转南风 <3级 0℃ -5℃
#
# [729 rows x 6 columns]
df3['最高温'] = df3['最高温'].apply(lambda x: x.strip()[:-1])# 为了方便计算温差,将温度的单位去掉。
df3['最低温'] = df3['最低温'].apply(lambda x: x.strip()[:-1])# 为了方便计算温差,将温度的单位去掉。
print("df3=\n",df3)
# df3=
# 日期 天气 气温 风向 最高温 最低温
# 0 2018-01-01 多云 1C~-4C 东南风 微风 1 -4
# 1 2018-01-02 阴转多云 8C~0C 东北风 3-4级 8 0
# 2 2018-01-03 阴转小雪 1C~-1C 东北风 4-5级转4-5级 1 -1
# 3 2018-01-04 阴 0C~-4C 东北风转北风 3-4级转3-4级 0 -4
# 4 2018-01-05 阴转多云 3C~-4C 西风转北风 3-4级转3-4级 3 -4
# .. ... ... ... ... .. ..
# 724 2019-12-27 多云转晴 6℃~-1℃ 西南风转南风 3-4级转3-4级 6 -1
# 725 2019-12-28 多云转小雨 10℃~4℃ 西南风转南风 3-4级转3-4级 10 4
# 726 2019-12-29 多云 11℃~2℃ 西南风转北风 <3级转<3级 11 2
# 727 2019-12-30 阴转晴 4℃~-6℃ 东北风转北风 4-5级转4-5级 4 -6
# 728 2019-12-31 晴转多云 0℃~-5℃ 西风转南风 <3级 0 -5
#
# [729 rows x 6 columns]
df3['温差'] = pd.to_numeric(df3['最高温'], errors='ignore') - pd.to_numeric(df3['最低温'], errors='ignore')
print("df3=\n",df3)
# df3=
# 日期 天气 气温 风向 最高温 最低温 温差
# 0 2018-01-01 多云 1C~-4C 东南风 微风 1 -4 5.0
# 1 2018-01-02 阴转多云 8C~0C 东北风 3-4级 8 0 8.0
# 2 2018-01-03 阴转小雪 1C~-1C 东北风 4-5级转4-5级 1 -1 2.0
# 3 2018-01-04 阴 0C~-4C 东北风转北风 3-4级转3-4级 0 -4 4.0
# 4 2018-01-05 阴转多云 3C~-4C 西风转北风 3-4级转3-4级 3 -4 7.0
# .. ... ... ... ... .. .. ...
# 724 2019-12-27 多云转晴 6℃~-1℃ 西南风转南风 3-4级转3-4级 6 -1 7.0
# 725 2019-12-28 多云转小雨 10℃~4℃ 西南风转南风 3-4级转3-4级 10 4 6.0
# 726 2019-12-29 多云 11℃~2℃ 西南风转北风 <3级转<3级 11 2 9.0
# 727 2019-12-30 阴转晴 4℃~-6℃ 东北风转北风 4-5级转4-5级 4 -6 10.0
# 728 2019-12-31 晴转多云 0℃~-5℃ 西风转南风 <3级 0 -5 5.0
#
# [729 rows x 7 columns]
df3['风向'] = df3['风向'].apply(lambda x: re.findall('\w+', x)[0])
df3[['风向1','风向2']] = df3['风向'].str.split('转', expand=True)
df3['风向1'] = df3['风向1'].apply(lambda x: x[0:1])
df3.drop(columns='风向2',inplace=True,axis=1)
print("pd.get_dummies(df3['风向1'])=\n",pd.get_dummies(df3['风向1']))
# pd.get_dummies(df3['风向1'])=
# 东 北 南 西
# 0 0 1 0 0 0
# 1 0 1 0 0 0
# 2 0 1 0 0 0
# 3 0 1 0 0 0
# 4 0 0 0 0 1
# .. .. .. .. .. ..
# 724 0 0 0 0 1
# 725 0 0 0 0 1
# 726 0 0 0 0 1
# 727 0 1 0 0 0
# 728 0 0 0 0 1
问题3:
对df的水压一列构造如下时序特征:
1)当前时刻该站点水压与本月的相同整点时间水压均值的差,例如当前时刻为2018-05-20 17:00:00,那么对应需要减去的值为当前月所有17:00:00时间点水压值的均值
2)当前时刻所在周的周末该站点水压均值与工作日水压均值之差
3)当前时刻向前7日内,该站点水压的均值、标准差、0.95分位数、下雨天数与下雪天数的总和
4)当前时刻向前7日内,该站点同一整点时间水压的均值、标准差、0.95分位数
5)当前时刻所在日的该站点水压最高值与最低值出现时刻的时间差
import pandas as pd
import numpy as np
import re
df1 = pd.read_csv('D:/binchen/txzq/datatask/yali18.csv')
df2 = pd.read_csv('D:/binchen/txzq/datatask/yali19.csv')
df3 = pd.read_csv('D:/binchen/txzq/datatask/qx1819.csv')
参考文献
【1】:http://datawhale.club/t/topic/579
【2】:https://blog.csdn.net/hahameier/article/details/112490825