File size: 5,111 Bytes
abf5292
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6fc6c55
 
 
 
 
 
 
abf5292
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43703d2
 
abf5292
43703d2
abf5292
 
43703d2
 
abf5292
 
43703d2
 
abf5292
 
43703d2
 
abf5292
 
43703d2
 
abf5292
 
43703d2
 
abf5292
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
def format_number_for_table(value):
    """用于表格的数字格式化:自动 B/M,保留适当小数"""
    if value is None or value == 0:
        return "0"
    if abs(value) >= 1_000_000_000:
        num = value / 1_000_000_000
        if num.is_integer():
            return f"{int(num)}B"
        else:
            return f"{num:.2f}B".rstrip('0').rstrip('.')
    elif abs(value) >= 1_000_000:
        num = value / 1_000_000
        if num.is_integer():
            return f"{int(num)}M"
        else:
            return f"{num:.1f}M".rstrip('0').rstrip('.')
    else:
        return f"{value:,.1f}".rstrip('0').rstrip('.')

def safe_float_or_zero(val):
    if val is None:
        return 0.0
    try:
        return float(val)
    except (ValueError, TypeError):
        return 0.0

def calculate_yoy_rate(current, previous):
    if previous == 0:
        return "+0.0%" if current >= 0 else "-0.0%"
    rate = (current - previous) / abs(previous) * 100
    sign = "+" if rate >= 0 else "-"
    return f"{sign}{abs(rate):.1f}%"

def build_table_format(three_year_data):
    # 按 fiscal_year 降序排列(最新在前)
    sorted_data = sorted(three_year_data, key=lambda x: x["fiscal_year"], reverse=True)
    
    # ✅ 生成年份标签:FY类型格式为"FY 2025",季度格式为"2025 Q3"
    year_labels = []
    for item in sorted_data:
        if item['level'] == 'FY':
            year_labels.append(f"FY {item['fiscal_year']}")
        else:
            year_labels.append(f"{item['fiscal_year']} {item['level']}")
    
    # 提取数值(确保至少三年,不足用 0 补齐)
    while len(sorted_data) < 3:
        sorted_data.append({
            "fiscal_year": 0,
            "level": "N/A",
            "total_revenue": 0,
            "net_income": 0,
            "earnings_per_share": 0.0,
            "operating_expenses": 0,
            "operating_cash_flow": 0
        })
        year_labels.append("N/A")

    # 取前三
    y0, y1, y2 = sorted_data[0], sorted_data[1], sorted_data[2]

    # 构建 list_data
    list_data = [
        ["Category"] + year_labels[:3],
        ["Total Revenue",
         format_number_for_table(safe_float_or_zero(y0["total_revenue"])),
         format_number_for_table(safe_float_or_zero(y1["total_revenue"])),
         format_number_for_table(safe_float_or_zero(y2["total_revenue"]))],
        ["Net Income",
         format_number_for_table(safe_float_or_zero(y0["net_income"])),
         format_number_for_table(safe_float_or_zero(y1["net_income"])),
         format_number_for_table(safe_float_or_zero(y2["net_income"]))],
        ["Earnings Per Share",
         f"{safe_float_or_zero(y0['earnings_per_share']):.2f}",
         f"{safe_float_or_zero(y1['earnings_per_share']):.2f}",
         f"{safe_float_or_zero(y2['earnings_per_share']):.2f}"],
        ["Operating Expenses",
         format_number_for_table(safe_float_or_zero(y0["operating_expenses"])),
         format_number_for_table(safe_float_or_zero(y1["operating_expenses"])),
         format_number_for_table(safe_float_or_zero(y2["operating_expenses"]))],
        ["Operating Cash Flow",
         format_number_for_table(safe_float_or_zero(y0["operating_cash_flow"])),
         format_number_for_table(safe_float_or_zero(y1["operating_cash_flow"])),
         format_number_for_table(safe_float_or_zero(y2["operating_cash_flow"]))]
    ]

    # 构建 yoy_rates(三列:y0 vs y1, y1 vs y2, y2 vs y3)
    # 注意:第三年没有更早的年份来比较,所以显示"--"
    yoy_rates = [
        ["Category"] + year_labels[:3],  # 三年的标签
        ["Total Revenue",
         calculate_yoy_rate(safe_float_or_zero(y0["total_revenue"]), safe_float_or_zero(y1["total_revenue"])),
         calculate_yoy_rate(safe_float_or_zero(y1["total_revenue"]), safe_float_or_zero(y2["total_revenue"])),
         "--"],  # 最早一年没有更早的数据来比较
        ["Net Income",
         calculate_yoy_rate(safe_float_or_zero(y0["net_income"]), safe_float_or_zero(y1["net_income"])),
         calculate_yoy_rate(safe_float_or_zero(y1["net_income"]), safe_float_or_zero(y2["net_income"])),
         "--"],
        ["Earnings Per Share",
         calculate_yoy_rate(safe_float_or_zero(y0["earnings_per_share"]), safe_float_or_zero(y1["earnings_per_share"])),
         calculate_yoy_rate(safe_float_or_zero(y1["earnings_per_share"]), safe_float_or_zero(y2["earnings_per_share"])),
         "--"],
        ["Operating Expenses",
         calculate_yoy_rate(safe_float_or_zero(y0["operating_expenses"]), safe_float_or_zero(y1["operating_expenses"])),
         calculate_yoy_rate(safe_float_or_zero(y1["operating_expenses"]), safe_float_or_zero(y2["operating_expenses"])),
         "--"],
        ["Operating Cash Flow",
         calculate_yoy_rate(safe_float_or_zero(y0["operating_cash_flow"]), safe_float_or_zero(y1["operating_cash_flow"])),
         calculate_yoy_rate(safe_float_or_zero(y1["operating_cash_flow"]), safe_float_or_zero(y2["operating_cash_flow"])),
         "--"]
    ]

    return {
        "list_data": list_data,
        "yoy_rates": yoy_rates
    }