在Python Pandas中使用10 + GB数据集

时间:2015-03-05 16:18:40

标签: python csv pandas dataset hdf5

我有一个非常大的.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_1metric_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对),我会尝试以下两种方法之一:

  1. metric_series读取前60行,执行相关,然后使用以下代码data.csv读取data.csv的后60行。虽然这对于数据集的第一部分来说速度更快,但由于我不得不跳过数据集,所以它变得无法忍受。我的电脑上数据集的最后60行读了10多分钟!

  2. 使用data = pd.read_csv('data.csv', nrows=60,skiprows=60)读取存储在内存中的DataFrame的前60行,然后使用data.head(60)从数据框中删除该数据,但这甚至更慢!

  3. 此时,我正在探索使用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文件指导我完成此操作,我仍会感激。

0 个答案:

没有答案