【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 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 提取码:4mui

首先要了解数据的特点:

  1. 每两行是一条信息(按照长表来看)
  2. 都是文本型数据,格式比较工整,每个变量之间有空格,没有长度不一的情况,需要进行文本提取
  3. 要提取的变量其实只有四个:模型model,状态state,精度precision,耗时time

其次明确需要做的几个步骤:

  1. 读文本txtread.table
  2. 每两行整合成一行表示一条数据
  3. 将文本进行切分或者直接提取需要的变量Series.str.split or Series.str.extract
  4. 对time进行数据类型转换同时取三位小数Series.astype and Series.round(decimals=3)
import pandas as pd
dataset = pd.read_table("D:/MyProjects/Notebook/joyful-pandas-master/notebook/benchmark.txt")
dataset = dataset.iloc[9:-2,:]  # 去头去尾
evenline = dataset.iloc[0::2,:].reset_index(drop=True)
oddline = dataset.iloc[1::2,:].reset_index(drop=True)
dataset_new = (evenline+" "+oddline)['start'] # 要加空格 不然后面split的时候model的名字会重复
dataset_new = dataset_new.str.split(" ", expand=True)
dataset_new = dataset_new[[5,1,2,14]]
dataset_new.columns = ['model', 'state', 'precision', 'time']
dataset_new.time = dataset_new.time.astype('float').round(decimals=3)
dataset_new = dataset_new.pivot(index = ['model'], columns = ['state','precision'], values = ['time']) # 长表变宽表,默认索引排序
dataset_new.columns = dataset_new.columns.map(lambda x: (x[1]+'_'+x[2]))  # 多级索引压缩

以下为部分结果的截图

在这里插入图片描述

水压站点的特征工程

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

df1df2中分别给出了18年和19年各个站点的数据,其中列中的H0H23分别代表当天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')

问题一:

  • 通过df1df2构造df,把时间设为索引,第一列为站点编号,第二列为对应时刻的压力大小,排列方式如下(压力数值请用正确的值替换):
![task11.2](D:\Note\pandas_learning\task11.2.PNG)                       站点    压力
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

同样首先了解数据的特点:

  1. 原始数据的变量为:时间为object,站点名为Object,24个小时为float,是宽表
  2. 时间列的数据类型需要考虑一下
  3. 原始数据有两张类似的表,需要合并
  4. 目标格式的长表索引时间不满足唯一性,但是时间+站点满足唯一性

再来明确一下要做的步骤:

  1. 站点列提取数字
  2. 两张表合并
  3. 宽表变长表
  4. 时间变量的构造和整合以及数据类型的转换
  5. 索引设置和排序
import pandas as pd
df1 = pd.read_csv('yali18.csv')
df2 = pd.read_csv('yali19.csv')
df3 = pd.read_csv('qx1819.csv')

df = pd.concat([df1,df2], axis=0)
df.MeasName = df.MeasName.str[2:].astype('int')
df = df.melt(id_vars = ['Time', 'MeasName'],
                    value_vars = ['H'+str(i) for i in range(24)],
                    var_name = 'Hours',
                    value_name = '压力')
df['Hours'] = df['Hours'].str[1:]
df['Time'] = df['Time']+"-"+df['Hours']
df['Time'] = pd.to_datetime(df['Time'].values,format='%Y-%m-%d-%H')
df = df.drop('Hours',axis=1)
df = df.sort_values(['Time', 'MeasName'])
df = df.set_index("Time")
df.columns = ['站点','压力']

在这里插入图片描述

问题二:

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

明确一下要做的步骤:

  1. 气温列:提取最高温、最低温、计算温差
  2. 天气列:总结一下天气的描述,确定沙暴、雾、雨、雪、晴天的描述关键词和界定规则
  3. 天气列:基于雨雪天气的描述确定雨量下雪量的度量规则
  4. 风向列:总结风向描述,确定编码规则
  5. 连接:按照索引进行左连接

在这里插入图片描述

在这里插入图片描述

# 1.对气温列进行处理
qw = df3['气温'].str.split("~", expand=True)
qw['low'] = pd.to_numeric(qw[1].str.extract('(-?\d+)')[0])
qw['high'] = pd.to_numeric(qw[0].str.extract('(-?\d+)')[0])
qw['diff'] = qw['high']-qw['low']
qx = qw.drop([0,1],axis=1)
# 2. 天气列
tq = df3['天气'].str.split('转', expand=True)
temp = pd.concat([tq[0],tq[1]]).value_counts()
qx['sand'] = df3['天气'].str.contains('扬沙')
qx['fog'] = df3['天气'].str.contains('雾')
qx['rain'] = df3['天气'].str.contains('雨')
qx['sun'] = df3['天气'].str.contains('[晴|多云]')
qx['snow'] = df3['天气'].str.contains('雪')
# 3.还没想好怎么度量
# 4.风向列
fx = df3['风向'].str.split(" ",expand=True)[0].value_counts()
qx['east'] = df3['风向'].str.contains('东').astype('int')
qx['west'] = df3['风向'].str.contains('西').astype('int')
qx['south'] = df3['风向'].str.contains('南').astype('int')
qx['north'] = df3['风向'].str.contains('北').astype('int')
# 5.连接
qx['time'] = pd.to_datetime(df3['日期'])
qx = qx.set_index('time')
df_ex2 = df.join(qx,how='left')

在这里插入图片描述

问题三:

  • df的水压一列构造如下时序特征:
    • 当前时刻该站点水压与本月的相同整点时间该站点水压均值的差,例如当前时刻为2018-05-20 17:00:00,那么对应需要减去的值为当前月所有17:00:00时间点水压值的均值
    • 当前时刻所在周的周末该站点水压均值与工作日水压均值之差
    • 当前时刻向前7日内,该站点水压的均值、标准差、0.95分位数、下雨天数与下雪天数的总和
    • 当前时刻向前7日内,该站点同一整点时间水压的均值、标准差、0.95分位数
    • 当前时刻所在日的该站点水压最高值与最低值出现时刻的时间差

第三问还没搞定,/(ㄒoㄒ)/~~

最后真心感谢宝藏 joyful pandas

猜你喜欢

转载自blog.csdn.net/weixin_41545602/article/details/112562051
今日推荐