前言
大家好,我是船长。
今天在写公众号热点文章的时候,船长需要处理大量金融数据:油价调整幅度、公积金政策变化、花呗白条利率对比……如果手动算Excel,光是查数据就得半天。
但用Python + Pandas,20分钟搞定。
这篇文章分享5个我在金融数据分析中最常用的Pandas技巧,每个都附带完整代码,复制就能跑。不管你是数据分析师、产品经理还是金融从业者,都能直接用上。
技巧一:时间序列重采样 —— 油价走势分析
分析油价变化趋势时,原始数据通常是每日日期。我们需要按月/季度聚合,看趋势。
import pandas as pd
import numpy as np
# 模拟2026年1-4月95号汽油价格数据(元/升)
dates = pd.date_range('2026-01-01', '2026-04-22', freq='W-FRI')
prices = [6.88, 7.02, 7.25, 7.48, 7.72, 7.95, 8.21, 8.45, 8.68, 8.92,
9.03, 9.05, 9.03, 8.97, 8.85, 8.57]
df = pd.DataFrame({'date': dates[:len(prices)], 'price_95': prices})
df.set_index('date', inplace=True)
# 按月重采样:取月末收盘价和月均价
monthly = df.resample('M').agg({
'price_95': ['last', 'mean', 'max']
})
monthly.columns = ['月末价', '月均价', '月最高价']
monthly['月涨跌幅'] = monthly['月末价'].pct_change() * 100
print(monthly.round(2))
# 输出:
# 月末价 月均价 月最高价 月涨跌幅
# 2026-01-31 7.72 7.31 7.95 NaN
# 2026-02-28 8.68 8.11 8.92 12.44%
# 2026-03-31 9.03 8.94 9.05 4.03%
# 2026-04-30 8.57 8.80 9.03 -5.09%
核心要点:
-
resample('M')按月聚合,resample('Q')按季度 -
agg()可以同时计算多个统计量 -
pct_change()直接算涨跌幅百分比
技巧二:多条件筛选与分组 —— 贷款产品利率对比
分析花呗、白条、信用卡等信贷产品的真实成本时,需要对比不同平台、不同分期的年化利率。
# 模拟信贷产品数据
data = {
'产品': ['花呗']*4 + ['白条']*4 + ['信用卡A']*4,
'分期数': [3, 6, 12, 24]*3,
'月费率': [0.015, 0.013, 0.011, 0.010, # 花呗
0.016, 0.014, 0.012, 0.011, # 白条
0.008, 0.007, 0.006, 0.005], # 信用卡
'首期优惠': [False, True, True, True, # 花呗
False, True, True, True, # 白条
False, False, False, False] # 信用卡
}
df = pd.DataFrame(data)
# 计算真实年化利率(IRR方法简化版)
def calc_apr(monthly_rate, months):
"""根据月费率计算近似年化利率"""
return ((1 + monthly_rate)**months - 1) / months * 12
df['年化利率'] = df.apply(
lambda row: calc_apr(row['月费率'], row['分期数']), axis=1
)
# 按产品分组,找出各产品最低利率
best_rates = df.loc[df.groupby('产品')['年化利率'].idxmin()]
print(best_rates[['产品', '分期数', '月费率', '年化利率', '首期优惠']])
核心要点:
-
groupby().idxmin()找每组最优值 -
信贷产品利率一定要算年化,不能只看月费率
-
花呗12期月费率0.011听起来很低,年化约14.5%
技巧三:滚动窗口计算 —— 股价/房价移动平均
分析房价或股价趋势时,移动平均线(MA)是最基础的工具。
# 模拟北京二手房月度网签数据(2025.4 - 2026.3)
np.random.seed(42)
base = np.linspace(1200, 2100, 12)
noise = np.random.normal(0, 80, 12)
dates = pd.date_range('2025-04-01', periods=12, freq='MS')
df = pd.DataFrame({
'date': dates,
'北京二手网签': np.round(base + noise).astype(int)
})
df.set_index('date', inplace=True)
# 计算移动平均
df['MA3'] = df['北京二手网签'].rolling(3).mean()
df['MA6'] = df['北京二手网签'].rolling(6).mean()
# 计算同比变化(需要去年数据,这里用简化版)
df['环比变化'] = df['北京二手网签'].pct_change() * 100
print(df.round(1))
核心要点:
-
rolling(n).mean()计算n期移动平均 -
3月MA消除短期波动,6月MA看中期趋势
-
pct_change()计算环比变化率
技巧四:数据透视表 —— 多维度政策影响分析
分析不同城市的公积金新政时,用透视表快速对比。
# 模拟各城市公积金政策数据
data = {
'城市': ['北京', '上海', '广州', '深圳', '杭州', '成都']*3,
'政策类型': ['额度提升']*6 + ['首付比例下调']*6 + ['提取条件放宽']*6,
'实施时间': ['2026-03', '2026-03', '2026-04', '2026-04', '2026-03', '2026-04',
'2026-03', '2026-04', '2026-03', '2026-03', '2026-04', '2026-04',
'2026-04', '2026-03', '2026-04', '2026-03', '2026-03', '2026-04'],
'影响幅度': [15, 20, 10, 12, 18, 10,
-5, -5, -5, -3, -5, -5,
8, 10, 5, 12, 8, 5] # 首付为负值表示下调
}
df = pd.DataFrame(data)
# 透视表:城市 x 政策类型
pivot = df.pivot_table(
values='影响幅度',
index='城市',
columns='政策类型',
aggfunc='sum'
)
print(pivot)
核心要点:
-
pivot_table()比 Excel 透视表更灵活 -
支持 aggfunc='sum'/'mean'/'count' 等多种聚合方式
-
分析政策影响时,多维交叉对比一目了然
技巧五:条件格式化输出 —— 自动生成分析报告
最后一步:把分析结果格式化输出,方便直接写入报告。
# 油价变化分析报告自动生成
report_data = {
'指标': ['95号汽油年初价', '95号汽油最高价', '年内累计涨幅',
'本次下调幅度', '调整后价格', '回补比例'],
'数值': ['6.88元/升', '9.05元/升', '2.15元/升(+31%)',
'0.46元/升', '9.03元/升', '21%'],
'状态': ['—', '⚠️ 近历史高点', '🔴 超额上涨',
'🟢 年内首降', '🟡 仍在高位', '🔴 回补不足']
}
df_report = pd.DataFrame(report_data)
# 添加分隔线效果
def format_report(df):
lines = ['=' * 60]
lines.append('📋 2026年油价分析报告')
lines.append('=' * 60)
for _, row in df.iterrows():
lines.append(f"{row['指标']:<15} {row['数值']:<20} {row['状态']}")
lines.append('=' * 60)
return '\n'.join(lines)
print(format_report(df_report))
总结
5个技巧快速回顾:
① resample() —— 时间序列按月/季度聚合,分析趋势
② groupby().idxmin() —— 分组找最优,对比产品利率
③ rolling().mean() —— 移动平均线,消除短期波动
④ pivot_table() —— 多维透视,交叉分析政策影响
⑤ 格式化输出 —— 自动生成可读报告
这些技巧在油价分析、房价对比、信贷产品分析等金融场景中都经常用到。掌握了Pandas这5个函数,80%的日常数据分析需求都能搞定。
有问题评论区聊,觉得有用转给需要的人。