根据时序CSV数据构建时间线

时间:2019-05-09 19:02:16

标签: python pandas csv

这与我遇到的特定错误无关,更多地是关于我应该使用哪种数据结构和算法来实现目标的问题。让我知道这是否更适合像软件工程这样的其他委员会。

我有一些IoT设备,这些设备将数据转储为CSV,而这些CSV太大了,人类无法解析。 CSV看起来像这样:

Time,Sensor1,State1,State2,State3,Sensor2,Sensor3,Sensor4,State4...
2019-05-04T10:04:45.601000Z,0.19,0,0,1,25.67,298.8,12.3,5...
2019-05-04T10:04:58.133000Z,0.23,0,1,2,24.53,300.1,14.4,6...
...

在一个目录中,我可能要分析一组十二个或两个CSV。每个CSV都有数十列和数万行。每个CSV的第一列是“时间”,在该CSV中,时间步长是统一的(尽管它们并不精确)。除时间外,CSV组中的列标题是唯一的(除了两个CSV都具有时间以外,没有两个CSV共享列名)。有时时间步长为10秒,有时为2秒甚至更短的时间间隔。在不同的CSV中,时间栏可能会覆盖相同的时间跨度,但是时间间隔可能无法完美对齐。例如,在上面的CSV中,我们在2019-05-04T10:04:45.601000Z有一个数据点。同一目录(组)中的另一个CSV可能具有最近的时间戳,时间为2019-05-04T10:04:49.601000Z(四秒后)。

我想构建一个通过扫描CSV进行状态转换而发生的“事件”的时间轴。并不是所有的变量更改都是有意义的,因此我希望能够声明我关心的状态转换。我想使用以下课程:

class StateTransition:
    def __init__(self, variable, from_state, to_state, name, relevant_measurements=()):
        self.variable = variable
        self.from_state = from_state
        self.to_state = to_state
        self.name = name
        self.relevant_measurements = relevant_measurements

我将维护要查找的StateTransitions实例的列表,如下所示:

states = (
    StateTransition(variable='State2',
                    from_state=0, to_state=1,
                    name='Cable plugged in',
                    relevant_measurements=('State1', 'Sensor4', )),
    StateTransition(variable='State2',
                    from_state=1, to_state=0,
                    name='Cable unplugged',
                    relevant_measurements('State1', 'Sensor3', )),
)

相关度量是指其他变量,这些变量可能来自或可能不来自同一CSV。 related_measurements的目的是要知道状态转换时这些其他测量(或状态)的值是多少。由于related_measurement可能来自另一个CSV,因此我将不得不在最接近状态转换时间戳的时间确定该度量的值。我想象构造一个这样的对象:

from datetime import datetime
class TimelineEvent:
    def __init__(self, state_transition: StateTransition, timestamp: datetime):
        self.st = state_transition
        self.timestamp = timestamp
        self.measurements = {}

在self.measurements是dict的情况下,对于“插入电缆”事件,它看起来像这样:

{'State1': 0,
 'Sensor4': 14.4,}

最终目标是根据我定义的StateTransitions为CSV组创建TimelineEvents列表。一旦有了时间表事件的列表,就可以根据需要显示它们,而我可以很容易地找出这一部分。我苦苦挣扎的是如何建立TimelineEvents列表。我是否应该一次通过一个CSV,然后根据时间戳对时间轴进行排序?我应该同时浏览所有CSV吗?我是否应该根据其时间戳逐步浏览CSV?我是否可以加载所有CSV的有用数据结构,从而使通过时间对齐的数据进行搜索变得容易?我从未使用过熊猫,但我将其包含在标签中,因为我认为它提供了在这里可能有用的工具,但是答案肯定不是必需的。

在这里内存使用不是很重要。至于运行时,它不必很快,但如果它在太阳爆发之前完成就很好了。最糟糕的情况是,假设定义了十万行CSV,100列和50个状态转换。

我已经考虑过将状态转换存储到一个看起来像这样的字典中:

states_dict[variable][from_state][to_state] = {'name': 'something', relevant_measurements=('some_sensor',),}

^类似上面的内容将提供StateTransitions的有效查找。如果可以帮助您,您可能会认为我已经做到了。

为了澄清:我不需要接受答案的实现。如果您可以指出这些工具和/或描述一种能够以我能理解的方式完成此任务的算法,那么我会接受这样的答案。

1 个答案:

答案 0 :(得分:1)

虽然这个问题并不是很明确,但是人们通常会处理从IoT设备输入的时间序列数据。

重新采样,将重新采样与实际结合,应用逻辑(如状态机)以及在DataFrame之间查找值是常见的。

这是一个示例,一种忙碌的框显示了上面的一些时间序列数据,由datetimeindex操纵。

var store = Ext.create('mystore', {
    proxy: {
        api: {
            read: 'http://url' + partofurl
        }
    }
});

下面提到的是基于近似时间戳的查找。参见:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge_asof.html