import numpy as np
import pandas as pd

# None과의 비교
print(None == None)  # True
print(None == np.nan)  # False
print(None == pd.NaT)  # False

# NaN과의 비교
print(np.nan == np.nan)  # False
print(np.nan == None)  # False
print(np.nan == pd.NaT)  # False

# NaT와의 비교
print(pd.NaT == pd.NaT)  # False
print(pd.NaT == None)  # False
print(pd.NaT == np.nan)  # False

None의 경우에만 그나마 == 비교가 가능하다.

다른 경우는 그 자신을 == 처리해도 False가 나온다.

[문제는 이래도 에러가 안 난다.]

nan이나 NaT같은 값들은 특정 value를 지니는 게 아니라, 애초에 비교 자체를 상정하지 않는, 일종의 상태 label 같은 느낌이다.

꼭 np.isnan()이나 pd.isna() 같은 걸로 비교하자.

 

type이 제대로 안 잡혀서 이슈가 있다면

type을 다 지정한 dict를 만들어서 매핑하는 게 가장 확실한 방법이다.

 

다만 시리즈 개수가 엄청 많은데, 최대한 자동으로 잡고 싶다면

df.convert_dtypes()를 쓰면 된다.

특히 엑셀이나 구글 시트에서 읽어온 dict를 dataframe으로 바꾸고 하는 과정에서

무조건 object로 잡히고 이걸 다시 각각 변환해줘야 하는 귀찮음이 있는데

이런 경우 용이하게 자동으로 잡아줄 수 있다.

대부분 개념적으로 특정 키값에 대해 테이블 데이터를 붙이는 작업을 하기 때문에

Outer는 쳐다도 안 보고 Inner나 left join을 찾게 된다.

문제는 한 쪽 부분만 존재하게 되는 케이스이다.

예를 들어,

예약수와 조회수를 같이 보여줘야 한다고 치자.

논리적으로 예약수가 0이라도 조회수는 0이 아닐 가능성이 높다.

조회수를 count하는 방식에 따라 조회수가 0인데도 예약수가 0일 수도 있다.

[가령 특정 채널을 통해 들어오는 조회는 조회수 count가 안 되는 경우]

1. 양쪽이 모두 한쪽만 있는 가능성이 있음

2. 양쪽이 모두 키값에 대해 unique함

이러면 outer로 join해줘야 한다. 한 쪽이 unique하지 않다면 논리적으로 group by 해서 unique하게 만들고 작업하는 게 수월하다.

Query로 치면 Union All로 하면 된다.

 

보통 left join을 검색하면 이런 그림이 나온다

틀린 그림은 아니지만 이렇게 되면 마치 A의 row도 유지될 거라는 착각을 하게 된다.

정확히 이 그림이 의미하는 바는 'A의 정보'가 유지된다는 거지 구조가 유지된다는 의미는 아니다.

예를 들어, A의 키값에 대해 B에 2가지 상태값으로 row가 나뉘어져 있다면

A에 대해 여러 row가 매핑되면서 A의 row가 늘어나게 된다.

따라서 각 테이블 형식의 데이터를 키값으로 A에는 전혀 없는 B의 컬럼을 붙이는 과정이라도

둘 다 키값에 대해 같은 기준으로 묶여있는지 체크가 필요하다.

케이스: 구글시트에서 여러 config 시트를 가져와 for문을 돌리면서 컬럼별 데이터 타입 변환

최초 접근은 이랬다.

dfs = [df1, df2, df3, df4]

for df in dfs:
	for col in df.columns:
    	if '날짜' in col or '일자' in col:
        	df[col] = pd.to_datetime(df[col])
        elif '금액' in col or '수수료율' in col or '분담률' in col:
        	df[col] = df[col].astype(float)
        else:
        	df[col] = df[col].astype(str)

inplace가 안 되는 현상(함수에서 가져다 쓰려고 하면 기존 object 형태)

찾아보니 iteration이 진행되는 전제에 문제가 있었다.

iteration은 기본적으로 해당 iteration의 item에 대한 기존값의 변경을 전제하지 않는다.

그걸 전제하면 update나 delete 행위가 iteration을 하는 변수 자체에 가해지는 경우,

최초에 설정된 iterator가 변경되기 때문이다. [ex) 1~5까지 반복하는데 첫번째 loop에서 4,5를 지워버리는 식]

그렇다고 모든 update 행위가 안 되는 것은 아니어 보인다. 논리적으로 성립 가능한 update 행위도 있을 수는 있다.

다만 이런 가능성은 습관적으로 배제하는 것이 좋다.

dfs = [df1, df2, df3, df4]
sheets = {}

for idx, df in enumerate(dfs):
	for col in df.columns:
    	if '날짜' in col or '일자' in col:
        	con_df[col] = pd.to_datetime(df[col])
        elif '금액' in col or '수수료율' in col or '분담률' in col:
        	df[col] = df[col].astype(float)
        else:
        	df[col] = df[col].astype(str)
    sheets[idx] = df

iteration을 수행하면서 해당 변수를 업데이트/삭제를 하는 경우 새로운 container에 담는 습관을 들여야 겠다.

(특히 형변환)

증상: UIFramework default로 잡으면 최초 인식 실패함. 수동으로 default를 설정 후 잡으면 통으로 잡히고 프레임워크를 한번 새로고침 해줘야 인식 가능. 이미지로 클릭 또는 attach window 같은 걸 선행해도 마찬가지 증상이 발생.

조치: UIFramework UIA로 Exist를 앞쪽에 추가

 

신기한 케이스인 거 같다. 아마 app에 붙을 때 UIA 방식은 허용되고, default는 허용 안 되는 것으로 보인다.

일단 UIA로 앱에 한번 붙기만 하면 default로 잡아놨던 셀렉터들도 잘 작동하고 있다.

현상: 손으로 켜면 잘 접속되는 프로그램이 uipath의 start command, cmd, powershell로 켜면 접속이 실패됨

조치1.

task manager에서 권한 문제인지 확인. trigger된 경로, 실행 주체가 손으로 켠 것과 모두 동일했음

조치2.

uipath로 더블클릭 했을 때는 실행 및 접속됨

조치3.

uipath로 '실행'을 켜서 경로를 입력하면 실행 및 접속됨

 

결론

CMD, powershell로 trigger 하는 것과 win+r, 더블클릭 실행의 차이가 뭐지? 하다가

혹시 시작위치 차이인가? 해서 경로를 가서 실행했더니 정상 실행 및 접속됨

 

추정원인

MFC에서 파일 리소스 check를 할 때, 설치된 경로로 부터의 상대 경로를 입력해 놓은 것으로 보임

따라서 시작 위치까지 지정하지 않으면 해당 내부 로직에서 파일을 찾을 수 없게 되어 auth가 실패함

'RPA 종합' 카테고리의 다른 글

ROI 산정 v0.9  (0) 2023.07.07
RPA Meetup 짤막 소감  (3) 2023.03.02
NeverSleep 대체 코드  (0) 2023.02.23
플로우차트와 시퀀스  (2) 2022.10.07
업무 타입 분류  (0) 2022.09.08

현재 페이지 URL을 가져오려고 하면 browser 객체에서 가져와야 될 느낌인데

굳이 그러지 않고 page의 아무 element나 잡고

get attributes 에서 url을 적고 output을 받으면 된다.

※ 자동으로 설정되는 리스트에는 없는데 가져온다.

+ Recent posts