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

ADB MRIO数据库行/列多表头聚合处理技术问询

Technical Verification and Optimization for ADB MRIO Aggregation

Verification of Current Implementation

  • Opaque Country Mapping: The col and row lists use numeric indices with no connection to the country codes specified in your requirements. There’s no way to confirm if these indices correctly map to BRA, CAN, ROA, etc., making validation of the country aggregation logic impossible.
  • Missing Industry Aggregation: Your code completely ignores the industry-level aggregation requirement. It treats all 35 industries as separate, but the task requires merging all except C4, C12, C13, C14, C15 into "OTH".
  • Fragile Positional Indices: Hardcoded values like 2205, 2212, and range(3,2525) depend on the exact structure of your input Excel file. Any change in the file’s layout (e.g., added rows/columns) will break the code without warning.
  • Unusable Output: The final Excel output uses default numeric indices instead of the aggregated country/industry labels (e.g., "ROW", "ROA", "OTH"), making it impossible to verify results at a glance.

Optimization Recommendations

1. Explicit Group Definitions

Define clear mappings for country and industry groups using their actual codes. This makes the logic transparent and easy to adjust if requirements change.

2. Use Pandas GroupBy for Aggregation

Replace manual matrix multiplication with pandas' groupby functionality. This is more readable, efficient, and less error-prone than building aggregation matrices from scratch.

3. Preserve Metadata

Retain country and industry labels throughout the process to validate aggregation results and ensure the output is usable for downstream analysis.

4. Label-Based Data Selection

Avoid positional indices; use label-based selection (e.g., df.loc[]) to make the code robust to changes in the input file structure.

5. Modularize the Code

Split the process into reusable functions to improve maintainability and readability.

Revised Implementation Code

import pandas as pd

# --------------------------
# Step 1: Define Aggregation Rules
# --------------------------
# Country grouping (maps original country codes to aggregated groups)
country_groups = {
    'ROW': ['BRA', 'CAN', 'MEX', 'ROW'],
    'ROA': ['AUS', 'TAP', 'KAZ', 'SRI', 'PAK', 'FIJ', 'BRU', 'BHU', 'KGZ', 'MLD'],
    'PRC': ['PRC'],
    'JPN': ['JPN'],
    'KOR': ['KOR'],
    'BAN': ['BAN'],
    'CAM': ['CAM'],
    'HKG': ['HKG'],
    'INO': ['INO'],
    'IND': ['IND'],
    'LAO': ['LAO'],
    'MAL': ['MAL'],
    'MON': ['MON'],
    'NEP': ['NEP'],
    'PHI': ['PHI'],
    'SIN': ['SIN'],
    'THA': ['THA'],
    'VIE': ['VIE'],
    'US': ['US'],
    'GER': ['GER']
}
# Reverse mapping: original country code -> aggregated group
country_to_group = {}
for group, codes in country_groups.items():
    for code in codes:
        country_to_group[code] = group

def get_country_group(code):
    """Map original country code to aggregated group; assign remaining to EU"""
    return country_to_group.get(code, 'EU')

def get_industry_group(code):
    """Map original industry code to aggregated group; keep target industries"""
    return code if code in ['C4', 'C12', 'C13', 'C14', 'C15'] else 'OTH'

# --------------------------
# Step 2: Load and Prepare Data
# --------------------------
# Adjust header/usecols based on your Excel's actual structure
df = pd.read_excel('ADB MRIO 2019.xlsx', header=6)

# Extract row labels (assuming first column is combined country-industry, e.g., "PRC_C4")
row_labels = df.iloc[:, 0].str.split('_', expand=True)
row_countries = row_labels[0]
row_industries = row_labels[1]

# Extract column labels for intermediate IO matrix (Z)
z_col_labels = df.columns[1:2206].str.split('_', expand=True)
z_col_countries = z_col_labels[0]
z_col_industries = z_col_labels[1]

# Extract column labels for final demand matrix (F)
f_col_labels = df.columns[2206:2521].str.split('_', expand=True)
f_col_countries = f_col_labels[0]
f_col_indicators = f_col_labels[1]

# --------------------------
# Step 3: Aggregate Z Matrix (Intermediate Input-Output)
# --------------------------
Z = df.iloc[:2205, 1:2206].copy()
# Add row groups
Z['row_country'] = row_countries.apply(get_country_group)
Z['row_industry'] = row_industries.apply(get_industry_group)
Z = Z.set_index(['row_country', 'row_industry'])
# Rename columns to aggregated groups
Z.columns = pd.MultiIndex.from_tuples(
    list(zip(z_col_countries.apply(get_country_group), z_col_industries.apply(get_industry_group)))
)
# Aggregate rows and columns
Z_agg = Z.groupby(level=[0,1]).sum().T.groupby(level=[0,1]).sum().T

# --------------------------
# Step 4: Aggregate V Matrix (Value Added)
# --------------------------
V = df.iloc[2205:2212, 1:2206].copy()
V.columns = pd.MultiIndex.from_tuples(
    list(zip(z_col_countries.apply(get_country_group), z_col_industries.apply(get_industry_group)))
)
V_agg = V.groupby(axis=1, level=[0,1]).sum()

# --------------------------
# Step 5: Aggregate x Vector (Total Output)
# --------------------------
x = df.iloc[2212, 1:2206].copy()
x.index = pd.MultiIndex.from_tuples(
    list(zip(z_col_countries.apply(get_country_group), z_col_industries.apply(get_industry_group)))
)
x_agg = x.groupby(level=[0,1]).sum()

# --------------------------
# Step 6: Aggregate F Matrix (Final Demand)
# --------------------------
F = df.iloc[:2205, 2206:2521].copy()
# Add row groups
F['row_country'] = row_countries.apply(get_country_group)
F['row_industry'] = row_industries.apply(get_industry_group)
F = F.set_index(['row_country', 'row_industry'])
# Rename columns to (country group, F indicator)
F.columns = pd.MultiIndex.from_tuples(
    list(zip(f_col_countries.apply(get_country_group), f_col_indicators))
)
# Aggregate rows and columns
F_agg = F.groupby(level=[0,1]).sum().T.groupby(level=[0,1]).sum().T

# --------------------------
# Step 7: Combine and Save Output
# --------------------------
# Build output structure
output_rows = list(Z_agg.index) + list(df.iloc[2205:2212, 0]) + ['Total Output']
output_cols = list(Z_agg.columns) + list(F_agg.columns) + ['Total Output']

output_df = pd.DataFrame(index=output_rows, columns=output_cols)

# Populate aggregated data
output_df.loc[Z_agg.index, Z_agg.columns] = Z_agg.values
output_df.loc[df.iloc[2205:2212, 0], Z_agg.columns] = V_agg.values
output_df.loc['Total Output', Z_agg.columns] = x_agg.values
output_df.loc[Z_agg.index, F_agg.columns] = F_agg.values
output_df.loc[Z_agg.index, 'Total Output'] = x_agg.values

# Save to Excel
output_df.to_excel('MRIO2019_new_optimized.xlsx')

Key Improvements

  • Transparent Logic: Country and industry groups are explicitly defined using their codes, making validation and adjustments straightforward.
  • Full Aggregation Compliance: Implements both country and industry aggregation requirements, including merging non-target industries into "OTH".
  • Robustness: Uses label-based grouping instead of hardcoded positional indices, so the code won’t break if the input file’s structure changes.
  • Interpretable Output: Includes meaningful multi-index headers for countries, industries, and F indicators, making results easy to verify and analyze.

内容的提问来源于stack exchange,提问作者annely

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:14:54