2017-12-12 2 views
1

내가 이렇게 신호가 있다고 가정 해 봅시다. 이미 피팅 라운드를 거쳤습니다. 이제 신호를 더 쉽게 관리 할 수 ​​있습니다.시계열에서 비슷한 신호 결합하기

하지만 어떤 이유로 든 제거 할 수없는 몇 가지 차이가 ​​있습니다.

enter image description here

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 


a = [0.5]*20 
b = [0.4]*20 
c = [0.503]*20 
d = [0.4]*20 

signal = pd.Series(np.concatenate([a,b,c,d])) 

plt.figure(figsize = (7,3)) 
plt.plot(signal, color = "firebrick") 
plt.axhline(0.5, linestyle = ":") 
plt.show() 

# Identify the four different intensities, so they can be grouped 
id = signal.transform(lambda x: (abs(x.diff()) > 0).cumsum()) 

나는 해결책을 생각하고있어 높은 [0.4, 0.4, 0.5, 0.503]

낮은에서 모든 신호를 줄 그리고 예를 들어, 작은 차이를 무시하고 다음, 그들을 통해 갈 수 0.010, 그래서

id = signal.transform(lambda x: (abs(x.diff()) > 0.010).cumsum())

은 그 때 나는 제대로에만 2 개의 다른 강도를 식별하는 것입니다. 작은 불일치 때문에 나는 단지 평균값 또는 중간 값을 취할 수 있습니다. 그것은 실제로 차이를 만들지 않습니다. 중요한 것은 2 가지 이상의 강도를 세지 않는다는 것입니다.

어떻게하면됩니까?

+0

당신이 무엇을 요구 분명하지 않다. 귀하의 질문은 무엇인가? 원하는 출력은 무엇입니까? – pault

+0

@pault 본질적으로 나는 0.503과 0.5의 평균이 원래의 데이터와 같은 인덱스에서 같은 값 (평균값, 중앙값, 최소값, 중요하지 않음)에 정렬되도록 피팅의 오버 슈팅을 수정하고 싶습니다. . 말이 돼? –

+0

시리즈를 thresholding하는 것은 어떻습니까? 예를 들어 평균에 의한 임계 값과 평균보다 크고 평균보다 작은 값에 대한 중앙값 계산 : 'med_high = signal [signal> signal.mean()]. ​​median()'및 'med_low = signal [signal pault

답변

1

여기 내 의견에 넣은 아이디어가 자세히 설명되어 있습니다.

신호의 평균을 임계 값으로 사용하십시오. 그런 다음 임계 값을 초과하는 신호의 부분과 아래의 신호의 중간 값을 계산하십시오. 이를 사용하여 데이터를 변환하십시오.

med_high = signal[signal > signal.mean()].median() 
med_low = signal[signal < signal.mean()].median() 
print (med_low, med_high) 

new_signal = signal.transform(lambda x: med_low if x < signal.mean() else med_high) 
plt.figure(figsize = (7,3)) 
plt.plot(new_signal, color = "firebrick") 
plt.axhline(0.5, linestyle = ":") 
plt.show() 

결과 :

enter image description here