다음 질문이 있습니다. 때때로 양수이고 때로는 음수 인 값이있는 히스토그램이있는 열이있는 팬더의 시계열을 작업 중입니다. 데이터 프레임의 새 열을 양수에서 음수에서 마지막 시간까지 변하는 순간의 행 번호의 차이이기 때문에 지속적으로 변경되는 시간 또는 범위의 각 창에 대한 로컬 최대 / 최소 값으로 채워야합니다. 부정적에서 긍정적으로 그리고 그 반대로 바뀌 었습니다. 효율성을 위해 pandas 또는 numpy 방법도 사용해야합니다.
다음과 같이 마지막으로 양수에서 음수로 또는 그 반대로 변경된 행 위치로 채워진 df.loc로 보조 열을 만들어 실험했습니다.
df.loc[(df.Histogram.shift(1) > 0) & (df.Histogram < 0), 'LOC'] = df.index.get_loc(df.Histogram)
df.LOC.fillna(method='ffill')
(오류가 발생했습니다) 나중에 이러한 행 위치 간의 차이를 계산하여 현재 최대 / 최소 시간 창을 정의한 다음 df.Histogram.rolling (loc_differences) .max () 메서드를 적용하려고했지만 만들지 못했습니다. .rolling은 고정 창 값 만 허용하고 열을 위치로 채울 수 없기 때문에 작동합니다. 이에 대한 간단한 해결책이 있어야한다는 것을 알고 있습니다. 이것은 내가 찾고있는 것의 예입니다.
Date Histogram Max/Min Value
01/02/2021 0.2 0.7
02/02/2021 0.3 0.7
03/02/2021 0.7 0.7
04/02/2021 0.2 0.7
05/02/2021 -0.2 -0.5
06/02/2021 -0.5 -0.5
07/02/2021 -0.1 -0.5
08/02/2021 0.4 0.4
09/02/2021 0.3 0.4
10/02/2021 -0.2 -0.2
11/02/2021 0.2 0.7
12/02/2021 0.7 0.7
13/02/2021 0.2 0.7
14/02/2021 0.3 0.7
15/02/2021 0.6 0.7
16/02/2021 0.2 0.7
17/02/2021 -0.2 -0.5
18/02/2021 -0.5 -0.5
19/02/2021 -0.1 -0.5
20/02/2021 0.4 0.4
21/02/2021 0.3 0.4
22/02/2021 -0.2 -0.3
23/02/2021 -0.1 -0.3
24/02/2021 -0.3 -0.3
25/02/2021 -0.1 -0.3
16/02/2021 0.2 0.3
27/02/2021 0.1 0.3
28/02/2021 0.3 0.3
이에 대한 해결책이 있습니까? 미리 감사드립니다.
다음은 히스토그램 데이터를 양수 / 음수 값 그룹으로 분할하는 편리한 방법입니다. grp
열이 증가 할 때마다 히스토그램 열은 부호를 변경하고 동일한 grp
값을 가진 모든 행 은 두 부호 변경 사이의 동일한 간격에 속합니다.
df['grp'] = (df.Histogram > 0).astype(int).diff().abs().cumsum().fillna(0)
df.head(10)
Date Histogram grp
0 01/02/2021 0.2 0.0
1 02/02/2021 0.3 0.0
2 03/02/2021 0.7 0.0
3 04/02/2021 0.2 0.0
4 05/02/2021 -0.2 1.0
5 06/02/2021 -0.5 1.0
6 07/02/2021 -0.1 1.0
7 08/02/2021 0.4 2.0
8 09/02/2021 0.3 2.0
9 10/02/2021 -0.2 3.0
의 선택 (df.Histogram > 0)
은 임의적이며 0을 음수 값으로 계산합니다. 히스토그램 시퀀스는 0.2, 0, 0.4, 0.3
그룹을 생성 [0, 1, 2, 2]
하고 시퀀스 -0.2, 0, -0.4, -0.3
는 단일 그룹을 생성합니다. 이것이 문제에 적합한 지 여부를 결정해야합니다.
에서 반환 한 첫 번째 행에 대해 발생할을 ( .fillna(0)
를) 채울 NaN
수 있습니다 .diff()
. 0 대체 값의 선택은 정당합니다. 첫 번째 행에서 두 번째 행으로 부호가 변경되면 grp
행 2에서 1이되고 행 1을 자체 그룹에 올바르게 배치합니다. 부호가 변경되지 않은 경우 grp
2 행에서 0이되고 1 행과 올바르게 그룹화됩니다.
이제 다음 groupby
과 같이 사용하여 그룹당 최소 / 최대 값을 계산할 수 있습니다.
minmax = df.groupby('grp', as_index=False)['Histogram'].agg(
{'hist_min': min, 'hist_max': max})
df = df.merge(minmax, on='grp')
df.head(10)
Date Histogram grp hist_min hist_max
0 01/02/2021 0.2 0.0 0.2 0.7
1 02/02/2021 0.3 0.0 0.2 0.7
2 03/02/2021 0.7 0.0 0.2 0.7
3 04/02/2021 0.2 0.0 0.2 0.7
4 05/02/2021 -0.2 1.0 -0.5 -0.1
5 06/02/2021 -0.5 1.0 -0.5 -0.1
6 07/02/2021 -0.1 1.0 -0.5 -0.1
7 08/02/2021 0.4 2.0 0.3 0.4
8 09/02/2021 0.3 2.0 0.3 0.4
9 10/02/2021 -0.2 3.0 -0.2 -0.2
마지막으로 부울 인덱싱을 사용하여 원하는 값을 조합 할 수 있습니다.
df['minmax'] = df.hist_min
df.loc[df.Histogram > 0, 'minmax'] = df.hist_max[df.Histogram > 0]
df.head(10)
Date Histogram grp hist_min hist_max minmax
0 01/02/2021 0.2 0.0 0.2 0.7 0.7
1 02/02/2021 0.3 0.0 0.2 0.7 0.7
2 03/02/2021 0.7 0.0 0.2 0.7 0.7
3 04/02/2021 0.2 0.0 0.2 0.7 0.7
4 05/02/2021 -0.2 1.0 -0.5 -0.1 -0.5
5 06/02/2021 -0.5 1.0 -0.5 -0.1 -0.5
6 07/02/2021 -0.1 1.0 -0.5 -0.1 -0.5
7 08/02/2021 0.4 2.0 0.3 0.4 0.4
8 09/02/2021 0.3 2.0 0.3 0.4 0.4
9 10/02/2021 -0.2 3.0 -0.2 -0.2 -0.2
전체 프로세스는 가능한 한 벡터화되므로 성능이 적절해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다