返回顶部
首页 > 资讯 > 精选 >pandas的优点有哪些
  • 670
分享到

pandas的优点有哪些

2023-06-15 17:06:08 670人浏览 独家记忆
摘要

本篇内容主要讲解“pandas的优点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“pandas的优点有哪些”吧!下面是一个例子,数据获取方式见文末。>>> im

本篇内容主要讲解“pandas的优点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“pandas的优点有哪些”吧!

下面是一个例子,数据获取方式见文末。

>>> import pandas as pd  # 导入数据集  >>> df = pd.read_csv('demand_profile.csv')  >>> df.head()       date_time  energy_kwh  0  1/1/13 0:00       0.586  1  1/1/13 1:00       0.580  2  1/1/13 2:00       0.572  3  1/1/13 3:00       0.596  4  1/1/13 4:00       0.592

基于上面的数据,我们现在要增加一个新的特征,但这个新的特征是基于一些时间条件生成的,根据时长(小时)而变化,如下:

pandas的优点有哪些

因此,如果你不知道如何提速,那正常第一想法可能就是用apply方法写一个函数,函数里面写好时间条件的逻辑代码。

def apply_tariff(kwh, hour):      """计算每个小时的电费"""          if 0 <= hour < 7:          rate = 12      elif 7 <= hour < 17:          rate = 20      elif 17 <= hour < 24:          rate = 28      else:          raise ValueError(f'Invalid hour: {hour}')      return rate * kwh

然后使用for循环来遍历df,根据apply函数逻辑添加新的特征,如下:

>>> # 不赞同这种操作  >>> @timeit(repeat=3, number=100)  ... def apply_tariff_loop(df): ...     """用for循环计算enery cost,并添加到列表"""  ...     energy_cost_list = []  ...     for i in range(len(df)):  ...         # 获取用电量和时间(小时)  ...         energy_used = df.iloc[i]['energy_kwh']  ...         hour = df.iloc[i]['date_time'].hour  ...         energy_cost = apply_tariff(energy_used, hour)  ...         energy_cost_list.append(energy_cost)  ...     df['cost_cents'] = energy_cost_list  ...   >>> apply_tariff_loop(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_loop` ran in average of 3.152 seconds.

对于那些写pythonic风格的人来说,这个设计看起来很自然。然而,这个循环将会严重影响效率。原因有几个:

首先,它需要初始化一个将记录输出的列表。

其次,它使用不透明对象范围(0,len(df))循环,然后再应用apply_tariff()之后,它必须将结果附加到用于创建新DataFrame列的列表中。另外,还使用df.iloc [i]['date_time']执行所谓的链式索引,这通常会导致意外的结果。

这种方法的最大问题是计算的时间成本。对于8760行数据,此循环花费了3秒钟。

接下来,一起看下优化的提速方案。

pandas的优点有哪些

使用 iterrows循环

第一种可以通过pandas引入iterrows方法让效率更高。这些都是一次产生一行的生成器方法,类似scrapy中使用的yield用法。

.itertuples为每一行产生一个namedtuple,并且行的索引值作为元组的第一个元素。nametuple是Python的collections模块中的一种数据结构,其行为类似于Python元组,但具有可通过属性查找访问的字段。

.iterrows为DataFrame中的每一行产生(index,series)这样的元组。

在这个例子中使用.iterrows,我们看看这使用iterrows后效果如何。

>>> @timeit(repeat=3, number=100)  ... def apply_tariff_iterrows(df):  ...     energy_cost_list = []  ...     for index, row in df.iterrows():  ...         # 获取用电量和时间(小时)  ...         energy_used = row['energy_kwh']  ...         hour = row['date_time'].hour  ...         # 添加cost列表  ...         energy_cost = apply_tariff(energy_used, hour)  ...         energy_cost_list.append(energy_cost)  ...     df['cost_cents'] = energy_cost_list  ...  >>> apply_tariff_iterrows(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_iterrows` ran in average of 0.713 seconds.

这样的语法更明确,并且行值引用中的混乱更少,因此它更具可读性。

时间成本方面:快了近5倍!

但是,还有更多的改进空间,理想情况是可以用pandas内置更快的方法完成。

pandas的优点有哪些

pandas的apply方法

我们可以使用.apply方法而不是.iterrows进一步改进此操作。pandas的.apply方法接受函数callables并沿DataFrame的轴(所有行或所有列)应用。下面代码中,lambda函数将两列数据传递给apply_tariff():

>>> @timeit(repeat=3, number=100)  ... def apply_tariff_withapply(df):  ...     df['cost_cents'] = df.apply(  ...         lambda row: apply_tariff(  ...             kwh=row['energy_kwh'],  ...             hour=row['date_time'].hour),  ...         axis=1)  ...  >>> apply_tariff_withapply(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_withapply` ran in average of 0.272 seconds.

apply的语法优点很明显,行数少,代码可读性高。在这种情况下,所花费的时间大约是iterrows方法的一半。

但是,这还不是“非常快”。一个原因是apply()将在内部尝试循环遍历Cython迭代器。但是在这种情况下,传递的lambda不是可以在Cython中处理的东西,因此它在Python中调用并不是那么快。

如果我们使用apply()方法获取10年的小时数据,那么将需要大约15分钟的处理时间。如果这个计算只是大规模计算的一小部分,那么真的应该提速了。这也就是矢量化操作派上用场的地方。

pandas的优点有哪些

矢量化操作:使用.isin选择数据

什么是矢量化操作?

如果你不基于一些条件,而是可以在一行代码中将所有电力消耗数据应用于该价格:df ['energy_kwh'] * 28,类似这种。那么这个特定的操作就是矢量化操作的一个例子,它是在pandas中执行的最快方法。

但是如何将条件计算应用为pandas中的矢量化运算?

一个技巧是:根据你的条件,选择和分组DataFrame,然后对每个选定的组应用矢量化操作。

在下面代码中,我们将看到如何使用pandas的.isin()方法选择行,然后在矢量化操作中实现新特征的添加。在执行此操作之前,如果将date_time列设置为DataFrame的索引,会更方便:

# 将date_time列设置为DataFrame的索引  df.set_index('date_time', inplace=True)  @timeit(repeat=3, number=100)  def apply_tariff_isin(df):      # 定义小时范围Boolean数组      peak_hours = df.index.hour.isin(range(17, 24))      shoulder_hours = df.index.hour.isin(range(7, 17))      off_peak_hours = df.index.hour.isin(range(0, 7))     # 使用上面apply_traffic函数中的定义      df.loc[peak_hours, 'cost_cents'] = df.loc[peak_hours, 'energy_kwh'] * 28      df.loc[shoulder_hours,'cost_cents'] = df.loc[shoulder_hours, 'energy_kwh'] * 20      df.loc[off_peak_hours,'cost_cents'] = df.loc[off_peak_hours, 'energy_kwh'] * 12

我们来看一下结果如何。

>>> apply_tariff_isin(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_isin` ran in average of 0.010 seconds.

提示,上面.isin()方法返回的是一个布尔值数组,如下:

[False, False, False, ..., True, True, True]

布尔值标识了DataFrame索引datetimes是否落在了指定的小时范围内。然后把这些布尔数组传递给DataFrame的.loc,将获得一个与这些小时匹配的DataFrame切片。然后再将切片乘以适当的费率,这就是一种快速的矢量化操作了。

上面的方法完全取代了我们最开始自定义的函数apply_tariff(),代码大大减少,同时速度起飞。

运行时间比Pythonic的for循环快315倍,比iterrows快71倍,比apply快27倍!

pandas的优点有哪些

还能更快?

太刺激了,我们继续加速。

在上面apply_tariff_isin中,我们通过调用df.loc和df.index.hour.isin三次来进行一些手动调整。如果我们有更精细的时间范围,你可能会说这个解决方案是不可扩展的。但在这种情况下,我们可以使用pandas的pd.cut()函数来自动完成切割:

@timeit(repeat=3, number=100)  def apply_tariff_cut(df):      cents_per_kwh = pd.cut(x=df.index.hour,                             bins=[0, 7, 17, 24],                             include_lowest=True,                             labels=[12, 20, 28]).astype(int)      df['cost_cents'] = cents_per_kwh * df['energy_kwh']

上面代码pd.cut()会根据bin列表应用分组。

其中include_lowest参数表示第一个间隔是否应该是包含左边的。

这是一种完全矢量化的方法,它在时间方面是最快的:

>>> apply_tariff_cut(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_cut` ran in average of 0.003 seconds.

到目前为止,使用pandas处理的时间上基本快达到极限了!只需要花费不到一秒的时间即可处理完整的10年的小时数据集。

但是,最后一个其它选择,就是使用 NumPy,还可以更快!

pandas的优点有哪些

使用Numpy继续加速

使用pandas时不应忘记的一点是Pandas的Series和DataFrames是在NumPy库之上设计的。并且,pandas可以与NumPy阵列和操作无缝衔接。

下面我们使用NumPy的 digitize()函数更进一步。它类似于上面pandas的cut(),因为数据将被分箱,但这次它将由一个索引数组表示,这些索引表示每小时所属的bin。然后将这些索引应用于价格数组:

@timeit(repeat=3, number=100)  def apply_tariff_digitize(df):      prices = np.array([12, 20, 28])      bins = np.digitize(df.index.hour.values, bins=[7, 17, 24])      df['cost_cents'] = prices[bins] * df['energy_kwh'].values

与cut函数一样,这种语法非常简洁易读。

>>> apply_tariff_digitize(df)  Best of 3 trials with 100 function calls per trial:  Function `apply_tariff_digitize` ran in average of 0.002 seconds.

0.002秒! 虽然仍有性能提升,但已经很边缘化了。

到此,相信大家对“pandas的优点有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: pandas的优点有哪些

本文链接: https://lsjlt.com/news/281053.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • pandas的优点有哪些
    本篇内容主要讲解“pandas的优点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“pandas的优点有哪些”吧!下面是一个例子,数据获取方式见文末。>>> im...
    99+
    2023-06-15
  • Pandas DataFrame的知识点有哪些
    本篇内容主要讲解“Pandas DataFrame的知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Pandas DataFrame的知识点有哪些”吧!1、DataFrame的创建Da...
    99+
    2023-06-29
  • Python Pandas的知识点有哪些
    本篇内容介绍了“Python Pandas的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么要学习Pandas那么问题来了:...
    99+
    2023-06-30
  • Python中的pandas知识点有哪些
    本篇内容主要讲解“Python中的pandas知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的pandas知识点有哪些”吧!前言pandas 是基于 Numpy 的一种...
    99+
    2023-06-27
  • redis的优点有哪些
    这篇文章将为大家详细讲解有关redis的优点有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。redis是Nosql数据库中使用较为广泛的非关系型内存数据...
    99+
    2024-04-02
  • ClickHouse的优点有哪些
    本篇内容介绍了“ClickHouse的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Clic...
    99+
    2024-04-02
  • HTAP的优点有哪些
    这篇文章主要讲解了“HTAP的优点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTAP的优点有哪些”吧!4 月 25 日,领先的企业级开源分布式数据...
    99+
    2024-04-02
  • VPS的优点有哪些
    VPS的优点有:1、VPS的扩展性强,能够无限创建网站子目录以及升级配置,从而满足网站后期发展的需求;2、VPS用途广,能够直接生成网站程序,速度快、效率高;3、VPS独立性好,具备独立IP资源,有利于网站优化;4、VPS稳定性高,当独享V...
    99+
    2024-04-02
  • jquery的优点有哪些
    这篇文章主要介绍了jquery的优点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。jquery的优点jQuery 是轻量级的框架,大小...
    99+
    2024-04-02
  • Swagger3的优点有哪些
    这篇文章主要介绍“Swagger3的优点有哪些”,在日常操作中,相信很多人在Swagger3的优点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Swagger3的优点有...
    99+
    2024-04-02
  • TypeScript的优点有哪些
    本篇内容介绍了“TypeScript的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Chirag...
    99+
    2024-04-02
  • vscode的优点有哪些
    vscode的优点有以下几点:轻量级vscode是一款轻量级的编辑器,安装包小,且启动速度快,可以提高用户体验。插件丰富vscode拥有丰富的插件系统,可以编辑HTML、CSS、JS、TS、Vue、React等前端代码和JAVA、Pytho...
    99+
    2024-04-02
  • javascript的优点有哪些
    javascript的优点有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。(1).javascript的优点:javascript减少网络传输。在javas...
    99+
    2023-06-14
  • Log4j2的优点有哪些
    这篇文章主要讲解了“Log4j2的优点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Log4j2的优点有哪些”吧!Log4j2简介Apache Log4j 2是 Log4j(1) 的升...
    99+
    2023-06-15
  • DevOps的优点有哪些
    这篇文章主要讲解了“DevOps的优点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“DevOps的优点有哪些”吧!DevOps(Development和Operations的组合词)是...
    99+
    2023-06-27
  • ChatGPT的优点有哪些
    这篇“ChatGPT的优点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ChatGP...
    99+
    2023-02-20
    chatgpt
  • UGUI的优点有哪些
    这篇文章主要为大家展示了“UGUI的优点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“UGUI的优点有哪些”这篇文章吧。UGUI的优点新UI系统二 直观、易于使用对于UI控件,开发者可以直...
    99+
    2023-06-04
  • Python的优点有哪些
    这篇文章主要讲解了“Python的优点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的优点有哪些”吧!  基于Python本身的优点:简单,易学,速度快,免费、开源,高层语...
    99+
    2023-06-02
  • nodejs有哪些优点
    这篇文章主要讲解了“nodejs有哪些优点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs有哪些优点”吧! nodej...
    99+
    2024-04-02
  • html5有哪些优点
    本篇内容介绍了“html5有哪些优点”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!html5是最近几年逐渐...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作