如何用与原始数据形态相似的合成数据填充Pandas时间序列缺口?
时间序列缺口的合成数据填充方案
针对传统插值无法保留数据噪声与形态的问题,以下几个工具库可以生成贴合原数据特征的合成数据:
1. TimeSynth(专用合成时间序列库)
专注于生成符合特定统计特征的时间序列,你可以先分析原数据的趋势、周期、噪声分布(均值、方差、噪声类型),再生成匹配特征的序列填充缺口。
示例代码:
import timesynth as ts import pandas as pd # 按缺口时长生成时间采样点 time_sampler = ts.TimeSampler(stop_time=len(df.loc[df['value'].isna()])) regular_time_samples = time_sampler.sample_regular_time(num_points=df['value'].isna().sum()) # 匹配原数据的趋势与噪声特征 trend = ts.trends.LinearTrend(slope=df['value'].dropna().diff().mean(), intercept=df['value'].dropna().iloc[-1]) noise = ts.noise.GaussianNoise(std=df['value'].dropna().std()) ts_generator = ts.TimeSeries(trend=trend, noise=noise) samples, _, _ = ts_generator.sample(regular_time_samples) # 填充缺口 df.loc[df['value'].isna(), 'value'] = samples
2. Prophet(适配趋势与周期性波动)
Facebook开源工具,擅长捕捉时间序列的趋势与周期性,用缺口前后的有效数据训练模型后,预测的缺口值会自带与原数据类似的波动,而非平滑曲线。
示例代码:
from prophet import Prophet import pandas as pd # 转换为Prophet要求的格式 train_df = df[~df['value'].isna()].rename(columns={'timestamp': 'ds', 'value': 'y'}) model = Prophet(yearly_seasonality=True, weekly_seasonality=True) model.fit(train_df) # 生成缺口区间的时间序列 gap_count = df['value'].isna().sum() future = model.make_future_dataframe(periods=gap_count, freq='H') # 根据数据时间频率调整freq forecast = model.predict(future) # 提取预测值填充缺口 gap_timestamps = df[df['value'].isna()]['timestamp'] df.loc[df['value'].isna(), 'value'] = forecast.loc[forecast['ds'].isin(gap_timestamps), 'yhat'].values
3. Statsmodels ARIMA/SARIMA(保留自相关特性)
如果数据存在明显的自相关性(前后时刻值关联紧密),用ARIMA/SARIMA拟合原数据的自相关结构,生成的预测值能保留原数据的波动模式。
示例代码:
import statsmodels.api as sm import pandas as pd # 处理为规整时间序列 ts_data = df['value'].dropna().asfreq('H') # 调整频率匹配你的数据 # 根据ACF/PACF图确定p,d,q参数,示例用(1,1,1) model = sm.tsa.ARIMA(ts_data, order=(1, 1, 1)) results = model.fit() # 预测缺口区间 gap_start = df[df['value'].isna()].index[0] gap_end = df[df['value'].isna()].index[-1] forecast = results.predict(start=gap_start, end=gap_end) # 填充缺口 df.loc[gap_start:gap_end, 'value'] = forecast.values
额外建议
- 先对原数据做时序分解(用
statsmodels.tsa.seasonal.seasonal_decompose),拆分趋势、季节、残差项,分别生成对应部分再合并,能进一步提升合成数据的贴合度。 - 生成前务必分析原数据的核心特征:趋势类型(线性/非线性)、周期规律、噪声分布、自相关系数,确保生成的序列与原数据统计特性一致。
内容的提问来源于stack exchange,提问作者ortunoa
相关产品推荐
相关产品推荐

