pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
数据结构
Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
Time- Series:以时间为索引的Series。
DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。
Panel :三维的数组,可以理解为DataFrame的容器。
pandas 对print出的数据格式进行修正选项
1、pd.set_option('expand_frame_repr', False)
True就是可以换行显示。设置成False的时候不允许换行
2、pd.set_option('display.max_rows', 10)
pd.set_option('display.max_columns', 10)
显示的最大行数和列数,如果超额就显示省略号,这个指的是多少个dataFrame的列。如果比较多又不允许换行,就会显得很乱。
3、pd.set_option('precision', 5)
显示小数点后的位数。浮点数的精度
4、pd.set_option('large_repr', A)
truncate表示截断,info表示查看信息,一般选truncate
5、pd.set_option('max_colwidth', 5)
设定每一列的最大宽度
6、pd.set_option('chop_threshold', 0.5)
绝对值小于0.5的显示0.0
7、pd.set_option('colheader_justify', 'left')
显示居中还是左边,
8、pd.set_option('display.width', 200)
横向最多显示多少个字符, 一般80不适合横向的屏幕,平时多用200.
更多设置请见 http://pandas.pydata.org/pandas-docs/stable/options.html
看数据
# print(df.shape) # 输出dataframe有多少行、多少列。
# print(df.shape[0]) # 取行数量,相应的列数量就是df.shape[1]
# print(df.columns) # 顺序输出每一列的名字,演示如何for语句遍历。
# print(df.index) # 顺序输出每一行的名字,可以for语句遍历。
for index, rowin _df.iterrows():
print(row['apikey'])
# print(df.dtypes) # 数据每一列的类型不一样,比如数字、字符串、日期等。该方法输出每一列变量类型
# print(df.head(3)) # 看前3行的数据,默认是5。与自然语言很接近
# print(df.tail(3)) # 看最后3行的数据,默认是5。
# print(df.sample(n=3)) # 随机抽取3行,想要去固定比例的话,可以用frac参数
# print(df.describe()) # 非常方便的函数,对每一列数据有直观感受;只会对数字类型的列有效
选取指定的行、列
print(df['open']) # 根据列名称来选取,读取的数据是Series类型
print(df[['candle_begin_time','close','high']]) # 同时选取多列,需要两个括号,读取的数据是DataFrame类型
创建新的DataFrame
把指定行,从新组织 DataFrame
"错误 写法"
df_num=df[['id','secretkey']]
df_num['count']=3
print( df_num['count'])
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
”正确写法“
df_num=df
df_num['count']=3
df_num=df_num.drop(['apikey','secretkey'],axis=1) 删除列
print( df_num['count'])
loc操作:通过label(columns和index的名字)来读取数据
loc:通过行标签索引数据
print(df.loc['2018-01-24 00:04:00']) # 选取指定的某一行,读取的数据是Series类型
print(df.loc['2018-01-24 00:01:00': '2018-01-24 00:06:00']) # 选取在此范围内的多行,和在list中slice操作类似,读取的数据是DataFrame类型
print(df.loc[:,'open':'close']) # 选取在此范围内的多列,读取的数据是DataFrame类型
print(df.loc['2018-01-24 00:01:00': '2018-01-24 00:05:00', 'open':'close'])
# 读取指定的多行、多列。逗号之前是行的范围,逗号之后是列的范围。读取的数据是DataFrame类型
print(df.loc[:, :]) # 读取所有行、所有列,读取的数据是DataFrame类型
at的使用方法与loc类似,但是比loc有更快的访问数据的速度,而且只能访问单个元素,不能访问多个元素
iloc操作:通过position来读取数据
iloc:通过行号索引行数据
# print(df.iloc[0]) # 以index选取某一行,读取的数据是Series类型
# print(df.iloc[0:3]) # 选取在此范围内的多行,读取的数据是DataFrame类型
取从0索引开始的3行数据
# print(df.iloc[:, 1:3]) # 选取在此范围内的多列,读取的数据是DataFrame类型
# print(df.iloc[1:3, 1:3]) # 读取指定的多行、多列,读取的数据是DataFrame类型
# print(df.iloc[:, :]) # 读取所有行、所有列,读取的数据是DataFrame类型
# print(df.iat[1, 1]) # 使用iat读取指定的某个元素。使用iloc也行,但是iat更高效。
# df.iloc[-1] 获取最后一行
修改具体的值
# df.iloc[0]['open']=0.001985 --错误的写法
#df.iloc[0,2]=0.001985 正确的写法
ix:通过行标签或行号索引数据(基于loc和iloc的混合)
列操作
# print('2018年1月24日' + df['北京时间']) # 字符串列可以直接加上字符串,对整列进行操作
# print(df['close'] * 100) # 数字列直接加上或者乘以数字,对整列进行操作。
# print(df[['close', 'volume']]) # 显示两列
# print(df['close'] * df['volume']) # 两列之间可以直接操作。
# 新增一列
# df['北京时间2'] = '2018年1月24日' + df['北京时间']
# df['交易所'] = 'bitfinex'
新增一行
_dff = _dff[['priceDec','quantityDec']]
_dff.loc[_dff.shape[0]]=[0.001614,2323]
统计函数
# print(df['close'].mean()) # 求一整列的均值,返回一个数。会自动排除空值。
#print(df[['close','volume']].mean()) # 求两列的均值,返回两个数,Series
#print(df[['close','volume']].mean(axis=1)) # 求两列的均值,返回DataFrame。axis=0或者1要搞清楚。
# axis=1,代表对整几列进行操作。axis=0(默认)代表对几行进行操作。实际中弄混很正常,到时候试一下就知道了。
print(df['high'].max()) # 最大值
print(df['low'].min()) # 最小值
print(df['close'].std()) # 标准差
print(df['close'].count()) # 非空的数据的数量
print(df['close'].median()) # 中位数
print(df['close'].quantile(0.25)) # 25%分位数
cum该列的累加值
df['volume_cum'] = df['volume'].cumsum() # 该列的累加值
print((df['涨跌幅'] +1.0).cumprod()) # 该列的累乘值,此处计算的就是资金曲线,假设初始1元钱。
shift类函数
默认值是1
df['下周期close'] = df['close'].shift(-1)
# 读取上一行的数据,若参数设定为3,就是读取上三行的数据;若参数设定为-1,就是读取下一行的数据;
diff类函数
df['涨跌'] = df['close'].diff(-1) # 求本行数据和下一行数据相减得到的值
df['涨跌'] = df['close'].diff(1) # 求本行数据和上一行数据相减得到的值
pct_change类函数
df['涨跌幅'] = df['close'].pct_change(1) # 类似于diff,但是求的是两个数直接的比例,相当于求涨跌幅
删除列的方式
drop函数的使用:删除行、删除列
print frame.drop(['a']) # 索引
print frame.drop(['hio'], axis = 1)
frame.drop(odata.index[[16,17]],inplace=True) # 原有数据块的相应行被删除
print(df.shape[0]) df = df.drop([df.shape[0]-1]) # 删除df中 最后一行
其他列函数
df['close_排名'] = df['close'].rank(ascending=True,pct=False)
# 输出排名。ascending参数代表是顺序还是逆序。pct参数代表输出的是排名还是排名比例
print(df['close'].value_counts()) # 计数。统计该列中每个元素出现的次数。返回的数据是Series
筛选操作
# print(df['symbol'] == 'AIDBTC') # 判断交易对代码是否等于BTCUSD
# print(df[df['symbol'] == 'BTCUSD']) # 将判断为True的输出:选取交易对代码等于BTCUSD的行
# print(df[df['symbol'] == 'BTCUSD'].index) # 输出判断为True的行的index
# print(df[df['symbol'].isin(['BTCUSD', 'LTCUSD', 'ETHUSD'])]) # 选取代码等于'BTCUSD'或'LTCUSD '或'ETHUSD'的行
# print(df[df['close'] < 10.0]) # 选取收盘价小于10的行
# print(df[(df['close'] < 10.0) & (df['symbol'] == 'AIDUSD')]) # 两个条件,或者的话就是|
缺失值
# 创建缺失值
index = df[df['candle_begin_time'].isin(['2018-01-24 00:00:00','2018-01-24 12:00:00'])].index
df.loc[index,'12小时'] = df['candle_begin_time']
# 删除缺失值
# print(df.dropna(how='any')) # 将带有空值的行删除。how='any'意味着,该行中只要有一个空值,就会删除,可以改成all。
# print(df.dropna(subset=['12小时', 'close'], how='all')) # subset参数指定在特定的列中判断空值。
# all代表全部为空,才会删除该行;any只要一个为空,就删除该行。
# 补全缺失值
# print(df.fillna(value=0)) # 直接将缺失值赋值为固定的值
# df['12小时'].fillna(value=df['close'], inplace=True) # 直接将缺失值赋值其他列的数据
# print(df.fillna(method='ffill')) # 向上寻找最近的一个非空值,以该值来填充缺失的位置,全称forward fill,非常有用
# print(df.fillna(method='bfill')) # 向下寻找最近的一个非空值,以该值来填充确实的位置,全称backward fill
# 找出缺失值
print(df.notnull())# 判断是否为空值,反向函数为isnull()
print(df.isnull())
print(df[df['12小时'].notnull()])# 将'12小时'列为不空的行输出
排序函数
#按obj的索引排序,默认升序,降序可在括号加ascending=False
sort_index()
# print(df.sort_values(by=['candle_begin_time'], ascending=0))
# by参数指定按照什么进行排序,acsending参数指定是顺序还是逆序,1顺序,0逆序
# print(df.sort_values(by=['symbol', 'candle_begin_time'], ascending=[0, 0])) # 按照多列进行排序
两个df上下合并操作,append操作
df1 = df.iloc[0:10][['candle_begin_time','symbol','close','volume']]
# print(df1)
df2 = df.iloc[5:15][['candle_begin_time','symbol','close','volume']]
# print(df2)
print(df1.append(df2))# append操作,将df1和df2上下拼接起来。注意观察拼接之后的index。index可以重复
df3 = df1.append(df2,ignore_index=True)# ignore_index参数,用户重新确定index
print(df3)
# =====对数据进行去重
# df3中有重复的行数,我们如何将重复的行数去除?
df3.drop_duplicates(
subset=['candle_begin_time','symbol'],# subset参数用来指定根据哪类类数据来判断是否重复。若不指定,则用全部列的数据来判断是否重复
keep='first',# 在去除重复值的时候,我们是保留上面一行还是下面一行?first保留上面一行,last保留下面一行,False就是一行都不保留
inplace=True
)
print(df3)
其他常用重要函数
# df.reset_index(inplace=True, drop=False) # 重置index
# print(df.rename(columns={'close': '收盘价', 'open': '开盘价'})) # rename函数给变量修改名字。使用dict将要修改的名字传给columns参数
# print(df.empty) # 判断一个df是不是为空,此处输出不为空
# print(pd.DataFrame().empty) # pd.DataFrame()创建一个空的DataFrame,此处输出为空
# print(df.T) # 将数据转置,行变成列,很有用
字符串处理
# print(df['symbol'])
# print('BTCUSD'[:3])
# print(df['symbol'].str[:3])
# print(df['symbol'].str.upper()) # 加上str之后可以使用常见的字符串函数对整列进行操作
# print(df['symbol'].str.lower())
# print(df['symbol'].str.len()) # 计算字符串的长度,length
# df['symbol'].str.strip() # strip操作,把字符串两边的空格去掉
# print(df['symbol'])
print(df['symbol'].str.contains('AID'))# 判断字符串中是否包含某些特定字符
# print(df['symbol'].str.replace('AID', 'AVT')) # 进行替换,将sz替换成sh
# # 更多字符串函数请见: http://pandas.pydata.org/pandas-docs/stable/text.html#method-summary
时间处理
rolling、expanding操作
# 计算'close'这一列的均值
# print(df['close'])
# 如何得到每一天的最近3天close的均值呢?即如何计算常用的移动平均线?
# 使用rolling函数
##min_periods关键字,指定每个列对所需的最小观察数,以获得有效结果。
##df['close'].rolling(ma_short,min_periods=1).mean()
# df['收盘价_3天均值'] = df['close'].rolling(3).mean()
# print(df[['close', '收盘价_3天均值']])
# rolling(n)即为取最近n行数据的意思,只计算这n行数据。后面可以接各类计算函数,例如max、min、std等
# print(df['close'].rolling(5).max())
# print(df['close'].rolling(3).min())
# print(df['close'].rolling(3).std())
# rolling可以计算每天的最近3天的均值,如果想计算每天的从一开始至今的均值,应该如何计算?
# 使用expanding操作
# df['收盘价_至今均值'] = df['close'].expanding().mean()
# print(df[['close', '收盘价_至今均值']])
# expanding即为取从头至今的数据。后面可以接各类计算函数
# print(df['close'].expanding().max())
# print(df['close'].expanding().min())
# print(df['close'].expanding().std())
# rolling和expanding简直是为量化领域量身定制的方法,经常会用到。
pandas列变量类型转换
_depthSellDf = pd.DataFrame(_depthListData['data']['asks'])
_depthBuyDf['priceDec']= _depthBuyDf[0] 字符串
_depthBuyDf['priceDec']= _depthBuyDf[0].astype('float') 转为float
max 后,要找整行数据
_iHeght_value=_df_HightEst['high'].max()
_iHeght_id= _df_HightEst['high'].idxmax()
print(_iHeght_value)
print(df.iloc[_iHeght_id])
pandas删除后几行
删除最后一行
df = df.drop([df.shape[0] -1])
删除最后30行 -无效
df = df.drop([df.shape[0] -30])
可行方案
df=df.head(_length-30)