다음과 같은 구조를 가진 긴 시간 및 온도 값 목록이 있습니다.
list1 = [[1, 72], [2, 72], [3, 73], [4, 72], [5, 74], [6, 73], [7, 71], [8, 92], [9, 73]]
일부 시간 / 온도 쌍은 데이터의 잘못된 스파이크입니다. 예를 들어 8 시간에 92도까지 급등했습니다. 이러한 갑작스런 온도 상승이나 급격한 감소를 제거하고 싶습니다.
이를 위해 다음 코드를 작성했습니다 (필요하지 않은 항목을 제거하고 스파이크 / 이상 값을 제거하는 부분 만 복사했습니다).
outlierpercent = 3
for i in values:
temperature = i[1]
index = values.index(i)
if index > 0:
prevtemp = values[index-1][1]
pctdiff = (temperature/prevtemp - 1) * 100
if abs(pctdiff) > outlierpercent:
outliers.append(i)
이것이 작동하는 동안 (스파이크로 간주되는 데 필요한 최소 백분율 차이를 설정할 수 있음 outlierpercent
) 매우 오랜 시간이 걸립니다 (목록 당 5-10 분). 내 목록은 매우 길고 (각각 약 5 백만 개의 데이터 요소) 수백 개의 목록이 있습니다.
이 작업을 수행하는 더 빠른 방법이 있는지 궁금합니다. 여기서 나의 주요 관심사는 시간입니다. 이와 같은 다른 유사한 질문이 있지만,이 구조의 매우 긴 목록에는 매우 효율적이지 않은 것 같아서 어떻게해야할지 모르겠습니다! 감사!
outlierpercent = 3
for index in range(1, len(values)):
temperature = values[index][1]
prevtemp = values[index-1][1]
pctdiff = (temperature/prevtemp - 1) * 100
if abs(pctdiff) > outlierpercent:
outliers.append(index)
이것은 시간이 지남에 따라 훨씬 나아질 것입니다.
최신 정보:
첫 번째 이상 값 만 제거되는 문제는 이상 값을 제거한 후 다음 반복에서 제거 된 이상 값 ( prevtemp = values[index-1][1]
) 의 온도를 비교하기 때문 입니다.
나는 당신이 이전 온도를 더 잘 처리함으로써 그것을 피할 수 있다고 믿습니다. 이 같은:
outlierpercent = 3
prevtemp = values[0][1]
for index in range(1, len(values)):
temperature = values[index][1]
pctdiff = (temperature/prevtemp - 1) * 100
# outlier - add to list and don't update prev temp
if abs(pctdiff) > outlierpercent:
outliers.append(index)
# valid temp, update prev temp
else:
prevtemp = values[index-1][1]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다