我有一个非常大的.csv(最初来自SAS数据集),其中包含以下列:
target_series metric_series month metric_1 metric_2 target_metric
1 1 1 #float #float #float
1 1 2 #float #float #float
...
1 1 60 #float #float #float
1 2 1 #float #float #float
1 2 2 #float #float #float
...
1 80000 60 #float #float #float
2 1 1 #float #float #float
...
50 80000 60 #float #float #float
正如您所看到的,该文件具有60
个月80000
个独立系列时间50
目标系列行数,并且在保存为{{{{}}时占用超过10 GB的空间1}}
。我需要做的是使用.csv
执行并记录每个metric_1
和metric_2
之间的相关性。
我写了以下代码:
target_metric
我在那里有import pandas as pd
from datetime import datetime
data = pd.read_csv("data.csv") # approximately 10 GB
output = []
for target_num in range(1,50):
for metric_number in range(1,80000):
startTime = datetime.now() # Begin the timer
current_df = data[(data['target_series'] == target_num) & (data['metric_series'] == metric_number)] # Select the current 60 months period that we want to perform the correlation on
print('The process took: '+str(datetime.now() - startTime)+' hours:minutes:seconds to complete.') # Stop the timer
results_amount_target = current_df[['metric_1','target_metric']].corr() # Perform metric_1 correlation
results_count_target = current_df[['metric_2','target_metric']].corr() # Perform metric_2 correlation
output.append([target_num, independent_number, results_amount_target.iat[0,1], results_count_target.iat[0,1]]) # Record the correlation in a Python list will be converted to a DataFrame later
代码的原因是要找出为什么这个过程需要这么长时间。计时器代码围绕着datetime
行,这是迄今为止最慢的行(我已经玩了current_df
的位置,以找出为什么这么长时间。
我发现用这行代码选择部分数据:
datetime
每次需要1.5秒。这对我来说太慢了!显然需要改变一些事情!
我决定尝试不同的方法。由于我知道我想一次遍历数据集60行(对于每个current_df = data[(data['target_series'] == target_num) & (data['metric_series'] == metric_number)]
和target_series
对),我会尝试以下两种方法之一:
从metric_series
读取前60行,执行相关,然后使用以下代码data.csv
读取data.csv
的后60行。虽然这对于数据集的第一部分来说速度更快,但由于我不得不跳过数据集,所以它变得无法忍受。我的电脑上数据集的最后60行读了10多分钟!
使用data = pd.read_csv('data.csv', nrows=60,skiprows=60)
读取存储在内存中的DataFrame
的前60行,然后使用data.head(60)
从数据框中删除该数据,但这甚至更慢!
此时,我正在探索使用data = data.drop(data.head(60).index)
或HDFStore
将数据集从h5py
移至.csv
,但我不确定如何继续。我进行此分析的计算机只有16 GB的内存,将来我可以使用比这个文件更大的数据。
解决此问题的最佳方法是什么?如何准备在Python / Pandas中处理更大的数据?
更新
感谢.h5
,我已将我的代码重写为以下内容:
filmor
现在这是超快速和记忆灯!如果有人可以通过import pandas as pd
from datetime import datetime
data = pd.read_csv("data.csv", chunksize=60) # data is now an iterable
output = []
for chunk in data:
results_amount_target = chunk[['metric_1','target_metric']].corr() # Perform metric_1 correlation
results_count_target = chunk[['metric_2','target_metric']].corr() # Perform metric_2 correlation
output.append([chunk['target_series'][0], chunk['independent_series'][0], results_amount_target.iat[0,1], results_count_target.iat[0,1]]) # Record the correlation in a Python list will be converted to a DataFrame later
或HDFStore
文件指导我完成此操作,我仍会感激。