当前位置: 首页 > 知识库问答 >
问题:

使用dataframe.mean()时运行时间呈指数级增长(非数字列)

秦渝
2023-03-14

我正在处理一个天气数据集(要复制;可以在这里找到数据,请解压缩它并运行下面的代码),我想对数据进行规范化。为此,我尝试了这个问题的第二个答案;

规范化熊猫数据框架的列

这可以归结为normalized_-df=(df-df.mean(axis=0))/df.std(axis=0)

但是,执行此代码需要很长时间。因此,我开始研究,df.mean()调用所花费的时间似乎呈指数增长。

我使用了以下代码来测试运行时:

import pandas as pd
import time

jena_climate_df = pd.read_csv("jena_climate_2009_2016.csv")
start = time.time()
print(jena_climate_df[:200000].mean(axis=0)) #Modify the number of rows here to observe the increase in time
stop = time.time()
print(f"{stop-start} Seconds for mean calc")

我运行了一些测试,选择逐渐增加用于平均值计算的行数。请参见以下结果:

0.004987955093383789 Seconds for mean calc ~ 10 observations
0.009006738662719727 Seconds for mean calc ~ 1000 observations
0.0837397575378418 Seconds for mean calc ~ 10000 observations
1.789750337600708 Seconds for mean calc ~ 50000 observations
7.518809795379639 Seconds for mean calc ~ 60000 observations
19.989460706710815 Seconds for mean calc ~ 70000 observations
71.97900629043579 Seconds for mean calc ~ 100000 observations
375.04513001441956 Seconds for mean calc ~ 200000 observations

在我看来,时间是呈指数增长的。我不知道为什么会发生这种情况,AFAIK将所有的值相加,然后除以观察值的数量,这在计算上应该不会太密集,但也许我在这里错了。如果您能解释一下,我们将不胜感激!

共有1个答案

鞠嘉志
2023-03-14

我做了一些测试,在本例中,罪魁祸首似乎是“日期时间”——非数字列。

其次,我尝试在以下三个场景中计算整个数据帧的平均值(每个场景有80K行),并使用%%timeit对其计时:

  • jena\u climate\u df[0:80000]。平均值(轴=0):10.2秒
  • 将日期/时间列设置为索引:jena_climate_df.set_index(“日期-时间”)[0:80000]。平均值(axis=0)-40ms(约为先前测试的0.4%)
  • 最后,删除日期/时间列:jena_climate_df.drop(“日期-时间”,轴=1)[0:80000]。平均值(轴=0)-19.8毫秒(原始时间的0.2%)

希望这能有所帮助。

 类似资料:
  • 我已经在Ubuntu14.04中安装了Android studio。我试图清理这个项目,但它花了太长时间,已经1小时了,因为gradle正在运行。在我的Gradle控制台中,我得到了如下错误: 线程“png-cruncher_8”java.lang.runtimeException:在等待从aapt进程时超时,请确保在/home/files/android/sdk/build-tools/23.0

  • 每个人在最新的更新之后,Studio在运行应用程序之前已经运行了很长时间(3-40分钟)“运行Gradle Build”。如何治疗?当前Studio版本:1.3。2.

  • 我在Master上运行了一个如下所示的spark代码: 我的集群配置:独立/客户机模式下的3个节点(1个主+2个从) 我尝试添加一个新的集群,因为上面搜索的关于资源不足的错误,但是这个错误在伸缩时仍然存在。 是因为节点中的内存较少吗??这里有什么建议吗??

  • 下面的代码通过指数慢的算法计算斐波那契数: 我在运行时计算第45个斐波那契数,在编译时计算第91个。 有趣的事实是,GCC4.9编译代码并在几分之一秒内计算出,但吐出需要一段时间。 以上是否意味着GCC会生成函数的两个编译版本,其中一个是快的,另一个是指数级慢的? 问题不是编译器如何优化计算(是的!它确实使用了某种记忆),而是如果它知道如何优化函数,为什么它不对做同样的操作呢?并且,函数有两个单独

  • 我有一个web应用程序,也在做真正密集的数据处理。有些函数非常慢(想想几分钟)。 这个重构的问题是tornado服务器阻塞了,同时无法为其他请求提供服务。 所以问题是:有没有一种方法可以重构处理程序,而不触及,也不创建新的线程/进程?

  • 我想使用setInterval将一个数字增加0.1/s,我还想将此函数多次应用于该数字(单击一次,0.1/s,单击两次,0.2/s等)。然而,当我执行这个函数时,这个数字会增加到3.00000001而不是3,或者7.999999999而不是8。我该怎么解决这个问题?