310 lines
9.1 KiB
Python
310 lines
9.1 KiB
Python
|
|
"""
|
|||
|
|
预设图表配置库
|
|||
|
|
|
|||
|
|
包含常用的图表配置,可直接用于模板替换
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from pptx.enum.chart import XL_LEGEND_POSITION
|
|||
|
|
from ..chart_builder.layout import ChartLayoutConfig, LegendConfig, ValueAxisConfig
|
|||
|
|
from ..chart_builder.styles import StyleConfig
|
|||
|
|
from ..chart_builder.date_axis import DateAxisConfig
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ============================================================================
|
|||
|
|
# 预设图表配置
|
|||
|
|
# ============================================================================
|
|||
|
|
|
|||
|
|
def get_chart1_config(df):
|
|||
|
|
"""
|
|||
|
|
图表1:当年收益率走势(柱状图+折线图)
|
|||
|
|
|
|||
|
|
特点:
|
|||
|
|
- 柱状图(沪深300指数,右轴)
|
|||
|
|
- 折线图(组合收益率,左轴)
|
|||
|
|
- 日期轴:2024/01 格式
|
|||
|
|
- 双轴配置
|
|||
|
|
"""
|
|||
|
|
label_interval = len(df) // 7
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
"df": df,
|
|||
|
|
"categories_col": "分类",
|
|||
|
|
"series_config": [
|
|||
|
|
{
|
|||
|
|
'name': '沪深300指数(收盘价)',
|
|||
|
|
'key': '沪深300指数(收盘价)',
|
|||
|
|
'type': 'bar',
|
|||
|
|
'axis': 'secondary'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
'name': '组合收益率(左轴)',
|
|||
|
|
'key': '组合收益率(左轴)',
|
|||
|
|
'type': 'line',
|
|||
|
|
'axis': 'primary'
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
"style_config": StyleConfig(
|
|||
|
|
color_scheme="aim00",
|
|||
|
|
line_width_pt=2.0,
|
|||
|
|
marker_style="none",
|
|||
|
|
),
|
|||
|
|
"layout_config": ChartLayoutConfig(
|
|||
|
|
title="组合2024年以来收益率走势图",
|
|||
|
|
legend_config=LegendConfig(
|
|||
|
|
position=XL_LEGEND_POSITION.TOP,
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
),
|
|||
|
|
value_axis_config=ValueAxisConfig(
|
|||
|
|
number_format="0%",
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
has_major_gridlines=False,
|
|||
|
|
),
|
|||
|
|
secondary_value_axis_config=ValueAxisConfig(
|
|||
|
|
number_format="#,##0",
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
has_major_gridlines=False,
|
|||
|
|
min_value=2950,
|
|||
|
|
max_value=4450,
|
|||
|
|
major_unit=200,
|
|||
|
|
),
|
|||
|
|
date_axis_config=DateAxisConfig(
|
|||
|
|
major_unit=label_interval,
|
|||
|
|
number_format='yyyy/mm',
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_chart2_config(df):
|
|||
|
|
"""
|
|||
|
|
图表2:组合成立以来收益率走势(面积图+折线图)
|
|||
|
|
|
|||
|
|
特点:
|
|||
|
|
- 面积图(组合规模,右轴)
|
|||
|
|
- 折线图(累计收益率,左轴)
|
|||
|
|
- 长期数据(2013-2024,2800+个点)
|
|||
|
|
- 日期轴自动间隔
|
|||
|
|
"""
|
|||
|
|
label_interval = len(df) // 7
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
"df": df,
|
|||
|
|
"categories_col": "分类",
|
|||
|
|
"series_config": [
|
|||
|
|
{
|
|||
|
|
'name': '组合规模(万元)',
|
|||
|
|
'key': '组合规模(万元)',
|
|||
|
|
'type': 'area',
|
|||
|
|
'axis': 'secondary'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
'name': '累计收益率',
|
|||
|
|
'key': '累计收益率',
|
|||
|
|
'type': 'line',
|
|||
|
|
'axis': 'primary'
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
"style_config": StyleConfig(
|
|||
|
|
color_scheme="aim00",
|
|||
|
|
line_width_pt=2.0,
|
|||
|
|
marker_style="none",
|
|||
|
|
),
|
|||
|
|
"layout_config": ChartLayoutConfig(
|
|||
|
|
title="组合成立以来收益率走势",
|
|||
|
|
legend_config=LegendConfig(
|
|||
|
|
position=XL_LEGEND_POSITION.TOP,
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
),
|
|||
|
|
value_axis_config=ValueAxisConfig(
|
|||
|
|
number_format="0%",
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
has_major_gridlines=True,
|
|||
|
|
),
|
|||
|
|
secondary_value_axis_config=ValueAxisConfig(
|
|||
|
|
number_format="#,##0",
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
has_major_gridlines=False,
|
|||
|
|
min_value=0,
|
|||
|
|
max_value=160000,
|
|||
|
|
major_unit=24000,
|
|||
|
|
),
|
|||
|
|
date_axis_config=DateAxisConfig(
|
|||
|
|
major_unit=label_interval,
|
|||
|
|
number_format='yyyy/mm',
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_chart3_config(df):
|
|||
|
|
"""
|
|||
|
|
图表3:权益仓位走势(面积图+折线图)
|
|||
|
|
|
|||
|
|
特点:
|
|||
|
|
- 面积图(沪深300指数,右轴)
|
|||
|
|
- 折线图(权益仓位,左轴)
|
|||
|
|
- 百分比格式
|
|||
|
|
"""
|
|||
|
|
label_interval = len(df) // 7
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
"df": df,
|
|||
|
|
"categories_col": "分类",
|
|||
|
|
"series_config": [
|
|||
|
|
{
|
|||
|
|
'name': '沪深300指数(收盘价)',
|
|||
|
|
'key': '沪深300指数(收盘价)',
|
|||
|
|
'type': 'area',
|
|||
|
|
'axis': 'secondary'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
'name': '权益仓位(人社部口径)',
|
|||
|
|
'key': '权益仓位(人社部口径)',
|
|||
|
|
'type': 'line',
|
|||
|
|
'axis': 'primary'
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
"style_config": StyleConfig(
|
|||
|
|
color_scheme="aim00",
|
|||
|
|
line_width_pt=2.0,
|
|||
|
|
marker_style="none",
|
|||
|
|
),
|
|||
|
|
"layout_config": ChartLayoutConfig(
|
|||
|
|
title="组合权益仓位走势图",
|
|||
|
|
legend_config=LegendConfig(
|
|||
|
|
position=XL_LEGEND_POSITION.TOP,
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
),
|
|||
|
|
value_axis_config=ValueAxisConfig(
|
|||
|
|
number_format="0%",
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
has_major_gridlines=False,
|
|||
|
|
min_value=0.15,
|
|||
|
|
max_value=0.30,
|
|||
|
|
),
|
|||
|
|
secondary_value_axis_config=ValueAxisConfig(
|
|||
|
|
number_format="#,##0",
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
has_major_gridlines=False,
|
|||
|
|
min_value=2950,
|
|||
|
|
max_value=4450,
|
|||
|
|
major_unit=200,
|
|||
|
|
),
|
|||
|
|
date_axis_config=DateAxisConfig(
|
|||
|
|
major_unit=label_interval,
|
|||
|
|
number_format='yyyy/mm',
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_chart4_config(df):
|
|||
|
|
"""
|
|||
|
|
图表4:久期走势(柱状图+折线图)
|
|||
|
|
|
|||
|
|
特点:
|
|||
|
|
- 柱状图(中债指数,右轴)
|
|||
|
|
- 折线图(久期,左轴)
|
|||
|
|
- 两位小数格式
|
|||
|
|
"""
|
|||
|
|
label_interval = len(df) // 7
|
|||
|
|
|
|||
|
|
# 动态计算右轴范围
|
|||
|
|
bond_index_data = df['中债新综合总财富指数(收盘价)']
|
|||
|
|
bond_min = bond_index_data.min()
|
|||
|
|
bond_max = bond_index_data.max()
|
|||
|
|
bond_range = bond_max - bond_min
|
|||
|
|
bond_unit = bond_range / 6
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
"df": df,
|
|||
|
|
"categories_col": "分类",
|
|||
|
|
"series_config": [
|
|||
|
|
{
|
|||
|
|
'name': '中债新综合总财富指数(收盘价)',
|
|||
|
|
'key': '中债新综合总财富指数(收盘价)',
|
|||
|
|
'type': 'bar',
|
|||
|
|
'axis': 'secondary'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
'name': '久期',
|
|||
|
|
'key': '久期',
|
|||
|
|
'type': 'line',
|
|||
|
|
'axis': 'primary'
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
"style_config": StyleConfig(
|
|||
|
|
color_scheme="aim00",
|
|||
|
|
line_width_pt=2.0,
|
|||
|
|
marker_style="none",
|
|||
|
|
),
|
|||
|
|
"layout_config": ChartLayoutConfig(
|
|||
|
|
title="组合久期走势图",
|
|||
|
|
legend_config=LegendConfig(
|
|||
|
|
position=XL_LEGEND_POSITION.TOP,
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
),
|
|||
|
|
value_axis_config=ValueAxisConfig(
|
|||
|
|
number_format="0.00",
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
has_major_gridlines=False,
|
|||
|
|
min_value=0.2,
|
|||
|
|
max_value=1.0,
|
|||
|
|
),
|
|||
|
|
secondary_value_axis_config=ValueAxisConfig(
|
|||
|
|
number_format="#,##0.00",
|
|||
|
|
font_size_pt=9,
|
|||
|
|
font_name="黑体",
|
|||
|
|
has_major_gridlines=False,
|
|||
|
|
min_value=int(bond_min - bond_unit),
|
|||
|
|
max_value=int(bond_max + bond_unit),
|
|||
|
|
major_unit=int(bond_unit),
|
|||
|
|
),
|
|||
|
|
date_axis_config=DateAxisConfig(
|
|||
|
|
major_unit=label_interval,
|
|||
|
|
number_format='yyyy/mm',
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ============================================================================
|
|||
|
|
# 预设图表映射
|
|||
|
|
# ============================================================================
|
|||
|
|
|
|||
|
|
CHART_PRESET_FUNCTIONS = {
|
|||
|
|
"图表1 - 当年收益率走势": get_chart1_config,
|
|||
|
|
"图表2 - 成立以来收益率": get_chart2_config,
|
|||
|
|
"图表3 - 权益仓位走势": get_chart3_config,
|
|||
|
|
"图表4 - 久期走势": get_chart4_config,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_chart_config(chart_key: str, df):
|
|||
|
|
"""
|
|||
|
|
获取图表配置
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
chart_key: 图表键名
|
|||
|
|
df: DataFrame
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
图表配置字典
|
|||
|
|
"""
|
|||
|
|
if chart_key in CHART_PRESET_FUNCTIONS:
|
|||
|
|
return CHART_PRESET_FUNCTIONS[chart_key](df)
|
|||
|
|
else:
|
|||
|
|
raise ValueError(f"未找到图表配置: {chart_key}")
|
|||
|
|
|