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)的英勇和语言能力使他获得了自由和神话般的地位,他的诗是伊斯兰教以前的阿拉伯半岛《悬诗》的七首诗之一。

posted @ 2023-06-20 11:31  坦笑&&life  阅读(8)  评论(0编辑  收藏  举报  来源