我有一个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循环来解决此问题,但是我想知道是否有更好的,更被人们接受的方法……理想情况下,将来可以启用并行性。