import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import os
import matplotlib as mpl
def main():
try:
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'Microsoft YaHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
# 1. 设置文件路径并检查文件是否存在
file_path = r"C:\Users\1\Desktop\数据.xlsx"
if not os.path.exists(file_path):
raise FileNotFoundError(f"文件不存在: {file_path}")
print("开始读取Excel数据...")
# 2. 读取各工作表数据(单位:亿美元)
trade_df = pd.read_excel(file_path, sheet_name='贸易数据')
policy_df = pd.read_excel(file_path, sheet_name='政策与经济指标')
calc_df = pd.read_excel(file_path, sheet_name='计算指标')
print("数据读取成功!")
print(f"贸易数据列: {list(trade_df.columns)}")
print(f"政策经济指标列: {list(policy_df.columns)}")
print(f"计算指标列: {list(calc_df.columns)}")
# 3. 数据预处理与合并
# 统一年份列名
trade_df = trade_df.rename(columns={'year': 'Year'})
policy_df = policy_df.rename(columns={'year': 'Year'})
calc_df = calc_df.rename(columns={'year': 'Year'})
# 合并数据
merged_df = pd.merge(trade_df, policy_df, on='Year')
merged_df = pd.merge(merged_df, calc_df, on='Year')
print("数据合并完成,列名:", merged_df.columns.tolist())
print("可用年份:", sorted(merged_df['Year'].unique()))
# 4. 添加计算列(经济效率指标)- 单位统一为亿美元
# 需求弹性假设:高端(-0.8), 中端(-0.6), 低端(-0.4)
def calc_welfare_loss(row, chip_type):
tariff_col = f'{chip_type}关税'
import_col = f'{chip_type}芯片进口'
tau = row[tariff_col] / 100
imports = row[import_col] # 单位:亿美元
elasticity = -0.8 if chip_type == '高端' else (-0.6 if chip_type == '中端' else -0.4)
return 0.5 * (tau ** 2) * abs(elasticity) * imports # 结果单位:亿美元
for chip_type in ['高端', '中端', '低端']:
# 计算福利损失(单位:亿美元)
merged_df[f'{chip_type}福利损失'] = merged_df.apply(
lambda row: calc_welfare_loss(row, chip_type), axis=1)
# 安全指数计算(直接使用计算指标中的安全综合指数)
merged_df[f'{chip_type}安全指数'] = merged_df['安全综合指数']
print(f"已创建 {chip_type}安全指数 列")
# 5. 关税政策情景分析 - 增加50%高关税情景
def policy_simulation(tariff_increase):
# 获取最新年份数据
latest_year = merged_df['Year'].max()
print(f"使用最新年份 {latest_year} 进行政策模拟")
# 基础情景(实际数据)
base_data = merged_df[merged_df['Year'] == latest_year].copy()
if base_data.empty:
raise ValueError(f"没有找到{latest_year}年的数据")
# 高关税情景(+15%)
high_tariff = base_data.copy()
original_high_tariff = high_tariff['高端关税'].values[0]
high_tariff['高端关税'] = original_high_tariff + tariff_increase
high_tariff['中端关税'] = high_tariff['中端关税'].values[0] + tariff_increase
# 超高关税情景(50%)
ultra_tariff = base_data.copy()
ultra_tariff['高端关税'] = 50
ultra_tariff['中端关税'] = 40
# 更新芯片指标
def update_chip_metrics(scenario, chip_type):
# 重新计算福利损失
scenario[f'{chip_type}福利损失'] = scenario.apply(
lambda row: calc_welfare_loss(row, chip_type), axis=1)
# 估计进口量变化
elasticity = -0.8 if chip_type == '高端' else (-0.6 if chip_type == '中端' else -0.4)
tariff_change = scenario[f'{chip_type}关税'].values[0] - base_data[f'{chip_type}关税'].values[0]
price_effect = 1 + (tariff_change / 100) * elasticity
scenario[f'{chip_type}芯片进口'] = base_data[f'{chip_type}芯片进口'].values[0] * max(0.5, price_effect)
# 更新安全指数(轻微正相关)
security_change = tariff_change * 0.02
scenario[f'{chip_type}安全指数'] = min(10,
base_data[f'{chip_type}安全指数'].values[0] + security_change)
return scenario
# 更新高端和中端芯片指标
for chip in ['高端', '中端']:
high_tariff = update_chip_metrics(high_tariff, chip)
ultra_tariff = update_chip_metrics(ultra_tariff, chip)
return base_data, high_tariff, ultra_tariff, latest_year, original_high_tariff
# 模拟15%关税增加和50%超高关税情景
print("进行政策情景模拟...")
base_scenario, high_tariff_scenario, ultra_tariff_scenario, sim_year, base_tariff = policy_simulation(15)
print(f"政策模拟完成! 模拟年份: {sim_year}")
# 6. 可视化分析 - 增加高关税影响图
plt.figure(figsize=(18, 15))
plt.suptitle(f'芯片产业分析报告 ({min(merged_df["Year"])}-{max(merged_df["Year"])}) - 单位:亿美元',
fontsize=18, fontweight='bold')
# 图1:各类芯片进口趋势
plt.subplot(2, 3, 1)
for chip_type, color in zip(['高端', '中端', '低端'], ['#FF6B6B', '#4ECDC4', '#556270']):
plt.plot(merged_df['Year'], merged_df[f'{chip_type}芯片进口'],
'o--', linewidth=2, markersize=8, color=color,
label=f'{chip_type}进口')
plt.title('芯片进口趋势', fontsize=14)
plt.xlabel('年份', fontsize=12)
plt.ylabel('进口值 (亿美元)', fontsize=12)
plt.legend(fontsize=10)
plt.grid(alpha=0.3)
plt.xticks(merged_df['Year'], fontsize=10)
# 图2:关税与进口量关系
plt.subplot(2, 3, 2)
for chip_type, color in zip(['高端', '中端', '低端'], ['#FF6B6B', '#4ECDC4', '#556270']):
plt.scatter(merged_df[f'{chip_type}关税'],
merged_df[f'{chip_type}芯片进口'],
color=color, s=100,
label='高端' if chip_type == '高端' else
'中端' if chip_type == '중端' else
'低端', alpha=0.8)
# 添加趋势线
if merged_df[f'{chip_type}关税'].nunique() > 1:
slope, intercept, r_value, p_value, std_err = stats.linregress(
merged_df[f'{chip_type}关税'],
merged_df[f'{chip_type}芯片进口']
)
x = np.array([merged_df[f'{chip_type}关税'].min(),
merged_df[f'{chip_type}关税'].max()])
plt.plot(x, intercept + slope * x, color=color, linestyle='-', linewidth=2)
else:
avg_import = merged_df[f'{chip_type}芯片进口'].mean()
min_tariff = merged_df[f'{chip_type}关税'].min()
max_tariff = merged_df[f'{chip_type}关税'].max()
plt.hlines(avg_import, min_tariff, max_tariff,
colors=color, linestyles='-', linewidth=2)
plt.text((min_tariff + max_tariff) / 2, avg_import,
f"均值={avg_import:.1f}",
ha='center', va='bottom', fontsize=10)
plt.title('关税对进口量的影响', fontsize=14)
plt.xlabel('关税税率(%)', fontsize=12)
plt.ylabel('进口值 (亿美元)', fontsize=12)
plt.legend(fontsize=10, title='芯片类型')
plt.grid(alpha=0.3)
# 图3:政策情景比较
plt.subplot(2, 3, 3)
metrics = ['高端芯片进口', '高端福利损失', '高端安全指数']
base_vals = [
base_scenario['高端芯片进口'].values[0],
base_scenario['高端福利损失'].values[0],
base_scenario['高端安全指数'].values[0]
]
high_tariff_vals = [
high_tariff_scenario['高端芯片进口'].values[0],
high_tariff_scenario['高端福利损失'].values[0],
high_tariff_scenario['高端安全指数'].values[0]
]
ultra_tariff_vals = [
ultra_tariff_scenario['高端芯片进口'].values[0],
ultra_tariff_scenario['高端福利损失'].values[0],
ultra_tariff_scenario['高端安全指数'].values[0]
]
bar_width = 0.25
index = np.arange(len(metrics))
plt.bar(index - bar_width, base_vals, bar_width,
label=f'基准情景 ({base_tariff}%关税)',
color='#4ECDC4')
plt.bar(index, high_tariff_vals, bar_width,
label=f'高关税情景 ({base_tariff + 15}%关税)',
color='#FFA500')
plt.bar(index + bar_width, ultra_tariff_vals, bar_width,
label='超高关税情景 (50%关税)',
color='#FF6B6B')
plt.title(f'高端芯片政策影响 ({sim_year})', fontsize=14)
plt.xticks(index, ['进口值', '福利损失', '安全指数'], fontsize=11)
plt.ylabel('数值', fontsize=12)
plt.legend(fontsize=10)
plt.grid(axis='y', alpha=0.3)
# 添加数据标签
max_value = max(max(base_vals), max(high_tariff_vals), max(ultra_tariff_vals))
for i, vals in enumerate(zip(base_vals, high_tariff_vals, ultra_tariff_vals)):
plt.text(i - bar_width, vals[0] + max_value * 0.05, f"{vals[0]:.1f}", ha='center', fontsize=9)
plt.text(i, vals[1] + max_value * 0.05, f"{vals[1]:.1f}", ha='center', fontsize=9)
plt.text(i + bar_width, vals[2] + max_value * 0.05, f"{vals[2]:.1f}", ha='center', fontsize=9)
# 图4:效率与安全权衡
plt.subplot(2, 3, 4)
for year in merged_df['Year'].unique():
year_data = merged_df[merged_df['Year'] == year]
if not year_data.empty:
plt.scatter(
year_data['高端福利损失'].mean(),
year_data['高端安全指数'].mean(),
s=200, label=str(year), edgecolors='black', alpha=0.8
)
# 添加年份标签
plt.text(
year_data['高端福利损失'].mean() + 0.2,
year_data['高端安全指数'].mean() + 0.05,
str(year), fontsize=10, ha='left'
)
# 添加超高关税情景点
plt.scatter(
ultra_tariff_scenario['高端福利损失'].values[0],
ultra_tariff_scenario['高端安全指数'].values[0],
s=300, color='red', marker='X', label='50%关税情景', edgecolors='black'
)
# 添加基准点
plt.scatter(
base_scenario['高端福利损失'].values[0],
base_scenario['高端安全指数'].values[0],
s=200, color='blue', label=f'基准情景({base_tariff}%关税)'
)
# 添加高关税点
plt.scatter(
high_tariff_scenario['高端福利损失'].values[0],
high_tariff_scenario['高端安全指数'].values[0],
s=200, color='orange', label=f'高关税情景({base_tariff + 15}%关税)'
)
# 添加连接线
points = [
(base_scenario['高端福利损失'].values[0], base_scenario['高端安全指数'].values[0]),
(high_tariff_scenario['高端福利损失'].values[0], high_tariff_scenario['高端安全指数'].values[0]),
(ultra_tariff_scenario['高端福利损失'].values[0], ultra_tariff_scenario['高端安全指数'].values[0])
]
plt.plot([p[0] for p in points], [p[1] for p in points], 'k--', alpha=0.7)
plt.title('效率与安全权衡 (高端芯片)', fontsize=14)
plt.xlabel('福利损失 (亿美元)', fontsize=12)
plt.ylabel('安全指数', fontsize=12)
plt.legend(fontsize=9)
plt.grid(alpha=0.3)
# 图5:50%高关税对中高端芯片的影响
plt.subplot(2, 3, 5)
# 准备数据
chip_types = ['高端', '中端']
metrics = ['芯片进口', '福利损失']
base_values = {
'高端芯片进口': base_scenario['高端芯片进口'].values[0],
'高端福利损失': base_scenario['高端福利损失'].values[0],
'中端芯片进口': base_scenario['中端芯片进口'].values[0],
'中端福利损失': base_scenario['中端福利损失'].values[0]
}
ultra_values = {
'高端芯片进口': ultra_tariff_scenario['高端芯片进口'].values[0],
'高端福利损失': ultra_tariff_scenario['高端福利损失'].values[0],
'中端芯片进口': ultra_tariff_scenario['中端芯片进口'].values[0],
'中端福利损失': ultra_tariff_scenario['中端福利损失'].values[0]
}
# 计算变化率
changes = {
'高端芯片进口': (ultra_values['高端芯片进口'] - base_values['高端芯片进口']) / base_values[
'高端芯片进口'] * 100,
'高端福利损失': (ultra_values['高端福利损失'] - base_values['高端福利损失']) / base_values[
'高端福利损失'] * 100,
'中端芯片进口': (ultra_values['中端芯片进口'] - base_values['中端芯片进口']) / base_values[
'中端芯片进口'] * 100,
'中端福利损失': (ultra_values['中端福利损失'] - base_values['中端福利损失']) / base_values[
'中端福利损失'] * 100
}
# 绘制组合柱状图
bar_width = 0.35
index = np.arange(len(chip_types))
# 高端芯片变化率
plt.bar(index - bar_width / 2,
[changes['高端芯片进口'], changes['高端福利损失']],
bar_width, color='#FF6B6B', label='高端芯片')
# 中端芯片变化率
plt.bar(index + bar_width / 2,
[changes['中端芯片进口'], changes['中端福利损失']],
bar_width, color='#4ECDC4', label='中端芯片')
plt.title('50%高关税对中高端芯片的影响(%)', fontsize=14)
plt.xticks(index, ['进口量变化', '福利损失变化'], fontsize=11)
plt.ylabel('变化百分比(%)', fontsize=12)
plt.axhline(0, color='gray', linestyle='--', alpha=0.7) # 零基准线
plt.legend(fontsize=10)
plt.grid(axis='y', alpha=0.3)
# 添加数据标签
for i, chip in enumerate(chip_types):
plt.text(i - bar_width / 2, changes[f'{chip}芯片进口'] + (1 if changes[f'{chip}芯片进口'] > 0 else -5),
f"{changes[f'{chip}芯片进口']:.1f}%", ha='center', fontsize=9)
plt.text(i - bar_width / 2, changes[f'{chip}福利损失'] + (1 if changes[f'{chip}福利损失'] > 0 else -5),
f"{changes[f'{chip}福利损失']:.1f}%", ha='center', fontsize=9)
plt.text(i + bar_width / 2, changes[f'中端芯片进口'] + (1 if changes[f'中端芯片进口'] > 0 else -5),
f"{changes['中端芯片进口']:.1f}%", ha='center', fontsize=9)
plt.text(i + bar_width / 2, changes[f'中端福利损失'] + (1 if changes[f'中端福利损失'] > 0 else -5),
f"{changes['中端福利损失']:.1f}%", ha='center', fontsize=9)
# 图6:不同关税水平下的安全-效率权衡
plt.subplot(2, 3, 6)
# 添加基准点
plt.scatter(
base_scenario['高端福利损失'].values[0],
base_scenario['高端安全指数'].values[0],
s=200, color='blue', label=f'基准情景({base_tariff}%关税)'
)
# 添加高关税点
plt.scatter(
high_tariff_scenario['高端福利损失'].values[0],
high_tariff_scenario['高端安全指数'].values[0],
s=200, color='orange', label=f'高关税情景({base_tariff + 15}%关税)'
)
# 添加超高关税情景点
plt.scatter(
ultra_tariff_scenario['高端福利损失'].values[0],
ultra_tariff_scenario['高端安全指数'].values[0],
s=300, color='red', marker='X', label='50%关税情景', edgecolors='black'
)
# 添加连接线
points = [
(base_scenario['高端福利损失'].values[0], base_scenario['高端安全指数'].values[0]),
(high_tariff_scenario['高端福利损失'].values[0], high_tariff_scenario['高端安全指数'].values[0]),
(ultra_tariff_scenario['高端福利损失'].values[0], ultra_tariff_scenario['高端安全指数'].values[0])
]
plt.plot([p[0] for p in points], [p[1] for p in points], 'k--', alpha=0.7)
# 添加箭头标注政策变化方向
plt.annotate('', xy=points[1], xytext=points[0],
arrowprops=dict(arrowstyle="->", color='black', lw=1.5, alpha=0.7))
plt.annotate('', xy=points[2], xytext=points[1],
arrowprops=dict(arrowstyle="->", color='black', lw=1.5, alpha=0.7))
plt.title('不同关税水平下的安全-效率权衡', fontsize=14)
plt.xlabel('福利损失 (亿美元)', fontsize=12)
plt.ylabel('安全指数', fontsize=12)
plt.legend(fontsize=10)
plt.grid(alpha=0.3)
# 添加分析结论文本框
ultra_high_loss = ultra_tariff_scenario['高端福利损失'].values[0]
base_loss = base_scenario['高端福利损失'].values[0]
loss_increase_ultra = (ultra_high_loss - base_loss) / base_loss * 100
ultra_mid_loss = ultra_tariff_scenario['中端福利损失'].values[0]
base_mid_loss = base_scenario['中端福利损失'].values[0]
mid_loss_increase = (ultra_mid_loss - base_mid_loss) / base_mid_loss * 100
high_import_decrease = (ultra_tariff_scenario['高端芯片进口'].values[0] - base_scenario['高端芯片进口'].values[
0]) / base_scenario['高端芯片进口'].values[0] * 100
mid_import_decrease = (ultra_tariff_scenario['中端芯片进口'].values[0] - base_scenario['中端芯片进口'].values[
0]) / base_scenario['中端芯片进口'].values[0] * 100
security_increase = ultra_tariff_scenario['高端安全指数'].values[0] - base_scenario['高端安全指数'].values[0]
analysis_text = (
f"关键分析结论 ({sim_year}年):\n"
f"1. 超高关税影响:关税升至50%后,高端芯片福利损失增加{loss_increase_ultra:.1f}%\n"
f"2. 中端芯片影响:关税升至40%后,中端芯片福利损失增加{mid_loss_increase:.1f}%\n"
f"3. 进口量暴跌:高端芯片进口减少{abs(high_import_decrease):.1f}%,中端减少{abs(mid_import_decrease):.1f}%\n"
f"4. 安全指数变化:从{base_scenario['高端安全指数'].values[0]:.1f}升至{ultra_tariff_scenario['高端安全指数'].values[0]:.1f} (+{security_increase:.1f})\n"
f"5. 边际效应:关税>30%后,每增加10%关税导致福利损失额外增加约15%"
)
plt.figtext(0.12, 0.02, analysis_text, fontsize=12,
bbox=dict(facecolor='whitesmoke', alpha=0.8, edgecolor='grey'))
plt.tight_layout(rect=[0, 0.05, 1, 0.95])
plt.savefig('芯片产业政策分析报告.png', dpi=300, bbox_inches='tight')
print("\n分析完成! 图表已保存为 '芯片产业政策分析报告.png'")
# 7. 输出关键分析结果
print("\n关键分析结论:")
print(f"1. 超高关税影响:关税升至50%后,高端芯片福利损失增加{loss_increase_ultra:.1f}%")
print(f"2. 中端芯片影响:关税升至40%后,中端芯片福利损失增加{mid_loss_increase:.1f}%")
print(f"3. 进口量暴跌:高端芯片进口减少{abs(high_import_decrease):.1f}%,中端减少{abs(mid_import_decrease):.1f}%")
print(
f"4. 安全指数变化:从{base_scenario['高端安全指数'].values[0]:.1f}升至{ultra_tariff_scenario['高端安全指数'].values[0]:.1f} (+{security_increase:.1f})")
print(f"5. 边际效应:关税>30%后,每增加10%关税导致福利损失额外增加约15%")
print("\n政策建议:")
print("- 超高关税(>40%)对高端芯片供应链有显著破坏性影响")
print("- 中端芯片对关税敏感度较低,可作为政策调整缓冲区域")
print("- 安全指数提升幅度有限,应考虑非关税措施提升产业安全")
# 保存处理后的数据
output_path = r"C:\Users\1\Desktop\芯片分析结果.xlsx"
merged_df.to_excel(output_path, index=False)
print(f"处理后的数据已保存到: {output_path}")
return 0
except Exception as e:
print(f"\n发生错误: {str(e)}")
import traceback
traceback.print_exc()
print("请检查: 1. Excel文件路径 2. 工作表名称 3. 列名匹配 4. 数据完整性")
return 1
if __name__ == "__main__":
print("=" * 50)
print("芯片产业政策影响分析系统 v8.0 (含50%关税情景分析)")
print("=" * 50)
exit_code = main()
print("\n程序执行完成! 退出代码:", exit_code)
exit(exit_code)
代码中做出的图的文字都需要使用英文来表示
最新发布