""" 预设图表配置库 包含常用的图表配置,可直接用于模板替换 """ 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}")