Python机器学习入门——科学计算库(Pandas)

Posted 零陵上将军_xdr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python机器学习入门——科学计算库(Pandas)相关的知识,希望对你有一定的参考价值。

(所需要的资料均已上传)

Pandas介绍

Pandas简介

2008年WesMcKinney开发出的库
专门用于数据挖掘的开源python库
以Numpy为基础,借力Numpy模块在计算方面性能高的优势
基于matplotlib,能够简便的画图
独特的数据结构

Pandas数据结构

Pandas中一共有三种数据结构,分别为:Series、DataFrame和MultiIndex(老版本中叫Panel )。

其中Series是一维数据结构,DataFrame是二维的表格型数据结构,MultiIndex是三维的数据结构。

Series

Series是一个类似于一维数组的数据结构,它能够保存任何类型的数据,比如整数、字符串、浮点数等,主要由一组数据和与之相关的索引两部分构成。

Series的创建

import pandas as pd

pd.Series(data=None, index=None, dtype=None)

参数:

data:传入的数据,可以是ndarray、list等
index:索引,必须是唯一的,且与数据的长度相等。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
dtype:数据的类型

1、指定内容,默认索引

import pandas as pd
pd.Series(np.arange(10))


2、指定索引

pd.Series([6.7,5.6,3,10,2], index=[1,2,3,4,5])


3、通过字典数据创建

 pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})

Series的属性

为了更方便地操作Series对象中的索引和数据,Series中提供了两个属性indexvalues

index:

import pandas as pd
series= pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})
print(series.index)

values:

import pandas as pd
series= pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})
print(series.values)

DataFrame

DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引

行索引,表明不同行,横向索引,叫index,0轴,axis=0
列索引,表名不同列,纵向索引,叫columns,1轴,axis=1

DataFrame的创建

pd.DataFrame(data=None, index=None, columns=None)

参数:

index:行标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。
columns:列标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。

创建学生成绩案例:

import pandas as pd
import numpy as np

subjects = ["数据结构", "操作系统", "面向对象", "大数据导论", "计算机组成原理","计算机网络"]
students=["学生{}".format(i) for i in range(1,11)]
data=pd.DataFrame(np.random.randint(50,100,(10,6)),index=students,columns=subjects)
print(data)

![在这里插入图片描述](https://img-blog.csdnimg.cn/c015dbb684c94f048e824115d5bd7e1f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NzcxOTM5,size_16,color_FFFFFF,t_70

DataFrame的属性

1、shape

data.shape

print(data.shape)

运行结果:

2、index

DataFrame的行索引列表

print(data.index)

运行结果:

3、columns
DataFrame的列索引列表:

print(data.columns)

运行结果;

4、values

直接获取其中array的值

print(data.values)


5、.T
转置

print(data.T)

6、head(n):显示前n行内容

如果不补充参数,默认5行。填入参数N则显示前N行

print(data.head())


7、tail(n):显示后n行内容

如果不补充参数,默认5行。填入参数N则显示后N行

data.tail()

DatatFrame索引的设置

以下所有案例多数是引用上面的学生课表案例

1、修改行列索引值

data.index=["教师{}".format(i) for i in range(1,11)]
# 错误方法
data.index[3] = '教师3'

2、 重设索引

reset_index(drop=False)

drop:默认为False,不删除原来索引,如果为True,删除原来的索引值

3、以某列值设置为新的索引

 set_index(keys, drop=True)
keys : 列索引名成或者列索引名称的列表
drop : boolean, default True.当做新的索引,删除原来的列

设置新索引案例:
1、创建

df = pd.DataFrame({'month': [1, 4, 7, 10],
                    'year': [2012, 2014, 2013, 2014],
                    'sale':[55, 40, 84, 31]})


2、以月份设置新的索引

df=df.set_index('month')
print(df)


3、设置多个索引,以年和月份

df = df.set_index(['year', 'month'])
print(df)

基本数据操作

为了更好的理解这些基本操作,我们将读取一个真实的股票数据。

import pandas as pd
# 将数据全部显示,没有省略号
pd.set_option('display.max_columns',None)
pd.set_option('display.max_rows',None)
pd.set_option('display.width',10000)

data=pd.read_csv(r'C:\\Users\\Administrator\\Desktop\\stock_day.csv')
data=data.set_index(["date"])

索引操作

Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持类似的操作,也可以直接使用列名、行名称,甚至组合使用。

1、直接使用行列索引(先列后行)

获取’2018-02-27’这天的’open’的结果

print(data['open']['2018/2/27'])


2、结合loc或者iloc使用索引

获取从’2018-02-27’:‘2018-02-22’,'open’的结果

print(data.loc['2018/2/27':'2018/2/22', 'open'])
print("--------------------------")
data.iloc[:3, :5]

3、使用ix组合索引
获取行第1天到第4天,[‘open’, ‘close’, ‘high’, ‘low’]这个四个指标的结果

# 使用ix进行下表和名称组合做引
data.ix[0:4, ['open', 'close', 'high', 'low']]

# 推荐使用loc和iloc来获取的方式
data.loc[data.index[0:4], ['open', 'close', 'high', 'low']]
data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]

赋值操作

对DataFrame当中的close列进行重新赋值为1

# 直接修改原来的值
data['close'] = 1
# 或者
data.close = 1

排序

排序有两种形式,一种对于索引进行排序,一种对于内容进行排序。

DataFrame排序

df.sort_values(by= , ascending= )

单个键或者多个键进行排序,
参数:
by:指定排序参考的键
ascending:默认升序
ascending=False:降序
ascending=True:升序

# 按照开盘价大小进行排序 , 使用ascending指定按照大小排序
data.sort_values(by="open", ascending=True).head()
# 按照多个键进行排序
data.sort_values(by=['open', 'high'])

使用df.sort_index给索引进行排序

# 对索引进行排序
data.sort_index()

Series排序

使用series.sort_values(ascending=True)进行排序

data['p_change'].sort_values(ascending=True).head()

使用series.sort_index()进行排序

data['p_change'].sort_index().head()

DataFrame运算

算术运算

add(other)
比如进行数学运算加上具体的一个数字

print(data['open'].add(1).head())

sub(other) :减去一个数

逻辑运算

逻辑运算符号

例如筛选data[“open”] > 23的日期数据

print(data['open']>23)


完成多个逻辑判断:

data[(data["open"] > 23) & (data["open"] < 24)].head()

逻辑运算函数

1、query(expr)
通过query使得刚才的过程更加方便简单

data.query("open<24 & open>23").head()

2、isin(values)

例如判断’open’是否为23.53和23.85

# 可以指定值进行一个判断,从而进行筛选操作
data[data["open"].isin([23.53, 23.85])]

统计运算

describe

综合分析: 能够直接得出很多统计结果,count, mean, std, min, max 等

print(data.describe())

统计函数

countNumber of non-NA observations
sum求和
mean平均值
median中位数
min最小值
max最大值
mode众数
abs绝对值
prod乘积
std标准差
var方差
idmax最大值索引
idmin最小值索引

累计统计函数

函数作用
cumsum计算前1/2/3/…/n个数的和
cummax计算前1/2/3/…/n个数的最大值
cummin计算前1/2/3/…/n个数的最小值
cumprod计算前1/2/3/…/n个数的积

例:对p_change进行求和,计算股票的涨跌

import matplotlib.pyplot as plt
import pandas as pd

data=pd.read_csv(r'C:\\Users\\Administrator\\Desktop\\stock_day.csv')
data=data.set_index(["date"])
data=data.sort_index()
stock_rise=data['p_change']
stock_rise.cumsum().plot()
plt.show()

自定义运算

apply(func, axis=0)

func:自定义函数
axis=0:默认是列,axis=1为行进行运算

文件读取与存储

CSV

pandas.read_csv(filepath_or_buffer, sep =’,’, usecols )

filepath_or_buffer:文件路径
sep :分隔符,默认用","隔开
usecols:指定读取的列名,列表形式

# 读取文件,并且指定只获取'open', 'close'指标
data = pd.read_csv("./data/stock_day.csv", usecols=['open', 'close'])

DataFrame.to_csv(path_or_buf=None,sep=’,’,columns=None,header=True,index=True, mode=‘w’, encoding=None)

path_or_buf :文件路径
sep :分隔符,默认用","隔开
columns :选择需要的列索引
header :boolean or list of string, default True,是否写进列索引值
index:是否写进行索引
mode:‘w’:重写, ‘a’ 追加

# 选取10行数据保存,便于观察数据
data[:10].to_csv("./data/test.csv", columns=['open'])

HDF5

从h5文件当中读取数据
pandas.read_hdf(path_or_buf,key =None, kwargs)**

path_or_buffer:文件路径
key:读取的键
return:Theselected object

DataFrame.to_hdf(path_or_buf, key, \\kwargs)

JSON

pandas.read_json(path_or_buf=None, orient=None, typ=‘frame’, lines=False)
将JSON格式准换成默认的Pandas DataFrame格式
例:

json_read = pd.read_json(r'C:\\Users\\Administrator\\Desktop\\Sarcasm_Headlines_Dataset.json', orient="records", lines=True)

DataFrame.to_json(path_or_buf=None, orient=None, lines=False)
将Pandas 对象存储为json格式

高级处理-缺失值处理

判断缺失值是否存在

如果缺失值的标记方式是NaN,判断数据中是否包含NaN:

pd.isnull(df),
pd.notnull(df)

案例:

import pandas as pd

pd.set_option('display.max_columns',None)
pd.set_option('display.max_rows',None)
pd.set_option('display.width',10000)

# 读取电影数据
movie = pd.read_csv(r'C:\\Users\\Administrator\\Desktop\\IMDB-Movie-Data.csv')

print(pd.notnull(movie))

存在缺失值nan,并且是np.nan

存在缺失值nan:

1、删除存在缺失值的:dropna(axis='rows')
    注:不会修改原数据,需要接受返回值

2、替换缺失值:fillna(value, inplace=True)
    value:替换成的值
    inplace:True:会修改原数据,False:不替换修改原数据,生成新的对象

1、删除
pandas删除缺失值,使用dropna的前提是,缺失值的类型必须是np.nan

# 不修改原数据
movie.dropna()

# 可以定义新的变量接受或者用原来的变量名
data = movie.dropna()

2、替换缺失值

for i in movie.columns:
    if np.all(pd.notnull(movie[i])) == False:
        print(i)
        movie[i].fillna(movie[i].mean(), inplace=True)

高级处理-数据离散化

为什么要离散化

连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。

什么是数据的离散化

连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。

离散化有很多种方法,这使用一种最简单的方式去操作

原始人的身高数据:165,174,160,180,159,163,192,184
假设按照身高分几个区间段:150~165, 165~180,180~195

这样我们将数据分到了三个区间段,我可以对应的标记为矮、中、高三个类别,最终要处理成一个"哑变量"矩阵。

股票的涨跌幅离散化

1、读取股票的数据

# 读取电影数据
data = pd.read_csv(r'C:\\Users\\Administrator\\Desktop\\IMDB-Movie-Data.csv')
p_change= data['p_change']

2、将股票涨跌幅数据进行分组

pd.qcut(data, q):
对数据进行分组将数据分组,一般会与value_counts搭配使用,统计每组的个数

series.value_counts():统计分组次数

# 自行分组
qcut = pd.qcut(p_change, 10)
# 计算分到每个组数据个数
print(qcut.value_counts())


自定义区间分组:

pd.cut(data, bins)
# 自己指定分组区间
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
p_counts = pd.cut(p_change, bins)
# 自己指定分组区间
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
p_counts = pd.cut(p_change, bins)
print(p_counts)

股票涨跌幅分组数据变成one-hot编码

什么是one-hot编码?
把每个类别生成一个布尔列,这些列中只有一列可以为这个样本取值为1.其又被称为热编码。

pandas.get_dummies(data, prefix=None)
# 得出one-hot编码矩阵
dummies = pd.get_dummies(p_counts, prefix="rise")
print(dummies)

高级处理-合并

pd.concat实现数据合并

pd.concat([data1, data2], axis=1)

按照行或列进行合并,axis=0为列索引,axis=1为行索引
# 按照行索引进行
pd.concat([data, dummies], axis=1)

pd.merge

pd.merge(left, right, how=‘inner’, on=None)

可以指定按照两组数据的共同键值对合并或者左右各自
left: DataFrame
right: 另一个DataFrame
on: 指定的共同键
how:按照什么方式连接

高级处理-交叉表与透视表

交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
pd.crosstab(value1, value2)
透视表:透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
data.pivot_table()
DataFrame.pivot_table([], index=[])

案例:探究股票的涨跌与星期几有关?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.max_columns',None)
pd.set_option('display.max_rows',None)
pd.set_option('display.width',10000)

data=pd.read_csv(r'C:\\Users\\Administrator\\Desktop\\stock_day.csv')

time=data.set_index(keys=["date"])

week=pd.to_datetime(time.index).weekday+1

data['week']=week

data['posi_neg'] = np.where(data["p_change"]>0,1,0)

count=pd.crosstab(data['week'],data['posi_neg'])

sum=count.sum(axis=1).astype(np.float32)
pro=count.div(sum,axis=0)
pro.plot(kind='bar',stacked=True)
plt.savefig('2')
plt.show()

print(data.pivot_table(['posi_neg'], index='week'))


高级处理-分组与聚合

什么分组与聚合

分组与聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的

以上是关于Python机器学习入门——科学计算库(Pandas)的主要内容,如果未能解决你的问题,请参考以下文章

Python机器学习入门——科学计算库(Matplotlib)

NumPy快速入门笔记

Python机器学习入门之导学+无监督学习

『Python』Numpy学习指南第十章_高端科学计算库scipy入门(系列完结)

Python语言下的机器学习库

AI:Python与人工智能相关的库/框架(机器学习&深度学习&数据科学/计算机视觉/自然语言处理)的简介案例应用之详细攻略