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

news2024/11/30 3:22:32

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()

实战案例特点:

  1. 完整的分析框架

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

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

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

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

扩展建议:

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

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


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

咱们下一期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node.js nvm 安装和使用

个人笔记记录。 参考文档&#xff1a;https://blog.csdn.net/weixin_45811256/article/details/130860444 1、下载nvm-setup.exe 安装程序 2、将本地的node卸载&#xff0c;然后点击进行安装。 3、安装 node.js 方法一&#xff1a; 去nodejs官网搜索历史版本&#xff0c;找…

js:函数

函数 函数&#xff1a;实现抽取封装&#xff0c;执行特定任务的代码块&#xff0c;方便复用 声明 函数命名规范 尽量小驼峰 前缀应该为动词&#xff0c;如getName、hasName 函数的调用 函数体是函数的构成部分 函数传参 参数列表里的参数叫形参&#xff0c;实际上写的数据叫实…

【大模型】基于LLaMA-Factory的模型高效微调

LLaMA-Factory项目介绍 LLaMA Factory 是一个简单易用且高效的大型语言模型&#xff08;Large Language Model&#xff09;训练与微调平台。通过 LLaMA Factory&#xff0c;可以在无需编写任何代码的前提下&#xff0c;在本地完成上百种预训练模型的微调&#xff0c;框架特性包…

论文笔记 SliceGPT: Compress Large Language Models By Deleting Rows And Columns

欲买桂花同载酒&#xff0c;终不似&#xff0c;少年游。 数学知识 秩&#xff1a; 矩阵中最大线性无关的行/列向量数。行秩与列秩相等。 线性无关&#xff1a;对于N个向量而言&#xff0c;如果任取一个向量 v \textbf{v} v&#xff0c;不能被剩下的N-1个向量通过线性组合的方式…

hadoop_zookeeper详解

Zookeeper秒懂 工作机制特点数据结构应用场景安装选举机制初始化启动无法和Leader保持连接 节点类型监听器原理写数据流程Paxos算法算法流程 客户端命令 Zookeeper 是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的 Apache 项目。 工作机制 Zookeeper是一个基于观察…

MD5算法加密笔记

MD5是常见的摘要算法。 摘要算法&#xff1a; 是指把任意⻓度的输⼊消息数据转化为固定⻓度的输出数据的⼀种密码算法. 摘要算法是 不可逆的, 也就是⽆法解密. 通常⽤来检验数据的完整性的重要技术, 即对数据进⾏哈希计算然后⽐ 较摘要值, 判断是否⼀致. 常⻅的摘要算法有: MD5…

【LeetCode每日一题】——717.1比特与2比特字符

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 数组 二【题目难度】 简单 三【题目编号】 717.1比特与2比特字符 四【题目描述】 有两种特…

ATTCK红队评估实战靶场(二)

http://vulnstack.qiyuanxuetang.net/vuln/?page2 描述&#xff1a;红队实战系列&#xff0c;主要以真实企业环境为实例搭建一系列靶场&#xff0c;通过练习、视频教程、博客三位一体学习。本次红队环境主要Access Token利用、WMI利用、域漏洞利用SMB relay&#xff0c;EWS re…

SpringMVC |(一)SpringMVC概述

文章目录 &#x1f4da;SpringMVC概述&#x1f407;三层架构&#x1f407;异步调用 &#x1f4da;SpringMVC入门案例&#x1f407;入门案例&#x1f407;注意事项 &#x1f4da;小结 学习来源&#xff1a;黑马程序员SSM框架教程_SpringSpringMVCMaven高级SpringBootMyBatisPlus…

uniapp实现APP版本升级

App.vue 直接上代码 <script>export default {methods: {//APP 版本升级Urlupload() {// #ifdef APP-PLUSplus.runtime.getProperty(plus.runtime.appid, (info) > {// 版本号变量持久化存储getApp().globalData.version info.version;this.ToLoadUpdate(info.versi…

visionpro官方示例分析(一) 模板匹配工具 缺陷检测工具

1.需求&#xff1a;找出图像中的这个图形。 2.步骤 使用CogPMAlignTool工具&#xff0c;该工具是模板匹配工具&#xff0c;见名知意&#xff0c;所谓模板匹配工具就是说先使用该工具对一张图像建立模板&#xff0c;然后用这个模板在其他图像上进行匹配&#xff0c;匹配上了就说…

QT:多ui界面显示

文章目录 1.多ui界面添加2.跳转函数3.返回函数4.Qt5源码工程5.模态显示 1.多ui界面添加 最终生成这个目录 2.跳转函数 void MainWindow::on_pushButton_clicked() {//this->setWindowModality(Qt::WindowModal);test1 *t1 new test1();t1->setParentData(this);this-…

python代码示例(读取excel文件,自动播放音频)

目录 python 操作excel 表结构 安装第三方库 代码 自动播放音频 介绍 安装第三方库 代码 python 操作excel 表结构 求出100班同学的平均分 安装第三方库 因为这里的表结构是.xlsx文件,需要使用openpyxl库 如果是.xls格式文件,需要使用xlrd库 pip install openpyxl /…

CSS技巧之2D转换

目录 2D转换 2D 转换之移动 translate 2D 转换之旋转 rotate 2D 转换中心点 transform-origin 2D 转换之缩放scale 2D 转换综合写法 2D转换 转换(transform)是CS53中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果转换(lranslorm)你可以简单理解…

架构-微服务-服务治理

文章目录 前言一、服务治理介绍1. 什么是服务治理2. 常见的注册中心 二、nacos简介三、nacos实战入门1. 搭建nacos环境2. 将商品微服务注册到nacos3. 将订单微服务注册到nacos 四、实现服务调用的负载均衡1. 什么是负载均衡2. 自定义实现负载均衡3. 基于Ribbon实现负载均衡 五、…

常见的概念 及 分布式系统的演变过程

文章目录 一. 概念解释1. 应用&#xff08;Application&#xff09;/ 系统&#xff08;System&#xff09;2. 模块&#xff08;Module&#xff09;/ 组件&#xff08;Component&#xff09;3. 分布式&#xff08;Distributed&#xff09;4. 集群&#xff08;Cluster&#xff09…

探讨播客的生态系统

最近对播客发生了兴趣&#xff0c;从而引起了对播客背后的技术&#xff0c;生态的关注。本文谈谈播客背后的技术生态系统。 播客很简单 播客&#xff08;podcast&#xff09;本质上就是以语音的方式发布信息。它和博客非常类似。如果将CSDN 网站上的文字加一个语音播报。CSDN …

微信小程序WXSS全局样式与局部样式的使用教程

微信小程序WXSS全局样式与局部样式的使用教程 引言 在微信小程序的开发中,样式的设计与实现是提升用户体验的关键部分。WXSS(WeiXin Style Sheets)作为微信小程序的样式表语言,不仅支持丰富的样式功能,还能通过全局样式与局部样式的灵活运用,帮助开发者构建美观且易于维…

Apache-maven在Windows中的安装配置及Eclipse中的使用

Apache Maven 是一个自动化项目管理工具&#xff0c;用于构建&#xff0c;报告和文档的项目管理工具。以下是在不同操作系统上安装和配置 Maven 的基本步骤&#xff1a; 安装 Maven 下载 Maven: apache-maven-3.9.9下载地址&#xff0c;也可访问 Apache Maven 官方网站 下载最…

【Web前端】如何构建简单HTML表单?

HTML 表单是 Web 开发中非常重要的组成部分。它们是与用户交互的主要方式&#xff0c;能够收集用户输入的数据。表单的灵活性使它们成为 HTML 中最复杂的结构之一&#xff0c;但若使用正确的结构和元素&#xff0c;可以确保其可用性和无障碍性。 表单的基本结构 HTML 表单使用…