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

embedded/2024/11/28 22:42:07/

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 yfclass StockAnalyzer:"""股票数据分析类"""def __init__(self, symbol: str, start_date: str, end_date: str):self.symbol = symbolself.start_date = start_dateself.end_date = end_dateself.data = Noneself._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 / lossself.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 - exp2self.data['Signal'] = self.data['MACD'].ewm(span=9, adjust=False).mean()return self.datadef 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)# 绘制MACDax3.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 figdef 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 signalsdef 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结合起来,创建一个完整的股票数据分析系统。它提供了一个可扩展的框架,可以根据实际需求添加更多功能。


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

咱们下一期见!


http://www.ppmy.cn/embedded/141277.html

相关文章

自制游戏:监狱逃亡

第一个游戏&#xff0c;不喜勿喷&#xff1a; ​ #include<bits/stdc.h> #include<windows.h> using namespace std; int xz; int ruond_1(int n){if(xz1){printf("撬开了&#xff0c;但站在你面前的是俄罗斯内务部特种部队的奥摩大帝&#xff0c;你被九把加…

C/C++绘制爱心

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/…

银行卡OCR 识别 API 接口的影响因素分析

在金融科技飞速发展的大背景下,数字化与自动化的发展态势愈发显著。银行卡 OCR 识别 API 接口作为一项关键技术&#xff0c;正起着举足轻重的作用。它能够自动从银行卡图像中提取关键信息&#xff0c;极大地提高了金融业务的处理效率。以下是对银行卡 OCR 识别 API 接口影响因素…

继承与多态(下)

目录 一.关键字final 1.修饰变量 2.修饰方法 3.修饰类 二.继承与组合 三.多态 1.方法重写 2.方法重载(严格上来说非多态) 3.向上转型 4.向下转型 5.向上向下转型综合例子 四.重载和重写的区别 一.关键字final 在 Java 中&#xff0c;final关键字是一个修饰符&#…

排序算法之选择排序篇

思想&#xff1a; 每次从未排序的部分找出最小的元素&#xff0c;将其放到已排序部分的末尾 从数据结构中找到最小值&#xff0c;放到第一位&#xff0c;放到最前面&#xff0c;之后再从剩下的元素中找出第二小的值放到第二位&#xff0c;以此类推。 实现思路&#xff1a; 遍…

蓝牙循环搜索并连接. Android辅助功能以及锁的灵活运用

现在需要实现个工具, android设备要不断自动的去搜索附近蓝牙打印机,然后进行配对,连接打印数据. 根据测试发现有两个技术难点 第一个是一些设备链接打印机后,会弹出进行配对的对话框,有些设备还会让你输入配对密码进行配对,如果用人工去点击,就不是自动去搜索配对,并打印了…

黑马程序员Java项目实战《苍穹外卖》Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一…

在 Spring Boot 中构造 API 响应的最佳实践

在平时的开发和项目中&#xff0c;我们一定会涉及到接口对接的功能&#xff0c;由于不同开发人员的编码习惯不同&#xff0c;API报文在项目中通常是"百花齐放"的。 不但增加工作难度&#xff0c;往往也是扯皮的大头&#xff0c;如果能统一报文格式&#xff0c;不但能…