量化交易入门(十三)Python开发-pandas

Pandas是Python中一个强大的数据分析和处理库。它提供了高性能、易用的数据结构和数据分析工具。Pandas的核心是DataFrame数据结构,可以让你高效地操作和分析结构化数据。下面我来详细介绍一下Pandas的主要功能和用法:

  1. 数据结构:
  • Series: 一维标记的同构数据结构,类似于一维数组
  • DataFrame: 二维标记的异构表格结构,包含行列标签,类似于电子表格或SQL表
  1. 数据导入和导出:
  • read_csv(), read_excel(), read_sql()等函数可从各种文件和数据库中导入数据
  • to_csv(), to_excel(), to_sql()等函数可将数据导出到文件或数据库
  1. 数据清洗和预处理:
  • 处理缺失值: isnull(), fillna(), dropna()
  • 去重: drop_duplicates()
  • 数据类型转换: astype()
  • 数据排序: sort_values(), sort_index()
  1. 数据选取和过滤:
  • 按标签选取: df.loc[行标签, 列标签]
  • 按位置选取: df.iloc[行号, 列号]
  • 布尔索引过滤: df[df['列名']>某值]
  1. 数据运算和聚合:
  • 算术运算: add(), sub(), mul(), div()
  • 统计聚合: sum(), mean(), max(), min(), count()
  • 分组聚合: groupby()
  • 数据透视表: pivot_table()
  1. 数据可视化:
  • 绘图函数: plot(), hist(), boxplot(), scatter()等
  1. 时间序列处理:
  • 时间戳和时间段: Timestamp, Period
  • 日期范围: date_range()
  • 频率转换: resample()
  • 移动窗口计算: rolling()

我们以一个包含股票量化数据的CSV文件为例,讲解Pandas的数据结构以及如何导入和导出数据。

假设我们有一个名为"stock_data.csv"的文件,内容如下:

Date,Open,High,Low,Close,Volume
2023-01-03,100.5,101.3,99.8,100.2,1000000
2023-01-04,100.3,100.8,99.5,100.6,1200000
2023-01-05,100.7,101.5,100.1,101.2,1500000
...

  1. 导入数据到DataFrame:
import pandas as pddf = pd.read_csv('stock_data.csv')
print(df.head())

输出:

         Date   Open   High    Low  Close   Volume
0  2023-01-03  100.5  101.3   99.8  100.2  1000000
1  2023-01-04  100.3  100.8   99.5  100.6  1200000
2  2023-01-05  100.7  101.5  100.1  101.2  1500000

pd.read_csv()函数将CSV文件读取为一个DataFrame对象。DataFrame是一个二维标记的数据结构,每列可以是不同的数据类型。
这里'Date'列是日期,'Open','High','Low','Close'是浮点数,'Volume'是整数。

  1. 选取和过滤数据:
# 选取单列 
closes = df['Close']
print(type(closes))# 选取多列
price_data = df[['Open', 'High', 'Low', 'Close']]# 过滤数据
high_volume = df[df['Volume'] > 1000000]

单列选取返回的是Series,多列选取返回的是子DataFrame。我们可以方便地用布尔条件筛选数据。

  1. 导出数据到CSV文件:
price_data.to_csv('price_data.csv', index=False)

to_csv()方法可将DataFrame导出为CSV文件。index=False表示不要将行索引也输出。

  1. 导出数据到Excel文件:
price_data.to_excel('price_data.xlsx', sheet_name='价格数据', index=False)

to_excel()将DataFrame导出到Excel文件,可以指定工作表名称。

假设我们的DataFrame df 中有一些缺失值和重复数据,并且Volume列的数据类型是字符串:

         Date   Open   High    Low  Close   Volume
0  2023-01-03  100.5  101.3   99.8  100.2  1000000
1  2023-01-04    NaN  100.8   99.5    NaN  1200000
2  2023-01-05  100.7  101.5  100.1  101.2  1500000
3  2023-01-03  100.5  101.3   99.8  100.2  1000000
4  2023-01-06  101.3    NaN  100.5  100.9  '800000'
  1. 数据清洗和预处理
  • 处理缺失值
# 删除包含缺失值的行
df_dropped = df.dropna()# 填充缺失值为0
df_filled = df.fillna(0)

dropna()函数删除包含缺失值的行,fillna()函数可以将缺失值填充为指定的值。

  • 去除重复行
df_deduped = df.drop_duplicates()

drop_duplicates()函数可以去除重复的行。

  • 数据类型转换
df['Volume'] = df['Volume'].astype(int)

astype()函数将Volume列转换为整数类型。

  1. 数据选取和过滤
  • 按标签选取
# 选取单个值
open0103 = df.at[0, 'Open']# 选取一行
row0 = df.loc[0]# 选取一列
opens = df.loc[:, 'Open']# 选取多列
price_data = df.loc[:, 'Open':'Close']

at用于选取单个标量值,loc用于按标签选取行、列或子DataFrame。

  • 按位置选取
# 选取单个值 
open0 = df.iat[0, 1]# 选取一行
row0 = df.iloc[0]# 选取一列
column0 = df.iloc[:, 0]  # 选取子DataFrame
subdf = df.iloc[:3, 1:5] 

iat用于选取单个标量值,iloc用于按整数位置选取行、列或子DataFrame。

  • 布尔索引过滤
# 选取'Open'大于100的行
high_open = df[df['Open'] > 100]# 选取'Volume'大于1000000且'Close'小于101的行 
filtered = df[(df['Volume'] > 1000000) & (df['Close'] < 101)]

将布尔条件传给DataFrame的[]操作符可以高效地过滤数据。多个条件可以用 &(和)、|(或)连接。

假设我们有一个包含多只股票数据的DataFrame df:

    Date        Symbol  Open   High   Low    Close  Volume
0   2023-01-03  AAPL    100.5  101.3  99.8   100.2  1000000
1   2023-01-03  GOOG    90.2   91.5   89.7   91.1   500000
2   2023-01-04  AAPL    100.3  100.8  99.5   100.6  1200000
3   2023-01-04  GOOG    91.3   92.0   90.5   91.7   600000
4   2023-01-05  AAPL    100.7  101.5  100.1  101.2  1500000
5   2023-01-05  GOOG    91.8   92.3   91.2   92.0   800000
  1. 数据运算
  • 算术运算
# 计算价格变化
df['PriceChange'] = df['Close'] - df['Open']# 计算价格变化百分比
df['PctChange'] = (df['Close'] - df['Open']) / df['Open'] * 100

我们可以直接对DataFrame的列进行算术运算,生成新的列。

  • 移动窗口计算
# 计算5日移动平均线
df['MA5'] = df.groupby('Symbol')['Close'].rolling(5).mean().reset_index(drop=True)

rolling()函数可以计算移动窗口的统计值,这里我们按Symbol分组,计算每只股票的5日移动平均收盘价。

  1. 数据聚合
  • 描述性统计
# 计算每列的统计值
stats = df.describe()# 计算Volume列的统计值 
volume_stats = df['Volume'].describe()

describe()函数计算DataFrame每列的常见统计值,如数量、均值、标准差、最小值、四分位数、最大值等。

  • 分组聚合
# 按Symbol分组,计算平均值
group_mean = df.groupby('Symbol').mean()# 按Symbol分组,计算最大Volume
group_max_volume = df.groupby('Symbol')['Volume'].max()

groupby()函数可以按一列或多列的值对数据分组,然后对每组应用聚合函数。

  • 透视表
# 按Symbol和Date汇总Volume 
volume_pivot = df.pivot_table(index='Date', columns='Symbol', values='Volume', aggfunc='sum')

pivot_table()函数可以方便地创建透视表,按行列标签汇总数据。这里我们按日期和股票代码汇总成交量。

假设我们有一个包含单只股票数据的DataFrame df:

    Date        Open    High    Low     Close   Volume
0   2023-01-03  100.5   101.3   99.8    100.2   1000000
1   2023-01-04  100.3   100.8   99.5    100.6   1200000
2   2023-01-05  100.7   101.5   100.1   101.2   1500000
3   2023-01-06  101.3   102.0   100.5   100.9   1800000
4   2023-01-09  100.8   101.2   99.9    100.5   1300000

Pandas的DataFrame和Series对象有一个便捷的 plot() 方法,可以快速创建各种图表。它实际上是在封装Python的Matplotlib库。

  1. 线形图
# 绘制收盘价折线图
df.plot(x='Date', y='Close', kind='line', figsize=(10, 6))

我们指定Date列为x轴,Close列为y轴,图表类型为'line',绘制收盘价折线图。figsize参数设置图表大小。

  1. 柱状图
# 绘制成交量柱状图
df.plot(x='Date', y='Volume', kind='bar', figsize=(10, 6))

这里我们绘制日成交量的柱状图,只需将图表类型改为'bar'。

  1. 直方图
# 绘制收盘价分布直方图
df['Close'].plot(kind='hist', bins=20, figsize=(10, 6))

直方图可以显示一列数据的分布情况。bins参数设置直方图的条形数量。

  1. 箱线图
# 绘制收盘价箱线图
df.boxplot(column=['Close'], figsize=(10, 6))

箱线图可以显示一列数据的统计分布信息,包括最小值、第一四分位数、中位数、第三四分位数和最大值。

  1. 散点图
# 绘制开盘价和收盘价散点图
df.plot(x='Open', y='Close', kind='scatter', figsize=(10, 6))

散点图可以显示两列数据的相关性。这里我们查看开盘价和收盘价的关系。

时间序列数据在量化金融领域非常常见,如股票价格、交易量等都是时间序列。

假设我们有以下股票数据DataFrame df:

    Date        Open    High    Low     Close   Volume
0   2023-01-03  100.5   101.3   99.8    100.2   1000000
1   2023-01-04  100.3   100.8   99.5    100.6   1200000
2   2023-01-05  100.7   101.5   100.1   101.2   1500000
3   2023-01-06  101.3   102.0   100.5   100.9   1800000
4   2023-01-09  100.8   101.2   99.9    100.5   1300000
  1. 将字符串日期转换为日期时间索引
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

我们先用 to_datetime() 函数将Date列转换为日期时间类型,然后用 set_index() 方法将其设置为DataFrame的索引。这样DataFrame就变成了一个时间序列。

  1. 重采样
# 按周重采样,计算最高价、最低价、开盘价、收盘价和成交量的均值
weekly_df = df.resample('W').agg({'Open': 'first','High': 'max','Low': 'min','Close': 'last','Volume': 'mean'
})

resample() 方法可以将时间序列转换为另一个频率。这里我们将日数据重采样为周数据,并计算每周的最高价、最低价、开盘价(第一个值)、收盘价(最后一个值)和平均成交量。

  1. 移动窗口计算
# 计算5日移动平均收盘价
df['MA5'] = df['Close'].rolling(window=5).mean()# 计算5日移动平均成交量,忽略NaN值
df['Volume_MA5'] = df['Volume'].rolling(window=5, min_periods=1).mean()

rolling() 方法可以计算移动窗口的统计值。这里我们计算5日移动平均收盘价和成交量。min_periods参数设置了最小非NaN值的数量,以处理时间序列开头或含有NaN值的情况。

  1. 移动窗口聚合
# 计算20日内最高价和最低价
df['20d_High'] = df['High'].rolling(window=20).max()
df['20d_Low'] = df['Low'].rolling(window=20).min()

这里我们计算了20日内的最高价和最低价,可以用于确定价格范围或支撑和阻力位。

  1. 日期范围生成
# 生成一个日期范围
date_range = pd.date_range(start='2023-01-01', end='2023-12-31', freq='B')

date_range() 函数可以生成一个指定频率的日期范围。这里我们生成了2023年的所有工作日('B'表示工作日)。这在需要对齐或填充时间序列数据时非常有用。

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

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

相关文章

技术创新与产业升级

在政府工作报告中,新兴技术如云计算、大数据、人工智能等被多次提及,这反映了政府高度重视新一代信息技术在推动经济社会发展中的重要作用。对于计算机行业而言,抓住这些新兴技术的发展机遇,推动技术创新和产业升级,将是未来发展的关键所在。 云计算作为一种新兴的计算模式,正…

485问题汇总

485问题汇总 485 通信波形没有负电压 问题描述&#xff1a;设备在没有外设的时候通信波形是正常的&#xff0c;即5V可以出来&#xff0c;在连接上设备后&#xff0c;设备的通信波形的-5V会随着设备的增多&#xff0c;电压会慢慢上升。当设备连接到24台设备后&#xff0c;485总…

MySQL下载及安装过程

MySQl 5.7 安装图解 目录 MySQl 5.7 安装图解 第一步 安装包 第二步 Mysql协议 第三步 安装前检查 第四步 安装 第五步 产品配置 第六步 安装完成 第一步 安装包 双击安装包文件 进行安装 第二步 Mysql协议 同意Mysql协议 , 选择 Server Only安装Mysql服务器即可 …

js处理base64字符串

编码 function encodeBase64(str: string): string {return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {return String.fromCharCode(parseInt(p1, 16))})) }解码 function decodeBase64(base64Str: string): string {return decodeURI…

数据结构(三)复杂度的深层次剖析

之前发布了数据结构&#xff08;一&#xff09;&#xff0c;很多同学反响不够清晰&#xff0c;那今天就发一篇对复杂度专题的博客&#xff0c;希望对大家理解复杂度提供一些帮助。 时间复杂度 我们先来一个理解一个复杂度&#xff0c;二分查找的复杂度&#xff08;之前写过二…

Ubuntu中安装VSCode的一个指令

问题描述 本来想去VSCode官网上下载软件包&#xff0c;然后双击使用Ubuntu Software安装的&#xff0c;但是安装老不成功。 想用命令行指令dpkg进行安装&#xff0c;虽然能成功&#xff0c;但是后续使用 code . 命令打开VSCode又报错说找不到命令。 解决方式 在命令行中使用…

蓝桥杯day8刷题日记--双子数,有奖问答

双子数 思路&#xff1a;双子数数位必为偶数&#xff0c;所以枚举的范围可以缩小为1000至9999,100000至999999,10000000至99999999 有奖问答 思路&#xff1a;每次枚举做到第i道题数各种得分的次数&#xff0c;得分为0的情况是由上一道题除了100分以外的分数的可能情况&…

牛客NC101 压缩字符串(一)【简单 模拟 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/c43a0d72d29941c1b65c857d8ac9047e 思路 直接模拟参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值…

备考ICA----Istio实验4---使用 Istio 进行金丝雀部署

备考ICA----Istio实验4—使用 Istio 进行金丝雀部署 上一个实验已经通过DestinationRule实现了部分金丝雀部署的功能,这个实验会更完整的模拟展示一个环境由v1慢慢过渡到v2版本的金丝雀发布. 1. 环境清理 kubectl delete gw/helloworld-gateway vs/helloworld dr/helloworld…

MATLAB入门指南:从零开始进行数学建模竞赛

第1部分&#xff1a;认识MATLAB 1.1 什么是MATLAB&#xff1f; MATLAB&#xff08;Matrix Laboratory的缩写&#xff09;是一个高性能的数值计算环境和第四代编程语言。由MathWorks公司开发&#xff0c;它提供了一个便捷的数学解决框架&#xff0c;主要用于算法开发、数据可视…

VS2017 remote debugger实现在线调试note

前言&#xff1a; 做为一个程序员&#xff0c; 必备的技能就是代码调试了&#xff0c;但是你们真的掌握了VS 的调试吗&#xff1f;有些时候由于线上环境和本地环境的差异&#xff0c; 导致本地可以运行&#xff0c; 但是线上确是存在异常的情况。也许可以通过Log 很快的定位到…

5.4.2、【AI技术新纪元:Spring AI解码】OpenAI Text-to-Speech (TTS) Integration

OpenAI文本转语音(TTS)集成 简介 音频API基于OpenAI的TTS(文本转语音)模型提供了一个语音端点,用户可以: 朗读一篇书面博客文章。以多种语言生成语音输出。利用流媒体实现实时音频输出。必要条件 创建OpenAI账号并获取API密钥。您可以在OpenAI注册页面上注册,并在API密…

JavaEE--小Demo--数据库建立

目录 实验准备 本次所要新建的文件 实验步骤 step1-demo.sql 1.在resources文件夹下新建demo.sql文件 2.打开此目录&#xff0c;并运行命令提示符 3.打开数据库mysql -uroot -p 4.创建数据库create database demo; 5.使用数据库use demo; 6.导入数据source demo.sql;…

bochs模拟器中文文档

一、前言&#xff1a; 相信很多人都有使用模拟器的需求&#xff0c;因为并不是所有的场景都能用虚拟机代劳&#xff0c;如果你需要对程序精心的调试&#xff0c;实时查看内存与寄存器信息、研究指令集的工作原理&#xff0c;那么模拟器就是一种非常重要的工具。常见的模拟器有…

简介:KMeans聚类算法

在机器学习中&#xff0c;无监督学习一直是我们追求的方向&#xff0c;而其中的聚类算法更是发现隐藏数据结构与知识的有效手段。聚类是一种包括数据点分组的机器学习技术。给定一组数据点&#xff0c;我们可以用聚类算法将每个数据点分到特定的组中。 理论上&#xff0c;属于同…

海量数据处理项目-学以致用-商用短链平台需求文档拆分和总结

海量数据处理项目-学以致用-商用短链平台需求文档拆分和总结

提升Midjourney风格化的三个技巧

1. 引言 在前篇博文中&#xff0c;我们详细讲述了Midjourney的新功能风格参考的一些基础使用方法&#xff0c;事实上我们可以通过控制参数和提示权重进行更多的自定义操作&#xff0c;在本文中&#xff0c;我将向大家介绍我在网上搜集到的一些提升风格化效果的三个技巧。 闲话…

怎么卸载Mybatis?(仅需三步)

解决办法如下&#xff1a; 第一步&#xff1a;选择文件→设置 第二步&#xff1a;找到插件→输入Mybatis找到这个标志 第三步&#xff1a;把这个勾勾取消掉&#xff0c;点击确定&#xff0c;就可以轻松卸载了

capl实现crc校验码计算

CAPL (Communication Access Programming Language) 是一种用于CANoe和CANalyzer工具中的脚本语言&#xff0c;它允许用户模拟和测试CAN网络中的ECU&#xff08;Electronic Control Unit&#xff09;行为。CAPL 提供了丰富的函数库来支持CAN通信的各种功能&#xff0c;包括发送…

hcip复习总结2(广域网与OSPF)

数据链路层面&#xff1a; 针对不同的物理链路定义不同的封装 局域网封装&#xff1a; Ethernet 2 &#xff08; TCP/IP &#xff09; &#xff0c; IEEE802.3 &#xff08; OSI &#xff09; 广域网封装&#xff1a; PPP HDLC FR ATM HDLC &#xff1a; 高级数据链路控制协…