数据分析(财报分析) · 第 1 课

把表格变成「会算的东西」

用 pandas 从格力的 6 年真实年报数据里,算出一条指标趋势。

这一课的赢

打开终端,敲 4 行代码,得到格力 2020–2025 年每一年的归母净利率,并能说出一句关于趋势的结论。

先看数据是什么

本课用的是真数据:格力电器(000651)2020–2025 六个年报的关键科目,单位统一为亿元

文件在 assets/data/000651-格力-年报关键数据.csv,长这样:

年份,营业总收入_亿元,归母净利润_亿元,经营现金流净额_亿元
2020,1705.0,221.8,192.4
2021,1896.5,230.6,18.9
2022,1901.5,245.1,286.7
2023,2050.2,290.2,564.0
2024,1900.4,321.8,293.7
2025,1711.2,290.0,463.8

来源:东方财富财务摘要,经 AKShare 1.15.87 stock_financial_abstract 导出,导出日 2026-09-24。 任何数字的最终裁决地是巨潮资讯网的年报原文。

三个概念,足够开始

① DataFrame = 一张有列名的表

你在 Excel 里的那张表,在 pandas 里叫 DataFrame。第一行是列名,左边那串 0 1 2 3 4 5行号(行号在 pandas 里叫「索引」,index)。

② Series = 表里的一整列

用列名把一列取出来,得到的不是数字,是「一整列」,叫 Series。记住这一点——第 3 个概念就靠它。

③ 关键:整列一起算(不写循环)

这是 pandas 和普通 Python 最不一样的地方,也是它取代 Excel 手工拉公式的原因:

# 两列“对齐着”一起算,一行算完所有年份
df["归母净利率_%"] = df["归母净利润_亿元"] / df["营业总收入_亿元"] * 100

你没写任何 for 循环,但它把 6 个年份全算了。这个特性叫向量化运算,是后面所有指标计算的地基。

为什么这比 Excel 强

Excel 里你要把公式往下拖,表一变就得重拖。这里公式写在列名上,不写在单元格上——以后换成 20 家公司、20 年数据,这行代码一个字都不用改。

动手(这一步才是真的在学)

  1. 打开终端,进工作区,启动 Python
    cd ~/Learning/数据分析
    python3

    看到 >>> 就对了。这是交互式 Python,每敲一行立刻看到结果——反馈最快的学习方式。

  2. 把两句话敲进去
    import pandas as pd
    df = pd.read_csv("assets/data/000651-格力-年报关键数据.csv")
    df

    第二行把 CSV 读成 DataFrame(pd 是 pandas 的通用简称,df 是「dataframe」的习惯命名)。第三行让它显示出来。

    你该看到:6 行 4 列,左边有 0–5 的行号。看到这个,说明你已经在用 pandas 了。

  3. 取出一列,造出一列
    # 取一列看看它长什么样
    df["营业总收入_亿元"]
    
    # 算归母净利率:造一列新的
    df["归母净利率_%"] = (df["归母净利润_亿元"] / df["营业总收入_亿元"] * 100).round(1)
    
    # 只看关心的两列
    df[["年份", "归母净利率_%"]]

    第 2 步的写法 df["新列名"] = 算式 就是「新增一列」——pandas 里没有「插入列」这种操作,赋值就是新增。这个习惯要改过来。

  4. 核对结果,然后说一句话

    你的输出应该是:13.0 → 12.2 → 12.9 → 14.2 → 16.9 → 16.9(%)。

    然后回答自己一个问题:这六年,格力的净利率在往上还是往下?

卡住了?

报错 FileNotFoundError:说明当前目录不对。终端里敲 pwd 确认是不是 /Users/mac/Learning/数据分析;路径是相对的(assets/…),必须在工作区根目录下运行。

报错 ModuleNotFoundError: No module named 'pandas':用 which python3 确认是 /opt/miniconda3/bin/python3

数字对不上但差不多:检查是不是漏了 * 100,或者括号套错了位置。

自查:回忆,不要往上翻

下面三题请凭记忆答。看起来很简单的题才最能暴露「其实没记住」——这就是存储强度的意义。

df["营业总收入_亿元"] 得到的是什么?

不算 for 循环、不逐行处理,那 df["a"] / df["b"] 是怎么算完 6 个年份的?

格力 2025 年的归母净利率是多少?(填数字,保留一位小数)

一句话结论

你现在可以说了:格力 2020–2025 年归母净利率从 13.0% 升到 16.9%,期间收入从 1705 亿先升到 2050 亿、再回落到 1711 亿——但利润率没有跟着掉,反而到了六年最高。

这就是财报分析里最值钱的一句话形态:不是"净利率 16.9%",而是"它在什么背景下变化"。收入下降、利润率反升,本身就值得追问一句为什么(产品结构?成本?还是别的)。

先别急着下判断

这一课你只算了一个指标,而且只算了一家公司。单点指标不足以支撑结论——要跟同行比、要看好几年、还要看现金流是否跟上(表里第三列就是为下一课准备的)。第 4 课会专门讲"指标对不上/看不懂"时怎么往下查。

你的参考资料与下一步

下一课预告:不再用手工导出的 CSV——用 akshare 自己拉数据,处理它返回的"横着的宽表"(行是指标、列是报告期),并装上第一道防错:确认你拿到的确实是年报口径。

我是你的老师,卡住就直接问。可以问:某个报错看不懂、某行代码为什么这么写、想多加一列(比如毛利率)该怎么改、或者"这个指标到底该不该这么算"。不用怕问题太基础。