【问题标题】:Double Masking on Pandas Dataframe makes RAM explodePandas Dataframe 上的双重屏蔽使 RAM 爆炸
【发布时间】:2014-11-07 16:47:43
【问题描述】:

我目前的代码可以工作,如果我只做大约 5 次迭代,但我需要做 500 次,它就可以工作。下面指示的循环正在拉动大约 100 gig 的 RAM 使用量(在一台好机器上),我不知道为什么.我怀疑这与我正在运行的双重面具有关(也如下所示)

我正在处理的“框架”并不是特别大(相比之下),它由 500 只股票及其从 1994 年到 2014 年的每日时间序列价格组成。下面的循环正在做的是从“框架”并根据某些因库存而异的给定日期屏蔽该列。然后它需要所有这些被屏蔽的列并将它们重新连接到一个新的数据帧中(我想不出一种就地方式来做到这一点)。我认为正是这种双重面具导致记忆爆炸。有没有其他人处理过这样的问题或知道如何解决它?

frame=pd.DataFrame()
for i in range(len(columns)):
    frame=frame.join(serieslist[i], how='outer', rsuffix=columns[i])
frame2=frame.rename(columns={'PRC': 'PRC'+str(columns[0])})
frame2.to_csv('tester.csv')
frame4=frame2.rename(columns=lambda x: x[3:])

#now chopping it down to 36-1, 24-1 and 12-1
ann_list=data['  DateEffective']

for i in range(len(ann_list)):
    ann_list[i]=parser.parse(ann_list[i])

months36=datetime.timedelta(36*365/12)
############This is the loop that explodes in memory use#################
frame5fin=pd.DataFrame()
for i in range(len(columns)):
    out36=(ann_list[i]+months36)
    ##########I am nearly positive this is the part of the code that makes the RAM explode####
    frame5=frame4[columns[i]][(frame4[columns[i]].index>ann_list[i]) & (frame4[columns[i]].index<out36)]
    print frame5
    frame5fin=frame5fin.join(frame5, how='outer')
print frame5fin.tail(100)

【问题讨论】:

  • 你真的打算在循环结束时在 frame5fin 和 frame5 之间进行连接吗?也许这应该是一个追加?似乎在每次迭代后 frame5fin 都会成倍增长。
  • @JD Long-您能解释一下为什么它会“呈指数级增长”吗?在我看来,这将是线性的。我认为这是我问题的症结所在。为什么是指数级?
  • 当您使用数据子集对其进行测试时,连接是否符合您的预期?试图阅读你的代码(很难做到)我猜frame4frame5 有许多共同的列以及一个共同的索引。当您加入这些 Pandas 时,会尝试匹配每列中的每个值。随着frame5in 变大,这个连接会大大减慢。你是对的,它可能是速度的线性下降。但是,我怀疑您不想根据每一列加入。但是我发现读懂你的想法非常困难。
  • 如果你想保留缺失值,你可以考虑使用 append 方法,然后在你完成循环之后,你可以获取结果并重新索引它以添加没有数据的日期。

标签: python pandas ram timedelta


【解决方案1】:

看起来你应该在最后一步累积结果:

 frame5fin=frame5fin.join(frame5, how='outer')

但是,该代码是一个连接,而不是附加到数据框 frame5fin

也许你想要:

 frame5fin=frame5fin.append(frame5)

【讨论】:

  • 这是可能的,但问题是每个 frame5 都有不同的索引。尝试将两个具有不同索引的 df 结合起来会引发异常。您是否偶然知道其他替代方案?
  • 在没有任何示例数据的情况下很难想象这一点......你所说的“不同索引”到底是什么意思?索引是多少?
  • 通过不同的索引,我的意思是我尝试组合的数据帧之间没有共同的索引。例如,一个是从 1994 年 6 月 13 日到 2014 年 8 月 1 日的时间序列,而另一个是从 1998 年 5 月 13 日到 2014 年 8 月 1 日的时间序列。当你加入这两个时,你会得到一个带有索引的数据框范围两个索引的联合(在本例中为 1994 年 6 月 13 日至 2014 年 8 月 1 日),它将把 nans 放在 1998 年 5 月 13 日之前的任何内容的第二列。
猜你喜欢
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2022-06-18
  • 1970-01-01
相关资源
最近更新 更多