使用dataframe.mean()时,运行时间出现奇怪的指数增长(Pandas性能非数字列)

4
我正在处理一组气象数据(要复制,请点击此处下载并运行下面的代码),并且想要对数据进行归一化处理。为此,我尝试了这个问题的第二个答案; Pandas数据帧的规范化列 它可以简化为 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

对我来说,时间似乎是呈指数增长的。我不知道为什么会这样,据我所知,将所有值相加并除以观察次数不应该太耗费计算资源,但也许我错了。希望能有一些解释!


请注意,axis=0表示计算每行的平均值而不是列。如果您的目标是归一化,则可能不是您的意图。我知道这不是您问题的答案,但请注意这一点。此外,您可以使用sklearn.preprocessing.StandardScaler进行归一化处理。 - Roim
我知道,但是当我不指定参数时(例如normalized_df=(df-df.mean())/df.std()),它也会这样做,对吗?所以另一个问题的答案也是按行计算平均值。这不就是归一化应该做的吗? - Psychotechnopath
规范化应该是特征类型,也就是在您的情况下是列。我们希望对数据进行规范化,以便能够比较特征之间的差异,例如像KNN这样对距离敏感的分类器。假设您有一个2x2的集合,其中一行填充了1,第二行填充了2。如果您按平均值进行规范化,则会发现两者都填充为零。这不是您想要做的事情。 - Roim
1
抱歉,我犯了一个错误。正确的方法是使用axis=0。它会返回每列的平均值。 - Roim
1个回答

5

我进行了一些测试,似乎罪魁祸首是“日期时间”——非数字列。

首先,当单独计算不同列的平均值时,显然没有指数行为(见下图——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毫秒(约为前一个测试的0.4%)。
  • 最后,删除日期/时间列:jena_climate_df.drop("Date Time", axis=1)[0:80000].mean(axis=0) - 19.8毫秒(原始时间的0.2%)。

希望这可以帮到您。


当然是非数字的DateTime列!我怎么可能会错过这么明显的东西。非常感谢。 - Psychotechnopath
@Psychotechnopath 非常愉快。如果问题涉及到pandas在非数值类型方面的性能,您可能需要更改主题行,以便其他人在将来可以找到它。 - Roy2012

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接