Final Task

任务四

数据下载地址:https://pan.baidu.com/s/1CjfdtavEywHtZeWSmCGv3A 2 提取码:4mui

QUESTION

题目较为简单,主要是对于文本对象的提取操作以及表格变形

首先读入数据

df = pd.read_table('benchmark.txt').convert_dtypes()

然后使用两个正则pattern对我们需要的modelstatetimeprecision进行提取

pat1 = 'Benchmarking (?P<state>\w+) (?P<precision>\w+) precision type (?P<model>\w+)'
pat2 = '(?P<model>\w+)  model average (?P<state>\w+) time :  (?P<time>\d+.\d{3})\d* ms'
table1 = df.start.str.extract(pat1).iloc[9:].dropna().set_index(['model'])
table2 = df.start.str.extract(pat2).iloc[9:].dropna().set_index(['model'])

接着,我们将table1和table2合并,table2只取time部分

table = pd.concat([table1, table2['time']],axis=1)
table

最后,对table进行pivot变换,再对columns进行一下合并,就大功告成了,这里使用pivot_table,个人感觉在进行pivot变换时,不论数据需不需要聚合,pivot_table都比pivot好, pivotindex参数要求必须在原表格的columns中,在本例中,我们若需要使用index model作为pivot函数的索引,还先得reset_index,使用pivot_table就没有这样的限制。

res = table.pivot_table(index='model', columns = ['state', 'precision'], values='time')
res.columns = res.columns.map(lambda x:'_'.join(x))
result

任务五

数据下载地址:https://pan.baidu.com/s/1Tqad4b7zN1HBbc-4t4xc6w 提取码:ijbd

df1df2中分别给出了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')
  • 通过df1df2构造df,把时间设为索引,第一列为站点编号,第二列为对应时刻的压力大小,排列方式如下(压力数值请用正确的值替换):

    table

  • 在上一问构造的df基础上,构造下面的特征序列或DataFrame,并把它们逐个拼接到df的右侧

    • 当天最高温、最低温和它们的温差
    • 当天是否有沙暴、是否有雾、是否有雨、是否有雪、是否为晴天
    • 选择一种合适的方法度量雨量/下雪量的大小(构造两个序列分别表示二者大小)
    • 限制只用4列,对风向进行0-1编码
  • 对df的水压一列构造如下时序特征:

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

使用melt对表格进行变换

df = pd.concat([df1, df2], axis=0)
df = df.melt(id_vars = ['Time', 'MeasName'],
                    value_vars = df1.columns[2:],
                    var_name = 'Hour',
                    value_name = 'Pressure')
to_timedelta = dict(zip(['H'+str(i) for i in range(24)], [pd.Timedelta('{} Hours'.format(i)) for i in range(24)]))
df.Hour = df.Hour.replace(to_timedelta)
df.Time = pd.to_datetime(df.Time) + df.Hour
df.drop('Hour', axis=1, inplace=True)
Date = df.Time
df.set_index('Time', inplace=True)
df.MeasName = df.MeasName.astype('string').str.extract('站点(?P<MeasName>\d+)')
df
result

第二小问,使用正则表达式式对温度进行提取

df3['日期'] = pd.to_datetime(df3['日期'])
df3 = df3.set_index('日期').convert_dtypes()
temp_pat = '(?P<最高气温>-?\d*)[C|℃]\s*~\s*(?P<最低气温>-?\d*)[C|℃]'
df3 = pd.concat([df3, df3['气温'].str.extract(temp_pat)], axis=1)
df3.drop('气温', axis=1, inplace=True)

对天气情况进行提取,使用contains函数

df3['是否沙暴'] = df3['天气'].str.contains('沙')
df3['是否有雾'] = df3['天气'].str.contains('雾')
df3['是否有雨'] = df3['天气'].str.contains('雨')
df3['是否有雪'] = df3['天气'].str.contains('雪')
df3['是否晴天'] = df3['天气'].str.contains('晴')
df3.head()
result

同样的方法提取风向

df3['风向东'] = df3['风向'].str.contains('东')
df3['风向南'] = df3['风向'].str.contains('南')
df3['风向西'] = df3['风向'].str.contains('西')
df3['风向北'] = df3['风向'].str.contains('北')
df3.drop('风向', axis=1, inplace=True)
df3.head()
result

对下雨和下雪情况分析

def extract(s):
    ret = pd.Series(index=['天气1', '天气2'], data=[np.nan, np.nan]).astype('string')
    weather =  s.split('转')
    if len(weather)==2:
        ret.iloc[:] = weather
    else:
        ret.iloc[:] = weather[0]
    return ret

def transform1(s):
    s= s.fillna('NA')
    s.iloc[~s.str.contains('雨')] = pd.NA
    return s

def transform2(s):
    s = s.fillna('NA')
    s.iloc[~s.str.contains('雪')] = pd.NA
    return s

weather = pd.Series(df3.天气.unique())
rain = pd.Series(weather[weather.str.contains('雨')])
rain = rain.apply(extract).apply(transform1)
snow = pd.Series(weather[weather.str.contains('雪')])
snow = snow.apply(extract).apply(transform2)
print(rain['天气1'].dropna().unique())
print(rain['天气2'].dropna().unique())
print(snow['天气1'].dropna().unique())
print(snow['天气2'].dropna().unique())
雨雪情况

使用如下方法进行等级划分,并进行原始值的替换

rain_level = dict({
    '雨':1,
    '雨夹雪':1,
    '小雨':1,
    '雷阵雨':2,
    '阵雨':2,
    '小到中雨':3, 
    '中雨':3,
    '中到大雨':4,
    '大雨':4,
    '暴雨':5
})
snow_level = dict({
    '小雪':1,
    '雨夹雪':1,
    '小到中雪':2,
    '中到大雪':3,
    '大雪':4
})
rain_code = rain.replace(rain_level).fillna(0).values.max(1)
snow_code = snow.replace(snow_level).fillna(0).values.max(1)
df3['雨量'] = df3['天气'].replace(rain_dict).astype('string')
zero = df3['雨量'].str.contains('[^\d]')
df3['雨量'].loc[zero] = '0'
df3['雪量'] = df3['天气'].replace(snow_dict).astype('string')
zero = df3['雪量'].str.contains('[^\d]')
df3['雪量'].loc[zero] = '0'
df3.drop('天气', axis=1, inplace=True)
df3 = df3.convert_dtypes()
df3.head()
result

对提取的数据进行整合,并填充缺失值,使用bfill的方法

df3[['风向东','风向南','风向西','风向北']] = df3[['风向东','风向南','风向西','风向北']].replace({True:1, False:0})
df3['最高气温'] = pd.to_numeric(df3['最高气温'], errors='coerce')
df3['最高气温'].fillna(method='bfill')
df3['最低气温'] = pd.to_numeric(df3['最低气温'], errors='coerce')
df3['温差']  = df3['最高气温'] - df3['最低气温']
df3 = df3.convert_dtypes()
def process(data):
    def func(group, data=data):
        index = group.index[0].floor('1D')
        key = ['最高气温', '最低气温', '温差', '是否沙暴','是否有雾','是否有雨','是否有雪', '是否晴天', '雨量', '雪量', '风向东','风向南','风向西','风向北']
        try:
            data.loc[index]
        except:
            return 
        for k in key:
            group[k] = data.loc[index, k]
        return group
    return func
df = df.resample('1D').apply(process(df3)).droplevel(0, axis=0)
result

第三小问

def process(group):
    # 特征1
    feature1 = []
    for i in range(1,13):
        month_mask = group.index.month == i
        mean_t = np.zeros(24)
        for k in range(24):
            hour_mask = (group.index.hour == k)
            mask = month_mask & hour_mask
            mean_t[k] = group.loc[mask].mean() if mask.sum()!=0 else 0
        hour_idx = group.index[month_mask].hour
        feature1.append(group.loc[month_mask] - mean_t[hour_idx])
    feature = pd.DataFrame(pd.concat(feature1, axis=0))
    feature.columns = ['feature1']
    # 特征2
    feature2 = []
    week = group.index.isocalendar().week.unique()
    reset_day = group.index.dayofweek.isin([5,6])
    for w in week:
        week_mask = group.index.isocalendar().week == w
        feature2.append(np.ones(week_mask.sum())*(group.loc[week_mask&reset_day].mean() - group.loc[week_mask&(~reset_day)].mean()))
    feature['feature2'] = pd.Series(np.concatenate(feature2, axis=0), index=feature.index)
    return feature


df.groupby(['MeasName'])['Pressure'].apply(process)
result
def func(r):
    data = []
    mask = r.index.hour == r.index[-1].hour
    data.append(r.mean())
    data.append(r.std())
    data.append(r.quantile(0.95))    
def process(group):
    # 特征3
    data = []
    r  = group['Pressure'].rolling('7D')
    data.append(r.mean())
    data.append(r.std())
    data.append(r.quantile(0.95))
    r  = group['是否有雨'].rolling('7D')
    data.append(r.sum())
    r  = group['是否有雪'].rolling('7D')
    data.append(r.sum())
    data = pd.concat(data,axis=1)
    
    ret = pd.DataFrame(index=group.index, data=data.values, columns=['7日均值','7日标准差','0.95分位数','雨天总数','雪天总数'])
    return ret

df.groupby(['MeasName'])[['Pressure', '是否有雨', '是否有雪']].apply(process)
result
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容