如何在保持数据分布不变的前提下将10个月数据重缩放至6个月?
将10个月数据转换为6个月周期并保留分布特征的可行方案
首先明确:完全可行,核心是通过合适的方法保留原数据的关键统计特征(比如均值、方差、极值分布、整体波动趋势等)。以下是几种实用的实现思路及示例:
原数据回顾
month value 0 1 866 1 2 274 2 3 975 3 4 792 4 5 512 5 6 610 6 7 980 7 8 984 8 9 602 9 10 177
具体实现方法
1. 比例映射法(保留整体占比)
先计算原数据的总价值,再将每个6月周期的价值按原数据的区间占比分配。比如:
- 原数据总价值:
866+274+975+792+512+610+980+984+602+177 = 6772 - 把10个月划分为6个区间(比如前2个月合并为第一个周期,接下来2个月为第二个,最后2个月拆分为两个周期),每个周期的价值取对应原区间的总和,确保整体占比和原数据一致。
2. 插值重采样法(保留波动趋势)
把原数据补全为连续时间序列,再合并为6个月周期,适合需要保留月度波动特征的场景:
import pandas as pd import numpy as np # 构建原数据 data = pd.DataFrame({ 'month': [1,2,3,4,5,6,7,8,9,10], 'value': [866,274,975,792,512,610,980,984,602,177] }) # 转换为月度时间序列,补全缺失的11、12月(用样条插值保留波动) data['date'] = pd.date_range(start='2023-01-01', periods=10, freq='M') data = data.set_index('date').resample('M').asfreq() data['value'] = data['value'].interpolate(method='spline', order=2) # 每2个月合并为一个6周期的数值(这里用求和,也可以用均值) six_month_data = data['value'].resample('2M').sum().reset_index() six_month_data.columns = ['period', 'value'] print(six_month_data)
3. 分布拟合法(保留统计分布特征)
通过拟合原数据的概率分布,生成符合特征的6个新数值,适合需要严格保留均值、方差等统计特征的场景:
from scipy.stats import gaussian_kde # 拟合原数据的核密度分布 kde = gaussian_kde(data['value'].dropna()) # 生成6个符合分布的数值 six_month_values = kde.resample(6).flatten() # 限制数值在原数据的极值范围内,避免偏离 six_month_values = np.clip(six_month_values, data['value'].min(), data['value'].max()) # 整理为结果 result = pd.DataFrame({ 'period': range(1,7), 'value': np.round(six_month_values).astype(int) }) print(result)
注意事项
- 如果更看重实际业务场景的趋势,优先选择比例映射或插值重采样法;
- 如果需要严格匹配统计分布特征(比如做模拟分析),选择分布拟合法;
- 可以根据需求调整方法细节,比如把求和改为均值,或者调整插值的方式。
内容的提问来源于stack exchange,提问作者Tempo
相关产品推荐
相关产品推荐

