我正在处理一个天气数据集(要复制;可以找到数据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将所有的值相加,然后除以观察值的数量,这在计算上应该不会太密集,但也许我在这里错了。如果您能解释一下,我们将不胜感激
我做了一些测试,在本例中,罪魁祸首似乎是“日期时间”——非数字列
首先,当单独计算不同列的平均值时,显然没有指数行为(见下图——X轴是行数,y轴是时间)
其次,我在下面的示例中尝试计算整个数据帧的平均值 三个场景(每个场景有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%)李>希望这有帮助
相关问题 更多 >
编程相关推荐