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

2024-09-28 18:50:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Normalize columns of pandas data frame

这可以归结为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将所有的值相加,然后除以观察值的数量,这在计算上应该不会太密集,但也许我在这里错了。如果您能解释一下,我们将不胜感激


Tags: of数据代码dfforheretime时间
1条回答
网友
1楼 · 发布于 2024-09-28 18:50:52

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

首先,当单独计算不同列的平均值时,显然没有指数行为(见下图——X轴是行数,y轴是时间)enter image description here

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

  • jena_climate_df[0:80000].mean(axis=0):10.2秒
  • 将日期/时间列设置为索引:jena_climate_df.set_index("Date Time")[0:80000].mean(axis=0) - 40 ms(约为上一次测试的0.4%)
  • 最后,删除日期/时间列:jena_climate_df.drop("Date Time", axis=1)[0:80000].mean(axis=0)-19.8毫秒(原始时间的0.2%)

希望这有帮助

相关问题 更多 >