반응형
지난 포스트에서는 여러 데이터 행에 대해 OLS 함수를 적용하는 여러 방법을 살펴 봤습니다. 이때 매 행마다 반복적으로 OLS를 적용하는 다음 코드를 보면 매번 Series를 만들지 않고 부분 결과의 리스트를 만든 다음에 마지막 단계에서 Series로 변환합니다. 매번 Series를 만들고 이어 붙여도 되지 않을까요?
for row_idx in range(df.shape[0]):
row = df.iloc[row_idx]
m = ols_lstsq(row)
ms.append(m)
results = pd.Series(ms)
일반적으로 Pandas에서 concat 함수 (넘파이에서는 concatenate) 를 반복 호출하는 일은 피해야 합니다. 다음과 같이 매번 Series 객체를 만들어 이어 붙이게 되면 뒤에 항목을 덧붙일 때마다 새로운 Series 객체가 새로운 메모리 위치에 생기는데, 이 새 객체는 이전 객체보다 한 행이 더 깁니다. 게다가 반복할 때마다 새로운 $m$을 저장할 임시 Series 객체를 만들어야 합니다. 속도도 66.9초로 매우 느려졌습니다. (기존에는 16초 정도가 소요됩니다)
t1 = time.time()
results = None
for row_idx in range(df.shape[0]):
row = df.iloc[row_idx]
m = ols_lstsq(row)
if results is None:
results = pd.Series([m])
else:
results = pd.concat((results, pd.Series([m])))
t2 = time.time()
결론적으로 중간 결과를 모을 때는 직접 기존 Series나 DataFrame 객체에 새 값을 append, concat 하는 대신 리스트를 만든 다음 이 결과 리스트로부터 Series나 DataFrame을 구성하는 것이 더 좋습니다.
반응형
'Computer > Pandas' 카테고리의 다른 글
Pandas 문자열 찾기 (0) | 2022.10.13 |
---|---|
여러 데이터 행에 함수 적용하기 (0) | 2022.10.13 |
Pandas groupby (3) (0) | 2021.08.14 |
Pandas - SettingWithCopyWarning (0) | 2021.08.11 |
Pandas groupby (2) (0) | 2021.08.07 |