python表格数据处理

发布时间: 2023-11-27 17:15 阅读: 文章来源:1MUMB102145PS

目录

技术背景python对Excel表格的处理vaex的安装与使用vaex的安装性能对比数据格式转换总结概要版权声明参考链接技术背景

数据处理是一个当下非常热门的研究方向,通过对于大型实际场景中的数据进行建模,可以用于预测下一阶段可能出现的情况。比如我们有过去的2002年-2018年的黄金价格的数据:

该数据来源于Gitee上的一个开源项目。其中包含有:时间、开盘价、收盘价、最高价、最低价、交易数以及成交额这么几个参数。假如我们使用一个机器学习的模型去分析这个数据,也许我们可以预测在这个数据中并不存在的金价数据。如果预测的契合度较好,那么对于一些人的投资策略来说有重大意义。但是这种实际场景下的数据,往往数据量是非常大的。虽然这里我们使用到的数据只有300多KB,但是我们更多的时候不得不考虑10个GB甚至是1个TB以上的数据的处理。如果处理都无法处理,那我们如何对这些数据进行建模呢?

python对Excel表格的处理

首先我们看一个最简单的情况,我们先不考虑性能的问题,那么我们可以使用xlrd这个工具来在python中打开和加载一个Excel表格:

# table.pydef read_table_by_xlrd():import xlrdworkbook = xlrd.open_workbook(r‘data.xls‘)sheet_name = workbook.sheet_names()print (‘All sheets in the file data.xls are: {}‘.format(sheet_name))sheet = workbook.sheet_by_index(0)print (‘The cell value of row index 0 and col index 1 is: {}‘.format(sheet.cell_value(0, 1)))print (‘The elements of row index 0 are: {}‘.format(sheet.row_values(0)))print (‘The length of col index 1 are: {}‘.format(len(sheet.col_values(1))))if __name__ == ‘__main__‘:read_table_by_xlrd()

上述代码的输出如下:

[dechin@dechin-manjaro gold]$ python3 table.py All sheets in the file data.xls are: [‘Sheet1‘, ‘Sheet2‘, ‘Sheet3‘]The cell value of row index 0 and col index 1 is: 开The elements of row index 0 are: [‘时间‘, ‘开‘, ‘高‘, ‘低‘, ‘收‘, ‘量‘, ‘额‘]The length of col index 1 are: 3923

我们这里成功地将一个xls格式的表格加载到了python的内存中,我们可以对这些数据进行分析。如果需要对这些数据修改,可以使用openpyxl这个仓库,但是这里我们不做过多的赘述。

在python中还有另外一个非常常用且非常强大的库可以用来处理表格数据,那就是pandas,这里我们利用ipython这个工具简单展示一下使用pandas处理表格数据的方法:

[dechin@dechin-manjaro gold]$ ipythonPython 3.8.5 (default, Sep4 2020, 07:30:14) Type ‘copyright‘, ‘credits‘ or ‘license‘ for more informationIPython 7.19.0 -- An enhanced Interactive Python. Type ‘?‘ for help.In [1]: import pandas as pdIn [2]: !ls -l总用量 368-rw-r--r-- 1 dechin dechin 3727363月 27 21:31 data.xls-rw-r--r-- 1 dechin dechin5633月 27 21:42 table.pyIn [3]: data = pd.read_excel(‘data.xls‘, ‘Sheet1‘) # 读取excel格式的文件In [4]: data.to_csv(‘data.csv‘, encoding=‘utf-8‘) # 转成csv格式的文件In [7]: !ls -l总用量 588-rw-r--r-- 1 dechin dechin 2218723月 27 21:52 data.csv-rw-r--r-- 1 dechin dechin 3727363月 27 21:31 data.xls-rw-r--r-- 1 dechin dechin5633月 27 21:42 table.pyIn [8]: !head -n 10 data.csv # 读取csv文件的头10行,时间,开,高,低,收,量,额0,2002-10-30,83.98,92.38,82.0,83.52,352,293733701,2002-10-31,83.9,83.92,83.9,83.91,66,55374802,2002-11-01,84.5,84.65,84.0,84.51,77,65025103,2002-11-04,84.9,85.06,84.9,84.99,95,80763304,2002-11-05,85.1,85.2,85.1,85.13,61,51936505,2002-11-06,84.9,84.9,84.9,84.9,1,849006,2002-11-07,85.0,85.15,85.0,85.14,26,22123107,2002-11-08,85.25,85.28,85.1,85.16,35,29817808,2002-11-11,85.18,85.19,85.18,85.19,65,5537050

在ipython中我们不仅可以执行python指令,还可以在前面加一个!就能够执行一些系统命令,非常的方便。csv格式的文件,其实就是用逗号跟换行符来替代常用的\t字符串进行数据的分隔。

但是,不论是使用xlrd还是pandas,我们都会面临一个同样的问题:需要把所有的数据加载到内存中进行处理。我们一般的个人电脑只有8GB-16GB的内存,就算是比较大的64GB的内存,我们也只能够在内存中对64GB以下内存大小的文件进行处理,这对于大数据场景来说远远不够。所以,下一章节中介绍的vaex就是一个很好的解决方案。另外,关于Linux下查看本地内存以及使用情况的方法如下:

[dechin@dechin-manjaro gold]$ vmstatprocs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- rb 交换 空闲 缓冲 缓存sisobiboincs us sy id wa st 000 35812168 328340 290487200202736236584 8800[dechin@dechin-manjaro gold]$ vmstat 2 3procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- rb 交换 空闲 缓冲 缓存sisobiboincs us sy id wa st 100 35810916 328356 290584400202736236584 8800 000 35811916 328364 290495200 0 661368811 9900 000 35812168 328364 290485600 0 067264201 9900

我们可以看到空闲内存大约有36GB的内存,这里我们本机一共有40GB的内存,算是比较大的了。

vaex的安装与使用

vaex提供了一种内存映射的数据处理方案,我们不需要将整个的数据文件加载到内存中进行处理,我们可以直接对硬盘存储进行操作。换句话说,我们所能够处理的文件大小不再受到内存大小的限制,只要在磁盘存储空间允许的范围内,我们都可以对这么大小的文件进行处理。一般现在个人PC的磁盘最小也有128GB,远远大于内存可以承受的范围。当然,由于分区的不同,不一定能够保障所有的内存资源都能够被使用到,这里附上查看当前目录分区的可用磁盘空间大小查询的方法:

[dechin@dechin-manjaro gold]$ df -hl .文件系统容量已用可用 已用% 挂载点/dev/nvme0n1p9144G57G80G42% /

这里可以看到我们还有80GB的可用磁盘空间,也就是说,如果我们在当前目录放一个80GB大小的表格文件,那么用pandas和xlrd都是没办法处理的,因为这已经远远超出了内存可支持的空间。但是用vaex,我们依然可以对这个文件进行处理。

在vaex的官方文档链接中也介绍有vaex的原理和优势:

vaex的安装

与大多数的python第三方包类似的,我们可以使用pip来进行下载和管理。当然由于下载的文件会比较多,中间的过程也会较为缓慢,我们只需安静等待即可:

[dechin@dechin-manjaro gold]$ python3 -m pip install vaexCollecting vaexDownloading vaex-4.1.0-py3-none-any.whl (4.5 kB)Collecting vaex-ml=0.11.0Downloading vaex_ml-0.11.1-py3-none-any.whl (95 kB) |████████████████████████████████| 95 kB 81 kB/s Collecting vaex-core=4.1.0Downloading vaex_core-4.1.0-cp38-cp38-manylinux2010_x86_64.whl (2.5 MB) |████████████████████████████████| 2.5 MB 61 kB/s Downloading ipywidgets-7.6.3-py2.py3-none-any.whl (121 kB) |████████████████████████████████| 121 kB 175 kB/s Requirement already satisfied: ipykernel>=4.7 in /home/dechin/anaconda3/lib/python3.8/site-packages (from ipympl->vaex-jupyter=0.6.0->vaex) (5.3.4)Collecting branca=0.3.1Downloading branca-0.4.2-py3-none-any.whl (24 kB)Collecting shapelyDownloading Shapely-1.7.1-cp38-cp38-manylinux1_x86_64.whl (1.0 MB) |████████████████████████████████| 1.0 MB 98 kB/s Collecting traittypes=0.2.1Downloading traittypes-0.2.1-py2.py3-none-any.whl (8.6 kB)Collecting ipyvue=1.5Downloading ipyvue-1.5.0-py2.py3-none-any.whl (2.7 MB) |████████████████████████████████| 2.7 MB 80 kB/s Collecting ipywebrtcDownloading ipywebrtc-0.5.0-py2.py3-none-any.whl (1.1 MB) |████████████████████████████████| 1.1 MB 99 kB/s Collecting pythreejs>=1.0.0Downloading pythreejs-2.3.0-py2.py3-none-any.whl (3.4 MB) |████████████████████████████████| 3.4 MB 30 kB/s Requirement already satisfied: widgetsnbextension~=3.5.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from ipywidgets>=7.6.0->ipympl->vaex-jupyter=0.6.0->vaex) (3.5.1)Requirement already satisfied: nbformat>=4.2.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from ipywidgets>=7.6.0->ipympl->vaex-jupyter=0.6.0->vaex) (5.0.8)Requirement already satisfied: ipython>=4.0.0; python_version >= "3.3" in /home/dechin/anaconda3/lib/python3.8/site-packages (from ipywidgets>=7.6.0->ipympl->vaex-jupyter=0.6.0->vaex) (7.19.0)Collecting jupyterlab-widgets>=1.0.0; python_version >= "3.6"Downloading jupyterlab_widgets-1.0.0-py3-none-any.whl (243 kB) |████████████████████████████████| 243 kB 115 kB/s Created wheel for aplus: filename=aplus-0.11.0-py3-none-any.whl size=4412 sha256=9762d51c5ece813b0c5a27ff6ebc1a86e709d55edb7003dcc11272c954dd39c7Stored in directory: /home/dechin/.cache/pip/wheels/de/93/23/3db69e1003030a764c9827dc02137119ec5e6e439afd64eebbSuccessfully built frozendict aplusInstalling collected packages: pyarrow, tabulate, frozendict, aplus, python-utils, progressbar2, vaex-core, vaex-ml, vaex-viz, vaex-astro, vaex-hdf5, cachetools, vaex-server, xarray, jupyterlab-widgets, ipywidgets, ipympl, branca, shapely, traittypes, ipyleaflet, ipyvue, ipyvuetify, ipywebrtc, ipydatawidgets, pythreejs, ipyvolume, bqplot, vaex-jupyter, vaexAttempting uninstall: ipywidgetsFound existing installation: ipywidgets 7.5.1Uninstalling ipywidgets-7.5.1:Successfully uninstalled ipywidgets-7.5.1Successfully installed aplus-0.11.0 bqplot-0.12.23 branca-0.4.2 cachetools-4.2.1 frozendict-1.2 ipydatawidgets-4.2.0 ipyleaflet-0.13.6 ipympl-0.7.0 ipyvolume-0.5.2 ipyvue-1.5.0 ipyvuetify-1.6.2 ipywebrtc-0.5.0 ipywidgets-7.6.3 jupyterlab-widgets-1.0.0 progressbar2-3.53.1 pyarrow-3.0.0 python-utils-2.5.6 pythreejs-2.3.0 shapely-1.7.1 tabulate-0.8.9 traittypes-0.2.1 vaex-4.1.0 vaex-astro-0.8.0 vaex-core-4.1.0 vaex-hdf5-0.7.0 vaex-jupyter-0.6.0 vaex-ml-0.11.1 vaex-server-0.4.0 vaex-viz-0.5.0 xarray-0.17.0

在出现Successfully installed的字样之后,就代表我们已经安装成功,可以开始使用了。

性能对比

由于使用其他的工具我们也可以正常的打开和读取表格文件,为了体现出使用vaex的优势,这里我们直接用ipython来对比一下两者的打开时间:

[dechin@dechin-manjaro gold]$ ipythonPython 3.8.5 (default, Sep4 2020, 07:30:14) Type ‘copyright‘, ‘credits‘ or ‘license‘ for more informationIPython 7.19.0 -- An enhanced Interactive Python. Type ‘?‘ for help.In [1]: import vaexIn [2]: import xlrdIn [3]: %timeit xlrd.open_workbook(r‘data.xls‘)46.4 ms 76.2 µs per loop (mean std. dev. of 7 runs, 10 loops each)In [4]: %timeit vaex.open(‘data.csv‘)4.95 ms 48.5 µs per loop (mean std. dev. of 7 runs, 100 loops each)In [7]: %timeit vaex.open(‘data.hdf5‘)1.34 ms 1.84 µs per loop (mean std. dev. of 7 runs, 1000 loops each)

我们从结果中发现,打开同样的一份文件,使用xlrd需要将近50ms的时间,而vaex最低只需要1ms的时间,如此巨大的性能优势使得我们不得不对vaex给予更多的关注。关于跟其他库的对比,在这个链接中已经有人做过了,即使是对比pandas,vaex在读取速度上也有1000多倍的加速,而计算速度的加速效果在数倍,总体来说表现非常的优秀。

数据格式转换

在上一章节的测试中,我们用到了1个没有提到过的文件:data.hdf5,这个文件其实是从data.csv转换而来的。这一章节我们主要就介绍如何将数据格式进行转换,以适配vaex可以打开和识别的格式。第一个方案是使用pandas将csv格式的文件直接转换为hdf5格式,操作类似于在python对表格数据处理的章节中将xls格式的文件转换成csv格式:

[dechin@dechin-manjaro gold]$ ipythonPython 3.8.5 (default, Sep4 2020, 07:30:14) Type ‘copyright‘, ‘credits‘ or ‘license‘ for more informationIPython 7.19.0 -- An enhanced Interactive Python. Type ‘?‘ for help.In [1]: import pandas as pdIn [4]: data = pd.read_csv(‘data.csv‘)In [10]: data.to_hdf(‘data.hdf5‘,‘data‘,mode=‘w‘,format=‘table‘)In [11]: !ls -l总用量 932-rw-r--r-- 1 dechin dechin 2218723月 27 21:52 data.csv-rw-r--r-- 1 dechin dechin 3485243月 27 22:17 data.hdf5-rw-r--r-- 1 dechin dechin 3727363月 27 21:31 data.xls-rw-r--r-- 1 dechin dechin5633月 27 21:42 table.py

操作完成之后在当前目录下生成了一个hdf5文件。但是这种操作方式有个弊端,就是生成的hdf5文件跟vaex不是直接适配的关系,如果直接用df = vaex.open(‘data.hdf5‘)的方法进行读取的话,输出内容如下所示:

In [3]: dfOut[3]: #table0‘(0, [83.98, 92.38, 82., 83.52], [0,...1‘(1, [83.9 , 83.92, 83.9 , 83.91], [1,...2‘(2, [84.5 , 84.65, 84., 84.51], [2,...3‘(3, [84.9 , 85.06, 84.9 , 84.99], [3,...4‘(4, [85.1 , 85.2 , 85.1 , 85.13], [4,.........3,917‘(3917, [274.65, 275.35, 274.6 , 274.61], [ ...3,918‘(3918, [274.4, 275.2, 274.1, 275. ], [391...3,919‘(3919, [275., 275.01, 274., 274.19], [ ...3,920‘(3920, [275.2, 275.2, 272.6, 272.9], [392...3,921‘(3921, [272.96, 273.73, 272.5 , 272.93], [ ...

在这个数据中,丢失了最关键的索引信息,虽然数据都被正确地保留了下来,但是在读取上有非常大的不便。因此我们更加推荐第二种数据转换的方法,直接用vaex进行数据格式的转换:

[dechin@dechin-manjaro gold]$ ipythonPython 3.8.5 (default, Sep4 2020, 07:30:14) Type ‘copyright‘, ‘credits‘ or ‘license‘ for more informationIPython 7.19.0 -- An enhanced Interactive Python. Type ‘?‘ for help.In [1]: import vaexIn [2]: df = vaex.from_csv(‘data.csv‘)In [3]: df.export_hdf5(‘vaex_data.hdf5‘)In [4]: !ls -l总用量 1220-rw-r--r-- 1 dechin dechin 2218563月 27 22:34 data.csv-rw-r--r-- 1 dechin dechin 3484363月 27 22:34 data.hdf5-rw-r--r-- 1 dechin dechin 3727363月 27 21:31 data.xls-rw-r--r-- 1 dechin dechin5633月 27 21:42 table.py-rw-r--r-- 1 dechin dechin 2935123月 27 22:52 vaex_data.hdf5

执行完毕后在当前目录下生成了一个vaex_data.hdf5文件,让我们再试试读取这个新的hdf5文件:

[dechin@dechin-manjaro gold]$ ipythonPython 3.8.5 (default, Sep4 2020, 07:30:14) Type ‘copyright‘, ‘credits‘ or ‘license‘ for more informationIPython 7.19.0 -- An enhanced Interactive Python. Type ‘?‘ for help.In [1]: import vaexIn [2]: df = vaex.open(‘vaex_data.hdf5‘)In [3]: dfOut[3]: #i t shlena00 ‘2002-10-30‘83.9892.3882.083.523522937337011 ‘2002-10-31‘83.983.9283.983.9166 553748022 ‘2002-11-01‘84.584.6584.084.5177 650251033 ‘2002-11-04‘84.985.0684.984.9995 807633044 ‘2002-11-05‘85.185.285.185.1361 5193650............ ... ...... ......3,9173917‘2018-11-23‘274.65275.35274.6274.611347837085806083,9183918‘2018-11-26‘274.4275.2274.1275.01373837737635843,9193919‘2018-11-27‘275.0275.01274.0274.191398438368455683,9203920‘2018-11-28‘275.2275.2272.6272.91559242581306883,9213921‘2018-11-28‘272.96273.73272.5272.93592161576336In [4]: df.sOut[4]: Expression = sLength: 3,922 dtype: float64 (column)-------------------------------------083.98183.9284.5384.9485.1... 3917274.653918274.43919 2753920275.23921272.96In [11]: df.plot(df.i, df.s, show=True) # 作图/home/dechin/anaconda3/lib/python3.8/site-packages/vaex/viz/mpl.py:311: UserWarning: `plot` is deprecated and it will be removed in version 5.x. Please `df.viz.heatmap` instead.warnings.warn(‘`plot` is deprecated and it will be removed in version 5.x. Please `df.viz.heatmap` instead.‘)

这里我们也需要提一下,在新的hdf5文件中,索引从高、低等中文变成了h、l等英文,这是为了方便数据的操作,我们在csv文件中将索引手动的修改成了英文,再转换成hdf5的格式。最后我们使用vaex自带的画图功能,绘制了这十几年期间黄金的价格变动:

由于vaex自带的绘图方法比较少,总结如下:

最常用的还是热度图,因此这里绘制出来的黄金价格图的效果也是热度图的效果,但是基本上功能是比较完备的,而且性能异常的强大。

总结概要

在这篇文章中我们介绍了三种不同的python库对表格数据进行处理,分别是xlrd、pandas和vaex,其中特别着重的强调了一下vaex的优越性能以及在大数据中的应用价值。配合一些简单的示例,我们可以初步地了解到这些库各自的特点,在实际场景中可以斟酌使用。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/vaex.html作者ID:DechinPhy更多原著文章请参考:https://www.cnblogs.com/dechinphy/

参考链接https://zhuanlan.zhihu.com/p/240797772
•••展开全文
相关文章