一、pandas介绍
- panel+data+analysis
二、DataFrame
1、结构:既有行索引,又有列索引的二维数组
import numpy as np
import pandas as pd
# 创建一个符合正态分布的10个股票5天的涨幅数据
stock_change = np.random.normal(0,1,(10,5))
# 添加行索引index
stock = ['股票{}'.format(i) for i in range(10)]
# 添加列索引columns
date = pd.date_range(start = '20180101',periods=5,freq='B')
# pd.date_range(start=None,end=None,periods=None,freq='B')用于生成一组连续的时间序列,
# freq:递进单位,默认1天,'B'默认略过周末
data = pd.DataFrame(stock_change,index=stock,columns=date)
2、属性:shape、index、columns、values、T
data.shape # (10,5)
data.index # Index(['股票0', '股票1', '股票2', '股票3', '股票4', '股票5', '股票6', '股票7', '股票8', '股票9'], dtype='object')
data.columns # DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04','2018-01-05'],dtype='datetime64[ns]', freq='B')
data.values # 值
data.T # 转置
3、方法:head()、tail()等
data.head() #默认显示前五行
data.tail() #默认显示后五行
4、DataFrame索引的设置
- 修改行列索引值
# data.index[2] = '股票_2' 不能单独修改索引
stock_ = ['股票_{}'.format(i) for i in range(10)]
data.index = stock_
data.head()
- 重设索引
- reset_index(drop = False)
- 重新设置新的下标索引
- drop:默认为False,不删除原来索引,如果为True,则删除原来索引
#重设索引,不删除和删除原来索引
data.reset_index().head()
data.reset_index(drop=True).head()
- 设置新索引
- 以某列值设置为新的索引
- set_index(keys,drop=True)
- keys:列索引名或者列索引名称的列表
- drop:True当做新的索引,删除原来的列,False则保留
- set_index(keys,drop=True)
df = pd.DataFrame({'month':[1,4,7,10],
'year':[2012,2014,2013,2014],
'sale':[55,40,84,31]})
#以月份设置新的索引
df.set_index('month')
#设置多个索引以年和月份
df_new = df.set_index(['year','month'])
df_new.index
注:通过刚才的设置,这样DateFrame变成了一个具有Multilndex的DataFrame,可以存储三维数据
三、Multilndex与Panel
1、Multilndex
多级或分层索引对象
- index属性
- names:levels的名称
- levels:每个level的元组值
df_new.index.names # FrozenList(['year', 'month'])
df_new.index.levels # FrozenList([[2012, 2013, 2014], [1, 4, 7, 10]])
2、Panel
- pandas.Panel(data=None,items=None,major_axis=None,minor_axis=None,copy=False,dtype=None)
- 存储3维数组的Panel结构
p = pd.Panel(np.arange(24).reshape(4,3,2),
items=list('ABCD'),
major_axis=pd.date_range('20130101',periods=3),
minor_axis=['first','second'])
结果显示:
<class 'pandas.core.panel.Panel'>
Dimensions: 4 (items) x 3 (major_axis) x 2 (minor_axis)
Items axis: A to D
Major_axis axis: 2013-01-01 00:00:00 to 2013-01-03 00:00:00
Minor_axis axis: first to second
# 从Panel中看DataFrame
p['A']
p.major_xs('2013-01-01')
四、Series
- 结构:带索引的一维数组
1、创建Series
# 指定内容,默认索引
pd.Series(np.arange(3,9,2))
# 指定索引
pd.Series([6.7,5.4,2,4,5],index=[1,2,3,4,5])
# 通过字典数据创建
pd.Series({'red':100,'blue':200,'green':500,'yellow':1000})
2、Series获取索引和值
- 属性:index、values
sr.index # DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04','2018-01-05'],dtype='datetime64[ns]', freq='B')
sr.values # array([ 1.95877474, -1.05435874, -0.16035102, 0.19338938, 0.64992306])
DataFrame是Series的容器,Panel是DataFrame的容器
五、基本数据操作
import pandas as pd
data = pd.read_csv('stock_day.csv')
#删除一些列,让数据更简单些,再去做后面的操作
data = data.drop(['ma5','ma10','ma20','v_ma5','v_ma10','v_ma20'],axis=1)
1、索引操作
# 1、直接索引,先列后行
data['open']['2018-02-26'] # 22.8
# 2、按名字索引
data.loc['2018-02-26']['open'] # 22.8
# 或者 data.loc['2018-02-26','open']
# 3、按数字索引
data.iloc[1,0] # 22.8
# 4、组合索引
# 获取行第一天到第四天,['open','close','high','low']这四个指标的结果
data.ix[:4,['open','close','high','low']]
data.loc[data.index[0:4],['open','close','high','low']]
data.iloc[:4,data.columns.get_indexer(['open','close','high','low'])]
2、赋值操作
# 获取open列
data['open'] # 或者data.open
#赋值操作
data.open = 100 # open列整列变成100
data.iloc[1,0] = 222
3、排序
-
DataFrame
- 使用df.sort_values(by= ,ascending= ) 对内容进行排序
- 单个键或者多个键进行排序,默认升序
- ascending=False降序\True升序
- 使用df.sort_index(ascending=) 对索引进行排序
- 使用df.sort_values(by= ,ascending= ) 对内容进行排序
-
Series
- 使用 sr.sort_values(ascending=) 对内容进行排序
- 使用 sr.sort_index(ascending=) 对索引进行排序
# 对内容排序
data.sort_values(by='high',ascending=False)
data.sort_values(by=['high','p_change'],ascending=False) # high相同时,看p_change
# 对索引排序
data.sort_index()
六、DataFrame运算
1、算数运算
# 算数运算(运算符和运算函数)
data['open'].add(3)
data['open'].sub(3)
data + 1
close = data['close']
open1 = data['open']
data['m_price_change']=close.sub(open1)
data.head()
2、逻辑运算
# 逻辑运算符(>,<,|,&)
# 筛选p_change>2的日期数据
data[data['p_change'] > 2]
# 筛选p_change>2并且low>15的日期数据
data[(data['p_change'] > 2) & (data['low'] > 15)]
# 逻辑运算函数(query,isin)
# 筛选p_change>2的日期数据
data.query('p_change > 2')
# 筛选p_change>2并且low>15的日期数据
data.query('p_change > 2 & low > 15')
# 判断'turnover'是否有4.19,2.39
data['turnover'].isin([4.19,2.39])
data[data['turnover'].isin([4.19,2.39])]
3、统计运算
- describe()
- 综合分析:能够得出很多统计结果,count,mena,std,min,max等
- 统计函数
- sum,mean,median,min,max,mode,abs,prod,std,var,idxmax,idxmin
data.max() #默认按列
data.max(axis=1) # 按行取最大值
- 累计统计函数
函数 | 作用 |
---|---|
cumsum | 计算前1/2/3/…/n个数的和 |
cummax | 计算前1/2/3/…/n个数的最大值 |
cummin | 计算前1/2/3/…/n个数的最小值 |
cumprod | 计算前1/2/3/…/n个数的积 |
data['p_change'].sort_index().cumsum(),plot()
# 想画的好看,用matplotlib
4、自定义运算
- apply(func,axis=0)
- func:自定义函数
- axis=0:默认是列,axis=1为行进行运算
data.apply(lambda x:x.max() - x.min(),axis=0)
结果显示:
open 22.74
high 23.68
close 22.85
low 21.81
volume 500757.29
price_change 6.55
p_change 20.06
turnover 12.52
m_price_change 6.71
dtype: float6
七、Pandas画图
- pandas.DataFrame.plot(x=None,y=None,kind=‘line’)
- kind:‘line’,‘bar’,‘barh’,‘hist’,‘pie’,‘scatter’
data.sort_index().plot(x='p_change',y='turnover',kind='scatter')
data.sort_index().p_change.plot()
八、文件读取与存储
- csv文件的读取与存储
- pd.read_csv(path,names=name)
- dataframe.to_csv(path)