我正在处理一组气象数据(要复制,请点击此处下载并运行下面的代码),并且想要对数据进行归一化处理。为此,我尝试了这个问题的第二个答案;
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
进行归一化处理。 - Roimnormalized_df=(df-df.mean())/df.std()
),它也会这样做,对吗?所以另一个问题的答案也是按行计算平均值。这不就是归一化应该做的吗? - Psychotechnopathaxis=0
。它会返回每列的平均值。 - Roim