
Pandas基础操作1
pandas数据分析库
什么是pandas?
Pandas 库是一个免费、开源的第三方 Python 库,是 Python 数据分析和机器学习必不可少的工具之一,它为 Python 数据分析提供了高性能,且易于使用的数据结构。Pandas 自诞生后被应用于众多的领域,比如金融、统计学、社会科学、建筑工程等。
Pandas 提供了两种数据结构,分别是 Series(一维数组结构)与 DataFrame(二维数组结构),这两种数据结构极大地增强的了 Pandas 的数据分析能力。
Series
概述
Series是一种类似与一维数组的对象,由下面两个部分组成:
- values:一组数据
- index:相关的数据索引标签
常见操作
- 创建方式
- 由列表或numpy数组创建
- 由字典创建
import pandas as pd
import numpy as np
from pandas import Series
s1 = Series(data=[1,2,3])
s2 = Series(data=np.random.randint(0,100,size=(3,)))
- Series的索引
- 隐式索引:默认形式的索引(0,1,2….)
- 显示索引:自定义的索引,可以通过index参数设置显示索引
- 显示索引的作用:增加了数据的可读性
s3 = Series(data=[1,2,3],index=['A','B','C'])
- Series的索引和切片
s4 = Series(data=[1,2,3],index=['A','B','C'])
s4[0],4s['A'],s4.A #索引操作
s4[0:2],s4['A':'B']#切片操作
- Series的常用属性
- shape
- size
- index
- values
- Series的常用方法
- head(),tail()
- unique(),nunique()
- value_counts()
- isnull(),notnull()
- add() sub() mul() div()
- Seriese的运算法则
DataFrame
概述
- DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
- 行索引:index
- 列索引:columns
- 值:values
DataFrame的创建
- 列表创建
- 数组创建
- 字典创建
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
df1 = DataFrame(data=[[1,2],[3,4]],index=('A','B'),columns=['a','b'])
df2 = DataFrame(data=np.random.randint(0,100,size=(7,8)))
dic = {
'张三':[150,150,150,300],
'李四':[0,0,0,0]
}
df3 = DataFrame(data=dic,index=['语文','数学','英语','理综'])
DataFrame的常用属性
- values,columns,index,shape
索引操作
- 对行进行索引
- 队列进行索引
- 对元素进行索引
df = DataFrame(data=np.random.randint(0,100,size=(5,7)))
df[0] #df[col_index],取单列
df[[0,1,2]] #df[[col1,col2]]取多列
df.iloc[0] #df.iloc[index] 取单行
df.iloc[[0,1,2]] #取多行
df.iloc[2,3] #取单个元素df.iloc[index,col]
df.iloc[[1,2],3] #取多个元素
切片操作
- 批量切行
- 批量切列
df[0:2] #切行 df[index1:index3]
df.iloc[:,0:2] #切列
数据查看
查看DataFrame的概览和统计信息
import numpy as np
import pandas as pd
# 创建 shape(150,3)的二维标签数组结构DataFrame
df = pd.DataFrame(data = np.random.randint(0,151,size = (150,3)),
index = None,# 行索引默认
columns=['Python','Math','En'])# 列索引
# 查看其属性、概览和统计信息
df.head(10) # 显示头部10行,默认5个
df.tail(10) # 显示末尾10行,默认5个
df.describe() # 查看数值型列的汇总统计,计数、平均值、标准差、最小值、四分位数、最大值
df.info() # 查看列索引、数据类型、非空计数和内存信息
数据保存与加载
csv
import numpy as np
import pandas as pd
df = DataFrame(data = np.random.randint(0,50,size = [50,5]), # 薪资情况
columns=['IT','化工','生物','教师','士兵'])
# 保存到当前路径下,文件命名是:salary.csv。csv逗号分割值文件格式
df.to_csv('./salary.csv',
sep = ';', # 文本分隔符,默认是逗号
header = True,# 是否保存列索引
index = True) # 是否保存行索引,保存行索引,文件被加载时,默认行索引会作为一列
# 加载
pd.read_csv('./salary.csv',
sep = ';',# 默认是逗号
header = [0],#指定列索引
index_col=0) # 指定行索引
pd.read_table('./salary.csv', # 和read_csv类似,读取限定分隔符的文本文件
sep = ';',
header = [0],#指定列索引
index_col=1) # 指定行索引,IT作为行索引
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
import numpy as np
import pandas as pd
df1 = pd.DataFrame(data = np.random.randint(0,50,size = [50,5]), # 薪资情况
columns=['IT','化工','生物','教师','士兵'])
df2 = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),# 计算机科目的考试成绩
columns=['Python','Tensorflow','Keras'])
# 保存到当前路径下,文件命名是:salary.xls
df1.to_excel('./salary.xls',
sheet_name = 'salary',# Excel中工作表的名字
header = True,# 是否保存列索引
index = False) # 是否保存行索引,保存行索引
pd.read_excel('./salary.xls',
sheet_name=0,# 读取哪一个Excel中工作表,默认第一个
header = 0,# 使用第一行数据作为列索引
names = list('ABCDE'),# 替换行索引
index_col=1)# 指定行索引,B作为行索引
sql
环境安装:
pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
import pandas as pd
# SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具
from sqlalchemy import create_engine
#创建数据源
df = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),# 计算机科目的考试成绩
columns=['Python','Tensorflow','Keras'])
# 数据库连接
#mysql+pymysql://用户名:密码@IP:Port/dbName?charset=UTF8MB4
conn = create_engine('mysql+pymysql://root:boboadmin@127.0.0.1:3306/spider?charset=UTF8MB4')
# 保存到数据库
df.to_sql('score',#数据库中表名
conn,# 数据库连接
if_exists='append')#如果表名存在,追加数据
# 从数据库中加载
pd.read_sql('select * from score limit 10', # sql查询语句
conn, # 数据库连接
index_col='Python') # 指定行索引名
股票分析案例
首先,安装tushare财经数据接口包:pip install tushare
- 使用tushare的
get_k_data()
方法获取指定股票的历史交易数据,并保存为DataFrame对象:
import tushare as ts
import pandas as pd
# 设置ts.get_k_data()的参数
stock_code = '000001' # 股票代码:平安银行
start_date = '2021-01-01' # 开始日期
end_date = '2023-2-12' # 结束日期
# 获取股票历史交易数据
df = ts.get_k_data(code=stock_code, start=start_date, end=end_date)
#将df中的数据存储到本地
df.to_csv('./gupiao.csv')
#可以将本地的文件数据读取到df
df = pd.read_csv('./gupiao.csv')
#删除指定的列
df.drop(labels='Unnamed: 0',axis=1,inplace=True) #axis=0表示的行1表示的是列
# 将日期列转换为日期类型
df['date'] = pd.to_datetime(df['date'])
#将date作为原数据的行索引
df.set_index('date',inplace=True)
- 计算股票的每日收益率和7日波动率:通过计算收益率和波动率,我们可以评估股票的风险和收益情况。
- 每日收益率:(当日收盘价 - 前一日的收盘价)/ 前一日的收盘价
- 7日波动率:对每日收益率数据进行每7日滚动的方差计算
# 计算收益率和波动率
return_rate = df['close'].pct_change() * 100 # 收益率
#或者:(df['close'] - df['close'].shift(1)) / df['close'].shift(1) * 100
volatility_rate = return_rate.rolling(window=7).std() # 波动率
- 查找股票的市值最大和最小日
# 市值 = 收盘价 * 成交量
market_value = df['close'] * df['volume']
#找出市值数据中最大最小值下标(市值最大和最小日期)
max_market_value_day = market_value.idxmax()
min_market_value_day = market_value.idxmin()
print(max_market_value_day)
print(min_market_value_day)
- 输出该股票所有收盘比开盘上涨3%以上的日期
#(收盘-开盘) / 开盘 > 0.03
((df['close'] - df['open']) / df['open']) > 0.03
#获取了True对应的行数据:就是满足需求的行数据
df.loc[((df['close'] - df['open']) / df['open']) > 0.03]
#基于index获取满足需求行数据的行索引
df.loc[((df['close'] - df['open']) / df['open']) > 0.03].index
- 输出该股票所有开盘比前日收盘跌幅超过2%的日期
#(开盘-前日收盘)/前日收盘 < -0.02
((df['open']-df['close'].shift(1))/df['close'].shift(1)) < -0.02
#定位满足要求的日期
df.loc[((df['open']-df['close'].shift(1))/df['close'].shift(1)) < -0.02].index
假如张三从2010年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()
实现代码:
#将2010-2023区间的数据取出 new_df = df['2010':'2023'] #对数据进行指定的取样 df_monthly = new_df.resample('M').first() #购买股票一共花费的金额 cost = df_monthly['open'].sum()*100 #对数据进行指定的取样 df_yearly = new_df.resample('A').last()[:-1] #卖出股票 recv = df_yearly['open'].sum()*1200 #计算剩余股票的价值 last_price = 最后已过的月份数量*100*new_df['open'][-1] #总收益 last_price+recv-cost
计算该股票历史数据的5日均线和30日均线
什么是均线?
- 对于每一个交易日,都可以计算出前N天的移动平均值,然后把这些移动平均值连起来,成为一条线,就叫做N日移动平均线。移动平均线常用线有5天、10天、30天、60天、120天和240天的指标。
- 5天和10天的是短线操作的参照指标,称做日均线指标;
- 30天和60天的是中期均线指标,称做季均线指标;
- 120天和240天的是长期均线指标,称做年均线指标。
均线计算方法:MA=(C1+C2+C3+…+Cn)/N C:某日收盘价 N:移动平均周期(天数)
ma5 = df['close'].rolling(5).mean() ma30 = df['close'].rolling(30).mean() #将均线两列添加到原始数据中 df['ma5'] = ma5 df['ma30'] = ma30 df = df.iloc[30:] #将空对应的行剔除