总结
1、任务1:
①、首先我们解读题目:
需要模型名称、训练状态或推断状态、数值。状态是float, half, double三种,Training表示训练,Inference表示推断。
②读取数据
import pandas as pd
import numpy as np
import io
df=pd.read_csv('benchmark.txt',sep='\r\t') # 我们发现分隔符是换行符
df.head(11) # 查看数据
数据解读,从以下结果看出,我们要的数据是从第10行开始,发现一个规律,我们需要的数据模型名称、训练状态或推断状态,全部在偶数行;模型名称和值在奇数行。
③、分离我们需要的数据。
df1=df.iloc[9::2,:]
df2=df.iloc[10::2,:]
df3=pd.DataFrame(df1.start.str.split(' ').to_list(),columns=['a','type_1','type_2','b','c','model_name'])
df4=pd.DataFrame(df2.start.str.split(' ').to_list(),columns=['model_name2','a','b','c','d','e','f','g','value','i'])
④、清洗数据,转换我们想要的内容。
df3['type_1'].replace('Training','Train',inplace=True)
df3['type']=df3['type_1']+'_'+df3['type_2']
df3=df3[['model_name','type']]
df4=df4[['model_name2','value']]
df5=pd.concat([df3,df4],axis=1)
del df5['model_name2']
df5=df5.iloc[:-1,:]
df5['value']=df5['value'].astype(float).round(3)
⑤、最后,转换为结果数据,我们使用drop_duplicates().shape判断出数据没有重复项,此时使用pivot转换结果。
df_result=pd.pivot(df5,index='model_name',columns='type',values='value').sort_index().reset_index()
结果如下:
2、任务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
①、首先读取数据,使用isna().sum()和drop_duplicates().shape观察df1和df2是完整数据(无缺失也无重复数据)。接下来开干。
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_c=pd.concat([df1,df2])
# 提取站点数字
df_c['MeasName']=df_c.MeasName.str.extract(r'(\d+)').astype(int)
#宽表转长表处理
df=df_c.melt(id_vars=['Time','MeasName'],
value_vars=df_c.columns[2:].tolist(),
var_name='时间',
value_name='压力')
# 修改列名
df.rename(columns={'MeasName':'站点'},inplace=True)
df['压力']=df['压力'].round(1)
# 提取小时
df['时间']=df.时间.str.extract(r'(\d+)')
#修改时间数据的数据类型
df['时间']=df['时间'].astype(str)
df['Time']=df['Time'].astype(str)
#拼接时间数据
df['Time']=df['Time']+' '+df['时间']+':00:00'
df['Time']=pd.to_datetime(df['Time'],format='%Y-%m-%d %H:%M:%S')
#删除不需要的列
del df['时间']
df.sort_values(['Time','站点'],ascending=True,inplace=True)
# 把时间列转为index
df.set_index('Time',inplace=True)
df.index.name=''