python - 以正确的方式使用天气数据对时间序列进行上采样
问题描述
我有一个数据集,其中包含从每月 1 日到 20 日的每个月的天气数据,并且每天的每个小时都会抛出一年,并且每个月的最后 10 天(以及它的小时数)都被删除。
天气数据是:(温度 - 湿度 - 风速 - 能见度 - 露水温度 - 太阳能辐射 - 降雨 - 降雪)
我想将数据集上采样为时间序列以填补当天缺失的数据,但由于气候的变化,我也面临许多问题。
这是迄今为止尝试过的
def get_hour_month_mean(data,date,hour,max_id):
return { 'ID':max_id,
'temperature':data['temperature'].mean(),
'humidity':data['humidity'].mean(),
'date':date,
'hour':hour,
'wind_speed':data['wind_speed'].mean(),
'visibility':data['visibility'].mean(),
'dew_temperature':data['dew_temperature'].mean(),
'solar_radiation':data['solar_radiation'].mean(),
'rainfall':data['rainfall'].mean(),
'count':data['count'].mean() if str(date.date()) not in seoul_not_func else 0,
'snowfall':data['snowfall'].mean(),
'season':data['season'].mode()[0],
'is_holiday':'No Holiday' if str(date.date()) not in seoul_p_holidays_17_18 else 'Holiday' ,
'functional_day':'Yes' if str(date.date()) not in seoul_not_func else 'No' ,
}
def upsample_data_with_missing_dates(data):
data_range = pd.date_range(
start="2017-12-20", end="2018-11-30", freq='D')
missing_range=data_range.difference(df['date'])
hour_range=range(0,24)
max_id=data['ID'].max()
data_copy=data.copy()
for date in missing_range:
for hour in hour_range:
max_id+=1
year=data_copy.year
month=date.month
if date.month==11:
year-=1
month=12
else:
month+=1
month_mask=((data_copy['year'] == year) &
(data_copy['month'] == month) &
(data_copy['hour'] == hour) &(data_copy['day'].isin([1,2])))
data_filter=data_copy[month_mask]
dict_row=get_hour_month_mean(data_filter,date,hour,max_id)
data = data.append(dict_row, ignore_index=True)
return data
任何想法如果我有前 20 天和接下来 20 天,获取缺失天数的最佳方法是什么?
解决方案
事实上,有很多方法可以处理缺失的时间序列值。
您已经尝试过传统方法,用平均值估算数据。但是这种方法的缺点是数据上的值太多导致的偏差。
您可以尝试使用遗传算法 (GA)、支持向量机 (SVR)、自回归 (AR) 和移动平均 (MA) 进行时间序列插补和建模。为了克服传统方法(均值)引起的偏差问题,这些方法用于预测或/和估算时间序列。
(考虑你有一个多元时间序列)
以下是您可以使用的一些资源: