【Pandas操作1】Series(索引、切片、常用方法)、DataFrame(常用属性、索引操作、切片操作、数据查看、数据保存与加载、操作excel、把数据写入到数据库)、股票分析案例
计算股票的每日收益率和7日波动率:通过计算收益率和波动率,我们可以评估股票的风险和收益情况。
·
1 pandas数据分析库
Pandas 提供了两种数据结构,分别是 Series(一维数组结构)与 DataFrame(二维数组结构),
这两种数据结构极大地增强的了 Pandas 的数据分析能力。
## Series
### 概述
Series是一种类似与一维数组的对象,由下面两个部分组成:
- values:一组数据
- index:相关的数据索引标签
### 常见操作
- 创建方式
- 由列表创建
- 由字典创建
import pandas as pd
from pandas import Series, DataFrame
s1 = Series(data=[3,3,6,6,8,8,9,9])
s1
s2 = Series(data={'name': 'lin', 'salary': '15000', 'age': 30})
s2
1.1 Series的索引
- 隐式索引:默认形式的索引(0,1,2....)
- 显示索引:自定义的索引,可以通过index参数设置显示索引
- 显示索引的作用:增加了数据的可读性
# 通过隐式索引访问元素
s1[0] # 3
# 通过隐式索引访问元素
s1[[0, 2, 4]]
# 显示索引
s2['name'] # 'lin'
1.2 Series的切片
# Series的切片
s1[0:3]
# Series的切片
s2['name': 'age']
1.3 Series的常用方法
- head() 显示前几个元素
- tail() 显示后几个元素
- unique() 显示后几个元素
- nunique() 统计去重后的元素的个数
- value_counts() 统计元素出现的次数
- isnull(),notnull()
# Series的运算
s1 + 100 # 让s1的每个元素都加100
# NaN就是None
s3 + s4
# 在Series的运算中只有索引一致的元素可以进行算术运算,否则补空
2 DataFrame(重要)
#### 概述
- DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。
- 设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
- 行索引:index
- 列索引:columns
- 值:values
#### DataFrame的创建
- 字典创建
dic = {
'name': ['Tom', 'Jerry', 'Jay'],
'age': [10, 20, 30],
'salary': [2000, 3000, 4000]
}
table = DataFrame(data=dic)
table
2.1 DataFrame的常用属性
- values 返回表格所有的值
- columns 返回列索引
- index 返回行索引
- shape 返回表格的维数,形状,是一个元组
2.2 索引操作(重点)
- 对行进行索引
- 队列进行索引
- 对元素进行索引
dic = {
'name': ['Tom', 'Jerry', 'Jay'],
'salary': [2000, 3000, 4000],
'age': [30, 40, 50]
}
df = DataFrame(data=dic, index=['a', 'b', 'c'])
df
# 索引取单列 df[col]
df['age']
# 索引取多列 df[[col1, col2]]
df[['age', 'name']]
# 索引取单行 df.loc/iloc[index]
df.loc['a']
# iloc后面跟的是隐式索引,loc后面跟显示索引
df.iloc[0]
# 索引取多行 df.loc/iloc[[index1, index2]]
df.loc[['a', 'b']]
# 索引取元素, 逗号左边是行,右边是列
df.loc['b', 'name']
2.3 切片操作
- 批量切行 df[‘a’: ‘c’]
- 批量切列 df.loc[:, ‘name’: ‘salary’]
# 切行
df['a': 'c']
# 切列
df.loc[:, 'name': 'salary']
2.4 数据查看
- 查看DataFrame的概览和统计信息
- head() 查看前几行
- tail() 查看后几行
- info() 查看表格的基本信息
- describe() 对数据表格进行统计描述
# 对数据表格进行统计描述
df.describe()
2.5 数据保存与加载
### csv
- to_csv() & read_csv()
dic = {
'name': ['Tom', 'Jerry', 'Jay'],
'salary': [2000, 3000, 4000],
'age': [30, 40, 50]
}
df = DataFrame(data=dic, index=['a', 'b', 'c'])
df
# 将df数据写入到文件中存储
df.to_csv('./df.txt')
# 读取外部文件, ./data/透视表-篮球赛.csv 的数据到df表格中
ball = pd.read_csv('./data/透视表-篮球赛.csv')
ball
2.6 DataFrame操作Excel
环境安装:
pip install xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install xlwt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
- to_excel(filaPath,sheet_name) & read_excel(filaPath,sheet_name)
- sheet_name工作表名称
# 读取execl数据 data/运营商数据.xlsx
opt = pd.read_excel('./data/运营商数据.xlsx')
opt
# 将数据写到excel中
dic = {
'name': ['Tom', 'Jerry', 'Jay'],
'salary': [2000, 3000, 4000],
'age': [30, 40, 50]
}
df = DataFrame(data=dic, index=['a', 'b', 'c'])
df.to_excel('dic.xlsx')
- 为什么需要将外部文件的数据读取加载到DataFrame表格中呢?
- 将外部文件读取到DataFrame中,我们就可以基于DataFrame自身的特性对数据进行不同维度的运算和处理
2.8 把数据写入到数据库
sql
环境安装:
pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
- 写入数据到数据库
- from sqlalchemy import create_engine
- 创建链接对象:
- conn = create_engine(‘mysql+pymysql://用户名:密码@ip:port/dbName?charset=UTF8MB4’)
import pandas as pd
from pandas import Series, DataFrame
dic = {
'name': ['Tom', 'Jerry', 'Jay'],
'salary': [2000, 3000, 4000],
'age': [30, 40, 50]
}
df = DataFrame(data=dic)
df
from sqlalchemy import create_engine
# 创建一个链接对象
# mysql+pymysql://用户名:密码@ip:port/dbName?charset=utf8mb4
conn = create_engine('mysql+pymysql://root:root@127.0.0.1:3306/new_spider?charset=utf8mb4')
df.to_sql(name='tf_df', con=conn)
- 读取数据库中的数据
import pymysql
conn = pymysql.Connect(
host = '127.0.0.1', # 数据库服务器地址
port = 3306, # 数据库端口
user = 'root', # 数据库的用户名
password = 'root', # 密码
db = 'blog' # 数据库名字
)
ret = pd.read_sql('select * from blog_article', conn)
ret
3 股票分析案例
import pandas as pd
# 可以将本地的文件数据读取到df ./data/600519.xlsx
df = pd.read_excel('./data/600519.xlsx')
df.head()
# 删除无用的一列, inplace=True将删除操作作用在原始数据中
df.drop(columns='Unnamed: 0', inplace=True)
df.head()
# 查看表格的基本信息
df.info()
# 转换 'date' 列为 datetime64[ns] 类型
df['date'] = pd.to_datetime(df['date'])
# 转换为按月的 Period 类型 月M 天D
df['date'] = df['date'].dt.to_period('D')
# 将date列转换成时间类型 astype()做类型转
df['date'].astype('datetime64')
#显示索引优势:可以增加数据的可读性
#将date列作为表格的行索引
df.set_index('date',inplace=True)
df.head()
-
计算股票的每日收益率和7日波动率:通过计算收益率和波动率,我们可以评估股票的风险和收益情况。
- 每日收益率:(当日收盘价 - 前一日的收盘价)/ 前一日的收盘价
- shift():将一组数据向前或者前后进行移动
- 7日波动率:对每日收益率数据进行每7日滚动的方差计算
- rolling():设置滚动窗口
- 每日收益率:(当日收盘价 - 前一日的收盘价)/ 前一日的收盘价
df['close'].shift(1)
# 前一日收盘
df['close'].shift(1)
# 每日收益率 (当日收盘价 - 前一日的收盘价) / 前一日的收盘价
day_rate = (df['close'] - df['close'].shift(1)) / df['close'].shift(1)
day_rate
# 7日波动率
# 对每7个数据框起来显示一个窗口,var求一组数据的方差
day_7_rolling_rate = day_rate.rolling(7).var()
day_7_rolling_rate
- 查找股票的市值最大和最小日
- 市值 = 收盘价 * 成交量
- 找出市值数据中最大最小值下标(市值最大和最小日期)
- idxmax() & idxmin()
# 每日市值 = 收盘价 * 成交量
day_valus = df['close'] * df['volume']
day_valus
# 找出市值数据中最大最小值下标(市值最大和最小日期)
day_valus.idxmax() # 求最大元素下标
day_valus.idxmin() # 最小元素下标
# 求最大元素下标 对应的最大值
day_valus.idxmax(), day_valus.max()
- 输出该股票所有收盘比开盘上涨3%以上的日期
- (收盘 - 开盘) / 开盘 > 0.03
ex = (df['close'] - df['open']) / df['open'] > 0.03
ex
# 想获取多有True对应的索引
# 在DataFrame中,可以使用布尔值作为表格的行索引:
# 就会保留True对应的行数据,忽略False对应的行数据
df.loc[['2015-01-05', '2015-01-06']]
df.loc[ex] # 获取了True对应的行数据(满足要求的行数据)
# 输出该股票所有收盘比开盘上涨3%以上的日期
df.loc[ex].index # 获取了满足要求的行数据的行索引
-
假如张三从2015年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
- 分析:
- 买入股票
- 一个完整的年,需要买入12手1200支股票。以购买当期的开盘价进行股票的买卖。
- 卖出股票
- 一个完整的年,需要卖出1200支股票(收盘价为单价)
- 特殊情况:
- 最后一年就是一个特殊的年(因为没有到该年最后一个交易日),只可以买不可以卖,但是手里剩余的股票是需要计算到总收益中。
- 买入股票
resample
函数介绍:pandas
库中的resample
函数主要用于将时间序列数据重新采样到不同的时间频率,例如从按天采样重新采样为按周或按月采样。resample
函数的常用语法如下:- df.resample(rule, …).func()
- 其中,df是一个时间序列数据的DataFrame,rule是指定重采样频率的规则字符串(H小时、W星期、M月、A年等),func是用于聚合数据的函数(例如求和、平均值等)。例如:
- df.resample(‘H’).mean()
- df.resample(‘W’).sum()
- df.resample(‘M’).max()
- 分析:
df
# 找出每个月的第一个交易日的开盘价
# resample("M")对时间序列数据进行重新采样
monthly = df.resample("M").first() # 取出了每个月第一个交易日对应的行数据
monthly.head(5)
# 买入股票的总花费
total_cost = monthly['open'].sum() * 100
total_cost
# 卖出股票到手多少钱 A表示年份
yearly = df.resample('A').last()
yearly
# 卖出收盘价
recv = yearly['close'].sum() * 1200
recv
# 计算宗收益
recv - total_cost
更多推荐
已为社区贡献1条内容
所有评论(0)