查看全集:💎Quantopia量化分析56讲
Pandas是Python的数据分析核心库,提供高效的Series
和DataFrame
数据结构,专为处理结构化数据设计。
安装:
pip install pandas numpy matplotlib
基础导入:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 从列表创建Series
s = pd.Series([1, 2, np.nan, 4, 5], name="Toy Series")
print(s)
输出:
0 1.0
1 2.0
2 NaN
3 4.0
4 5.0
Name: Toy Series, dtype: float64
设置索引:
s.index = pd.date_range("2023-01-01", periods=5, freq="D")
print(s.index)
输出:
DatetimeIndex(['2023-01-01', '2023-01-02', ..., '2023-01-05'], dtype='datetime64[ns]', freq='D')
按位置访问:
print(s.iloc[0]) # 第一个元素 → 1.0
print(s.iloc[1:4]) # 切片
按日期访问:
print(s.loc['2023-01-02']) # 2.0
print(s.loc['2023-01-02':'2023-01-04'])
# 填充缺失值
s_filled = s.fillna(s.mean())
print(s_filled)
# 删除缺失值
s_dropped = s.dropna()
重采样(日数据→月数据):
monthly_data = s.resample('M').mean()
print(monthly_data)
时区转换:
s_utc = s.tz_localize('UTC')
s_eastern = s_utc.tz_convert('US/Eastern')
data = {
'A': np.random.randn(5),
'B': ['X', 'Y', 'Z', 'W', 'V'],
'C': pd.date_range('2023-01-01', periods=5)
}
df = pd.DataFrame(data)
print(df.head())
添加/删除列:
df['D'] = df['A'] * 2
df = df.drop('B', axis=1)
布尔筛选:
filtered = df[df['A'] > 0] # 筛选A列正值的行
df1 = pd.DataFrame({'X': [1,2], 'Y': [3,4]})
df2 = pd.DataFrame({'X': [5,6], 'Y': [7,8]})
combined = pd.concat([df1, df2])
滚动均值与波动率:
df['Rolling_Mean'] = df['A'].rolling(30).mean()
df['Rolling_Std'] = df['A'].rolling(30).std()
收益率计算:
returns = df.pct_change()
pct_change
:收益率计算技巧功能:计算当前元素与前一个元素的百分比变化,常用于金融收益率计算。
基础用法:
# 生成示例数据
prices = pd.Series([100, 105, 110, 108, 115])
returns = prices.pct_change() # 默认计算单日收益率
print(returns)
0 NaN
1 0.050000
2 0.047619
3 -0.018182
4 0.064815
dtype: float64
高级技巧:
periods
参数调整计算间隔# 计算3日收益率(当前vs前第3日)
long_returns = prices.pct_change(periods=3)
print(long_returns)
0 NaN
1 NaN
2 NaN
3 0.080000 # (108-100)/100
4 0.095238 # (115-105)/105
dtype: float64
dropna
清理数据clean_returns = returns.dropna()
print(clean_returns)
注意事项:
rolling
:滚动计算全攻略功能:创建滑动窗口对象,用于计算滚动统计量。
基础架构:
# 创建20日滚动窗口
rolling_window = prices.rolling(window=20)
常用统计量:
# 滚动均值与标准差
ma_20 = rolling_window.mean()
std_20 = rolling_window.std()
# 直接链式写法
ma_20 = prices.rolling(20).mean()
完整示例:
# 生成100日随机数据
np.random.seed(42)
data = pd.Series(np.random.normal(0, 1, 100))
# 计算不同窗口的滚动均值
windows = [5, 20, 50]
for w in windows:
data.rolling(w).mean().plot(label=f'{w}日均线')
plt.legend()
plt.title("不同窗口的移动平均线对比")
plt.show()
关键参数详解:
参数 | 说明 | 示例 |
window | 窗口大小 | window=30 (30日窗口) |
min_periods | 最小计算数据量 | min_periods=5 (至少5个数据点) |
center | 窗口居中 | center=True (当前点位于窗口中间) |
实战技巧:
min_periods=1
允许初始阶段计算smooth_data = prices.rolling(30, min_periods=1).mean()
# 假设df包含两列价格数据
rolling_corr = df['A'].rolling(60).corr(df['B'])
def my_roll_func(x):
return (x.max() - x.min())/2
custom_roll = prices.rolling(10).apply(my_roll_func)
常见误区警示:
fillna
或dropna
处理window-1
个历史点演练一:完整分析流程
# 获取数据(示例使用随机数据)
dates = pd.date_range('2023-01-01', periods=100, freq='D')
prices = pd.DataFrame({
'AAPL': np.cumprod(1 + np.random.normal(0.001, 0.02, 100)),
'GOOG': np.cumprod(1 + np.random.normal(0.0008, 0.015, 100))
}, index=dates)
# 计算5日收益率
returns = prices.pct_change(5).dropna()
# 计算双均线系统
prices['AAPL_MA20'] = prices['AAPL'].rolling(20).mean()
prices['AAPL_MA60'] = prices['AAPL'].rolling(60).mean()
# 可视化
plt.figure(figsize=(12,6))
prices[['AAPL', 'AAPL_MA20', 'AAPL_MA60']].plot()
plt.title('苹果股价双均线系统')
plt.ylabel('价格')
plt.show()
输出分析:
演练二:生成随机收益并绘制价格曲线
returns = pd.DataFrame(np.random.normal(0.01, 0.03, (100, 5)),
columns=['Stock1', 'Stock2', 'Stock3', 'Stock4', 'Stock5'])
prices = (1 + returns).cumprod()
prices.plot(figsize=(10,6))
plt.title('模拟股票价格走势')
plt.xlabel('日期')
plt.ylabel('价格')
plt.legend(loc='upper left')
plt.show()
核心要点回顾:
Series
是带索引的一维数据容器DataFrame
是二维表格,支持列式操作pct_change
是收益率计算的核心工具rolling
实现移动窗口分析.loc/.iloc
进行索引进阶学习路径:
rolling
计算)pandas_datareader
获取真实金融数据避坑指南:
df[column]
直接赋值,使用df.assign()
或[]
操作sort_index()
通过这个完整指南,您已掌握Pandas的核心操作和金融数据分析的关键技术。现在尝试用yfinance
库获取真实股票数据(示例代码见下方),开启您的数据分析之旅吧!
import yfinance as yf
# 获取苹果公司历史数据
aapl = yf.download('AAPL', start='2020-01-01', end='2023-01-01')
aapl['MA50'] = aapl['Close'].rolling(50).mean()
aapl[['Close', 'MA50']].plot(figsize=(10,6))