Python数据分析基础 📊
1. NumPy基础操作 🔢
1.1 NumPy数组创建与操作
NumPy是Python中科学计算的基础库,提供了高效的多维数组对象和处理工具:
import numpy as np
# 创建数组
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.zeros((3, 4)) # 3x4的零矩阵
arr3 = np.ones((2, 3)) # 2x3的1矩阵
arr4 = np.arange(0, 10, 2) # [0,2,4,6,8]
# 数组操作
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # 形状:(2, 3)
print(arr.dtype) # 数据类型
print(arr.size) # 元素总数
print(arr.ndim) # 维度数
# 数组计算
arr_sum = arr1 + arr1 # 元素级加法
arr_mul = arr1 * 2 # 标量乘法
dot_product = np.dot(arr1, arr1) # 点积
1.2 数组切片与索引
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
# 基本切片
print(arr[0, :]) # 第一行
print(arr[:, 1]) # 第二列
print(arr[0:2, 1:3]) # 子矩阵
# 布尔索引
mask = arr > 5
print(arr[mask]) # 输出大于5的元素
1.3 数组运算与统计
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 基本运算
print(np.sum(arr)) # 求和
print(np.mean(arr)) # 平均值
print(np.std(arr)) # 标准差
print(np.var(arr)) # 方差
# 按轴运算
print(np.sum(arr, axis=0)) # 按列求和
print(np.sum(arr, axis=1)) # 按行求和
2. Pandas数据处理 🐼
2.1 Series和DataFrame基础
import pandas as pd
# 创建Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
# 创建DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4],
'B': pd.date_range('20230101', periods=4),
'C': pd.Series(1, index=list(range(4))),
'D': np.random.randn(4)
})
# 基本属性
print(df.shape) # 形状
print(df.dtypes) # 数据类型
print(df.index) # 索引
print(df.columns) # 列名
2.2 数据清洗与处理
# 处理缺失值
df.fillna(value=0) # 填充缺失值
df.dropna(how='any') # 删除含有缺失值的行
# 数据转换
df['A'] = df['A'].astype('float64') # 类型转换
df['B'] = pd.to_datetime(df['B']) # 转换为日期类型
# 数据筛选
mask = df['A'] > 2
filtered_df = df[mask] # 条件筛选
# 数据排序
df.sort_values('A', ascending=False) # 按A列降序排序
2.3 数据聚合与分组操作
# 分组操作
grouped = df.groupby('A')
print(grouped.mean()) # 分组平均值
print(grouped.count()) # 分组计数
# 聚合操作
agg_funcs = {
'B': 'count',
'C': ['sum', 'mean'],
'D': ['min', 'max']
}
result = df.groupby('A').agg(agg_funcs)
3. Matplotlib数据可视化 📈
3.1 基础绘图
import matplotlib.pyplot as plt
# 线图
plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title('Simple Line Plot')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.grid(True)
plt.show()
# 散点图
plt.scatter(df['A'], df['D'])
plt.title('Scatter Plot')
plt.show()
3.2 高级绘图
# 子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
ax1.plot(df['A'], df['B'])
ax1.set_title('Plot 1')
ax2.scatter(df['C'], df['D'])
ax2.set_title('Plot 2')
plt.tight_layout()
plt.show()
# 直方图
plt.hist(df['D'], bins=20)
plt.title('Histogram')
plt.show()
4. 实战案例:股票数据分析 📊
让我们创建一个完整的股票数据分析系统:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import yfinance as yf
class StockAnalyzer:
"""股票数据分析类"""
def __init__(self, symbol: str, start_date: str, end_date: str):
self.symbol = symbol
self.start_date = start_date
self.end_date = end_date
self.data = None
self._load_data()
def _load_data(self):
"""加载股票数据"""
try:
self.data = yf.download(self.symbol,
start=self.start_date,
end=self.end_date)
except Exception as e:
raise Exception(f"加载股票数据失败:{str(e)}")
def calculate_technical_indicators(self):
"""计算技术指标"""
# 移动平均线
self.data['MA5'] = self.data['Close'].rolling(window=5).mean()
self.data['MA20'] = self.data['Close'].rolling(window=20).mean()
# RSI指标
delta = self.data['Close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
rs = gain / loss
self.data['RSI'] = 100 - (100 / (1 + rs))
# MACD指标
exp1 = self.data['Close'].ewm(span=12, adjust=False).mean()
exp2 = self.data['Close'].ewm(span=26, adjust=False).mean()
self.data['MACD'] = exp1 - exp2
self.data['Signal'] = self.data['MACD'].ewm(span=9, adjust=False).mean()
return self.data
def plot_stock_analysis(self):
"""绘制股票分析图表"""
# 创建子图
fig = plt.figure(figsize=(15, 10))
# 价格和成交量图
ax1 = plt.subplot2grid((4, 1), (0, 0), rowspan=2)
ax2 = plt.subplot2grid((4, 1), (2, 0))
ax3 = plt.subplot2grid((4, 1), (3, 0))
# 绘制价格和移动平均线
ax1.plot(self.data.index, self.data['Close'], label='Close')
ax1.plot(self.data.index, self.data['MA5'], label='MA5')
ax1.plot(self.data.index, self.data['MA20'], label='MA20')
ax1.set_title(f'{self.symbol} Stock Analysis')
ax1.set_ylabel('Price')
ax1.legend()
ax1.grid(True)
# 绘制成交量
ax2.bar(self.data.index, self.data['Volume'])
ax2.set_ylabel('Volume')
ax2.grid(True)
# 绘制MACD
ax3.plot(self.data.index, self.data['MACD'], label='MACD')
ax3.plot(self.data.index, self.data['Signal'], label='Signal')
ax3.set_ylabel('MACD')
ax3.legend()
ax3.grid(True)
plt.tight_layout()
return fig
def generate_trading_signals(self):
"""生成交易信号"""
signals = pd.DataFrame(index=self.data.index)
signals['signal'] = 0
# MACD交叉信号
signals['signal'] = np.where(
self.data['MACD'] > self.data['Signal'], 1, 0)
signals['position'] = signals['signal'].diff()
return signals
def calculate_returns(self):
"""计算收益率统计"""
daily_returns = self.data['Close'].pct_change()
stats = {
'Total Return': (self.data['Close'][-1] / self.data['Close'][0] - 1) * 100,
'Average Daily Return': daily_returns.mean() * 100,
'Daily Return Std': daily_returns.std() * 100,
'Sharpe Ratio': (daily_returns.mean() / daily_returns.std()) * np.sqrt(252),
'Max Drawdown': ((self.data['Close'] / self.data['Close'].cummax() - 1)
.min()) * 100
}
return pd.Series(stats)
def main():
"""主函数:演示股票分析系统的使用"""
# 创建分析器实例
analyzer = StockAnalyzer(
symbol='AAPL',
start_date='2023-01-01',
end_date='2023-12-31'
)
try:
# 计算技术指标
analyzer.calculate_technical_indicators()
# 生成交易信号
signals = analyzer.generate_trading_signals()
# 计算收益统计
returns = analyzer.calculate_returns()
print("\n收益率统计:")
print(returns)
# 绘制分析图表
fig = analyzer.plot_stock_analysis()
plt.show()
except Exception as e:
print(f"分析过程出错:{str(e)}")
if __name__ == "__main__":
main()
实战案例特点:
-
完整的分析框架
- 数据加载和预处理
- 技术指标计算
- 交易信号生成
- 收益率分析
-
可视化展示
- 多子图展示
- 价格和成交量分析
- 技术指标展示
-
模块化设计
- 清晰的类结构
- 功能分离
- 易于扩展
-
实用的分析工具
- 移动平均线
- MACD指标
- RSI指标
- 收益率统计
扩展建议:
- 添加更多技术指标
- 实现回测系统
- 添加风险管理模块
- 实现实时数据分析
- 添加机器学习预测
- 实现投资组合分析
- 添加报告生成功能
这个实战案例展示了如何将NumPy、Pandas和Matplotlib结合起来,创建一个完整的股票数据分析系统。它提供了一个可扩展的框架,可以根据实际需求添加更多功能。
如果你觉得这篇文章有帮助,欢迎点赞转发,也期待在评论区看到你的想法和建议!👇
咱们下一期见!