首页 > 解决方案 > 以正确的方式使用天气数据对时间序列进行上采样

问题描述

我有一个数据集,其中包含从每月 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 天,获取缺失天数的最佳方法是什么?

标签: pythonpandasmachine-learningtime-seriesdata-science

解决方案


事实上,有很多方法可以处理缺失的时间序列值。

您已经尝试过传统方法,用平均值估算数据。但是这种方法的缺点是数据上的值太多导致的偏差。

您可以尝试使用遗传算法 (GA)、支持向量机 (SVR)、自回归 (AR) 和移动平均 (MA) 进行时间序列插补和建模。为了克服传统方法(均值)引起的偏差问题,这些方法用于预测或/和估算时间序列。

(考虑你有一个多元时间序列)

以下是您可以使用的一些资源:

深度学习方法调查

time.series.missing-values-in-time-series-in-python

Python中的插值填充缺失值


推荐阅读