2

我有两个数据流,都是一系列(时间戳,值)元组。IE:

[(2013-04-03T22:16:36+0000, 2334.5), (2013-04-03T22:46:36+0000, 43543.23), ...]  

这个想法是其中一个将是“首选”,一个不是,我想创建一个单一的时间序列,它是可用时较高偏好流的结果,而在没有时回退到最不优选的流。

我的想法是将两个流中的值的时间戳放入存储桶中,并将存储桶用作 DataFrame 的索引,每个流都有一个列,每个存储桶中都有一个 (timestamp, value) 元组列表。然后我可以只遍历每个桶,然后选择得分最高的那个。

数据框看起来像这样:

timestamp            stream1                                  stream2  
2013-04-03 00:00:00  [(2013-04-03T00:16:36+0000, 2334.5),     [(2013-04-03T00:17:36+0000, 2314.5)]
                      (2013-04-03T00:17:36+0000, 2314.5)]
2013-04-03 00:30:00  [(2013-04-03T00:43:44+0000, 43543.23),   [(2013-04-03T00:47:36+0000, 2364.5)] 
                      (2013-04-03T00:54:24+0000, 4443.23)]
2013-04-03 01:00:00  []                                       [(2013-04-03T01:01:30+0000, 34.34)]
2013-04-03 01:30:00  [(2013-04-03T01:35:32+0000, 238734.3)]   [(2013-04-03T01:45:32+0000, 238734.3)]

在这种情况下,时间戳已被放入每半小时一次的存储桶中,并且 stream1 是首选流。对于 00:00 的存储桶,将选择 stream1 中的两个点,对于 00:30 的存储桶,将选择流 1 中的两个点,对于 01:00 的存储桶,将选择 stream2 中的单个点stream1 没有数据,对于 01:30 的存储桶,将选择 stream1 中的单个数据点,因为它是首选流。

我该怎么做呢?我尝试创建数据框并使用resample('h', how='count')拆分为每小时计数,并使用groupby, 但不能完全将时间戳放入存储桶并为每个存储桶的每个流创建值列表。

4

1 回答 1

2

我有一个解决方案,但我不确定它的效率如何(我自己是熊猫菜鸟),或者是否有一种更“熊猫风格”的方法:

hh = date_range('2013-01-01T00:30:00', periods=48, freq='1800S')
s5 = date_range('2013-01-01', freq='5S', end='2013-01-02')
s5 = s5[:720] + s5[1440:]  # introduce a gap in the 5 second data
hh_d = Series(hh.astype('int') / 10 ** 9, index=hh)
s5_d = Series(s5.astype('int') / 10 ** 9, index=s5)
df = DataFrame({
    'hh': hh_d,
    '5s': s5_d,
})
# Make a grouping, for simplicity by day, hour
grp = df.groupby(lambda x: (x.day, x.hour))

result = TimeSeries()
for name, group in grp:
    winner = None
    for column in group.keys():  # iterate over the columns (streams)
        data = group[column].dropna()  # ditch any NaNs that will be present
        # next, perform the test (in this case, just the length)
        if not winner or len(data) > len(group[winner].dropna()):
            winner = column
    # finally, add the data to the result set.
    result = result.append(group[winner].dropna())

在 5 秒间隔时检查结果会得出:

ipdb> result[719:725]
2013-01-01 00:59:55    1357001995
2013-01-01 01:00:00    1357002000
2013-01-01 01:30:00    1357003800
2013-01-01 02:00:00    1357005600
2013-01-01 02:00:05    1357005605
2013-01-01 02:00:10    1357005610
dtype: float64

这表明在间隙期间选择了半小时流。

上面的示例基于组中每列的长度,但我想可以应用任何测试。

希望有更多熊猫经验的人可以详细说明我的稻草人答案!

于 2013-10-03T11:27:22.373 回答