Python 有限制和大数据的熊猫运行总和

Python 有限制和大数据的熊猫运行总和,python,pandas,bigdata,dataframe,Python,Pandas,Bigdata,Dataframe,我有一个巨大的面板数据,超过10GB。数据如下所示: ID Start_time Factor End_time 1001 1611 0.12 1861 1001 1612 -0.01 1862 ... 1001 1861 0.57 2111 1001 1862 0.06 2112 ... 1002 1200 0.01 1450 1002 1201 0.52

我有一个巨大的面板数据,超过10GB。数据如下所示:

ID    Start_time  Factor  End_time
1001     1611      0.12   1861
1001     1612     -0.01   1862
...
1001     1861      0.57   2111
1001     1862      0.06   2112
...
1002     1200      0.01   1450
1002     1201      0.52   1451
...
1002     1450     -0.21   1700
1002     1451      0.30   1701
...
数据按IDStart\u time值排序。我想计算从开始时间到相应的结束时间的每个ID的因子之和

输出示例:

ID    Start_time  Factor  End_time  Cumulative_factor
1001     1611      0.12   1861      0.12+(-0.01)+...+0.57
1001     1612     -0.01   1862      -0.01+...+0.57+0.06
...
1001     1861      0.57   2111      0.57+0.06+...
1001     1862      0.06   2112      0.06+...
...
1002     1200      0.01   1450      0.01+0.52+...+(-0.21)
1002     1201      0.52   1451      0.52+...+(-0.21)+0.30
...
1002     1450     -0.21   1700      -0.21+0.30+...
1002     1451      0.30   1701      0.30+...
...

由于我有超过1000万个观察值,有没有一种有效的方法来计算它?

注意:这部分是一个反向的
cumsum
,不幸的是,对于cumsum(和朋友们)反向没有kwarg论点,我认为这可能是一个很好的增强

使用iloc可以非常便宜地反转数据帧,不过:

df.iloc[::-1].cumsum().iloc[::-1]

这与当前打开/关闭的票据的问题非常相似。而不是在一行一行的基础上进行,技巧是在小组中分两次进行。将未结票数相加,从已结票数中减去(减去得到当前未结票数)

现在,我们可以做的是向上求和,向下求和,取差:

In [12]: open = df.set_index("Start_time")["Factor"].cumsum()

In [13]: closed = df.set_index("End_time")["Factor"].cumsum()

In [14]: open.sub(closed, fill_value=0)
Out[14]:
1611    0.12
1612    0.11
1861    0.56
1862    0.63
2111   -0.68
2112   -0.74
Name: Factor, dtype: float64

这并不完全是你想要的,但应该把你踢向正确的方向。

如果我在这里被认为是个聪明人,那我很抱歉。 “大数据”是按定义的数据,它不适合内存,10GB可以。这也意味着,根据定义,熊猫无法处理“大数据”,因为它在内存中完成一切

处理大数据问题的正确方法是使用map/reduce。使用map/reduce可以轻松解决您遇到的问题。由于您的数据已经在您所说的开始时间进行了排序,因此您可以轻松地通过一个减速机对其进行流式处理,以获得每个开始时间的总和

如果你觉得这像是黑魔法,别担心,不是

  • 将数据另存为CSV(如果您还没有),gzip使其成为CSV 它可以通过zcat进行流化
  • 编写一个reducer,只是一个python文件,它 连续读取标准文本
  • 在单个变量中不断求和数据
  • 每次键更改时打印该变量
  • zcat文件,使用| head查看它是否做了您想要的事情,并不断开发它,直到它符合您的目的
  • 这将为您提供基本的功能,并且此方法是您可以使用的内存效率最高的方法,因为它实际上从未在内存中保存整个文件,一次只保存一条记录

    如果您对unix流不太熟悉,这会让您大吃一惊,您很快就会爱上它


    TLDR;Pandas是错误的工具,请仔细阅读Map/Reduce

    你能显示你想要的输出吗?下面的文章演示了如何在太大而无法放入内存的Pandas
    DataFrame
    上进行计算:由于数据已排序,看起来像
    End\u time-Start\u time==250
    ,你可以尝试滚动窗口总和?谢谢you@JohnGalt对但这只是数据的一部分,大多数数据仍然有不同的窗口。@JulienSpronck,输出的例子就是我想要的输出,你能告诉我你还需要什么吗?是的,我认为你的方法解决了部分问题,也就是说,如果时间间隔相同,那么我可以使用这个方法。Thanks@Brad我想我已经说过了,我不知道你到底想要什么。在我看来,这与这个例子非常相似。“差距”在哪里?
    In [12]: open = df.set_index("Start_time")["Factor"].cumsum()
    
    In [13]: closed = df.set_index("End_time")["Factor"].cumsum()
    
    In [14]: open.sub(closed, fill_value=0)
    Out[14]:
    1611    0.12
    1612    0.11
    1861    0.56
    1862    0.63
    2111   -0.68
    2112   -0.74
    Name: Factor, dtype: float64