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

import pandas as pd


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

quantity_text = "125"
quantity = int(quantity_text)
sales = quantity * 19.9
print("销售数量：", quantity, type(quantity))
print("销售总价：", sales)

gender = "女 "
clean_gender = gender.strip()
print("原始值：", repr(gender))
print("是否为女：", clean_gender == "女")


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

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


def normalize_project(text):
    """删除两端空白，并把英文冒号替换为中文冒号。"""
    return text.strip().replace(":", "：")


print(normalize_project(project))

order_code = "2024-East-0018"
parts = order_code.split("-")
rebuilt_code = "_".join(parts)
print("拆分结果：", parts)
print("重新拼接：", rebuilt_code)


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


def format_percent(value):
    """把数值格式化为保留两位小数的百分比文本。"""
    return f"{value:.2f}%"


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

amount = 12.3
rounded_amount = round(amount, 2)
display_amount = f"{amount:.2f}"
print("round 结果：", rounded_amount, type(rounded_amount))
print("固定两位：", display_amount, type(display_amount))

rates = [9.5, 10.0]
largest_rate = max(rates)
largest_rate_text = format_percent(largest_rate)
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()
    work["付款方式"] = work["付款方式"].astype(str).str.strip()

    grouped = work.groupby(["年", "区域分布"])
    result = (
        grouped["付款方式"]
        .value_counts(normalize=True)
        .mul(100)
        .rename("占比")
        .reset_index()
    )
    result = result.loc[
        result.groupby(["年", "区域分布"])["占比"].idxmax()
    ].copy()
    result = result.sort_values(["年", "区域分布"]).reset_index(drop=True)
    result["占比"] = result["占比"].map(format_percent)
    return result


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年度"]

    work["项目"] = work["项目"].astype(str).str.strip()
    selected = work.loc[work["项目"].isin(targets)].copy()
    selected[amount_columns] = selected[amount_columns].fillna(0).round(2)

    export_rows = selected.copy()
    for column in amount_columns:
        export_rows[column] = export_rows[column].map(lambda value: f"{value:.2f}")
    return export_rows


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


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

# 百分比格式化后会变成字符串；字符串按字符顺序比较，不能保证数值大小顺序，
# 也不便继续求和或平均，所以应先完成计算、排序和筛选，再格式化。
# text.strip() 处理一个普通字符串；series.str.strip() 通过 pandas 的 .str
# 访问器处理 Series 中的每个文本元素。
