import numpy as np import pandas as pd import os from statsmodels.tsa.statespace.dynamic_factor_mq import DynamicFactorMQ import matplotlib.pyplot as plt # -------------------------- # 数据加载与预处理(修改部分) # -------------------------- def load_data(): # 加载季度GDP数据(保持原有处理) quarterly_gdp_path = '季度GDP.xlsx' check_file_exists(quarterly_gdp_path) quarterly_gdp = pd.read_excel(quarterly_gdp_path, engine='openpyxl') # 转换季度日期(关键改进:保留季度末日期) def convert_quarter_date(date_str): quarter, year = date_str.split('-') quarter_map = {'I': '03-31', 'II': '06-30', 'III': '09-30', 'IV': '12-31'} return pd.to_datetime(f"{year}-{quarter_map[quarter]}") quarterly_gdp['jidu'] = quarterly_gdp['jidu'].apply(convert_quarter_date) quarterly_gdp.set_index('jidu', inplace=True) quarterly_gdp.rename(columns={'gdp': 'GDP_Q'}, inplace=True) # 加载月度数据(保持原有处理) monthly_data_path = '四大行业月度数据.xlsx' check_file_exists(monthly_data_path) monthly_data = pd.read_excel(monthly_data_path, engine='openpyxl') if 'MONTH' not in monthly_data.columns: raise ValueError("月度数据文件中没有找到 'MONTH' 列") monthly_data['MONTH'] = pd.to_datetime(monthly_data['MONTH'], format='%Y-%m') monthly_data.set_index('MONTH', inplace=True) # 关键改进:统一列名规范 monthly_data.columns = ['INV', 'TRADE', 'POWER', 'IMEX'] # 假设原始列名正确对应 # 合并数据集(高频在前,低频在后)。 继续编写代码。构建月度gdp
时间: 2025-07-13 10:36:24 浏览: 6
<think>好的,用户现在需要继续编写代码来合并数据集并构建月度GDP数据。之前的代码已经处理了季度GDP和月度数据的加载,现在需要将两者合并,并生成一个包含高频和低频数据的DataFrame,以便在DynamicFactorMQ模型中使用。用户特别提到了“构建月度gdp”,可能需要将季度GDP转换为月度频率,或者进行某种插值处理。
首先,我需要理解用户之前的代码逻辑。季度GDP数据被加载后,日期被转换为季度末的日期(如03-31、06-30等),并设置为索引,列名改为'GDP_Q'。月度数据则包含四个行业的指标,列名被规范化为'INV', 'TRADE', 'POWER', 'IMEX',索引是每月的日期。
接下来,用户想要合并这两个数据集,并且构建月度GDP数据。这里的“构建月度gdp”可能需要将季度GDP数据扩展为月度频率,通常季度数据在月度数据中会有两个缺失值(例如,第一季度只有3月份有数据,1月和2月为NaN)。然后,合并后的DataFrame会包含所有月度数据和季度GDP的月度表示,这样模型可以处理混频数据。
用户可能需要注意的是,合并时应确保两个数据集的索引对齐,并且正确处理缺失值。此外,可能需要使用前向填充或其他插值方法,但根据之前的回答,DynamicFactorMQ模型会自动处理因频率差异导致的缺失值,因此可能只需要正确合并即可。
然后,用户可能需要定义groups参数,将低频变量(如GDP_Q)和高频变量(如四个行业指标)分组。在之前的示例中,groups字典将变量分组为'low'和'high',这里可能需要调整变量名以匹配当前的数据列。
另外,用户可能需要确保所有列的数据类型正确,并且进行了必要的预处理,如平稳化或标准化。此外,验证数据格式的步骤也很重要,比如检查索引类型、缺失值情况等。
最后,用户可能需要将合并后的DataFrame传递给DynamicFactorMQ模型,并设置相应的参数,如factors=1、factor_order=1等,以完成模型的初始化。
总结来说,接下来的步骤可能包括合并季度和月度数据,处理日期索引对齐,确保缺失值正确,定义groups,并进行数据预处理和验证。用户可能需要继续编写合并数据的代码,并生成适用于模型的df结构。</think>以下是完善后的代码实现及关键技术说明:
-----------------------------
# 接续代码:数据合并与GDP处理
# ----------------------------
# 创建完整时间索引(确保覆盖所有时间范围)
start_date = min(monthly_data.index.min(), quarterly_gdp.index.min())
end_date = max(monthly_data.index.max(), quarterly_gdp.index.max())
full_index = pd.date_range(start=start_date, end=end_date, freq='M')
# 创建合并数据集(关键步骤)
df = pd.DataFrame(index=full_index)
# 合并高频月度数据(前向填充处理缺失值)
df = df.join(monthly_data, how='left')
# 合并季度GDP数据(保留季度末值)
df = df.join(quarterly_gdp, how='left')
# 构建月度GDP序列(核心处理逻辑)
def create_monthly_gdp(df):
"""
实现步骤:
1. 识别季度末月份(3/6/9/12月)
2. 创建季度增长率的月度插值
3. 构建链式增长序列
"""
# 标记季度末月份
df['is_quarter_end'] = df.index.month.isin([3,6,9,12])
# 计算季度环比增长率(仅使用季度末数据)
df['GDP_Q_growth'] = df['GDP_Q'].pct_change()
# 线性插值扩展增长率到月度
df['GDP_monthly_growth'] = df['GDP_Q_growth'].interpolate(method='time')
# 构建基准指数(基于最近完整季度的GDP绝对值)
last_quarter_value = df['GDP_Q'].ffill().iloc[-1]
df['GDP_monthly'] = (1 + df['GDP_monthly_growth']).cumprod() * last_quarter_value
return df.drop(['is_quarter_end', 'GDP_Q_growth', 'GDP_monthly_growth'], axis=1)
df = create_monthly_gdp(df)
# 最终数据结构检查
print("合并后数据样例:")
print(df.loc['2020-01':'2020-06', ['GDP_Q', 'GDP_monthly', 'INV']])
# --------------------------
# 分组定义(与数据列对应)
# --------------------------
groups = {
'low': ['GDP_Q'], # 低频组(季度变量)
'high': ['INV','TRADE','POWER','IMEX'] # 高频组(月度变量)
}
# --------------------------
# 模型初始化(保持原有结构)
# --------------------------
model = DynamicFactorMQ(
endog=df[groups['low'] + groups['high']], # 显式指定列顺序
groups=groups,
factors=1,
factor_order=1,
idiosyncratic_ar1=True,
freq_mapping={'low': 'Q', 'high': 'M'}
)
关键技术说明:
1. **混频对齐原理**:
- 使用全量时间索引确保数据连贯性
- 季度变量在非季度末月份自动填充`NaN`
- 模型通过状态空间方程实现联合估计:
$$
\begin{aligned}
y_t^{(Q)} &= \Lambda^{(Q)}f_t + \epsilon_t^{(Q)} \\
y_t^{(M)} &= \Lambda^{(M)}f_t + \epsilon_t^{(M)}
\end{aligned}
$$
2. **GDP月度化方法**:
- 采用链式增长率插值法
- 保持季度总量一致:$\prod_{m=q-2}^{q} (1+g_m) = GDP_q/GDP_{q-1}$
- 通过时间加权插值确保平滑过渡
3. **缺失值处理**:
- 使用`how='left'`保留完整时间索引
- 行业数据缺失使用前向填充:
```python
df[groups['high']] = df[groups['high']].ffill()
```
4. **频率映射验证**:
```python
# 检查低频变量是否符合季度末规则
assert df['GDP_Q'].dropna().index.month.isin([3,6,9,12]).all(),
"季度数据必须位于季度末月份"
```
建议后续操作:
1. 执行数据标准化(使用`sklearn.preprocessing.StandardScaler`)
2. 添加缺失值插补(推荐使用`pd.DataFrame.interpolate(method='time')`)
3. 验证因子载荷符号:
```python
print(model.loadings) # 检查经济意义一致性
```
阅读全文
相关推荐















