澳大利亚天气预测,是Kaggle上一个非常接近真实场景的数据集,因为其数据结构复杂,前期需要做大量的数据预处理,所以本文先介绍澳大利亚天气数据集的特征工程部分,下节课再进行建模分析。
Kaggle下载地址:https://www.kaggle.com/datasets/jsphyg/weather-dataset-rattle-package
数据说明
# Date:观察特征的那一天 # Location:观察的城市 # MinTemp:当天最低温度(摄氏度) # MaxTemp:当天最高温度(摄氏度)温度都是 string # Rainfall:当天的降雨量(单位是毫米mm) # Evaporation:一个凹地上面水的蒸发量(单位是毫米mm),24小时内到早上9点 # Sunshine:一天中出太阳的小时数 # WindGustDir:最强劲的那股风的风向,24小时内到午夜 # WindGustSpeed:最强劲的那股风的风速(km/h),24小时内到午夜 # WindDir9am:上午9点的风向 # WindDir3pm:下午3点的风向 # WindSpeed9am:上午9点之前的十分钟里的平均风速,即 8:50~9:00的平均风速,单位是(km/hr) # WindSpeed3pm:下午3点之前的十分钟里的平均风速,即 14:50~15:00的平均风速,单位是(km/hr) # Humidity9am:上午9点的湿度 # Humidity3pm:下午3点的湿度 # Pressure9am:上午9点的大气压强(hpa) # Pressure3pm:下午3点的大气压强 # Cloud9am:上午9点天空中云的密度,取值是[0, 8],以1位一个单位,0的话表示天空中几乎没云,8的话表示天空中几乎被云覆盖了 # Cloud3pm:下午3点天空中云的密度 # Temp9am:上午9点的温度(单位是摄氏度) # Temp3pm:下午3点的温度(单位是摄氏度) # RainTodayBoolean: 今天是否下雨 # RainTomorrow:明天是否下雨(标签值)
代码示例
1、导入数据集和初步探索
探索发现,特征数据有不同程度的缺失
import pandas as pd weather = pd.read_csv('./datas/weatherAUS5000.csv', index_col=0) # weather.info() # print(weather.isnull().mean())
2、切分数据集
from sklearn.model_selection import train_test_split x = weather.iloc[:, :-1] y = weather.iloc[:, -1] # print(y.unique()) #['Yes' 'No'] x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0) # print(y_train.value_counts()) # No 2722 Yes 778 # print(y_test.value_counts()) # No 1133 Yes 367 # 打印发现,训练集和测试集都存在样本不均衡问题
3、标签编码
from sklearn.preprocessing import LabelEncoder encoder = LabelEncoder().fit(y_train) y_train = encoder.transform(y_train) y_test = encoder.transform(y_test) # print(y_train.shape)
4、处理日期特征
天气预测可能和日期中的月份有关系,所以提取日期中的月份
x_train['Month'] = x_train['Date'].str.split('-', expand=True)[1].astype('int') x_train.drop('Date', axis=1, inplace=True) x_test['Month'] = x_test['Date'].str.split('-', expand=True)[1].astype('int') x_test.drop('Date', axis=1, inplace=True) # print(len(x_train['Month'].unique()))
5、处理地点特征
观测点所在城市,对应所在气候区域划分,可能对天气预测有影响,所以将城市替换成气候区域。 # 本过程比较复杂,参见上一篇文章:澳大利亚观测点城市气候区域划分
city_climate = pd.read_csv('./datas/sample_city_climate.csv', index_col=0) # 用气候区域替换观测点城市,并去掉空格 climate_dict = city_climate['Climate'].to_dict() x_train['Climate'] = x_train['Location'].apply(lambda x: climate_dict[x].strip()) x_train.drop('Location', axis=1, inplace=True) x_test['Climate'] = x_test['Location'].apply(lambda x: climate_dict[x].strip()) x_test.drop('Location', axis=1, inplace=True)
6、众数填补分类缺失值
cate_col = x_train.columns[x_train.dtypes == 'object'].tolist() # Cloud9am、Cloud3pm、Month虽然是数字,但风力等级,应该当分类处理 cate_col += ['Cloud9am', 'Cloud3pm', 'Month'] from sklearn.impute import SimpleImputer impmost = SimpleImputer(strategy='most_frequent') impmost.fit(x_train.loc[:, cate_col]) x_train.loc[:, cate_col] = impmost.transform(x_train.loc[:, cate_col]) x_test.loc[:, cate_col] = impmost.transform(x_test.loc[:, cate_col]) # x_test.info()
7、分类特征编码
至此数据全部变为了数值型
from sklearn.preprocessing import OrdinalEncoder encoder = OrdinalEncoder() encoder.fit(x_train.loc[:, cate_col]) x_train.loc[:, cate_col] = encoder.transform(x_train.loc[:, cate_col]) x_test.loc[:, cate_col] = encoder.transform(x_test.loc[:, cate_col]) # x_train.info()
8、均值填补连续数据缺失值
cols = x_train.columns.tolist() seri_col = list(set(cols) - set(cate_col)) impmean = SimpleImputer() impmean.fit(x_train.loc[:, seri_col]) x_train.loc[:, seri_col] = impmean.transform(x_train.loc[:, seri_col]) x_test.loc[:, seri_col] = impmean.transform(x_test.loc[:, seri_col]) # print(x_test.isnull().mean())
9、连续数据标准化
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler.fit(x_train.loc[:, seri_col]) x_train.loc[:, seri_col] = scaler.transform(x_train.loc[:, seri_col]) x_test.loc[:, seri_col] = scaler.transform(x_test.loc[:, seri_col]) # print(x_test.describe().T)
本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/read/290
- 上一篇:
- Python爬取可转债和正股涨跌幅信息
- 下一篇:
- 数据结构之链表类的封装