"""4f 课后练习：字符串与真题文本处理。

要求：
1. 只修改 TODO 标记的位置。
2. 每个结果先预测，再运行并解释。
3. 计算过程中保留数值类型，只在最终展示时格式化。
"""

import pandas as pd


print("=" * 68)
print("第一部分：数字文本与精确匹配")

quantity_text = "125"
# TODO 1：把 quantity_text 转换为整数，再乘以价格 19.9。
quantity = 0
sales = quantity * 19.9
print("销售数量：", quantity, type(quantity))
print("销售总价：", sales)

gender = "女 "
# TODO 2：删除 gender 两端空白，使下面的比较结果为 True。
clean_gender = gender
print("原始值：", repr(gender))
print("是否为女：", clean_gender == "女")


print("\n第二部分：替换、分割与拼接")

project = " 加:期初现金及现金等价物余额 "


def normalize_project(text):
    """删除两端空白，并把英文冒号替换为中文冒号。"""
    # TODO 3：使用 strip() 和 replace() 返回标准项目名。
    return text


print(normalize_project(project))

order_code = "2024-East-0018"
# TODO 4：按连字符拆分 order_code，并使用下划线重新拼接。
parts = []
rebuilt_code = "请修改"
print("拆分结果：", parts)
print("重新拼接：", rebuilt_code)


print("\n第三部分：格式化与处理顺序")


def format_percent(value):
    """把数值格式化为保留两位小数的百分比文本。"""
    # TODO 5：使用 f-string，66.6667 应返回 66.67%。
    return "请修改"


print("占比：", format_percent(66.6667))

amount = 12.3
# TODO 6：分别保存 round(amount, 2) 的数值结果和固定两位的文本结果。
rounded_amount = amount
display_amount = "请修改"
print("round 结果：", rounded_amount, type(rounded_amount))
print("固定两位：", display_amount, type(display_amount))

rates = [9.5, 10.0]
# TODO 7：先用数值求最大值，再格式化；不要先转成带百分号的字符串。
largest_rate = 0
largest_rate_text = "请修改"
print("最大占比：", largest_rate_text)


print("\n第四部分：科图真题微案例")

payment_data = pd.DataFrame(
    {
        "年": [2023, 2023, 2023, 2023, 2023, 2023, 2023],
        "区域分布": ["华东", "华东", "华东", "华北", "华北", "华北", "华北"],
        "付款方式": ["支付宝", "支付宝 ", "微信", "微信", "微信 ", "银行卡", "微信"],
    }
)


def top_payment_by_region(df):
    """返回每个年份和区域占比最高的付款方式，最后格式化占比。"""
    work = df.copy()
    # TODO 8：完成以下步骤。
    # 1. 清理“付款方式”两端空白。
    # 2. 按“年、区域分布”分组，计算付款方式组内占比并乘 100。
    # 3. 每组只保留占比最大的付款方式。
    # 4. 最后把占比格式化为保留两位小数的百分比文本。
    return pd.DataFrame(columns=["年", "区域分布", "付款方式", "占比"])


print(top_payment_by_region(payment_data))


print("\n第五部分：青娅真题微案例")

cashflow_data = pd.DataFrame(
    {
        "项目": [
            " 加：期初现金及现金等价物余额 ",
            "五、现金及现金等价物净增加额",
            "经营活动产生的现金流量净额",
        ],
        "2022年度": [12.3, 4.0, 22.678],
        "2021年度": [None, 5.126, 18.0],
        "2020年度": [8.0, None, 16.2],
    }
)


def select_cashflow_rows(df):
    """筛选两个目标项目，并生成固定两位小数的导出副本。"""
    work = df.copy()
    targets = [
        "加：期初现金及现金等价物余额",
        "五、现金及现金等价物净增加额",
    ]
    amount_columns = ["2022年度", "2021年度", "2020年度"]
    # TODO 9：清理“项目”，使用 isin(targets) 筛选，金额缺失填 0。
    # TODO 10：所有数值处理结束后，把导出副本的金额列格式化为两位文本。
    return work.iloc[0:0].copy()


print(select_cashflow_rows(cashflow_data).to_string(index=False))


print("\n第六部分：自检")

# TODO 11：解释为什么百分比必须最后格式化。
# 解释：

# TODO 12：解释 text.strip() 和 series.str.strip() 的使用对象差异。
# 解释：

# 自检：
# [ ] 能区分数字文本与数值。
# [ ] 能用 repr() 发现隐藏空白。
# [ ] 知道字符串方法返回新字符串。
# [ ] 能输出 12.30 和 66.67%。
# [ ] 科图微案例先选最大值、后格式化。
# [ ] 青娅微案例先清理项目名、后精确筛选。
