Data Whale第20期组队学习 Pandas学习—第二次综合练习

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_halfTrain_floatTrain_doubleInference_halfnference_floatInference_double
model_10.9540.9010.3570.2810.9781.130
model_20.3600.7940.0111.0831.1370.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-0100:00:0011.0
2018-01-0100:00:0021.0
2018-01-0100:00:00301.0
2018-01-0101:00:0011.0
2018-01-0101:00:0021.0
2019-12-3123:00:00301.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值