DataFrame


Based on NumPy

Ref: Pandas and NumPy arrays explained

Ref: pandas: powerful Python data analysis toolkit【开发者文档】

  • dataframe 转化成 array
  1. df=df.values
  • array 转化成 dataframe
  1. import pandas as pd
  2.  
  3. df = pd.DataFrame(df)

数据集直接转换为dataframe格式。

  1. import pandas as pd
  2. iris_df = pd.DataFrame(iris.data, columns = iris.feature_names)

表格基本操作

COMP9318/L1 - Pandas-1.ipynb

COMP9318/L1 - Pandas-2.ipynb

COMP9318/L1 - numpy-fundamentals.ipynb

一、初始化

初始化 index & columns

类似于倒排表,column相当于words. index就是doc id.

  1. df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
  2. df

Output: 

  numbers
a 10
b 20
c 30
d 40

时间序列

    以“月”为间隔单位。

  1. dates = pd.date_range('2015-1-1', periods=9, freq='M')
  2. df.index = dates
  3. df

Output:

  1. DatetimeIndex(['2015-01-31', '2015-02-28', '2015-03-31', '2015-04-30',
  2. '2015-05-31', '2015-06-30', '2015-07-31', '2015-08-31',
  3. '2015-09-30'],
  4. dtype='datetime64[ns]', freq='M')
  No1 No2 No3 No4
2015-01-31 -0.173893 0.744792 0.943524 1.423618
2015-02-28 -0.388310 -0.494934 0.408451 -0.291632
2015-03-31 0.675479 0.256953 -0.458723 0.858815
2015-04-30 -0.046759 -2.548551 0.454668 -1.011647
2015-05-31 -0.938467 0.636606 -0.237240 0.854314
2015-06-30 0.134884 -0.650734 0.213996 -1.969656
2015-07-31 1.046851 -0.016665 -0.488270 1.377827
2015-08-31 0.482625 0.176105 -0.681728 -1.057683
2015-09-30 -1.675402 0.364292 0.897240 -0.629711

二、添加数据

添加一列

类似dict的添加方式。

  1. # (1) 其他col默认
    df['floats'] = (1.5, 2.5, 3.5, 4.5)
  2.  
  3. # (2) 自定义
  4. df['names'] = pd.DataFrame(['Yves', 'Felix', 'Francesc'], index=['a', 'b', 'c'])

添加一行

类似list的添加方式。

  1. df = df.append(pd.DataFrame({'numbers': 100, 'floats': 5.75, 'names': 'Henry'}, index=['z',]))

添加一行,再添加一列

  1. # 1.1.1 使用vstack增加一行含缺失值的样本(nan, nan, nan, nan), reshape相当于升维度
  2. nan_tmp = array([nan, nan, nan, nan]).reshape(1,-1)
  3. print(nan_tmp)
  4. # 1.1.2 合并两个array
  5. iris.data = vstack((iris.data, array([nan, nan, nan, nan]).reshape(1,-1)))
  6.  
  7. ##########################################################################################
  8. # 1.2.1 使用hstack增加一列表示花的颜色(0-白、1-黄、2-红),花的颜色是随机的,意味着颜色并不影响花的分类
  9. random_feature = choice([0, 1, 2], size=iris.data.shape[0]).reshape(-1,1)
  10. # 1.2.2 合并两个array
  11. iris.data = hstack((random_feature, iris.data))

添加csv文件

  1. df = pd.read_csv('./asset/lecture_data.txt', sep='\t') # to read an excel file, use read_excel()
  2. df.head() # 头五个数据
  3. df.describe() # 统计量信息

三、查找 select

查找某一个元素

是通过“key" 并非row number。

定位的套路是:row number --> key --> row context --> target

.index, .loc, liloc

  1. df.index # the index values
  2.  
  3. df.loc[['a', 'd']] # selection of multiple indices
  4. df.loc[df.index[1:3]] # 获得索引键值,再得到请求的行。

以上是先获得“某行”;以下是先确定“某列”,再定位“某行”。

  1. df['No2'].iloc[3]

遍历每一行元素

两个方案:itertuples()应该比iterrows()快

  1. import pandas as pd
  2. inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
  3. df = pd.DataFrame(inp)
  4. print(df)
  5. -------------------------------------------------------------------
    # 开始遍历,俩个方式等价

  6. for index, row in df.iterrows():
  7. print(row["c1"], row["c2"])
  8.  
  9. for row in df.itertuples(index=True, name='Pandas'):
  10. print(getattr(row, "c1"), getattr(row, "c2"))

Ref: Iterate over rows in a dataframe in Pandas

拿出某一列元素

这一列的值展示。

  1. In [9]: df.loc[df.index[:]]
  2. Out[9]:
  3. c1 c2
  4. 0 10 100
  5. 1 11 110
  6. 2 12 120
  7.  
  8. In [10]: df.loc[df.index[:],'c2']
  9. Out[10]:
  10. 0 100
  11. 1 110
  12. 2 120
  13. Name: c2, dtype: int64

列统计

(1) 这一列的 "类型统计"。

  1. # permit_status - Outcome
  2. status_cts = df_train.permit_status.value_counts(dropna=False)
  3. print(status_cts)
  4. # Complete 358
  5. # Cancelled 31
  6. # In Process 7
  7. # Comments:
  8. # - Complete v not (Cancelled or In Process) as binary outcome

(2) 这一列的 "统计量"。

  1. # attendance
  2. attendance_null_ct = df_train.attendance.isnull().sum()
  3. print(attendance_null_ct) #
  4. print(df_train.attendance.describe())
  5. # count 393.000000
  6. # mean 3716.913486
  7. # std 16097.152814
  8. # min 15.000000
  9. # 25% 200.000000
  10. # 50% 640.000000
  11. # 75% 1800.000000
  12. # max 204000.000000

筛选 WHERE

  1. # 列出某一属性的行
  2. f[df['location'] == 'Vancouver'].head()
  3.  
  4. # 更为复杂的条件
  5. df[(df['location'] == 'Vancouver') & (df['time'] != 'Q1') & (df['dollars_sold'] > 500)]

三、合并 join

Ref: JOIN和UNION区别

Ref: What is the difference between join and merge in Pandas?

Pandas写法

这个及其类似SQL JOIN. how = 'inner/left/right/outer'。

  1. df.join(pd.DataFrame([1, 4, 9, 16, 25],
  2. index=['a', 'b', 'c', 'd', 'y'],
  3. columns=['squares',]), how='inner')

JOIN用于按照ON条件联接两个表,主要有四种:

INNER JOIN 内部联接两个表中的记录,仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。我理解的是只要记录不符合ON条件,就不会显示在结果集内。
LEFT JOIN / LEFT OUTER JOIN 外部联接两个表中的记录,并包含左表中的全部记录。如果左表的某记录在右表中没有匹配记录,则在相关联的结果集中右表的所有选择列表列均为空值。理解为即使不符合ON条件,左表中的记录也全部显示出来,且结果集中该类记录的右表字段为空值。
RIGHT JOIN / RIGHT OUTER JOIN 外部联接两个表中的记录,并包含右表中的全部记录。简单说就是和LEFT JOIN反过来。
FULL JOIN / FULL OUTER JOIN 完整外部联接返回左表和右表中的所有行。就是LEFT JOIN和RIGHT JOIN和合并,左右两表的数据都全部显示。

SQL写法(参考)

两张表:msp, party。

  1. 内连接inner join
  2. SELECT msp.name, party.name FROM msp JOIN party ON party=code
  3. SELECT msp.name, party.name FROM msp inner JOIN party ON party=code
  4.  
  5. 左连接left join
  6. SELECT msp.name, party.name FROM msp LEFT JOIN party ON party=code
  7.  
  8. 右连接right join
  9. SELECT msp.name, party.name FROM msp RIGHT JOIN party ON msp.party=party.code
  10.  
  11. 全连接(full join)
  12. SELECT msp.name, party.name FROM msp FULL JOIN party ON msp.party=party.code

join和union的区别

合并两表,保留共有列。

  1. pd.concat([df2,df3])
  2.  
  3. pd.concat([df2,df3]).drop_duplicates()

四、预处理 之 Apply

Ref: Pandas的Apply函数——Pandas中最好用的函数

假如我们想要得到表格中的PublishedTimeReceivedTime属性之间的时间差数据,就可以使用下面的函数来实现:

  1. import pandas as pd
  2. import datetime   # 用来计算日期差的包
  3.  
  4. def dataInterval(data1, data2):
    # 以某种格式提取时间信息为可计算的形式
  5. d1 = datetime.datetime.strptime(data1, '%Y-%m-%d')
  6. d2 = datetime.datetime.strptime(data2, '%Y-%m-%d')
  7. delta = d1 - d2
  8. return delta.days
  9.  
  10. def getInterval(arrLike): # 用来计算日期间隔天数的调用的函数
  11. PublishedTime = arrLike['PublishedTime']
  12. ReceivedTime = arrLike['ReceivedTime']
  13. days = dataInterval(PublishedTime.strip(), ReceivedTime.strip()) # 注意去掉两端空白
  14. return days
  15.  
  16. if __name__ == '__main__':
  17. fileName = "NS_new.xls";
  18. df = pd.read_excel(fileName)
  19. df['TimeInterval'] = df.apply(getInterval , axis = 1)

表格数据分析

一、Basic Analytics

  1. df.sum()
  2. df.mean()
  3. df.cumsum()
  4. df.describe()
  5. np.sqrt(abs(df))
  6. np.sqrt(abs(df)).sum()

 

二、分组统计

原始数据

  No1 No2 No3 No4 Quarter
2015-01-31 -0.173893 0.744792 0.943524 1.423618 Q1
2015-02-28 -0.388310 -0.494934 0.408451 -0.291632 Q1
2015-03-31 0.675479 0.256953 -0.458723 0.858815 Q1
2015-04-30 -0.046759 -2.548551 0.454668 -1.011647 Q2
2015-05-31 -0.938467 0.636606 -0.237240 0.854314 Q2
2015-06-30 0.134884 -0.650734 0.213996 -1.969656 Q2
2015-07-31 1.046851 -0.016665 -0.488270 1.377827 Q3
2015-08-31 0.482625 0.176105 -0.681728 -1.057683 Q3
2015-09-30 -1.675402 0.364292 0.897240 -0.629711 Q3

"一维" 分组

三行数据为一组,然后按组统计。

  1. groups = df.groupby('Quarter')
  2. groups.mean()

"二维" 分组

group by 两个columns后的情况。

  1. df['Odd_Even'] = ['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd']
  2. groups = df.groupby(['Quarter', 'Odd_Even'])
  3. groups.mean()
可见,以最小单位进行统计。
Quarter Odd_Even No1   No2 No3   No4
Q1 Even -0.388310 -0.494934 0.408451 -0.291632
Odd 0.250793 0.500873 0.242400 1.141217
Q2 Even 0.044063 -1.599643 0.334332 -1.490651
Odd -0.938467 0.636606 -0.237240 0.854314
Q3 Even 0.482625 0.176105 -0.681728 -1.057683
Odd -0.314275 0.173813 0.204485 0.374058

另一个例子:

  1. type_cat_cts = (
  2. df_train
  3. .groupby([df_train.permit_type, df_train.event_category.isnull()])
  4. .size())
  5. print(type_cat_cts)
  6. # permit_type event_category
  7. # Charter Vessel True 10
  8. # Special Event False 325
  9. # Valet Parking True 61
  10. # Comments:
  11. # - present iff Special Event

分组统计

We use agg() to apply multiple functions at once, and pass a list of columns to groupby() to grouping multiple columns

  1. df.groupby(['location','item']).agg({'dollars_sold': [np.mean,np.sum]})

  

三、数据透视表(Pivot Table)

更多内容,参考:https://github.com/DBWangGroupUNSW/COMP9318/blob/master/L1%20-%20Pandas-2.ipynb

原始数据

如果想做二次更为细分的统计,可以借助pivot_table。

二级列分组

  1. table = pd.pivot_table(df, index = 'location', columns = 'time', aggfunc=np.sum)

  1. pd.pivot_table(df, index = ['location', 'item'], columns = 'time', aggfunc=np.sum, margins=True)

四、表格可视化

  1. %matplotlib inline
  2. df.cumsum().plot(lw=2.0, grid=True)  # 线的粗度是2.0
  3. # tag: dataframe_plot
  4. # title: Line plot of a DataFrame object

实战练习


预处理:金融数据展示

一、数据初看

打开文档

Ref: https://github.com/yhilpisch/py4fi/blob/master/jupyter36/source/tr_eikon_eod_data.csv

  1. # data from Thomson Reuters Eikon API
  2. raw = pd.read_csv('source/tr_eikon_eod_data.csv',
  3. index_col=0, parse_dates=True)
  4. raw.info()

只查看一列

  1. # (1) 想看其中的哪一列
    data = pd.DataFrame(raw['.SPX'])
  2. data.columns = ['Close']
  3.  
  4. # (2) 看个别数据,再看总体数据(数据多只能通过figure看)
  5. data.tail()
  6. data['Close'].plot(figsize=(8, 5), grid=True);
  7. # tag: dax
  8. # title: Historical DAX index levels

二、进一步查看窗口数据

差值:window size = 2

shift 为1,默认下拉表格位置,也就是表示“上一个值”。

  1. %time data['Return'] = np.log(data['Close'] / data['Close'].shift(1))
  2. data['Return'].plot(figsize=(8, 5), grid=True);

平滑:window size > 2

窗口期数据的“统计量”计算。

  1. data['42d'] = data['Close'].rolling(window=42).mean()
  2. data['252d'] = data['Close'].rolling(window=252).mean()
  3. data[['Close', '42d', '252d']].plot(figsize=(8, 5), grid=True)
  4. # tag: dax_trends
  5. # title: The S&P index and moving averages

三、多列数据同时显示

两列数据上下显示出来。

  1. data[['Close', 'Return']].plot(subplots=True, style='b', figsize=(8, 5), grid=True);
  2. # tag: dax_returns
  3. # title: The S&P 500 index and daily log returns

训练模型:Regression Analysis

一、准备数据

/* 略 */

二、训练数据

一般的思路,可能选择:scikit learning;当然,NumPy也提供了一些基本的功能。

训练 training

  1. xdat = rets['.SPX'].values
  2. ydat = rets['.VIX'].values
  3. reg = np.polyfit(x=xdat, y=ydat, deg=1)

预测并可视化

  1. plt.plot(xdat, ydat, 'r.')
  2. ax = plt.axis() # grab axis values
  3. x = np.linspace(ax[0], ax[1] + 0.01)
  4.  
  5. ------------------------------------------
    # 画出预测趋势
  6. plt.plot(x, np.polyval(reg, x), 'b', lw=2)
  7. plt.grid(True)
  8. plt.axis('tight')
  9. plt.xlabel('S&P 500 returns')
  10. plt.ylabel('VIX returns')
  11. # tag: scatter_rets
  12. # title: Scatter plot of log returns and regression line

高频数据

一、引入的问题

思考:High Frequency首先会带来怎么样的问题?

index时间,在秒级以下仍然有很多的数据,但对目前的分析而言其实意义不是很大。

  1. Bid Ask Mid
  2. 2017-11-10 13:59:59.716 1.16481 1.16481 1.164810
  3. 2017-11-10 13:59:59.757 1.16481 1.16482 1.164815
  4. 2017-11-10 14:00:00.005 1.16482 1.16482 1.164820
  5. 2017-11-10 14:00:00.032 1.16482 1.16483 1.164825
  6. 2017-11-10 14:00:00.131 1.16483 1.16483 1.164830

二、重采样 resampling

这个类似:先分段,再用“统计量”替换“原来的密集的数据”;与窗口策略小有不同。

  1. eur_usd_resam = eur_usd.resample(rule='1min', label='last').last()
  2. eur_usd_resam.head()

End.

[Pandas] 03 - DataFrame的更多相关文章

  1. Pandas | 03 DataFrame 数据帧

    数据帧(DataFrame)是二维数据结构,即数据以行和列的表格方式排列. 数据帧(DataFrame)的功能特点: 潜在的列是不同的类型 大小可变 标记轴(行和列) 可以对行和列执行算术运算 结构体 ...

  2. python 数据处理学习pandas之DataFrame

    请原谅没有一次写完,本文是自己学习过程中的记录,完善pandas的学习知识,对于现有网上资料的缺少和利用python进行数据分析这本书部分知识的过时,只好以记录的形势来写这篇文章.最如果后续工作定下来 ...

  3. Pandas之Dataframe叠加,排序,统计,重新设置索引

    Pandas之Dataframe索引,排序,统计,重新设置索引 一:叠加 import pandas as pd a_list = [df1,df2,df3] add_data = pd.concat ...

  4. pandas中DataFrame对象to_csv()方法中的encoding参数

    当使用pd.read_csv()方法读取csv格式文件的时候,常常会因为csv文件中带有中文字符而产生字符编码错误,造成读取文件错误,在这个时候,我们可以尝试将pd.read_csv()函数的enco ...

  5. pandas(DataFrame)

    DataFrame是二维数据结构,即数据以行和列的表格方式排列!特点:潜在的列是不同的类型,大小可变,标记行和列,可以对列和行执行算数运算. 其中Name,Age即为对应的Columns,序号0,1, ...

  6. Python3 Pandas的DataFrame数据的增、删、改、查

    Python3 Pandas的DataFrame数据的增.删.改.查 一.DataFrame数据准备 增.删.改.查的方法有很多很多种,这里只展示出常用的几种. 参数inplace默认为False,只 ...

  7. Python3 Pandas的DataFrame格式数据写入excle文件、json、html、剪贴板、数据库

    Python3 Pandas的DataFrame格式数据写入excle文件.json.html.剪贴板.数据库 一.DataFrame格式数据 Pandas是Python下一个开源数据分析的库,它提供 ...

  8. python. pandas(series,dataframe,index) method test

    python. pandas(series,dataframe,index,reindex,csv file read and write) method test import pandas as ...

  9. pandas取dataframe特定行/列

    1. 按列取.按索引/行取.按特定行列取 import numpy as np from pandas import DataFrame import pandas as pd df=DataFram ...

随机推荐

  1. HTML基础介绍

    前言: H5是目前行业里非常热门的一种语言,学习难度较低,可以快速入门.我个人也在学习H5,采用写博客的方式来梳理我学到的知识点,也分享给更多想学习的人一起来学习. Tip:个人学习过程中梳理的知识点 ...

  2. 开发APP必须知道的API集合,来源http://www.cnblogs.com/wikiki/p/7232388.html

    笔记 OneNote - OneNote支持获取,复制,创建,更新,导入与导出笔记,支持为笔记添加多媒体内容,管理权限等.提供SDK和Demo. 为知笔记 - 为知笔记Windows客户端开放了大量的 ...

  3. react native Android支持gif和WebP动图

    在项目android/app/build.gradle的文件中找到dependencies 支持gif动图加入: implementation 'com.facebook.fresco:animate ...

  4. 实战redhat6.5离线升级openssl&openssh

    记录一次RedHat6.5升级openssl&openssh踩坑填坑.由于机房信息安全员用绿盟扫描出服务器openssh有8个重要的安全漏洞,最好的解决方式就是升级版本. 注意事项: 先升级o ...

  5. 【原创】为什么Redis集群有16384个槽

    引言 我在<那些年用过的Redis集群架构(含面试解析)>一文里提到过,现在redis集群架构,redis cluster用的会比较多. 如下图所示 对于客户端请求的key,根据公式HAS ...

  6. jqGrid根据数据动态设置rowList

    superme.rowList = [10,20,50,100]; superme.rowNum = 20; 全局属性 loadComplete : function (data) { if(data ...

  7. MySql优化相关概念的理解笔记

    MySQL架构 查询执行流程 查询执行的流程是怎样的: 连接1.1客户端发起一条Query请求,监听客户端的‘连接管理模块’接收请求1.2将请求转发到‘连接进/线程模块’1.3调用‘用户模块’来进行授 ...

  8. 小米 OJ 编程比赛 02 月常规赛 3 Logic Gatekeeper CDQ分治

    link:https://code.mi.com/problem/list/view?id=139 题意: 有一个1e6 * 1e6 大的格子,现在有两种操作:1,给一个子矩阵中的每个格子加上k.2, ...

  9. BZOJ2655 Calc - dp 拉格朗日插值法

    BZOJ2655 Calc 参考 题意: 给定n,m,mod,问在对mod取模的背景下,从[1,m]中选出n个数相乘可以得到的总和为多少. 思路: 首先可以发现dp方程 ,假定dp[m][n]表示从[ ...

  10. SDU暑期集训排位(3)

    B. Mysterious LCM 做法 保留 \(a_i|x\) 的元素,其它元素解体. \(a_i\) 的某个质因子的指数,要和 \(x\) 的这个质因子一样多,才有贡献,否则这个质因子它在划水啊 ...