You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在保持数据分布不变的前提下将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:35:21