Python数据方向之pandas
pandas有数据分析界"瑞士军刀"的盛誉。
关于pandas
pandas,python+data+analysis的组合缩写,是python中基于numpy和matplotlib的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包,享有数分三剑客之名。
正因为pandas是在numpy基础上实现,其核心数据结构与numpy的ndarray十分相似,但pandas与numpy的关系不是替代,而是互为补充。二者之间主要区别是:
-
从数据结构上看:
-
核心数据结构
- numpy的核心数据结构是ndarray,支持任意维数的数组,但要求单个数组内所有数据是同质的,即类型必须相同;
- pandas的核心数据结构是series和dataframe,仅支持一维和二维数据,但数据内部可以是异构数据,仅要求同列数据类型一致即可
-
数据结构
- numpy的数据结构仅支持数字索引;
- pandas数据结构则同时支持数字索引和标签索引
-
-
从功能定位上看:
-
numpy虽然也支持字符串等其他数据类型,但仍然主要是用于数值计算,尤其是内部集成了大量矩阵计算模块,例如基本的矩阵运算、线性代数、fft、生成随机数等,支持灵活的广播机制
-
pandas主要用于数据处理与分析,支持包括数据读写、数值计算、数据处理、数据分析和数据可视化全套流程操作
-
pandas主要面向数据处理与分析,主要具有以下功能特色:
-
按索引匹配的广播机制,这里的广播机制与numpy广播机制还有很大不同
-
便捷的数据读写操作,相比于numpy仅支持数字索引,pandas的两种数据结构均支持标签索引,包括bool索引也是支持的
-
类比SQL的join和groupby功能,pandas可以很容易实现SQL这两个核心功能,实际上,SQL的绝大部分DQL和DML操作在pandas中都可以实现
-
类比Excel的数据透视表功能,Excel中最为强大的数据分析工具之一是数据透视表,这在pandas中也可轻松实现
-
自带正则表达式的字符串向量化操作,对pandas中的一列字符串进行通函数操作,而且自带正则表达式的大部分接口
-
丰富的时间序列向量化处理接口
-
常用的数据分析与统计功能,包括基本统计量、分组统计分析等
-
集成matplotlib的常用可视化接口,无论是series还是dataframe,均支持面向对象的绘图接口
正是由于具有这些强大的数据分析与处理能力,pandas还有数据处理中"瑞士军刀"的美名。
参考链接:
Pandas入门详细教程
pandas用法-全网最详细教程
Pandas知识点超全总结
清晰易懂的NumPy 图解教程!(公众号:机器学习算法那些事)
生成数据表
1、首先导入pandas库,一般都会用到numpy库,所以我们先导入备用:
import numpy as np
import pandas as pd
2、导入CSV或者xlsx文件:
df = pd.DataFrame(pd.read_csv('name.csv',header=1))
df = pd.DataFrame(pd.read_excel('name.xlsx'))
或者
import pandas as pd
from collections import namedtuple
Item = namedtuple('Item', 'reply pv')
items = []
with codecs.open('reply.pv.07', 'r', 'utf-8') as f:
for line in f:
line_split = line.strip().split('\t')
items.append(Item(line_split[0].strip(), line_split[1].strip()))
df = pd.DataFrame.from_records(items, columns=['reply', 'pv'])
3、用pandas创建数据表:
df = pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006],
"date":pd.date_range('20130102', periods=6),
"city":['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
"age":[23,44,54,32,34,32],
"category":['100-A','100-B','110-A','110-C','210-A','130-F'],
"price":[1200,np.nan,2133,5433,np.nan,4432]},
columns =['id','date','city','category','age','price'])
二、读写数据
Pandas支持了非常丰富的文件类型,也就是说,它可以读取和保存多种类型的数据,比如:excel文件、csv文件、或者json文件、sql文件,甚至html文件等,这对我们获取数据很方便,这里挑常用的几个讲解,其他基本大同小异,注意特殊参数就行,读者自行查阅。
1、读数据
-
excel文件
-
excel无疑是接触最多的数据源,所有首先讲解pandas读取excel文件的方法。
pd.read_excel()
-
参数详解:
- io:文件路劲,可以是相对路径,可以是绝对路径
- sheet_name:excel存在多个sheet的情况,所以可以指定sheet 名(列1,列2…)或者指定第几个(0,1,2…),默认第一个。
- usecols:提取特定的列,可以是列名,也可以是列号,[]括起来
- header:以数据的第几行做标题行,和后面的参数skiprows 很像,都能是跳过几行
- dtype:指定读取到的数据格式
- skiprows :跳过几行,和header类似
-
-
csv文件
-
excel虽然是使用做多的数据格式,但是由于excel存在诸多问题,如:数据加载慢、多sheet问题,没法保存大数据(excel单个表只能100w多一点),所以csv就显得优秀很多,上述问题都不存在。
pd.read_csv()
-
读取时的参数很多都是一样的,所以不再赘述,只讲解不一样的参数。
-
和Excel不同参数详解:
- sep:csv文件并不是表格格式,所以要指定分隔符,默认是逗号,有事还可能是”\t“
- encoding:csv文件不像excel只有一种编码,所以使用时有时候需要指定编码格式。utf8或者gb2312等
-
-
sql文件
-
不得不说,现在好多数据都是直接在数据库提取的,好在pandas也有专门的获取方法,代码如下:
pd.read_sql(sql, con)
-
参数详解:
-
sql:sql语句,比如"select * from test"
-
con:链接数据库的信息,包括ip、user、密码、数据库等,
con = pymysql.connect( host=‘182.225.32.220’, # 本地数据库 user=‘root’, password=‘***’, db=‘financial’, charset=‘utf8’)
-
-
2、写数据
对于写文件,重要参数几乎一样,这里只使用excel做演示:
dataFrame.to_excel("输出.xlsx",index=False,sheet_name="1")
参数说明:
- excel_writer:保存文件路径,不写绝对路径则保存在当前目录下。注意文件后缀(必须)
- sheet_name:保存excel文件中sheet的名字(excel特有)
- index:是否输出索引列,一般不输出(通用)
- encoding:指定输出文件编码(通用)
- startrow/startcol:输出文件在excel文件第几行几列开始(excel特有)
- sep:输出的csv文件以什么分割,默认逗号(csv特有)
以上基本是常用参数,其他参数用的不多,默认即可,有特殊需求就百度查询。
需要注意的是,保存文件要选择适应的类型,具体如下:
神奇的numpy(用NumPy表示日常数据)
NumPy是Python中用于数据分析、机器学习、科学计算的重要软件包。它极大地简化了向量和矩阵的操作及处理。python的不少数据处理软件包依赖于NumPy作为其基础架构的核心部分(例如scikit-learn、SciPy、pandas和tensorflow)。除了数据切片和数据切块的功能之外,掌握numpy也使得开发者在使用各数据处理库调试和处理复杂用例时更具优势。
日常接触到的数据类型,如电子表格,图像,音频…等,如何表示呢?Numpy可以解决这个问题。
表和电子表格
电子表格或数据表都是二维矩阵。电子表格中的每个工作表都可以是自己的变量。python中类似的结构是pandas数据帧(dataframe),它实际上使用NumPy来构建的。
音频和时间序列
音频文件是一维样本数组。每个样本都是代表一小段音频信号的数字。CD质量的音频每秒可能有44,100个采样样本,每个样本是一个-65535到65536之间的整数。这意味着如果你有一个10秒的CD质量的WAVE文件,你可以将它加载到长度为10 * 44,100 = 441,000个样本的NumPy数组中。想要提取音频的第一秒?只需将文件加载到我们称之为audio的NumPy数组中,然后截取audio[:44100]。
以下是一段音频文件:
时间序列数据也是如此(例如,股票价格随时间变化的序列)。
图像
图像是大小为(高度×宽度)的像素矩阵。如果图像是黑白图像(也称为灰度图像),则每个像素可以由单个数字表示(通常在0(黑色)和255(白色)之间)。如果对图像做处理,裁剪图像的左上角10 x 10大小的一块像素区域,用NumPy中的image[:10,:10]就可以实现。
这是一个图像文件的片段:
如果图像是彩色的,则每个像素由三个数字表示 :红色,绿色和蓝色。在这种情况下,我们需要第三维(因为每个单元格只能包含一个数字)。因此彩色图像由尺寸为(高x宽x 3)的ndarray表示。
语言
如果我们处理文本,情况就会有所不同。用数字表示文本需要两个步骤,构建词汇表(模型知道的所有唯一单词的清单)和嵌入(embedding)。让我们看看用数字表示这个(翻译的)古语引用的步骤:“Have the bards who preceded me left any theme unsung?”
模型需要先训练大量文本才能用数字表示这位战场诗人的诗句。我们可以让模型处理一个小数据集,并使用这个数据集来构建一个词汇表(71,290个单词):
然后可以将句子划分成一系列“词”token(基于通用规则的单词或单词部分):
然后我们用词汇表中的id替换每个单词:
这些ID仍然不能为模型提供有价值的信息。因此,在将一系列单词送入模型之前,需要使用嵌入(embedding)来替换token/单词(在本例子中使用50维度的word2vec嵌入):
你可以看到此NumPy数组的维度为[embedding_dimension x sequence_length]。
在实践中,这些数值不一定是这样的,但我以这种方式呈现它是为了视觉上的一致。出于性能原因,深度学习模型倾向于保留批数据大小的第一维(因为如果并行训练多个示例,则可以更快地训练模型)。很明显,这里非常适合使用reshape()。例如,像BERT这样的模型会期望其输入矩阵的形状为:[batch_size,sequence_length,embedding_size]。
这是一个数字合集,模型可以处理并执行各种有用的操作。我留空了许多行,可以用其他示例填充以供模型训练(或预测)。
事实证明,在我们的例子中,那位诗人的话语比其他诗人的诗句更加名垂千古。尽管生而为奴,诗人安塔拉(Antarah)的英勇和语言能力使他获得了自由和神话般的地位,他的诗是伊斯兰教以前的阿拉伯半岛《悬诗》的七首诗之一。