从连续pandas行计算值

2024-09-28 20:43:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个python新手,尝试预处理timeseries数据,这样当对象在一系列节点和边上移动时,我可以计算一些更改,这样我就可以计算站点数,将它们聚合到路由中,并了解路由上的行为。数据最初是以两个CSV文件的形式出现的(entrance,Typedoc=0和clearance,Typedoc=1,每个文件大约85k行/19MB),我将它们合并成一个文件并执行了一些维度缩减。我已经设法把它放入一个多索引数据帧中。下面是一个片段:

    In [1]: movements.head()
    Out[1]: 
                         Typedoc  Port   NRT   GRT      Draft
    Vessname ECDate                                                            
    400 L    2012-01-19        0  2394  2328  7762   4.166667
             2012-07-22        1  2394  2328  7762  17.000000
             2012-10-29        0  2395  2328  7762   6.000000
    A 397    2012-05-27        1  3315  2928  2928  18.833333
             2012-06-01        0  3315  2928  2928   5.250000

我有兴趣了解每个级别在穿越其时间序列时的变化。最后,我将把它表示为一个图形。我想我真的很喜欢字典形式的这些数据,其中一个唯一的Vessname的每个条目本质上都是一个标记化的沿途站点字符串:

^{pr2}$

其中嵌套列表值为:

    [ECDate, Typedoc, Port, Draft]

如果i=0,那么我感兴趣的值是停留时间和通过时间以及吃水深度的变化,计算如下:

    t_dwell = stops_dict['400 L'][i+1][0] - stops_dict['400 L'][i][0]

    d_draft = stops_dict['400 L'][i+1][3] - stops_dict['400 L'][i][3]

    i += 1

以及

    t_transit = stops_dict['400 L'][i+1][0] - stops_dict['400 L'][i][0]

假设所有的数据类型都是正确的(这是一个很大的假设,因为我还没有掌握如何让pandas解析我的日期)。然后我将提取链接作为某种形式:

    link = str(stops_dict['400 L'][i][2])+'->'+str(stops_dict['400 L'][i+1][2]),t_transit,d_draft

t逯transit和d_draft值作为边权重。节点是唯一的端口值列表,这些值被分配到“400L”:[t tu dwell,NRT,GRT]k,v pairs(不知何故)。我还没有完全弄清楚,但我觉得我不需要帮助。在

我想不出一个更简单的方法,所以我尝试定义一个需要重新开始的函数,方法是将已排序的数据帧写入,然后用以下方法读回:

    with open(filename,'sb) as csvfile:
        datareader = csv.reader(csvfile, delimiter=",")
        next(datareader, None)
        <FLOW CONTROL> #based on Typedoc and ECDate values

函数将添加到空字典:

    stops_dict = {}

    def createStopsDict(row):
        #this reads each row in a csv file, 
        #creates a dict entry from row[0]: Vessname if not in dict
        #or appends things after row[0] to the dict entry if Vessname in dict
        ves = row[0]
        if ves in stops_dict:
            stops_dict[ves].append(row[1:])
        else:
            stops_dict[ves]=[row[1:]]
        return

这是一种效率低下的做事方式。。。 我可能会用iterrows而不是csv阅读器。。。 我研究过熔化和未堆积,我不认为这些是正确的。。。 基本上,我没能成功地实现这一点,因为我还没能正确地实现这一点。。。在

有没有一种更简单,我敢说是“优雅”的方法,将基于多索引值的数据帧行直接映射到可重用的数据结构中(现在是字典stop-dict)。在

我不受词典或其结构的束缚,所以如果有更好的方法,我愿意接受建议。在

谢谢!在

更新2: 我想我已经弄清楚了。。。 从我最初的数据帧移动开始:

    movements.reset_index().apply(
        lambda x: makeRoute(x.Vessname,
            [x.ECDate,
             x.Typedoc,
             x.Port,
             x.NRT,
             x.GRT,
             x.Draft]),
             axis=1
             )

其中:

    routemap = {}
    def makeRoute(Vessname, info):
        if Vessname in routemap:
            route = routemap[Vessname]
            route.append(info)
        else:
            routemap[Vessname] = [info]
        return

在我需要通过调用list元素来计算事物的结构中,返回一个键控到Vessname的字典。在


Tags: 文件数据方法inif字典dict形式