如何基于数值拆分通过read_csv读取的Pandas时间序列?
时间序列数据拆分的实用方法
Hey there! 看你已经用Pandas读取了这份带日期索引的时间序列数据,要把它拆分成两部分(通常是训练集和测试集对吧?),这里有几种符合时间序列特性的实现方法——记住绝对不能用随机拆分哦,会破坏时序逻辑的:
1. 按比例拆分(最常用)
如果没有特定的时间节点要求,直接按数据量比例拆分是最方便的,比如80%作为训练集,20%作为测试集:
# 计算拆分索引,取前80%作为训练集 split_ratio = 0.8 split_index = int(len(series) * split_ratio) # 拆分数据 train_data = series[:split_index] test_data = series[split_index:] # 可以打印下拆分后的数量验证 print(f"训练集样本数: {len(train_data)}, 测试集样本数: {len(test_data)}")
2. 按指定日期拆分
如果你的业务有明确的时间分割点(比如某一年之后作为测试),利用日期索引直接筛选就好:
# 设定拆分日期,比如2017-01-01 split_date = '2017-01-01' # 拆分数据 train_data = series[series.index < split_date] test_data = series[series.index >= split_date] # 验证拆分结果 print(f"训练集时间范围: {train_data.index.min()} 至 {train_data.index.max()}") print(f"测试集时间范围: {test_data.index.min()} 至 {test_data.index.max()}")
注:你的数据索引已经是datetime类型了,所以可以直接和字符串日期比较;如果索引还不是datetime类型,先执行series.index = pd.to_datetime(series.index)转换。
3. 按固定样本数拆分
如果你明确知道需要多少样本作为训练/测试,直接用位置索引拆分:
# 比如取前1500条作为训练集 train_data = series.iloc[:1500] test_data = series.iloc[1500:]
重要提醒
时间序列拆分必须严格保持时序顺序,绝对不能用sklearn.model_selection.train_test_split的默认随机拆分方式,否则会导致未来数据泄露到训练集中,模型评估结果完全失真!
内容的提问来源于stack exchange,提问作者prabhakar
相关产品推荐
相关产品推荐

