Python入门(14)--数据分析基础

Python数据分析基础 📊

1. NumPy基础操作 🔢

1.1 NumPy数组创建与操作

NumPy是Python中科学计算的基础库,提供了高效的多维数组对象和处理工具:

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 数组切片与索引

python 复制代码
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 数组运算与统计

python 复制代码
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基础

python 复制代码
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 数据清洗与处理

python 复制代码
# 处理缺失值
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 数据聚合与分组操作

python 复制代码
# 分组操作
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 基础绘图

python 复制代码
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 高级绘图

python 复制代码
# 子图
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. 实战案例:股票数据分析 📊

让我们创建一个完整的股票数据分析系统:

python 复制代码
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()

实战案例特点:

  1. 完整的分析框架

    • 数据加载和预处理
    • 技术指标计算
    • 交易信号生成
    • 收益率分析
  2. 可视化展示

    • 多子图展示
    • 价格和成交量分析
    • 技术指标展示
  3. 模块化设计

    • 清晰的类结构
    • 功能分离
    • 易于扩展
  4. 实用的分析工具

    • 移动平均线
    • MACD指标
    • RSI指标
    • 收益率统计

扩展建议:

  1. 添加更多技术指标
  2. 实现回测系统
  3. 添加风险管理模块
  4. 实现实时数据分析
  5. 添加机器学习预测
  6. 实现投资组合分析
  7. 添加报告生成功能

这个实战案例展示了如何将NumPy、Pandas和Matplotlib结合起来,创建一个完整的股票数据分析系统。它提供了一个可扩展的框架,可以根据实际需求添加更多功能。


如果你觉得这篇文章有帮助,欢迎点赞转发,也期待在评论区看到你的想法和建议!👇

咱们下一期见!

相关推荐
nju_spy25 分钟前
python 算法题基础常用总结(比赛 or 机试 or 面试)
python·记忆化搜索·位运算·二分查找 - bisect·排序与lambda·最短路和最小生成树·堆与优先队列
Deng87234734831 分钟前
自动化极验3点选验证码的识别与验证方案
运维·python·自动化
川石课堂软件测试1 小时前
自动化测试的基本概念及常用框架
数据库·python·功能测试·测试工具·单元测试·自动化·流程图
灰勒塔德1 小时前
jetson orin nano super开发指南
linux·服务器·python
8278209371 小时前
python scp 备份
开发语言·python
poggioxay1 小时前
JAVA零基础入门知识3(持续更新中)
java·开发语言·python
serve the people1 小时前
TensorFlow 基础训练循环(简化版 + 补全代码)
人工智能·python·tensorflow
木里先森1 小时前
解决报错:/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found
linux·python
爱打代码的小林2 小时前
numpy库数组笔记
笔记·python·numpy
Misnice2 小时前
pip 查看当前包列表
windows·python·pip