DataFrame


Based on NumPy

Ref: Pandas and NumPy arrays explained

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

  • dataframe 转化成 array
df=df.values
  • array 转化成 dataframe
import pandas as pd

df = pd.DataFrame(df)

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

import pandas as pd
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.

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

Output: 

  numbers
a 10
b 20
c 30
d 40

时间序列

    以“月”为间隔单位。

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

Output:

DatetimeIndex(['2015-01-31', '2015-02-28', '2015-03-31', '2015-04-30',
'2015-05-31', '2015-06-30', '2015-07-31', '2015-08-31',
'2015-09-30'],
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) 其他col默认
df['floats'] = (1.5, 2.5, 3.5, 4.5) # (2) 自定义
df['names'] = pd.DataFrame(['Yves', 'Felix', 'Francesc'], index=['a', 'b', 'c'])

添加一行

类似list的添加方式。

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

添加一行,再添加一列

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

添加csv文件

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

三、查找 select

查找某一个元素

是通过“key" 并非row number。

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

.index, .loc, liloc

df.index  # the index values

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

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

df['No2'].iloc[3]

遍历每一行元素

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

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

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

Ref: Iterate over rows in a dataframe in Pandas

拿出某一列元素

这一列的值展示。

In [9]: df.loc[df.index[:]]
Out[9]:
c1 c2
0 10 100
1 11 110
2 12 120 In [10]: df.loc[df.index[:],'c2']
Out[10]:
0 100
1 110
2 120
Name: c2, dtype: int64

列统计

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

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

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

# attendance
attendance_null_ct = df_train.attendance.isnull().sum()
print(attendance_null_ct) #
print(df_train.attendance.describe())
# count 393.000000
# mean 3716.913486
# std 16097.152814
# min 15.000000
# 25% 200.000000
# 50% 640.000000
# 75% 1800.000000
# max 204000.000000

筛选 WHERE

# 列出某一属性的行
f[df['location'] == 'Vancouver'].head() # 更为复杂的条件
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'。

df.join(pd.DataFrame([1, 4, 9, 16, 25],
index=['a', 'b', 'c', 'd', 'y'],
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。

内连接inner join
SELECT msp.name, party.name FROM msp JOIN party ON party=code
SELECT msp.name, party.name FROM msp inner JOIN party ON party=code 左连接left join
SELECT msp.name, party.name FROM msp LEFT JOIN party ON party=code 右连接right join
SELECT msp.name, party.name FROM msp RIGHT JOIN party ON msp.party=party.code 全连接(full join)
SELECT msp.name, party.name FROM msp FULL JOIN party ON msp.party=party.code

join和union的区别

合并两表,保留共有列。

pd.concat([df2,df3])

pd.concat([df2,df3]).drop_duplicates()

四、预处理 之 Apply

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

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

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

表格数据分析

一、Basic Analytics

df.sum()
df.mean()
df.cumsum()
df.describe()
np.sqrt(abs(df))
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

"一维" 分组

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

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

"二维" 分组

group by 两个columns后的情况。

df['Odd_Even'] = ['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd']
groups = df.groupby(['Quarter', 'Odd_Even'])
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

另一个例子:

type_cat_cts = (
df_train
.groupby([df_train.permit_type, df_train.event_category.isnull()])
.size())
print(type_cat_cts)
# permit_type event_category
# Charter Vessel True 10
# Special Event False 325
# Valet Parking True 61
# Comments:
# - 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

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。

二级列分组

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

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

四、表格可视化

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

实战练习


预处理:金融数据展示

一、数据初看

打开文档

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

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

只查看一列

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

二、进一步查看窗口数据

差值:window size = 2

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

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

平滑:window size > 2

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

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

三、多列数据同时显示

两列数据上下显示出来。

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

训练模型:Regression Analysis

一、准备数据

/* 略 */

二、训练数据

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

训练 training

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

预测并可视化

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

高频数据

一、引入的问题

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

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

                           Bid        Ask        Mid
2017-11-10 13:59:59.716 1.16481 1.16481 1.164810
2017-11-10 13:59:59.757 1.16481 1.16482 1.164815
2017-11-10 14:00:00.005 1.16482 1.16482 1.164820
2017-11-10 14:00:00.032 1.16482 1.16483 1.164825
2017-11-10 14:00:00.131 1.16483 1.16483 1.164830

二、重采样 resampling

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

eur_usd_resam = eur_usd.resample(rule='1min', label='last').last()
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. HBase 系列(六)——HBase Java API 的基本使用

    一.简述 截至到目前 (2019.04),HBase 有两个主要的版本,分别是 1.x 和 2.x ,两个版本的 Java API 有所不同,1.x 中某些方法在 2.x 中被标识为 @depreca ...

  2. MongoDB的一些高级语法.md

      MongoDB的一些高级语法 AND 和 OR操作 AND操作 OR操作 嵌入式文档 插入 查询 数组(Array)字段 插入 查询 聚合(Aggregation) 筛选数据 修改字段 注意事项 ...

  3. 使用.Net Core + Vue + IdentityServer4 + Ocelot 实现一个简单的DEMO +源码

    运行环境 Vue 使用的是D2admin: https://doc.d2admin.fairyever.com/zh/ Github地址:https://github.com/Fengddd/Perm ...

  4. SpringBoot Mybatis解决使用PageHelper一对多分页问题

    一般来说使用 PageHelper 能解决绝大多数的分页问题,相关使用可在博客园上搜索,能找到很多资料. 之前我在做SpringBoot 项目时遇到这样一个问题,就是当一对多联合查询时需要分页的情况下 ...

  5. Rest构建分布式 SpringCloud微服务架构项目

    一.开发环境:jdk  1.8.Maven  3.x.IDEA  2019.1.4.SpringBoot   2.0.7.spring Cloud  最新的稳定版  Finchley SR2   搭配 ...

  6. 初识JAVA语言

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 前言        很多游戏开发者可能会有疑问,你会C#,JS,TS,为什么还要初识JAVA呢?有人可能会说,多学点对自己有好处 ...

  7. unity_实用小技巧(相机跟随两个主角移动)

    在两人对战的游戏中,有时候我们希望能看清楚两玩家的状态,这时我们需要让相机跟随玩家,可是我们不能让相机只跟随一个玩家移动,这时我们可以取两玩家的中点作为相机的位置.方法如下: public Trans ...

  8. 最近学习了限流与RateLimiter

    前言 分布式环境下应对高并发保证服务稳定几招,按照个人理解,优先级从高到低分别为缓存.限流.降级.熔断,每招都有它的作用,本文重点就讲讲限流这部分. 坦白讲,其实上面的说法也不准确,因为服务降级.熔断 ...

  9. Leetcode之二分法专题-441. 排列硬币(Arranging Coins)

    Leetcode之二分法专题-441. 排列硬币(Arranging Coins) 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形 ...

  10. [Mysql] GroupBy 分组,按天、周、月

    简单说明: 最近在做报表功能的时候,需要将数据按天.周和月进行合并展示(数据记录都是按天20190701). 正文: 说明:数据表中date都是int类型:如 20190701 一.按天 SELECT ...