基于列的上一个和下一个值从基于时间的数据创建“增量”日志(pandas df)

时间:2019-04-30 15:30:04

标签: python python-3.x pandas

尝试解决基于时间的传感器数据中的数据质量问题,同时从中创建新的“日志”。这就是问题-

理想情况下,参数X以可接受的速率随时间增加或保持恒定(永远不会减小)。但是在实际数据中,由于校准问题,情况并非如此。在物理上都不可能的两种情况-

  • 情况1)X可能突然从50000增加到300,000,然后在短时间内保持该值。发现错误后,数据将重置为大约50000。
  • 情况2)X可能突然从例如80000减少到50000,然后在短时间内保持该值。发现错误后,数据将重置为大约80000。

在第一次迭代中,只要dX> 0.01(实际列值与移位列值之间的差),就会创建一个日志。在两种情况下都将不良数据拖入新日志。为了清除这些不良数据,我根据第一次迭代的日志在下面编写了程序

下面的程序解决了情况2,但是解决方案导致情况1的情况更糟。如果突然增加到300,000,则“对数”将不会更新到首次达到300,000的水平。因此,有用的数据会从重置为50000的位置丢失。

import pandas as pd

data = {'time':[43254.09605,43254.09606,43254.09609,43254.09613,43254.09616,43254.09618,43254.09719,43254.09721,43254.09723,43254.09725]
,'X': [50000,50000.2,50000.4,300000.2,300000.4,300000.6,50000.1,50000.2,50000.4,50000.6]
,'dX':[0.19995117,0.19995117,0.19995117,32002.398,0.19921875,0.203125,0.100097656,0.099853516,0.19995117,0.20019531]
,'dX2':[None,0.2,0.2,249999.8,0.2,0.2,-250000.5,0.1,0.2,0.2]}

df = pd.DataFrame.from_dict(data)

def log_maker (df):

    prev = 0
    list_df = []

    for i in range(1, len(df)):

        curr = df.loc[i, 'X']

        if (df.loc[i, 'dX'] > 0.01) and (df.loc[i, 'dX'] < 10) and (curr > prev):

            list_df.append(df.loc[i,])
            prev = curr #updates prev even if curr is a bad value, in our case 300000.4

    return list_df

其中dX2是新日志中X的移位。 dX来自原始时间日志。

我在考虑是否有一种方法可以存储最后一个好行,并将curr与仅最后一个好prev进行比较。

我不是程序员,而是此特定传感器数据的专家。因此,如果有任何疑问,我可以回答。因此,(df.loc[i, 'dX'] < 10)是X可以增加的合理“速率”。另外,我无法设置严格的标准,例如X cannot be greater than 299999,因为可能会比50000 to 55000突然增加,这也是不正确的,但55000本身是一个正确的值,稍后会出现随着时间增加的日志。

1 个答案:

答案 0 :(得分:0)

我最终使用dX_real = curr - prev而不是dX,这对于解决大多数情况下的问题很有帮助。这使得prev仅被正确的值更新。还要设置一个初始条件,以便在时间日志以错误的值(非常高的X)(该代码不在此处)开始时获得第一个好点。

def log_maker (df):

    prev = 0
    list_df = []

    for i in range(1, len(df)):

        curr = df.loc[i, 'X']
        dX_real = curr - prev

        if (dX_real  > 0.01) and (dX_real  < 10):

            list_df.append(df.loc[i,])
            prev = curr #updates prev even if curr is a bad value, in our case 300000.4

    return list_df