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中提供了两个属性index和values
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())
统计函数
count | Number 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)
『Python』Numpy学习指南第十章_高端科学计算库scipy入门(系列完结)
AI:Python与人工智能相关的库/框架(机器学习&深度学习&数据科学/计算机视觉/自然语言处理)的简介案例应用之详细攻略