pandas


       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) 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 官方教程 读取写入文件 官方IO 读取 写入 read_csv to_csv read_excel to_exce...
    MiracleJQ阅读 7,202评论 0 16
  • 第1章 入门知识 简述:用于操作行列数据,方便地实现各种形式的数据分析; Pandas最初主要应用于金融数据分析工...
    惑也阅读 1,028评论 0 3
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,451评论 0 13
  • Series(一维数据) import numpy as npimport pandas as pdp = pri...
    A雪_辰A阅读 646评论 0 1
  • 2017年计划是看五十本书,今天是第十二本,书名是《怎样解题》,作者是G波利亚。 书中讲述解题的步骤 .第一.你必...
    甘于寂寞阅读 432评论 0 1