数据分析
文章平均质量分 57
S_o_l_o_n
logic
展开
-
高效数据存储格式Parquet
Parquet还使用了字典编码,以及RLE编码(Run Length Encoding),将数据值映射成数字,然后保存一个字典映射,同时记录某个值连续重复的次数,这样不用反复的保存一些占用空间较大的数据,特别是对于字符类型的数据,这种方式尤其对于重复值较多的chunk,非常高效,实际上我们的表格数据经常某些列具有较多的重复数据。因此,Parquet的这些编码方式,可以高效的节省空间,减少实际数据的IO,但是需要更多的metadata的解析,将IO密集部分变成了CPU密集的工作,CPU当然快多了。原创 2022-10-09 23:37:39 · 3289 阅读 · 0 评论 -
pandas一维数据分组之cut和qcut
对于一个一维的数值型数据,我们有时候想对其根据数值区间或者根据分位数进行分组,然后再做后续的分析,本文介绍pandas里的cut和qcut函数,实现这种快速分组操作。cutcut函数,将一维序列中的数值打上区间标签,参数签名如下:pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False,duplicates='raise')其中x...原创 2021-12-15 17:48:26 · 2722 阅读 · 0 评论 -
pandas pivot_table之数值精度丢失陷阱
pandas的pivot_table函数可以指定行列值重新制表,并且对于同一行列索引下的多个值会进行聚合运算,默认是均值运算,因此,这里如果我们默认其aggfunc的均值运算,那么会存在将其他数值类型转为浮点值的行为,如果原本是数值较大的整型,超出了64位浮点数能精确表示的最大范围的话,这里就会存在精度丢失现象。 尽管我们可以让aggfunc=lambda x:x,即不对value做任何操作,这样不会存在均值计算,但是实际上还会存在精度丢失的情况。看如下是pivot_tab...原创 2021-11-07 16:56:21 · 1011 阅读 · 0 评论 -
使用plotly画交互图入门
目录plotly简介plotly的安装作图图片保存plotly简介 plotly是一个python的第三方库,其可以制作精美的动态交互图,并且和pandasDataFrame数据结构兼容较好。如今plotly还集成了plotly_express,plotly_express最初是基于plotly的一个库,其提供一些更加高级简单的作图接口,使得用plotly作图更加简单便捷,如今plotly已经将plotly_express集成在了一起,因此不需要额外安装plotly...原创 2021-11-01 21:49:31 · 1519 阅读 · 0 评论 -
python 性能提升之使用deque代替list
使用list的好处是,对于固定长度的情形,list各种操作都是被极致优化的,比如当我们想要直接通过下标获取元素时,其复杂度为O(1),是高效的获取方式。但是,当我们需要频繁对list进行一些pop(0)或者insert之类的会同时改变list的长度和元素索引的操作时,会导致list在内存中复制,即空间复杂度为O(n)的操作;此外,如果频繁的append,且会造成list对象的元素数量较大的变化,同样也会进行复制。此时,我们可以使用python标准库collections中deque数据结构,这...原创 2021-05-11 20:17:30 · 1025 阅读 · 0 评论 -
python中时间戳(epoch)和日期的相互转换
1 epoch时间转日期使用标准库datetime,具体来说,使用datetime.datetime.fromtimestamp(timestamp,tz=None)方法。其中timestamp为浮点数,表示epoch秒数,tz表示时区,默认为None,表示原创 2020-12-01 22:38:49 · 4858 阅读 · 1 评论 -
整数转浮点数精度溢出的原因和处理方式
对于64位浮点数来说,其尾数有53位(包含首位的隐藏位),当一个整数转为浮点数时,只有当该整数的二进制位数不超过53位时,64位浮点数才可以精确的表示该整数,不然会造成精度丢失。试想一下,当一个十进制整数的二进制有54位,那么最后一位无法准确储存,64位浮点数就会造成精度的丢失,自然地,当位数超过53位后,64位浮点数的可表示整数并不是连续的。 在笔者的这篇文章《浮点数的各种最值推算以及对python sys.float_info的解释》中,讲过浮点数能在该范围内精确表示的最大...原创 2020-06-01 23:25:38 · 3965 阅读 · 0 评论 -
pandas DataFrame的apply函数result_type参数说明
DataFrame的apply函数是对指定的轴进行循环处理,并返回处理的结果。这里有一个问题在于,如果对于每一次运算,返回的结果只有一个元素,那么最终得到的结果是一个Series;但是如果每次处理返回的不是一个元素,而是由单个或者多个元素组成的可迭代对象,比如列表,那么最终得到的是Series还是DataFrame呢?对此,可以使用apply函数的result_type参数来指定。 result_type参数可以取'reduce','expand','broadcast'以及N...原创 2020-06-01 15:48:05 · 8090 阅读 · 0 评论 -
理解浮点数的二进制表示
目录二进制的科学计数法浮点数的二进制表示符号位、尾数和指数(以64位浮点数为例)0、规约数和非规约数无穷大和空值NaN二进制的科学计数法 浮点数在电脑中用二进制储存,约定以二进制的科学计数法来进行表示一个浮点数,类比十进制的科学计数法,很容易知道,二进制的科学计数法的首位数字一定为1,然后通过乘以相应的底数为2的指数来得到二进制数,如下所示。 下面等号左边是原二进制数,右边就是其二进制的科学计数表示。和十进制一样,二进制的科学计数表示之后,也...原创 2020-05-30 23:14:14 · 6445 阅读 · 0 评论 -
浮点数的各种最值推算以及对python sys.float_info的解释
目录最大和最小的正规约数取值最小和最大的正非规约数取值浮点数能在该范围内精确表示的最大十进制整数大于1的最小规约数和1之间的距离epsilon对python sys.float_info的解释 本文将以64位浮点数为例,对64位浮点数的取值范围进行推算,并通过python的sys.float_info的信息,对其逐一解释,以对浮点数有一个更好的理解。本文需要笔者的这篇文章作为预备知识。最大和最小的正规约数取值 对于64位整数来说,由于规约数的移码后的指...原创 2020-05-31 23:38:27 · 5723 阅读 · 1 评论 -
使用python获取某个月的天数和日期
可以使用python的标准库calendar,如下代码所示。import calendarres = calendar.monthrange(2020,5)print(res)[out]:(4,31) #该元组中,第一个元素表示5月份第一天是周五(0表示周一,6表示周日),第二个元素表示天数 此外还可以直接获取一个月的所有具体日期的迭代器,返回datetime.date。如下所示。下面两个例子中,分别使用了calendar.Calendar().itermon...原创 2020-05-30 10:53:53 · 7277 阅读 · 0 评论 -
pandas DataFrame控制台打印输出设置浮点数小数位数
DataFrame的输出格式很多都可以通过pd.options的属性实现设置,具体可以看官方文档。本文说明如何设置在打印输出DataFRame时设置浮点数的输出格式,这里以保留几位小数为例,可以通过pd.options.display.float_format设置,将其设置为一个可以调用的以单个元素为参数的函数即可,如下所示。要注意的是,这个属性是针对浮点数的,因此对于整数int其并不起作用,可以对比下面例子中设置后的df和df1的输出结果。import pandas as pddf ...原创 2020-05-29 09:19:54 · 9209 阅读 · 1 评论 -
python数据分析性能提升之谨慎使用Decimal类型
在用python处理数据时,尤其是金融数据,由于浮点数的不精确性(具体原因看这里),有时候为了追求精确性,我们会选择decimal标准库的Decimal数据类型来表示数值。但是要注意的是,Decimal数据类型相比于float类型,在各种计算中,会额外的消耗较多时间,特别是在处理大量的数据时,Decimal带来的性能下降是相当大的,甚至会把程序的运行时间提升一个量级。所以,在处理大量...原创 2020-04-13 16:45:58 · 1460 阅读 · 0 评论 -
pandas分组聚合运算groupby之agg,apply,transform
目录一、agg和transform二、agg和apply三、其他注意点 groupby函数是pandas中用以分组的函数,可以通过指定列来进行分组,并返回一个GroupBy对象。对于GroupBy对象的聚合运算,其有经过优化的较为常用的sum,mean等函数,但是如果我们需要用自定义的函数进行聚合运算,那么就需要通过agg,apply,transform来...原创 2019-12-17 01:22:18 · 2729 阅读 · 0 评论 -
python编程之logging模块的使用
编程中,很多时候我们需要保存一个程序的中间输出,要了解一个程序的运行情况,记录程序运行中在一些关键节点处的信息,以便我们后续进行分析和问题的排查。对于简单的应用和相对不那么复杂的程序,我们当然可以通过最常用的print来实现这些需求,无论是输出到控制台还是重定向到磁盘文件。但是一旦程序的功能性和复杂性提升了,我们一直使用print会显得杂乱,而且print的意义有时候也不明显,pri...原创 2019-11-19 16:34:22 · 247 阅读 · 0 评论 -
利用pandas的isin函数提取两个结构化数据文件的异同
在进行数据分析时,有时候我们需要对比两份数据是否一致,如果不一致,提取不一致的数据记录;对于结构化的数据来说,我们可以利用pandas的DataFrame数据结构来实现这一点。 我们先将结构化数据文件读入成DataFrame,然后再利用DataFrame的isin函数来实现。这里对于isin函数要注意的有以下几点:1、isin(values)函数中,如果value...原创 2019-11-18 13:37:56 · 689 阅读 · 4 评论 -
numpy数据类型转换Memory Error解决办法之给元素构建数字映射
当我们用numpy处理数据时,由于numpy的内存管理机制,其要求所有的元素的内存size一致,这样很多时候就会存在一个问题:一旦数据中出现了一个占据字节数很大的元素,那么所有的元素都会同样的占据该内存大小,尽管其他的元素并不需要这么大的内存就可以储存;这个问题就容易造成内存的消耗过大,内存浪费,如果机器内存本身不大,数据量又很大,那么就会导致memory error。 ...原创 2019-11-15 16:34:48 · 512 阅读 · 0 评论 -
numpy:性能提升之利用numpy的apply_along_axis函数替代pandas的apply函数
pandas的DataFrame的apply函数可以实现对指定的轴进行遍历操作,这是个很方便也很常用的函数,但是问题在于,当我们的数据量较大,比如有50万行,这时要对50万行进行逐行遍历的话,如果对每行的操作用到了Series索引,那么这将是一个非常耗时的过程,因为对于pandas来说,索引操作是低效的,这种低效再经过50万行放大,那么性能就会显得很差。对此,我们可以通过numpy的...原创 2019-11-15 15:50:28 · 10140 阅读 · 1 评论 -
numpy数据类型说明以及自动转换陷阱
numpy的dtype是一个很重要的概念,因为numpy为了性能,优化了内存管理,ndarray的值在内存中几乎是连续的,同时其每个元素的内存大小也被设计成是一样的,因此,当生成ndarray时,每个元素的数据类型都会被转为相同的类型,这时如果原生的数据类型是不一样的,那么就涉及到一个数据类型转换的问题,即data type casting。 明白numpy中的数据类...原创 2019-11-15 10:43:02 · 1721 阅读 · 0 评论 -
numpy:利用np.frompyfunc函数实现元素级操作,类似pandas的applymap函数功能
在pandas里,对于DataFrame,可以利用applymap(func)函数实现对DataFrame中每个元素进行函数func操作,而且相比于for loop,其性能会有较大的提升。而对于numpy中的ndarrray,没有类似名称的函数实现相同功能,但是有一个numpy.frompyfunc函数,其可以对一个python函数进行封装,返回一个封装后的函数,然后可以利用返回的封...原创 2019-11-13 21:34:42 · 4820 阅读 · 0 评论 -
pandas性能百倍提升之用字典索引或ndarray替换DataFrame索引以及内存占用分析
在利用pandas进行数据分析时,DataFrame是其基本的数据结构,当数据量较小时还好,一旦数据量较大,比如几十万上百万时,这时DataFrame就会变得笨重,笨重主要体现在对其索引的操作上,而对DataFrame的索引操作又是基本的操作,所以这时,在性能上就会有很大的损失;对pandas的使用可以让我们可以直观简单的进行数据分析,但是往往会在性能上有较大的损失。当然,对于性能的...原创 2019-11-05 19:00:07 · 5159 阅读 · 0 评论 -
pandas性能提升之避免对小数据量使用pandas内置函数
pandas本身就是面向数据分析的,而且是面向大数据分析的,所以其内置函数本身在设计上相比于一些python原生的操作就会繁杂一些,这也是为了功能性的考虑。所以,这就导致了其内置函数就像高速火车,而python的原生操作就像超跑,超跑在速度上是具有优势的,但是在功能性上是比不上高速火车的。所以,理论上,如果可以用python的原生操作实现,那么总是可以更快的,毕竟内置函数很多也是用原...原创 2019-11-05 14:34:20 · 575 阅读 · 0 评论 -
pandas之apply和for loop之间的比较和权衡
首先,文章开头就需要强调的是:对于大的数据量,能不用loop就尽量不用loop,无论是for loop还是apply,尽量用内置函数实现。 在pandas里,我们经常听到一句话就是尽量减少for loop的时候,尽量用apply去替代,但是这句话是有语境的,并不一定的正确的,实际上,在pandas里,对于for loop和apply之间的使用,是一个需要权衡的东西,并...原创 2019-11-05 11:29:23 · 2174 阅读 · 0 评论 -
pandas给DataFrame新增列并赋值
给DataFrame新增列的话,除了join,merge,concat这些函数之外,还可以通过简单的df['new_column']=values的形式对其新增列,但是在使用这种方式新增列时,需要注意索引问题以及新增多列时该如何操作。一、索引问题 这个问题只有在等号右边的对象是Series或者DataFrame时需要注意,因为这时等号右边的对象是有索引的,这样赋值...原创 2019-10-31 13:14:14 · 49646 阅读 · 0 评论 -
Python: 多线程还是多进程?
并发编程一般来说,主要有两个目的:程序对并发效果的需求和提高程序运行效率。本文所讲的内容是针对提高程序运行效率这个话题的,因此对于多线程还是多进程的选择,后面将围绕如何提高程序运行效率展开。目录一、任务的执行时间拆分二、线程、进程和CPU调度三、全局解释器锁(GIL)四、python线程和进程的区别五、python中选择多线程和多进程的判断方法一、任务的执...原创 2019-10-16 17:46:42 · 1787 阅读 · 0 评论 -
pandas中读取、写入csv文件和excel文件的若干问题
1、当读取一个文件出现UnicodeError时,可能是因为此文件的编码方式不是utf-8,因为python3默认的编码方式的utf-8,所以如果编码冲突就会出现这样的错误。解决办法是更改文件的编码方式,这个可以打开文件,然后选择‘另存为’——工具——web选项——编码方式,点击更改为utf-8即可;2、对于0开始的数字串写入和读取的问题写入:对于这种类型的数字,要注意先转为字符串格式...原创 2018-10-02 22:16:57 · 2562 阅读 · 0 评论 -
如何直观理解梯度下降算法
要理解梯度下降算法,首先得理解梯度,而为了更好的理解梯度,首先需要理解方向导数。所以,我们先从一个多元可微函数的方向导数开始进入。 在讲方向导数之前,我们先思考一个问题:在三维空间里面想象一个立方体,如下图,现在底面ABCD上任意取一点E,坐标为(a,b),则点E到斜平面AB''D''的竖直距离d是多少呢? 如果a,b都大于0,则实际上d=a+b。...原创 2019-07-20 12:43:29 · 467 阅读 · 0 评论 -
python网络爬虫之利用selenium解决Ajax逆向解析URL困难问题
现在很多的大型网站都利用率异步加载技术以减少服务器的压力,当我们想爬取利用异步加载的网站数据时,一般无法直接通过显式的url来获取网页源码,对此一般的方法是通过逆向分析来寻找隐藏的url,然后通过这个隐藏的url来获取网页源码。但是问题在于,这个过程需要自己去寻找url的规律,寻找并尝试出有效的隐藏的url,这个过程并不一定有效,因为尽管找到了隐藏的url,但是其不一定具有明显的规律...原创 2019-07-17 14:53:56 · 649 阅读 · 0 评论 -
Python统计建模分析工具包statsmodels的使用简介
在Python中,statsmodels是统计建模分析的核心工具包,其包括了几乎所有常见的各种回归模型、非参数模型和估计、时间序列分析和建模以及空间面板模型等,其功能是很强大的,使用也相当便捷,当然前提是知道怎么去使用。最实用最有效的方式自然是自己去看官方的文档,学习里面的例子,学会如何去使用,但是对于刚开始的学习者来说,这种大的文档难免显得有点庞杂,因此本文旨在从大的方向上去介绍一...原创 2019-02-24 13:14:14 · 12172 阅读 · 1 评论 -
一文搞清字符编码,彻底解决python2.x字符编码问题
广义上,编码指的是把一个对象对应到另外一个对象,其实际上就是一个映射,不同的编码方案就是不同的映射规则。自然地,映射的两个集合元素也可以是任何对象,即我们可以对任何事物任何对象进行编码。编码的意义往往是在于让信息更加方便的储存、传递和交流,或者对信息进行加密。前者诸如我们汉字到拼音,这实际上也是一种编码,只是这种编码在识别上并不是一种好的编码方式,因为要严格识别和区分每个编码后的对象...原创 2019-06-07 20:18:05 · 1219 阅读 · 0 评论 -
pandas输出csv文件用Excel打开中文乱码问题
pandas的to_csv方法默认输出编码方式为uft8,但是是无BOM格式的,但是对于excel软件,其对于utf8编码方式,只支持有BOM格式的,因此直接输出csv文件使用无BOM格式的utf8编码格式的,这时用excel软件打开后会出现中文乱码问题。当然这时excel软件本身不支持无BOM的utf8编码,如果用文本编辑器或者notepad++等支持无BOM的utf8编码方式的编...原创 2019-05-31 22:22:04 · 5578 阅读 · 1 评论 -
利用正则表达式模块re对字符串进行过滤和处理
python标准库中的re模块是正则表达式模块,本文主要讲几个最常用的方法以帮助日常最常碰到的关于字符串的过滤和处理。一、对于字符串开头匹配有时我们需要选取以特定特征开头的字符串,特别是在I/O时,我们常需要对一些非结构化的字符串进行逐行过滤,选取符合开头要求的行,这时可以利用re.match(rexp,string),其中rexp表示正则表达式的匹配模式,string表示被...原创 2019-05-28 22:27:21 · 1868 阅读 · 0 评论 -
python四舍五入运算产生误差的原因以及实现精确四舍五入的方法
由于python中,数字都是用二进制方式储存的,所以当我们直接输入一个十进制的浮点数,比如3.675,其并无法精确的用二进制表示或储存,只能以一定精度进行近似表示。这时,如果我们需要对其做一些运算,比如四舍五入,由于实际操作的对象是二进制浮点数,而二进制浮点数常常又无法精确的表示十进制浮点数,这时就会存在误差。看如下例子。 可以看到,当我们直接用round函数对3...原创 2019-05-27 22:04:03 · 3250 阅读 · 0 评论 -
将DataFrame的多列设为多层次索引
对于一个DataFrame,df,有时候我们需要把df的两个或多列设为这个df的层次索引,但是同时又希望保留这两列,这时要避免直接用df.index=df[['a','b']]这样的方式,因为这样赋值之后,df的index并不是一个层次索引,而是以列'a','b'组成的元组构成的单层次索引。要实现这样的多层次索引,有以下几种方式:1、df.set_index(['a','b'],...原创 2019-05-27 21:30:19 · 8527 阅读 · 0 评论 -
在DataFrame中新建列赋值后全部为NaN的问题释疑
在pandas中,有时候我们对一个df以如下方式新创建一个列,然后用一个Series赋值给新建的列,但是发现得到的新列的值全部为NaN,这是什么原因呢?df['newColumn']=df_other['otherColumn'] 注意以上赋值方式中,等号右边为一个Series,这时就需要考虑这个Series的index和df的index是否一致,如果不一致,那...原创 2019-05-20 22:00:41 · 16886 阅读 · 6 评论 -
pandas性能提升之避免直接对大DataFrame多次索引和访问
DataFrame是一个比较重量级的数据结构,当我们对一个比较大的DataFrame进行多次重复性访问时,效率是很低的。比如,如果我们需要对一个DataFrame逐行进行一个相对复杂一点的操作,尽管可以使用相对高效的apply进行逐行遍历,但是如果我们对每行的操作需要同时用到其他行时,如果是直接对DataFrame进行操作,这时就避免不了对DataFrame进行索引操作,而实际上对D...原创 2019-08-05 11:07:17 · 663 阅读 · 0 评论 -
pandas性能提升之利用chunksize参数对大数据分块处理
DataFrame是一个重量级的数据结构,当一个dataframe比较大,占据较大内存的时候,同时又需要对这个dataframe做较复杂或者复杂度非O(1)的操作时,会由于内存占用过大而导致处理速度极速下降。 对此,我们的方法是尽量避免直接对过大的dataframe直接操作(当然有时候没有办法,必须对整体的dataframe进行操作,这时就需要从其他方面优化,比如尽量...原创 2019-08-19 20:58:38 · 14528 阅读 · 3 评论 -
高性能Pandas:eval和query
本文转载自michael的自由空间 jianshu.com/p/caaf201fc5a8 正如我们在前面几节中已经看到的,PyData堆栈的强大功能建立在NumPy和Pandas通过直观语法将基本操作使用C实现能力之上:例如NumPy的矢量化/广播操作,Pandas的分组类型操作。尽管这些抽象概念在许多常见的...转载 2019-08-16 10:02:26 · 386 阅读 · 0 评论 -
pandas数据merge陷阱之对NaN值的位置处理
在利用pandas进行数据分析时,merge是很常用的操作,但是这里有一个小陷阱,就是当两个DataFrame进行merge之后,如果左侧的DataFrame出现的空值NaN,那么pandas默认会把其放置在merge后的DataFrame的末尾,这是个需要特别注意的地方。如下图所示。 特别是当我们后续要对空值填充的话,如果是用前向填充或者后向填充等和相对位置有关...原创 2019-10-09 21:44:07 · 7605 阅读 · 0 评论 -
python正则表达式要点概述
正则表达式在文本字符串处理上功能强大,python的re模块是一个标准模块,其实现了正则表达式的所有功能,而且其匹配引擎是用C语言编写的,所以在性能上也是很高的,本文将对python的正则表达式的较为常用的要点进行一些总结。目录一、语法捕获组(...)非捕获组(?:..)反斜杠\对捕获组的引用\number贪心算法和非贪心算法二、matchObject...原创 2019-10-09 21:29:41 · 399 阅读 · 0 评论