第4章 财务数据处理与可视化
4.1 数据处理
4.1.1 数据清洗
- 缺失值处理
- 异常值检测
- 数据标准化
import pandas as pd
import numpy as np
# 财务数据清洗示例
def clean_financial_data(df):
# 处理缺失值
df = df.fillna(method='ffill') # 前向填充
# 检测异常值
df = df[(df['Revenue'] > 0) & (df['Expenses'] > 0)]
# 数据标准化
df['Revenue'] = (df['Revenue'] - df['Revenue'].mean()) / df['Revenue'].std()
df['Expenses'] = (df['Expenses'] - df['Expenses'].mean()) / df['Expenses'].std()
return df
# 示例数据
raw_data = pd.DataFrame({
'Date': pd.date_range('2024-01-01', periods=5),
'Revenue': [1000000, np.nan, 1200000, 1300000, 1500000],
'Expenses': [600000, 700000, 800000, 900000, 1000000]
})
cleaned_data = clean_financial_data(raw_data)
print("清洗后的财务数据:")
print(cleaned_data)
数据结构示例:
字段名 | 类型 | 示例值 |
---|---|---|
Date | pd.Timestamp | 2024-01-01 00:00:00 |
Revenue | float | 1000000.0 |
Expenses | float | 600000.0 |
4.1.2 数据转换
- 数据类型转换
- 数据重塑
- 数据合并
# 财务数据转换示例
def transform_financial_data(df):
# 数据类型转换
df['Date'] = pd.to_datetime(df['Date'])
# 数据重塑
df_melted = df.melt(id_vars=['Date'],
value_vars=['Revenue', 'Expenses'],
var_name='Category',
value_name='Amount')
# 数据合并
df_merged = pd.merge(df, df_melted, on='Date')
return df_merged
# 示例
transformed_data = transform_financial_data(cleaned_data)
print("\n转换后的财务数据:")
print(transformed_data)
数据结构示例:
字段名 | 类型 | 示例值 |
---|---|---|
Date | pd.Timestamp | 2024-01-01 00:00:00 |
Category | string | Revenue |
Amount | float | 1000000.0 |
4.1.3 数据聚合
- 分组统计
- 数据透视表
- 时间序列处理
# 财务数据聚合示例
def aggregate_financial_data(df):
# 分组统计
monthly_stats = df.resample('M', on='Date').agg({
'Revenue': ['sum', 'mean'],
'Expenses': ['sum', 'mean']
})
# 数据透视表
pivot_table = pd.pivot_table(
df,
values=['Revenue', 'Expenses'],
index='Date',
aggfunc=np.sum
)
# 时间序列处理
df['Revenue_MA'] = df['Revenue'].rolling(window=3).mean()
return monthly_stats, pivot_table, df
# 示例
monthly_stats, pivot_table, processed_data = aggregate_financial_data(cleaned_data)
print("\n月度统计:")
print(monthly_stats)
print("\n数据透视表:")
print(pivot_table)
print("\n处理后数据:")
print(processed_data)
数据结构示例:
字段名 | 类型 | 示例值 |
---|---|---|
Date | pd.Timestamp | 2024-01-31 00:00:00 |
Revenue_sum | float | 5000000.0 |
Revenue_mean | float | 1250000.0 |
Expenses_sum | float | 4000000.0 |
Expenses_mean | float | 800000.0 |
4.2 图表结构
4.2.1 基本图表
- 折线图
- 柱状图
- 饼图
import matplotlib.pyplot as plt
# 财务数据可视化示例
def plot_basic_charts(df):
# 折线图 - 收入与支出趋势
plt.figure(figsize=(12, 6))
plt.plot(df['Date'], df['Revenue'], label='收入')
plt.plot(df['Date'], df['Expenses'], label='支出')
plt.title('收入与支出趋势')
plt.xlabel('日期')
plt.ylabel('金额')
plt.legend()
plt.grid(True)
plt.show()
# 柱状图 - 月度收入对比
monthly_revenue = df.resample('M', on='Date')['Revenue'].sum()
plt.figure(figsize=(10, 6))
monthly_revenue.plot(kind='bar')
plt.title('月度收入对比')
plt.xlabel('月份')
plt.ylabel('收入')
plt.show()
# 饼图 - 支出构成
expense_categories = ['运营', '研发', '市场']
expense_values = [400000, 300000, 300000]
plt.figure(figsize=(8, 8))
plt.pie(expense_values, labels=expense_categories, autopct='%1.1f%%')
plt.title('支出构成')
plt.show()
# 示例
plot_basic_charts(cleaned_data)
数据结构示例:
字段名 | 类型 | 示例值 |
---|---|---|
chart_type | string | line |
x_axis | list | [‘2024-01-01’, ‘2024-01-02’, ‘2024-01-03’] |
y_axis | list | [1000000, 1200000, 1300000] |
labels | list | [‘收入’, ‘支出’] |
4.2.2 高级图表
- 热力图
- 箱线图
- 散点图矩阵
import seaborn as sns
# 高级财务图表示例
def plot_advanced_charts(df):
# 热力图 - 相关性分析
plt.figure(figsize=(8, 6))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
plt.title('财务指标相关性分析')
plt.show()
# 箱线图 - 收入分布
plt.figure(figsize=(8, 6))
sns.boxplot(x=df['Revenue'])
plt.title('收入分布')
plt.show()
# 散点图矩阵
sns.pairplot(df[['Revenue', 'Expenses', 'Revenue_MA']])
plt.suptitle('财务指标关系矩阵', y=1.02)
plt.show()
# 示例
plot_advanced_charts(processed_data)
数据结构示例:
字段名 | 类型 | 示例值 |
---|---|---|
chart_type | string | heatmap |
data | dict | {‘Revenue’: [1.0, 0.95], ‘Expenses’: [0.95, 1.0]} |
annotations | bool | True |
color_map | string | coolwarm |
4.3 可视化图表
4.3.1 Matplotlib基础
- 图形绘制
- 样式设置
- 子图布局
# 财务仪表板示例
def create_financial_dashboard(df):
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))
# 收入趋势图
ax1.plot(df['Date'], df['Revenue'], label='收入')
ax1.set_title('收入趋势')
ax1.set_ylabel('金额')
ax1.legend()
ax1.grid(True)
# 支出构成饼图
expense_categories = ['运营', '研发', '市场']
expense_values = [400000, 300000, 300000]
ax2.pie(expense_values, labels=expense_categories, autopct='%1.1f%%')
ax2.set_title('支出构成')
plt.tight_layout()
plt.show()
# 示例
create_financial_dashboard(cleaned_data)
数据结构示例:
字段名 | 类型 | 示例值 |
---|---|---|
dashboard_layout | string | 2x1 |
charts | list | [{‘type’: ‘line’, ‘title’: ‘收入趋势’, ‘x_axis’: ‘Date’, ‘y_axis’: ‘Revenue’}, {‘type’: ‘pie’, ‘title’: ‘支出构成’, ‘labels’: [‘运营’, ‘研发’, ‘市场’], ‘values’: [400000, 300000, 300000]}] |
4.3.2 Seaborn高级可视化
- 统计图形
- 多变量分析
- 主题设置
# 财务指标关系图
def plot_financial_relationships(df):
plt.figure(figsize=(12, 6))
sns.set_theme(style="whitegrid")
# 收入与支出关系
sns.scatterplot(x='Revenue', y='Expenses', hue='Revenue_MA', data=df)
plt.title('收入与支出关系')
plt.xlabel('收入')
plt.ylabel('支出')
plt.show()
# 示例
plot_financial_relationships(processed_data)
数据结构示例:
字段名 | 类型 | 示例值 |
---|---|---|
chart_type | string | scatter |
x_axis | string | Revenue |
y_axis | string | Expenses |
hue | string | Revenue_MA |
theme | string | whitegrid |
4.3.3 Plotly交互式可视化
- 动态图表
- 仪表盘创建
- 网页嵌入
import plotly.express as px
import plotly.graph_objects as go
# 交互式财务仪表板
def create_interactive_dashboard(df):
# 收入趋势图
fig1 = px.line(df, x='Date', y='Revenue', title='收入趋势')
# 支出构成饼图
fig2 = px.pie(values=[400000, 300000, 300000],
names=['运营', '研发', '市场'],
title='支出构成')
# 创建仪表板
fig = go.Figure()
fig.add_trace(fig1.data[0])
fig.add_trace(fig2.data[0])
fig.update_layout(
title='财务仪表板',
grid={'rows': 2, 'columns': 1, 'pattern': 'independent'}
)
fig.show()
# 示例
create_interactive_dashboard(processed_data)
数据结构示例:
字段名 | 类型 | 示例值 |
---|---|---|
dashboard_type | string | interactive |
charts | list | [{‘type’: ‘line’, ‘x_axis’: ‘Date’, ‘y_axis’: ‘Revenue’, ‘title’: ‘收入趋势’}, {‘type’: ‘pie’, ‘values’: [400000, 300000, 300000], ‘labels’: [‘运营’, ‘研发’, ‘市场’], ‘title’: ‘支出构成’}] |
layout | dict | {‘title’: ‘财务仪表板’} |
4.3.3 Plotly交互式可视化
- 动态图表
- 仪表盘创建
- 网页嵌入
import plotly.express as px
import plotly.graph_objects as go
# 交互式财务仪表板
def create_interactive_dashboard(df):
# 收入趋势图
fig1 = px.line(df, x='Date', y='Revenue', title='收入趋势')
# 支出构成饼图
fig2 = px.pie(values=[400000, 300000, 300000],
names=['运营', '研发', '市场'],
title='支出构成')
# 创建仪表板
fig = go.Figure()
fig.add_trace(fig1.data[0])
fig.add_trace(fig2.data[0])
fig.update_layout(
title='财务仪表板',
grid={'rows': 2, 'columns': 1, 'pattern': 'independent'}
)
fig.show()
# 示例
create_interactive_dashboard(processed_data)
```