Улучшение значений DataFrame на основе паттерна увеличения и уменьшения - PullRequest
0 голосов
/ 25 января 2020

У меня есть датафрейм со значениями глубины от OpenPose. Я хочу немного почистить эти данные. Шаблон генерируемых данных подобен тому, как сначала набор значений уменьшается для большого количества кадров, а затем снова значение начинает увеличиваться. Между ними иногда возникают нежелательные значения, которые должны быть заменены на ноль, либо на предыдущее, либо на следующее значение. Если значение между двумя хорошими значениями внезапно становится равным нулю, его следует заменить на увеличивающееся или уменьшающееся значение в зависимости от последовательности, которой оно следует. Есть много таких файлов с разными значениями, поэтому ищете общее решение?

values ​​= [0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 221, 218, 215, 223, 222, 218, 213, 185, 185, 185, 184, 175, 172, 184, 168, 164, 165, 164, 165, 176, 173, 172, 165, 161, 156 , 152, 148, 145, 141, 139, 138, 135, 133, 133, 133, 133, 133, 133, 135, 133, 133, 131, 132, 132, 131, 131, 131, 132, 131, 127, 129 , 127, 122, 115, 0, 118, 129, 0, 0, 0, 0, 0, 0, 0, 0, 116, 115, 0, 0, 0 0, 0, 0, 0, 0, 0, 163, 0, 0, 0, 116, 116, 0, 116, 115, 115, 0, 0, 131, 132, 132, 120, 120, 122, 127, 130, 132, 132, 134, 134, 146, 147, 148, 131, 131, 148, 148, 148, 148, 148, 149, 149, 150, 0, 151, 152, 160, 165, 169, 173, 177, 173, 173, 175, 176, 177, 189, 191, 192, 191, 192, 194, 197, 204, 209, 217, 223, 0, 222, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Я пытался написать код для того же самого, и это может быть очень плохим способом. Вы можете предложить любой другой метод.

 def filter1(Z):

        for index3, item3 in enumerate(Z):
            if Z[index3] != 0 and Z[index3-1] != 0 and (index3 != 0 or index3 != 1 or index3 != 2 ) :
                if (Z[index3] > Z[index3-1]) and (Z[index3+1] > Z[index3]) and (Z[index3+2] > Z[index3+1]): # and (Z[index3+3] > Z[index3+2]):
                    if (Z[index3-2] == Z[index3-1] == Z[index3+1] == Z[index3+2]) or (Z[index3-1] == Z[index3+1]) or (Z[index3+2] == Z[index3+1]) :
                        Z[index3] = Z[index3+1] 
                    else:
                        if Z[index3-1] != 0 and Z[index3+1] != 0:
                            Z[index3] = min(Z[index3-1], Z[index3+1])
                        else:
                            Z[index3] = max(Z[index3+1], Z[index3-1])

                else: 
                    if Z[index3] > Z[index3-1]:
                        if Z[index3-2] == Z[index3-1] == Z[index3+1] == Z[index3+2] or Z[index3-1] == Z[index3+1] or Z[index3-2] == Z[index3-1] ==Z[index3-3]:
                            Z[index3] = Z[index3-1] 
                        else:
                            if Z[index3-1] != 0 and Z[index3+1] != 0:
                                Z[index3] = min(Z[index3-1], Z[index3+1])
                            else:
                                Z[index3] = max(Z[index3-1], Z[index3+1])
            else:
                if index3 == 0:
                    continue
                else:
                    if Z[index3] != 0:
                        if Z[index3-1] == Z[index3+1]:
                            Z[index3] = Z[index3-1]
                        else:
                            if Z[index3-1] == Z[index3-2] == Z[index3+2] ==  0:
                                Z[index3] = Z[index3-1]
                            else:
                                if Z[index3+1] == Z[index3+2] ==  0:
                                    Z[index3] = Z[index3+1]                                                            
                    else:
                        #  if Z[index3-1] == Z[index3+1] :
                        if Z[index3-1] != 0 and Z[index3] == 0:
                            Z[index3] = Z[index3-1]
filter(df.values)
...