aoi学院

Aisaka's Blog, School of Aoi, Aisaka University

Python-第11篇《简单的数据分析》

📖 开篇语

还记得第一次用Excel做月度报表的情景吗?

选中数据 → 点击求和 → 插入图表 → 拖拽生成数据透视表
“哇,原来数据分析这么简单!”

今天我们要学的,就是用Python做这些“简单”的数据分析。

你会发现:

  • 一行代码就能完成复杂的分组统计
  • 自动处理几万行数据,再也不用手动拖拽

🎯 今日学习目标

  • 掌握基础统计运算(求和、平均、最大最小值)
  • 学会分组统计(比数据透视表更快)
  • 实战月度支出分析(自动生成分析报告)

🧮 基础统计运算:数据分析的基石

创建示例数据:月度支出表

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
import pandas as pd
import numpy as np

# 创建真实的月度支出数据
np.random.seed(42) # 保证结果可重复

# 生成3个月的支出数据
日期范围 = pd.date_range('2024-01-01', '2024-03-31', freq='D')
支出类别 = ['餐饮', '交通', '购物', '娱乐', '住房', '医疗', '教育', '其他']
支出方式 = ['现金', '支付宝', '微信', '银行卡']

月度支出 = []
for 日期 in 日期范围:
# 每天1-3笔支出
日支出笔数 = np.random.randint(1, 4)

for _ in range(日支出笔数):
类别 = np.random.choice(支出类别)
方式 = np.random.choice(支出方式)
金额 = np.random.randint(10, 501) # 10-500元随机支出

月度支出.append({
'日期': 日期,
'类别': 类别,
'方式': 方式,
'金额': 金额,
'备注': f'{类别}消费'
})

# 创建DataFrame
df = pd.DataFrame(月度支出)
df['月份'] = df['日期'].dt.month
df['星期'] = df['日期'].dt.day_name()
df['是否周末'] = df['日期'].dt.dayofweek >= 5

print("📊 月度支出数据预览:")
print(df.head(10))
print(f"\n数据形状:{df.shape}")

基础统计运算(比Excel函数更强大)

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
print("=== 基础统计运算 ===")

# 总支出
总支出 = df['金额'].sum()
print(f"💰 总支出:{总支出:,}元")

# 平均支出
平均支出 = df['金额'].mean()
print(f"📊 平均支出:{平均支出:.2f}元/笔")

# 最大/最小支出
最大支出 = df['金额'].max()
最小支出 = df['金额'].min()
print(f"🔝 最大支出:{最大支出}元")
print(f"🔻 最小支出:{最小支出}元")

# 支出笔数
总笔数 = df['金额'].count()
print(f"📝 总支出笔数:{总笔数}笔")

# 标准差(支出波动)
支出标准差 = df['金额'].std()
print(f"📈 支出标准差:{支出标准差:.2f}元")

# 中位数(比平均数更稳定)
支出中位数 = df['金额'].median()
print(f"⚖️ 支出中位数:{支出中位数}元")

# 分位数分析
q25 = df['金额'].quantile(0.25) # 25%分位
q75 = df['金额'].quantile(0.75) # 75%分位
print(f"📊 支出分位数:25%={q25}元,75%={q75}元")

# 描述性统计(一键生成所有统计指标)
print("\n📋 描述性统计汇总:")
print(df['金额'].describe())

按条件统计(比Excel筛选更智能)

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
print("\n=== 条件统计分析 ===")

# 周末vs工作日支出对比
周末支出 = df[df['是否周末']]['金额'].sum()
工作日支出 = df[~df['是否周末']]['金额'].sum()
print(f"周末支出:{周末支出:,}元")
print(f"工作日支出:{工作日支出:,}元")
print(f"周末日均:{周末支出 / df[df['是否周末']]['金额'].count():.2f}元/天")
print(f"工作日日均:{工作日支出 / df[~df['是否周末']]['金额'].count():.2f}元/天")

# 大额支出分析(>200元)
大额支出 = df[df['金额'] > 200]
大额支出统计 = {
'总笔数': len(大额支出),
'总金额': 大额支出['金额'].sum(),
'平均金额': 大额支出['金额'].mean(),
'最大金额': 大额支出['金额'].max()
}
print(f"\n💰 大额支出(>200元)统计:")
for 指标, 数值 in 大额支出统计.items():
print(f" {指标}{数值}")

# 小额支出分析(<50元)
小额支出 = df[df['金额'] < 50]
小额支出统计 = {
'总笔数': len(小额支出),
'总金额': 小额支出['金额'].sum(),
'平均金额': 小额支出['金额'].mean(),
'占比': 小额支出['金额'].sum() / df['金额'].sum() * 100
}
print(f"\n🪙 小额支出(<50元)统计:")
for 指标, 数值 in 小额支出统计.items():
if 指标 == '占比':
print(f" {指标}{数值:.1f}%")
else:
print(f" {指标}{数值}")

# 特定日期范围分析(春节期间)
春节开始 = pd.Timestamp('2024-02-08')
春节结束 = pd.Timestamp('2024-02-18')
春节支出 = df[(df['日期'] >= 春节开始) & (df['日期'] <= 春节结束)]
print(f"\n🧧 春节期间支出:{春节支出['金额'].sum():,}元({len(春节支出)}笔)")

📊 分组统计:超级数据透视表

基础分组统计(一行代码搞定)

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
print("\n=== 分组统计分析 ===")

# 按类别统计支出
类别统计 = df.groupby('类别')['金额'].agg(['count', 'sum', 'mean', 'max']).round(2)
类别统计.columns = ['支出笔数', '总支出', '平均支出', '最大支出']
类别统计 = 类别统计.sort_values('总支出', ascending=False)

print("📊 按支出类别统计:")
print(类别统计)

# 按支付方式统计
方式统计 = df.groupby('方式')['金额'].agg(['count', 'sum', 'mean']).round(2)
方式统计.columns = ['使用次数', '总支出', '平均支出']
方式统计 = 方式统计.sort_values('总支出', ascending=False)

print("\n💳 按支付方式统计:")
print(方式统计)

# 按月份统计
月度统计 = df.groupby('月份')['金额'].agg(['count', 'sum', 'mean']).round(2)
月度统计.columns = ['支出笔数', '月度总支出', '平均单笔支出']
月度统计.index = [f"{月}月" forin 月度统计.index]

print("\n📅 按月份统计:")
print(月度统计)

多维度分组(Excel需要多次操作)

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
# 多维度分组统计
print("\n=== 多维度分组分析 ===")

# 类别+支付方式交叉统计
交叉统计 = df.groupby(['类别', '方式'])['金额'].agg(['count', 'sum']).round(2)
交叉统计.columns = ['笔数', '金额']
print("📊 类别×支付方式交叉统计:")
print(交叉统计)

# 重置索引让结果更美观
交叉统计_重置 = df.groupby(['类别', '方式']).agg({
'金额': ['count', 'sum', 'mean'],
'日期': 'count'
}).round(2)
交叉统计_重置.columns = ['支出笔数', '总支出', '平均支出', '天数']
print("\n📋 类别×支付方式详细统计:")
print(交叉统计_重置)

# 按星期和类别统计
星期类别 = df.groupby(['星期', '类别'])['金额'].sum().unstack(fill_value=0)
print("\n📅 星期×类别支出矩阵:")
print(星期类别)

# 计算每个类别的支出占比
类别占比 = df.groupby('类别')['金额'].sum() / df['金额'].sum() * 100
类别占比 = 类别占比.round(1)
print("\n📈 各类别支出占比:")
for 类别, 占比 in 类别占比.items():
print(f" {类别}{占比}%")

高级分组函数(财务专用)

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
# 财务专用分组统计
print("\n=== 财务专用分析 ===")

# 累计支出(类似Excel的累计求和)
日累计支出 = df.groupby('日期')['金额'].sum().cumsum()
print(f"\n📈 累计支出(月末):{日累计支出.iloc[-1]:,}元")

# 滚动平均(7天移动平均)
df_sorted = df.sort_values('日期')
日支出 = df_sorted.groupby('日期')['金额'].sum()
滚动平均 = 日支出.rolling(window=7, min_periods=1).mean()

print(f"\n📊 7天移动平均支出(最新):{滚动平均.iloc[-1]:.2f}元")

# 同比环比分析(需要多月份数据)
# 这里模拟计算日均支出的环比变化
一月数据 = df[df['月份'] == 1]
二月数据 = df[df['月份'] == 2]
三月数据 = df[df['月份'] == 3]

一月日均 = 一月数据.groupby('日期')['金额'].sum().mean()
二月日均 = 二月数据.groupby('日期')['金额'].sum().mean()
三月日均 = 三月_data.groupby('日期')['金额'].sum().mean()

print(f"\n📊 各月日均支出:")
print(f" 1月:{一月日均:.2f}元/天")
print(f" 2月:{二月日均:.2f}元/天")
print(f" 3月:{三月日均:.2f}元/天")

# 计算环比变化
if 二月日均 > 0:
二月环比 = (二月日均 - 一月日均) / 一月日均 * 100
print(f" 2月环比:{二月环比:+.1f}%")

if 三月日均 > 0:
三月环比 = (三月日均 - 二月日均) / 二月日均 * 100
print(f" 3月环比:{三月环比:+.1f}%")

🎯 实战项目:月度支出分析

版本1.0:基础支出分析
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
# 月度支出分析 - 基础版
print("=== 月度支出分析报告 ===")

def 基础支出分析(df):
"""基础支出分析"""

print("📊 生成基础支出分析...")

# 1. 总体支出分析
总分析 = {
'总支出': df['金额'].sum(),
'平均支出': df['金额'].mean(),
'支出笔数': len(df),
'日均支出': df.groupby('日期')['金额'].sum().mean(),
'最大单笔': df['金额'].max(),
'最小单笔': df['金额'].min()
}

print("\n📈 总体支出情况:")
for 指标, 数值 in 总分析.items():
if '金额' in 指标:
print(f" {指标}{数值:,.2f}元")
else:
print(f" {指标}{数值}")

# 2. 分类支出分析
分类分析 = df.groupby('类别').agg({
'金额': ['sum', 'mean', 'count'],
'日期': 'nunique'
}).round(2)

分类分析.columns = ['总支出', '平均支出', '支出笔数', '支出天数']
分类分析 = 分类分析.sort_values('总支出', ascending=False)

print("\n📊 分类支出排名:")
for 类别, 数据 in 分类分析.iterrows():
print(f" {类别}{数据['总支出']:,.2f}元({数据['支出笔数']}笔)")

# 3. 支付方式分析
方式分析 = df.groupby('方式').agg({
'金额': ['sum', 'count'],
'日期': 'nunique'
}).round(2)
方式分析.columns = ['总支出', '使用次数', '使用天数']

print("\n💳 支付方式分析:")
for 方式, 数据 in 方式分析.iterrows():
print(f" {方式}{数据['总支出']:,.2f}元({数据['使用次数']}次)")

# 4. 时间趋势分析
日支出 = df.groupby('日期')['金额'].sum()

print("\n📅 时间趋势分析:")
print(f" 最高单日支出:{日支出.max():,.2f}元({日支出.idxmax().strftime('%m月%d日')})")
print(f" 最低单日支出:{日支出.min():,.2f}元({日支出.idxmin().strftime('%m月%d日')})")

# 周末vs工作日
周末支出 = df[df['是否周末']]['金额'].sum()
工作日支出 = df[~df['是否周末']]['金额'].sum()

print(f"\n📊 周末vs工作日:")
print(f" 周末支出:{周末支出:,.2f}元(占比{周末支出/总分析['总支出']*100:.1f}%)")
print(f" 工作日支出:{工作日支出:,.2f}元(占比{工作日支出/总分析['总支出']*100:.1f}%)")

return {
'总体分析': 总分析,
'分类分析': 分类分析,
'方式分析': 方式分析,
'日支出': 日支出
}

# 执行基础分析
基础结果 = 基础支出分析(df)
版本1.0:基础支出分析
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
# 月度支出分析 - 基础版
print("=== 月度支出分析报告 ===")

def 基础支出分析(df):
"""基础支出分析"""

print("📊 生成基础支出分析...")

# 1. 总体支出分析
总分析 = {
'总支出': df['金额'].sum(),
'平均支出': df['金额'].mean(),
'支出笔数': len(df),
'日均支出': df.groupby('日期')['金额'].sum().mean(),
'最大单笔': df['金额'].max(),
'最小单笔': df['金额'].min()
}

print("\n📈 总体支出情况:")
for 指标, 数值 in 总分析.items():
if '金额' in 指标:
print(f" {指标}{数值:,.2f}元")
else:
print(f" {指标}{数值}")

# 2. 分类支出分析
分类分析 = df.groupby('类别').agg({
'金额': ['sum', 'mean', 'count'],
'日期': 'nunique'
}).round(2)

分类分析.columns = ['总支出', '平均支出', '支出笔数', '支出天数']
分类分析 = 分类分析.sort_values('总支出', ascending=False)

print("\n📊 分类支出排名:")
for 类别, 数据 in 分类分析.iterrows():
print(f" {类别}{数据['总支出']:,.2f}元({数据['支出笔数']}笔)")

# 3. 支付方式分析
方式分析 = df.groupby('方式').agg({
'金额': ['sum', 'count'],
'日期': 'nunique'
}).round(2)
方式分析.columns = ['总支出', '使用次数', '使用天数']

print("\n💳 支付方式分析:")
for 方式, 数据 in 方式分析.iterrows():
print(f" {方式}{数据['总支出']:,.2f}元({数据['使用次数']}次)")

# 4. 时间趋势分析
日支出 = df.groupby('日期')['金额'].sum()

print("\n📅 时间趋势分析:")
print(f" 最高单日支出:{日支出.max():,.2f}元({日支出.idxmax().strftime('%m月%d日')})")
print(f" 最低单日支出:{日支出.min():,.2f}元({日支出.idxmin().strftime('%m月%d日')})")

# 周末vs工作日
周末支出 = df[df['是否周末']]['金额'].sum()
工作日支出 = df[~df['是否周末']]['金额'].sum()

print(f"\n📊 周末vs工作日:")
print(f" 周末支出:{周末支出:,.2f}元(占比{周末支出/总分析['总支出']*100:.1f}%)")
print(f" 工作日支出:{工作日支出:,.2f}元(占比{工作日支出/总分析['总支出']*100:.1f}%)")

return {
'总体分析': 总分析,
'分类分析': 分类分析,
'方式分析': 方式分析,
'日支出': 日支出
}

# 执行基础分析
基础结果 = 基础支出分析(df)
版本2.0:高级分析功能
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
# 月度支出分析 - 高级版
print("\n=== 高级支出分析 ===")

def 高级支出分析(df):
"""高级支出分析"""

print("🔍 执行高级分析...")

# 1. 时间序列分析
print("\n📈 时间序列分析:")

# 日支出趋势
日支出 = df.groupby('日期')['金额'].sum().sort_index()

# 计算趋势指标
支出增长 = 日支出.pct_change().mean() * 100
支出波动 = 日支出.std()
支出趋势 = "上升" if 支出增长 > 0 else "下降"

print(f" 支出趋势:{支出趋势}(日均增长率:{支出增长:.2f}%)")
print(f" 支出波动:{支出波动:.2f}元(标准差)")

# 找支出高峰和低谷
高峰日期 = 日支出.idxmax()
低谷日期 = 日支出.idxmin()
print(f" 支出高峰:{日支出.max():,.2f}元({高峰日期.strftime('%m月%d日')})")
print(f" 支出低谷:{日支出.min():,.2f}元({低谷日期.strftime('%m月%d日')})")

# 2. 异常检测
print("\n⚠️ 异常支出检测:")

# 使用IQR方法检测异常值
Q1 = df['金额'].quantile(0.25)
Q3 = df['金额'].quantile(0.75)
IQR = Q3 - Q1
下限 = Q1 - 1.5 * IQR
上限 = Q3 + 1.5 * IQR

异常支出 = df[(df['金额'] < 下限) | (df['金额'] > 上限)]

print(f" 发现异常支出:{len(异常支出)}笔")
if len(异常支出) > 0:
print(f" 异常支出金额范围:{异常支出['金额'].min():.2f} - {异常支出['金额'].max():.2f}元")
print(f" 异常支出占比:{异常支出['金额'].sum() / df['金额'].sum() * 100:.1f}%")

# 分析异常支出的类别分布
异常类别分布 = 异常支出['类别'].value_counts()
print(f" 异常支出主要类别:{异常类别分布.index[0]}{异常类别分布.iloc[0]}笔)")

# 3. 消费行为分析
print("\n💡 消费行为分析:")

# 消费频次分析
日消费频次 = df.groupby('日期').size()
平均日消费次数 = 日消费频次.mean()
最高日消费次数 = 日消费频次.max()

print(f" 平均日消费次数:{平均日消费次数:.1f}次")
print(f" 最高日消费次数:{最高日消费次数}次")

# 消费集中度分析
20%支出 = df.nlargest(int(len(df) * 0.2), '金额')['金额'].sum()
集中度 = 前20%支出 / df['金额'].sum() * 100

print(f" 前20%支出占总支出:{集中度:.1f}%(帕累托法则)")

if 集中度 > 80:
print(" 💡 消费高度集中,建议关注大额支出")
elif 集中度 < 60:
print(" 💡 消费较为分散,支出管理良好")

# 4. 预测分析(简化版)
print("\n🔮 简单预测分析:")

# 基于历史数据预测下月支出
月度平均 = df.groupby('月份')['金额'].sum().mean()
最近一月 = df[df['月份'] == df['月份'].max()]['金额'].sum()
趋势因子 = 最近一月 / 月度平均

预测下月支出 = 月度平均 * 趋势因子
print(f" 预测下月支出:{预测下月支出:,.2f}元")
print(f" (基于趋势因子:{趋势因子:.2f})")

# 5. 健康度评估
print("\n💚 消费健康度评估:")

# 计算各项健康指标
健康指标 = {
'支出稳定性': (1 - 日支出.std() / 日支出.mean()) * 100,
'预算遵守度': min(100, 100 - abs(日支出.mean() - 200) / 200 * 100), # 假设预算200元/天
'消费多样性': len(df['类别'].unique()) / len(支出类别) * 100,
'理性消费率': (1 - len(df[df['金额'] > 300]) / len(df)) * 100 # 假设300元以上为大额
}

总体健康度 = sum(健康指标.values()) / len(健康指标)

print(f" 总体健康度:{总体健康度:.1f}分")
for 指标, 分值 in 健康指标.items():
print(f" {指标}{分值:.1f}分")

if 总体健康度 >= 80:
print(" 🎉 消费健康状况优秀!")
elif 总体健康度 >= 60:
print(" 👍 消费健康状况良好")
else:
print(" ⚠️ 消费健康状况需要改善")

return {
'日支出': 日支出,
'异常支出': 异常支出,
'健康指标': 健康指标,
'总体健康度': 总体健康度
}

# 执行高级分析
高级结果 = 高级支出分析(df)
版本3.0:专业分析报告
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
# 专业支出分析报告
print("\n=== 专业支出分析报告 ===")

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.chart import LineChart, BarChart, PieChart, Reference
import matplotlib.pyplot as plt

def 生成专业支出报告(df, 文件名="月度支出分析报告.xlsx"):
"""生成专业的支出分析报告"""

print("📊 生成专业报告...")

# 创建工作簿
wb = Workbook()

# 1. 执行汇总表
汇总表 = wb.active
汇总表.title = "执行汇总"

# 标题
汇总表["A1"] = "月度支出分析报告"
汇总表["A1"].font = Font(size=18, bold=True, color="FFFFFF")
汇总表["A1"].fill = PatternFill(start_color="366092", end_color="366092", fill_type="solid")
汇总表.merge_cells("A1:H1")
汇总表["A1"].alignment = Alignment(horizontal="center")

# 基本信息
分析期间 = f"{df['日期'].min().strftime('%Y年%m月%d日')} - {df['日期'].max().strftime('%Y年%m月%d日')}"
汇总表["A3"] = f"分析期间:{分析期间}"
汇总表["A4"] = f"数据记录数:{len(df)}笔"
汇总表["A5"] = f"报告生成时间:{pd.Timestamp.now().strftime('%Y年%m月%d日 %H:%M')}"

# 关键指标
关键指标 = [
["关键指标", "数值", "单位", "环比变化", "健康状况"],
["总支出", f"{df['金额'].sum():,.2f}", "元", "-", "待评估"],
["平均单笔支出", f"{df['金额'].mean():.2f}", "元/笔", "-", "待评估"],
["日均支出", f"{df.groupby('日期')['金额'].sum().mean():.2f}", "元/天", "-", "待评估"],
["支出笔数", f"{len(df):,}", "笔", "-", "待评估"],
["支出类别数", f"{df['类别'].nunique()}", "类", "-", "待评估"],
["支出方式数", f"{df['方式'].nunique()}", "种", "-", "待评估"]
]

起始行 = 7
for 行号, 数据行 in enumerate(关键指标, 起始行):
for 列号, 值 in enumerate(数据行, 1):
单元格 = 汇总表.cell(row=行号, column=列号, value=值)
if 行号 == 起始行:
单元格.font = Font(bold=True)
单元格.fill = PatternFill(start_color="D9E2F3", end_color="D9E2F3", fill_type="solid")

# 2. 分类支出表
分类表 = wb.create_sheet("分类支出分析")

分类表["A1"] = "分类支出分析"
分类表["A1"].font = Font(size=14, bold=True)

# 分类统计数据
分类统计 = df.groupby('类别').agg({
'金额': ['count', 'sum', 'mean', 'max'],
'日期': 'nunique'
}).round(2)

分类统计.columns = ['支出笔数', '总支出', '平均支出', '最大支出', '支出天数']
分类统计 = 分类统计.sort_values('总支出', ascending=False)
分类统计['占比'] = (分类统计['总支出'] / 分类统计['总支出'].sum() * 100).round(1)

# 写入表头
表头 = ['类别', '支出笔数', '总支出', '平均支出', '最大支出', '占比', '支出天数']
for 列号, 标题 in enumerate(表头, 1):
单元格 = 分类表.cell(row=3, column=列号, value=标题)
单元格.font = Font(bold=True)
单元格.fill = PatternFill(start_color="E8F4FD", end_color="E8F4FD", fill_type="solid")

# 写入数据
for 行号, (类别, 数据) in enumerate(分类统计.iterrows(), 4):
分类表.cell(row=行号, column=1, value=类别)
分类表.cell(row=行号, column=2, value=数据['支出笔数'])
分类表.cell(row=行号, column=3, value=数据['总支出'])
分类表.cell(row=行号, column=4, value=数据['平均支出'])
分类表.cell(row=行号, column=5, value=数据['最大支出'])
分类表.cell(row=行号, column=6, value=f"{数据['占比']}%")
分类表.cell(row=行号, column=7, value=数据['支出天数'])

# 添加图表数据
图表数据行 = len(分类统计) + 6
分类表.cell(row=图表数据行, column=1, value="图表数据")
分类表.cell(row=图表数据行, column=1).font = Font(bold=True)

for i, (类别, 数据) in enumerate(分类统计.iterrows(), 图表数据行 + 1):
分类表.cell(row=i, column=1, value=类别)
分类表.cell(row=i, column=2, value=数据['总支出'])

# 创建饼图
饼图 = PieChart()
饼图.title = "支出分类占比"
数据 = Reference(分类表, min_col=2, min_row=图表数据行 + 1, max_row=图表数据行 + len(分类统计))
分类 = Reference(分类表, min_col=1, min_row=图表数据行 + 1, max_row=图表数据行 + len(分类统计))

饼图.add_data(data)
饼图.set_categories(分类)
分类表.add_chart(饼图, "I3")

# 3. 时间趋势表
时间表 = wb.create_sheet("时间趋势分析")

时间表["A1"] = "支出时间趋势分析"
时间表["A1"].font = Font(size=14, bold=True)

# 日支出数据
日支出 = df.groupby('日期')['金额'].sum().sort_index()

时间表["A3"] = "日支出明细"
时间表["A3"].font = Font(bold=True)

# 写入日支出数据
表头 = ['日期', '支出金额', '星期', '是否周末']
for 列号, 标题 in enumerate(表头, 1):
单元格 = 时间表.cell(row=5, column=列号, value=标题)
单元格.font = Font(bold=True)

for 行号, (日期, 金额) in enumerate(日支出.items(), 6):
该日数据 = df[df['日期'] == 日期].iloc[0]
时间表.cell(row=行号, column=1, value=日期.strftime('%m-%d'))
时间表.cell(row=行号, column=2, value=金额)
时间表.cell(row=行号, column=3, value=该日数据['星期'])
时间表.cell(row=行号, column=4, value='是' if 该日数据['是否周末'] else '否')

# 创建折线图
折线图 = LineChart()
折线图.title = "日支出趋势"
折线图.style = 2
折线图.y_axis.title = '支出金额(元)'
折线图.x_axis.title = '日期'

数据 = Reference(时间表, min_col=2, min_row=6, max_row=6 + len(日支出))
分类 = Reference(时间表, min_col=1, min_row=6, max_row=6 + len(日支出))

折线图.add_data(data)
折线图.set_categories(分类)
时间表.add_chart(折线图, "F5")

# 4. 健康度评估表
健康表 = wb.create_sheet("消费健康度评估")

健康表["A1"] = "消费健康度评估"
健康表["A1"].font = Font(size=14, bold=True)

# 计算健康指标
日消费频次 = df.groupby('日期').size()
支出集中度 = df.nlargest(int(len(df) * 0.2), '金额')['金额'].sum() / df['金额'].sum() * 100
类别多样性 = len(df['类别'].unique()) / 8 * 100 # 假设有8个标准类别
理性消费率 = (1 - len(df[df['金额'] > 300]) / len(df)) * 100

健康指标 = {
'支出稳定性': max(0, 100 - (日消费频次.std() / 日消费频次.mean() * 100)),
'消费多样性': min(100, 类别多样性),
'理性消费率': 理性消费率,
'支出分散度': max(0, 100 - 支出集中度)
}

总体健康度 = sum(健康指标.values()) / len(健康指标)

# 写入健康指标
健康表["A3"] = "健康指标"
健康表["A3"].font = Font(bold=True)

健康数据 = [
["健康指标", "得分", "等级", "建议"],
["支出稳定性", f"{健康指标['支出稳定性']:.1f}", "良好" if 健康指标['支出稳定性'] >= 80 else "需改善", "保持规律消费习惯"],
["消费多样性", f"{健康指标['消费多样性']:.1f}", "优秀" if 健康指标['消费多样性'] >= 90 else "良好", "适当增加消费类别"],
["理性消费率", f"{健康指标['理性消费率']:.1f}", "优秀" if 健康指标['理性消费率'] >= 90 else "良好", "控制大额支出"],
["支出分散度", f"{健康指标['支出分散度']:.1f}", "良好" if 健康指标['支出分散度'] >= 70 else "需改善", "避免过度集中消费"]
]

for 行号, 数据行 in enumerate(健康数据, 5):
for 列号, 值 in enumerate(数据行, 1):
单元格 = 健康表.cell(row=行号, column=列号, value=值)
if 行号 == 5:
单元格.font = Font(bold=True)
单元格.fill = PatternFill(start_color="E8F4FD", end_color="E8F4FD", fill_type="solid")

# 总体评分
健康表.cell(row=11, column=1, value="总体健康度")
健康表.cell(row=11, column=1).font = Font(bold=True)
健康表.cell(row=12, column=1, value=f"{总体健康度:.1f}分")
健康表.cell(row=12, column=2, value="优秀" if 总体健康度 >= 85 else "良好" if 总体健康度 >= 70 else "需改善")

# 调整列宽
forin ["A", "B", "C", "D"]:
健康表.column_dimensions[列].width = 20

# 保存文件
wb.save(文件名)
print(f"✅ 专业支出报告已生成:{文件名}")

return 文件名

# 生成专业报告
专业报告文件 = 生成专业支出报告(df)

# 额外:生成数据可视化
print("\n📊 生成数据可视化图表...")

plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号

# 1. 支出分类饼图
plt.figure(figsize=(10, 8))
分类统计 = df.groupby('类别')['金额'].sum().sort_values(ascending=False)
plt.pie(分类统计.values, labels=分类统计.index, autopct='%1.1f%%', startangle=90)
plt.title('月度支出分类分布', fontsize=16)
plt.axis('equal')
plt.savefig('支出分类分布.png', dpi=300, bbox_inches='tight')
plt.close()

# 2. 日支出趋势图
plt.figure(figsize=(14, 6))
日支出 = df.groupby('日期')['金额'].sum()
plt.plot(日支出.index, 日支出.values, marker='o', linewidth=2, markersize=4)
plt.title('日支出趋势图', fontsize=16)
plt.xlabel('日期', fontsize=12)
plt.ylabel('支出金额(元)', fontsize=12)
plt.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('日支出趋势.png', dpi=300, bbox_inches='tight')
plt.close()

# 3. 类别对比柱状图
plt.figure(figsize=(12, 6))
分类数据 = df.groupby('类别').agg({
'金额': 'sum',
'日期': 'count'
})
分类数据.columns = ['总支出', '支出笔数']

# 创建双轴图
fig, ax1 = plt.subplots(figsize=(12, 6))
ax2 = ax1.twinx()

# 绘制总支出
bars = ax1.bar(分类数据.index, 分类数据['总支出'], color='skyblue', alpha=0.7, label='总支出')
ax1.set_xlabel('支出类别', fontsize=12)
ax1.set_ylabel('总支出(元)', fontsize=12, color='blue')
ax1.tick_params(axis='y', labelcolor='blue')

# 绘制支出笔数
line = ax2.plot(分类数据.index, 分类_data['支出笔数'], color='red', marker='o', linewidth=2, label='支出笔数')
ax2.set_ylabel('支出笔数', fontsize=12, color='red')
ax2.tick_params(axis='y', labelcolor='red')

plt.title('各类别支出对比', fontsize=16)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('类别支出对比.png', dpi=300, bbox_inches='tight')
plt.close()

print("✅ 所有可视化图表已生成!")

🏃‍♀️ 进阶小挑战

挑战1:销售趋势分析
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# 销售趋势分析挑战
print("=== 销售趋势分析挑战 ===")

# 创建销售数据
销售数据 = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=100, freq='D'),
'产品': np.random.choice(['产品A', '产品B', '产品C', '产品D'], 100),
'销售员': np.random.choice(['张三', '李四', '王五', '赵六'], 100),
'客户类型': np.random.choice(['新客户', '老客户'], 100),
'销售额': np.random.randint(1000, 10000, 100),
'数量': np.random.randint(10, 100, 100),
'地区': np.random.choice(['华北', '华东', '华南', '西部'], 100)
})

# 添加月份和季度
销售数据['月份'] = 销售数据['日期'].dt.month
销售数据['季度'] = 销售数据['日期'].dt.quarter

def 销售趋势分析(df):
"""销售趋势分析"""

print("📈 开始销售趋势分析...")

# 1. 时间趋势分析
print("\n📊 时间趋势分析:")

# 日销售额趋势
日销售 = df.groupby('日期')['销售额'].sum()
销售增长 = 日销售.pct_change().mean() * 100

print(f" 日均销售增长率:{销售增长:.2f}%")
print(f" 最高单日销售:{日销售.max():,}元({日销售.idxmax().strftime('%Y-%m-%d')})")
print(f" 最低单日销售:{日销售.min():,}元({日销售.idxmin().strftime('%Y-%m-%d')})")

# 月度趋势
月度销售 = df.groupby('月份')['销售额'].sum()
print(f"\n 月度销售情况:")
for 月份, 销售额 in 月度销售.items():
print(f" {月份}月:{销售额:,}元")

# 2. 产品表现分析
print("\n📦 产品表现分析:")

产品分析 = df.groupby('产品').agg({
'销售额': ['sum', 'mean', 'count'],
'数量': 'sum'
}).round(2)

产品分析.columns = ['总销售额', '平均销售额', '销售次数', '总数量']
产品分析 = 产品分析.sort_values('总销售额', ascending=False)

print(" 产品销售排名:")
for 产品, 数据 in 产品分析.iterrows():
print(f" {产品}{数据['总销售额']:,.2f}元({数据['销售次数']}次)")

# 3. 销售员业绩分析
print("\n🏆 销售员业绩分析:")

销售员分析 = df.groupby('销售员').agg({
'销售额': ['sum', 'mean', 'count'],
'客户类型': lambda x: (x == '新客户').sum()
}).round(2)

销售员分析.columns = ['总销售额', '平均销售额', '销售次数', '新客户数']
销售员分析 = 销售员分析.sort_values('总销售额', ascending=False)

print(" 销售员业绩排名:")
for 销售员, 数据 in 销售员分析.iterrows():
新客户率 = 数据['新客户数'] / 数据['销售次数'] * 100
print(f" {销售员}{数据['总销售额']:,.2f}元(新客户率:{新客户率:.1f}%)")

# 4. 地区分析
print("\n🗺️ 地区销售分析:")

地区分析 = df.groupby('地区').agg({
'销售额': ['sum', 'mean', 'count']
}).round(2)

地区分析.columns = ['总销售额', '平均销售额', '销售次数']
地区分析['市场占比'] = (地区分析['总销售额'] / 地区分析['总销售额'].sum() * 100).round(1)

print(" 地区市场表现:")
for 地区, 数据 in 地区分析.iterrows():
print(f" {地区}{数据['总销售额']:,.2f}元(占比:{数据['市场占比']}%)")

# 5. 客户类型分析
print("\n👥 客户类型分析:")

客户分析 = df.groupby('客户类型').agg({
'销售额': ['sum', 'mean', 'count']
}).round(2)

客户分析.columns = ['总销售额', '平均销售额', '客户数量']

for 客户类型, 数据 in 客户分析.iterrows():
print(f" {客户类型}{数据['总销售额']:,.2f}元(平均:{数据['平均销售额']:.2f}元/单)")

# 6. 交叉分析
print("\n🔗 交叉分析:")

# 产品×地区
产品地区 = df.groupby(['产品', '地区'])['销售额'].sum().unstack(fill_value=0)
print(" 产品×地区销售矩阵:")
print(产品地区)

# 销售员×产品
销售产品 = df.groupby(['销售员', '产品'])['销售额'].sum().unstack(fill_value=0)
print("\n 销售员×产品销售矩阵:")
print(销售产品)

# 7. 异常检测
print("\n⚠️ 异常销售检测:")

# 使用IQR方法检测异常销售额
Q1 = df['销售额'].quantile(0.25)
Q3 = df['销售额'].quantile(0.75)
IQR = Q3 - Q1
下限 = Q1 - 1.5 * IQR
上限 = Q3 + 1.5 * IQR

异常销售 = df[(df['销售额'] < 下限) | (df['销售额'] > 上限)]

print(f" 发现异常销售:{len(异常销售)}笔")
if len(异常销售) > 0:
print(f" 异常销售额范围:{异常销售['销售额'].min():.2f} - {异常销售['销售额'].max():.2f}元")

# 分析异常销售的特征
异常产品 = 异常销售['产品'].value_counts().head(3)
print(f" 异常销售主要涉及产品:{', '.join(异常产品.index)}")

return {
'日销售': 日销售,
'月度销售': 月度销售,
'产品分析': 产品分析,
'销售员分析': 销售员分析,
'地区分析': 地区分析,
'异常销售': 异常销售
}

# 执行销售趋势分析
销售分析结果 = 销售趋势分析(销售数据)

# 生成销售趋势图表
plt.figure(figsize=(15, 10))

# 子图1:日销售额趋势
plt.subplot(2, 2, 1)
日销售 = 销售分析结果['日销售']
plt.plot(日销售.index, 日销售.values, marker='o', linewidth=2)
plt.title('日销售额趋势', fontsize=14)
plt.xlabel('日期')
plt.ylabel('销售额(元)')
plt.xticks(rotation=45)
plt.grid(True, alpha=0.3)

# 子图2:月度销售额柱状图
plt.subplot(2, 2, 2)
月度销售 = 销售分析结果['月度销售']
plt.bar(月度销售.index, 月度销售.values, color='skyblue')
plt.title('月度销售额对比', fontsize=14)
plt.xlabel('月份')
plt.ylabel('销售额(元)')

# 子图3:产品销售额饼图
plt.subplot(2, 2, 3)
产品分析 = 销售分析结果['产品分析']
plt.pie(产品分析['总销售额'].values, labels=产品分析.index, autopct='%1.1f%%', startangle=90)
plt.title('产品销售占比', fontsize=14)

# 子图4:地区销售额柱状图
plt.subplot(2, 2, 4)
地区分析 = 销售分析结果['地区分析']
plt.bar(地区分析.index, 地区分析['总销售额'].values, color='lightcoral')
plt.title('地区销售对比', fontsize=14)
plt.xlabel('地区')
plt.ylabel('销售额(元)')
plt.xticks(rotation=45)

plt.tight_layout()
plt.savefig('销售趋势分析图表.png', dpi=300, bbox_inches='tight')
plt.close()

print("✅ 销售趋势分析图表已生成!")
挑战2:财务比率计算
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# 财务比率计算挑战
print("=== 财务比率计算挑战 ===")

# 创建财务数据
财务数据 = pd.DataFrame({
'公司': ['公司A', '公司B', '公司C', '公司D', '公司E'],
'营业收入': [1000000, 800000, 1200000, 600000, 1500000],
'营业成本': [600000, 480000, 720000, 420000, 900000],
'营业利润': [200000, 160000, 240000, 100000, 300000],
'净利润': [150000, 120000, 180000, 75000, 225000],
'总资产': [2000000, 1600000, 2400000, 1200000, 3000000],
'总负债': [800000, 640000, 960000, 480000, 1200000],
'流动资产': [1200000, 960000, 1440000, 720000, 1800000],
'流动负债': [600000, 480000, 720000, 360000, 900000],
'应收账款': [300000, 240000, 360000, 180000, 450000],
'存货': [400000, 320000, 480000, 240000, 600000]
})

def 计算综合财务比率(财务df):
"""计算综合财务比率"""

print("📊 计算综合财务比率...")

# 创建结果DataFrame
比率结果 = 财务df.copy()

# 1. 盈利能力比率
print("\n💰 盈利能力比率:")

比率结果['销售毛利率'] = (财务df['营业收入'] - 财务df['营业成本']) / 财务df['营业收入'] * 100
比率结果['销售净利率'] = 财务df['净利润'] / 财务df['营业收入'] * 100
比率结果['资产净利率'] = 财务df['净利润'] / 财务df['总资产'] * 100
比率结果['净资产收益率'] = 财务df['净利润'] / (财务df['总资产'] - 财务df['总负债']) * 100

print(" 已计算:销售毛利率、销售净利率、资产净利率、净资产收益率")

# 2. 偿债能力比率
print("\n🏦 偿债能力比率:")

比率结果['流动比率'] = 财务df['流动资产'] / 财务df['流动负债']
比率结果['速动比率'] = (财务df['流动资产'] - 财务df['存货']) / 财务df['流动负债']
比率结果['资产负债率'] = 财务df['总负债'] / 财务df['总资产'] * 100
比率结果['权益乘数'] = 财务df['总资产'] / (财务df['总资产'] - 财务df['总负债'])

print(" 已计算:流动比率、速动比率、资产负债率、权益乘数")

# 3. 营运能力比率
print("\n⚙️ 营运能力比率:")

比率结果['应收账款周转率'] = 财务df['营业收入'] / 财务df['应收账款']
比率结果['存货周转率'] = 财务df['营业成本'] / 财务df['存货']
比率结果['总资产周转率'] = 财务df['营业收入'] / 财务df['总资产']

print(" 已计算:应收账款周转率、存货周转率、总资产周转率")

# 4. 综合评分
print("\n📊 综合财务评分:")

# 创建评分标准
评分标准 = {
'销售毛利率': {'优秀': 30, '良好': 20, '及格': 10},
'销售净利率': {'优秀': 15, '良好': 10, '及格': 5},
'净资产收益率': {'优秀': 15, '良好': 10, '及格': 5},
'流动比率': {'优秀': 2.0, '良好': 1.5, '及格': 1.0},
'速动比率': {'优秀': 1.5, '良好': 1.0, '及格': 0.8},
'资产负债率': {'优秀': 40, '良好': 50, '及格': 60} # 越低越好
}

def 计算单项评分(实际值, 标准, 指标名称):
"""计算单项指标评分"""
if '资产负债率' in 指标名称: # 负向指标,越低越好
if 实际值 <= 标准['优秀']:
return 100
elif 实际值 <= 标准['良好']:
return 80
elif 实际值 <= 标准['及格']:
return 60
else:
return 40
else: # 正向指标,越高越好
if 实际值 >= 标准['优秀']:
return 100
elif 实际值 >= 标准['良好']:
return 80
elif 实际值 >= 标准['及格']:
return 60
else:
return 40

# 计算各项评分
评分列 = []
for 指标, 标准 in 评分标准.items():
评分列.append(f"{指标}_评分")
比率结果[f"{指标}_评分"] = 比率结果[指标].apply(
lambda x: 计算单项评分(x, 标准, 指标)
)

# 计算综合评分
比率结果['综合财务评分'] = 比率结果[评分列].mean(axis=1)

# 财务等级评定
def 评定财务等级(综合评分):
if 综合评分 >= 90:
return "优秀"
elif 综合评分 >= 80:
return "良好"
elif 综合评分 >= 70:
return "一般"
elif 综合评分 >= 60:
return "及格"
else:
return "较差"

比率结果['财务等级'] = 比率结果['综合财务评分'].apply(评定财务等级)

print(" 已计算:综合财务评分、财务等级")

return 比率结果

# 执行财务比率计算
财务比率结果 = 计算综合财务比率(财务数据)

print("\n📊 财务比率分析结果:")

# 显示关键比率
关键比率 = ['销售毛利率', '销售净利率', '净资产收益率', '流动比率', '资产负债率', '综合财务评分']

print("\n关键财务比率:")
for 比率 in 关键比率:
print(f"\n{比率}:")
for 公司, 数值 in 财务比率结果[['公司', 比率]].values:
if '%' in 比率 or '评分' in 比率:
print(f" {公司}{数值:.1f}{'%' if '%' in 比率 else '分'}")
else:
print(f" {公司}{数值:.2f}")

# 显示财务等级
print(f"\n🏆 财务等级评定:")
for 公司, 等级 in 财务比率结果[['公司', '财务等级']].values:
print(f" {公司}{等级}")

# 生成财务比率雷达图
from math import pi

plt.figure(figsize=(10, 10))

# 选择几个关键比率做雷达图
雷达图指标 = ['销售毛利率', '销售净利率', '净资产收益率', '流动比率', '综合财务评分']
雷达图数据 = 财务比率结果[雷达图指标].values

# 标准化数据(0-100分)
for i, 指标 in enumerate(雷达图指标):
if 指标 == '流动比率': # 特殊处理,超过2的按100分算
雷达图数据[:, i] = np.minimum(雷达图数据[:, i] / 2 * 100, 100)
elif 指标 not in ['综合财务评分']: # 百分比指标直接乘以100
雷达图数据[:, i] = 雷达图_data[:, i]

角度 = np.linspace(0, 2 * pi, len(雷达图指标), endpoint=False).tolist()
角度 += 角度[:1] # 闭合图形

# 为每家公司绘制雷达图
颜色 = ['red', 'blue', 'green', 'orange', 'purple']
for i, (公司, 数据) in enumerate(zip(财务比率结果['公司'], 雷达图数据)):
值 = 数据.tolist()
值 += 值[:1] # 闭合图形

plt.polar(角度, 值, 'o-', linewidth=2, label=公司, color=颜色[i])
plt.fill(角度, 值, alpha=0.25, color=颜色[i])

plt.xticks(角度[:-1], 雷达图指标)
plt.ylim(0, 100)
plt.title('财务比率雷达图', fontsize=16, pad=20)
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0))
plt.tight_layout()
plt.savefig('财务比率雷达图.png', dpi=300, bbox_inches='tight')
plt.close()

print("✅ 财务比率雷达图已生成!")

💭 今日思考

通过今天的学习,我们发现:

  • pandas的基础统计函数比Excel更强大、更灵活
  • 分组统计可以一键完成复杂的数据透视表操作
  • 条件统计让数据分析变得简单直观
  • 用Python做财务分析,效率提升是数量级的

📝 课后小结

  • ✅ 掌握了基础统计运算(求和、平均、最大最小值)
  • ✅ 学会了分组统计的各种方法
  • ✅ 理解了条件统计的应用场景
  • ✅ 完成了专业的月度支出分析

🎯 下节预告

下节我们将学习制作你的第一个数据报告,把今天分析的数据变成漂亮的图表和专业的报告,让老板对你的分析能力刮目相看!


💡 小贴士

  • describe()函数是快速了解数据的利器
  • groupby是数据分析的核心,要熟练掌握
  • 条件统计要结合业务场景使用
  • 多练习真实数据的分析,理论结合实践

🤖 Powered by Kimi K2 0905 💻 内容经葵葵🌻审核与修改