Map Reduce在Pandas中成对处理数据框

时间:2019-05-24 17:41:15

标签: python pandas mapreduce

我有一个Elasticsearch数据库,并且它有很多时间序列数据。我想将这些数据批量加载到内存中,放入一个Dataframe中,进行一些操作,然后在将来的Dataframe中减少这些数据。

time_ranges = [(t1, t2), {t2, t3), (t3, t4)]
data_chunk0 = elastic_query(time_ranges[0])
data_chunk1 = elastic_query(time_ranges[1])
data_chunk2 = elastic_query(time_ranges[2])

(其中elastic_query只是一个针对时间范围执行查询并为某些项目返回数据帧的函数,其中每个项目具有多列数据)

items |  col1   |  col2   |   col3|
item 1|  10     | True    |    5  |
item 2|  11     | True    |    9  |
item 1|  90     | False   |    5  |

我想做的是:对于data_chunk0,采用最大列...然后对于data_chunk1,采用最大列...合并这两个结果,并采用最大的结果。然后,获取此结果并与data_chunk2比较并再次获得最大数据。这是序列中的样子:

result = pd.concat([data_chunk0.groupby('items').max(), data_chunk1.groupby('items').max()]).groupby('items).max()
pd.concat([result, data_chunk2.groupby('items').max()]).groupby('items).max()

但是,我不想将数据加载到内存中来执行此操作。我想一次做一对。我可以这样使用python的reduce方法来做到这一点:

def reduce_ranges(range1, range2):
    #here, load data for range1 and range 2 from Elastic
    return pd.concat([range1.groupby('items').max(), range2.groupby('items').max()], ignore_index=True).groupby('items').max().reset_index()

result = reduce((lambda x, y: reduce_ranges(x, y)), time_ranges)

但是,问题在于,我实际上也需要在reduce函数中添加一列,并且我不想必须对第一个范围进行两次处理(因为对于除第一对之外的所有数据帧对,第一个范围已经由上一个缩小步骤处理了。)

是否有更优雅的方法可以执行此操作,而无需使用for循环?

我查看了“ map”,然后查看了“ reduce”,但看来我必须将所有数据加载到列表中,以便map函数在缩小之前进行处理。

所以,我怎么办

给出一个时间范围列表,加载第一个时间范围的数据...找到列的最大值....然后加载第二个时间范围的数据...与第一个时间范围的MAX RESULT结合...返回新的最大数据帧...然后加载第三时间范围的数据,等等。

我知道我可以使用for循环来解决此问题,但是我想知道是否有更好的,更被人们接受的方法……理想情况下,将来可以启用并行性。

0 个答案:

没有答案