pandas 处理天气/日期相关特征并数值化

最近的项目利用机器学习进行分析,对于特征的选取,尝试使用天气相关的数据。

利用pandas,对于得到的过去两三年的天气情况进行处理。


历史天气获取地址:http://tianqi.2345.com/wea_history/71146.htm

此处展现的是上海浦东地区过去两年的天气情况,如下:



由于数据可以直接复制粘贴比爬虫获取要快速,所以直接粘贴到excel中,进行分析。

1.分别读入三年的天气数据,并合并成一张表,代码如下:
#导入三年天气合并
w_2016=pd.read_excel('2016天气.xlsx')
w_2017=pd.read_excel('2017天气.xlsx')
w_2018=pd.read_excel('2018天气.xlsx')
df2=w_2016.append(w_2017).append(w_2018)

表格样式如下:


2.对天气,风向风力,空气质量指数进行详细拆分

拆分为:最好天气,最坏天气,风向,风力,空气质量 等列,具体处理方式如下:

空气质量指数:只取空气质量;

天气处理:分别找到当天最好最坏天气;

风力风向:只取风力级别,然后,对风力处理,分别找到当天最低最高风力;

import pandas as pd
import re
df2.set_index ('日期',inplace = True)
#风力取级别,分别找到当天最低最高风力
df2['风力'] =df2['风力'].apply(lambda x:x.replace('微风','1-2级'))
df2['风力'] =df2['风力'].apply(lambda x:x.split('级',1)[0])
WIND_ORDER = ['1','2','3','4','5','6']
def wind_parser(wind, type='best'):
    indices = [WIND_ORDER.index(i) for i in wind.split('-')]
    if type == 'best':
        return WIND_ORDER[min(indices)]
    elif type == 'worst':
        return WIND_ORDER[max(indices)]
df2['最低风力']=df2['风力'].apply(lambda x: wind_parser(x, 'best'))
df2['最高风力']=df2['风力'].apply(lambda x: wind_parser(x, 'worst'))
#空气质量指数:只取空气质量
df2['风力'] =df2['风向风力'].apply(lambda x:x.split('风',1)[1])
df2['空气'] =df2['空气质量指数'].apply(lambda x: re.split(re.compile(r'\d+'),x)[1])
df2['最高气温'] =df2['最高气温'].apply(lambda x:x.split('℃',1)[0])
df2['最低气温'] =df2['最低气温'].apply(lambda x:x.split('℃',1)[0])
#天气处理:分别找到当天最好最坏天气
WEATHER_ORDER = ['晴','多云','阴','阵雨', '雷阵雨','小雨','中雨', '大雨','暴雨','雨夹雪','中雪']
def weather_parser(weather, type='best'):
    indices = [WEATHER_ORDER.index(i) for i in weather.split('~')]
    if type == 'best':
        return WEATHER_ORDER[min(indices)]
    elif type == 'worst':
        return WEATHER_ORDER[max(indices)]
df2['最好天气']=df2['天气'].apply(lambda x: weather_parser(x,'best'))
df2['最坏天气']=df2['天气'].apply(lambda x: weather_parser(x,'worst'))


#丢弃多余的列:
df2.drop(['风向风力','空气质量指数','天气','风力'],axis=1,inplace=True) 

 处理完成之后,目前的表格已经变成,如下:



3.对气温,风力等特征进行数值化处理
#0-1气温(最高气温>=36)
df['高气温值']=df['最高气温'].apply(lambda x: 1 if x >= 36 else 0)

#0-1风力(最高风力>=5)
df['高风力值']=df['最高风力'].apply(lambda x: 1 if x >= 5 else 0)


#df['天气'] 列数值化:0-晴,阴,多云,暴雨,中雪,小雨,阵雨,雷阵雨;1-中雨;2-大雨,雨夹雪
def weather_numerical(weather):
    if weather in ['大雨','雨夹雪']:
        return 2
    elif weather in ['中雨']:
        return 1
    else:
        return 0

df['天气值']=df['最坏天气'].apply(lambda x:weather_numerical(x))


#df['空气'] 列数值化:0-优,良,轻度污染;1-中度污染;2-重度污染
def air_numerical(air):
    if air in ['重度污染']:
        return 2
    elif air in ['中度污染']:
        return 1
    else:
        return 0

df['空气值']=df['空气'].apply(lambda x: air_numerical(x)) 


4.对日期进行处理,增加月初值,月末值,并把星期进行one-hot处理:
#月初值,月末值
df['月初值']=df['日期'].dt.day.apply(lambda x: 1 if x<=6 else 0)
df['月末值']=df['日期'].dt.day.apply(lambda x :1 if x>=28 else 0)

#df‘星期’列转换成‘周一’‘周二’‘周三’‘周四’‘周五’‘周六’‘周日’
df=df.join(pd.get_dummies(df['星期']))

5.只抽取周一~周五的记录
#抽取周一~周五数据
df=df[df['星期'].isin (['星期一','星期二','星期三','星期四','星期五'])]

进行处理后,当前表格变成如下:


至此,天气和日期相关的特征提取,以及数值化过程完成。


---

未经允许,请勿转载。

转载请注明出处,谢谢!

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页