df['test'] = np.where(조건, 참일 때 값, 거짓일 때 값) 형태로 쓰게 되는데

각 line별로 function을 태우고 그 값을 넣고 싶을 때가 생긴다.

그 경우 lambda를 활용할 수 있다.

df["test"] = df.apply(lambda r: func(r.col0, r.col1), axis=1)

여기서 axis는 컬럼 기준으로 작업할지, 행 기준으로 작업할지에 대한 매개변수다.

axis=1일 경우 컬럼 기준, 0인 경우 행 기준으로 작업한다.

 

함수의 return이 여러 개인 경우엔,

df["test1"], df["test2"], df["test3"] = zip(*df.apply(lambda r: func(r.col0, r.col1), axis=1))

들어갈 각 열들을 나열하고, zip으로 묶어주면 return의 순서대로 값이 들어간다.

python에서는 굉장히 간단한 형태로 string의 empty 여부를 확인한다.

string 자체를 bool이 들어갈 자리에 두면 값이 있는 경우 True, 빈 경우 False를 반환한다.

(strip()이랑 같이 쓰면 IsNullOrWhitespace 처럼 쓸 수 있다.)

여기에 and나 or 같은 논리연산자가 들어가면

가장 마지막에 검사된 값을 반환한다.

예를 들어,

True or 'test'는 True를 반환한다. (True만 검사하면 무조건 True)

True and 'test'는 'test'를 반환한다. ('test'까지 검사해야 True, False를 알 수 있기 때문)

False and 'test'는 False를 반환한다.(False만 검사하면 무조건 False)

 

이런 고로 논리연산자를 쓸 때 괄호를 쳐주지 않으면 제대로 인식이 되지 않는 케이스가 생긴다.

가령 df[df["test"] == test and df["test1"] == "test"] 같은 형태는

the truth value of a series is ambiguous. use a.empty a.bool() a.item() a.any() or a.all()

같은 에러가 난다.

df[(df["test"] == test) and (df["test1"] == "test")]

괄호로 묶어주면 식이 유효한 경우 에러가 사라진다.

 

numpy의 경우 and, or 대신 &, | 를 사용해야 되는 케이스가 많다.

기업 관련

1. 기업의 최종 미션이 명확해야 한다.
2. 사람을 잘 뽑는 것도 중요하지만 뽑은 사람을 성공으로 이끌 수 있어야 한다.
 - 안 되는 대부분의 이유는 원래 있던 사람이 기득권을 유지하려고 하기 때문
 - stage마다 필요한 사람이 다르다는 것을 이해하고 인지의 제약을 벗어나야 한다.
 - 내가 키워놓은 열매를 신규 인원이 와서 따먹는다는 생각 X
 - 내가 성장해야 회사가 성장하고, 회사가 성장해야 내가 성장한다.

업무 관련

1. 사람은 심리적인 상처를 과장하게 마련. 그런 부분을 주의하고 객관적으로 볼 수 있어야 한다.

 - 클라우드 비용으로 해고된 사람은 다른 회사에 가서도 클라우드 도입 시 비용이 커서 안 된다고 말한다.

2. 문제를 해결 할 때 솔루션에 집중하지 말고 얼마나 중요한 문제인지를 먼저 봐야 한다.

 - 주어진 문제만 솔루션을 내는 수동적인 자세가 아닌 문제 자체가 어떤 히스토리를 갖고 얼마나 중요한지를 먼저 체크

1. DataFrame은 필터링을 하고 다른 곳에 담아도 원본 index를 보존한다.

df_edit = df[df['col0'].str.contains(item)]

이런 식으로 필터를 걸어 할당했다 하더라도, 원래 df에 있던 index를 가져온다.

따라서 len(df_edit) > 0 이라도 df_edit['col0'][0]은 못 불러올 수 있다.

idx    col0

13    "test"

print 해보면 이런 식으로 기존 index가 남아있음을 알 수 있다.

df 자체에서 .head()나 .tail() 로 개수를 가져올 수는 있겠지만 첫번째 줄에 있는 col0의 값을 가져오려면 

index를 reset해야 한다. (혹시나 다른 방법이 있다면 댓글 부탁드린다.)

df_edit = df[df['col0'].str.contains(item)].reset_index()

그러면 하기와 같이 바뀌게 된다.

idx    col0

0    "test"

2. Dataframe은 index열을 필요로 한다.

dictionary를 dataframe으로 convert하는 경우는 자연스럽게 생긴다.

따라서 엑셀을 dataframe 형태로 읽는데 pk값에 해당하는 int열이 없다면, index=false를 항상 줘야 한다.

df = wb.sheets(1).used_range.options(pd.DataFrame, index=False).value

안 그러면 다른 열을 index열로 바꿔버려 정합성이 맞지 않는 경우가 생긴다.

 

총평 : 

너무 Slack 프로모션 느낌이 많이 났다. 실제 사용자에게 유효한 경험들 위주로 소개해줬으면 좋았을텐데
다른 앱에도 있는 비슷한 기능을 이름만 바꿔서 소개한다는 생각이 들었다. [ex. 화상회의 -> 허들] 

개인적으로 Slack의 장점은 남다른 확장성에 있다고 생각하는데 국내에서 많이 쓰고 있는 다른 여타 시스템과의 연계에 초점을 두고 Usecase나 기능 소개를 진행했으면 좋겠다.

[이게 고쳐지지 않으면 다음 웨비나부턴 별로 안 들을 듯]

 


전체 개요

1. 슬랙 기능 관련 설명
2. 슬랙 UseCase


팬데믹 이후 물리적 공간보다는 디지털 공간이 주요 업무 환경

직원들이 소속감을 느끼는 방식이 중요

생산성 향상

1. 다방향 소통
 * 이메일(단방향 소통) 
  문서 요청 - 문서 첨부 혹은 포워딩
  To, CC

 * Slack(다방향 소통)
  메세지를 멘션으로 봐야 할 사람 제약 가능
  메세지에 대해 emoji로 읽었음에 대한 반응 가능

2. 소통의 시스템화
 - emoji를 사용함으로써 비대면 소통에서 필요한 감정 표현 가능
 - 허들 기능을 통해 바로 통화 가능
   => 다중 presentation 가능
   => 바로 영상 통화로 전환 가능
 - 반복되는 일은 맞춤 프로세스로 자동화
 - 승인 절차 간소화
 - 의견 수집 및 반영
 - 외부와의 연결




=======================================

야놀자 usecase

1. 상시 원격 근무 제도

 원격 근무를 많이 하면서 슬랙을 선호하는 이유

 1) 슬랙에서 공개 채널에 올리면 바로 답변 가능
  => 질문/도움이 필요하면 바로 메세지
 2) 비동기 커뮤니케이션, 동기 커뮤니케이션 자유자재로 활용
  => DM과 허들을 수시로 넘나들며 필요한 정보를 주고 받음


2. 조직문화 : Y-CODE
 고객코드
  고객은 모든 사용자이며 차별없이 데이터로 판단. 고객경험 우선시
 생산성코드
  시스템 개선으로 중복을 없애고 문제점을 기록, 공유. 예외보다 합의된 기준을 만듦
 전문가코드
  ...
 
 => 이런 코드를 지키기 위해선 빠르고 정확하게 소통할 수 있어야 함


3. Slack을 활용한 신규입사자 온보딩 방안
 1) 슬랙에서 합의된 약속 공유
 2) New Joiner 마크를 부착
 3) 강의안에 관련 슬랙 채널을 표시하고 대표 채널 TOP10 소개



------------------------------------------------

야놀자 system infra team usecase

 CCC
 Connect
  외부 조직과 바로 연결
  외부 조직이 슬랙을 사용 바로 연결
  아니라면 게스트 계정 발급
 Channel
  업무 관련 문의를 위한 로비 채널 운영
  => _lobby_it_helpdesk
  => _lobby_it_infra
 Custom
  이모지 만들기와 사용
  워크플로(결재 등)
  슬랙봇
  앱연동




파이썬은 객체 지향 함수이기 때문에 모듈을 import하고 그 객체로부터 메서드(함수)를 뽑아 쓴다.

먼저 메서드가 정의된 파일(모듈)이 abc.py라 가정하고 다음과 같은 내용이 있다고 하자.

def add(a, b):
    return a+b

def minus(a,b):
    return a-b

import abc를 하면 abc 객체를 생성할 수 있다.

그 객체에서 메서드를 뽑아서 사용하면 된다.

a = abc.add(3, 5)

b = abc.minus(3, 5)

 

다른 패키지들도 마찬가지다.

가령 DB에 연결하게 해주는 pymysql 패키지는 import된 후

conn=pymysql.connect(
  host=connHeader['host'],
  port=connHeader['port'],
  user=connHeader['user'],
  password=connHeader['password'],
  db=connHeader['db'],
  charset=connHeader['charset']
)

이런 형태로 연결 객체를 만들어 준다.

1. 판다스의 자료 구조와 장점

Pandas에서 자료구조는

시리즈(Series)라 불리는 Columnal 데이터와

DataTable과 유사한 형태의 테이블 데이터인 데이터프레임(DataFrame)이 있다.

 

기본 자료구조가 정해진 컬럼을 주렁주렁 달고 다니는 row 형태가 아닌 column 형태라서

자료 가공을 하면서 조건에 맞는지 여부를 따질 때, 다른 컬럼을 소환하지 않고 작업할 수 있다.

따라서 작업 속도가 빠르고 데이터 관련 가공은 Pandas를 많이 쓴다.

 

비슷한 궤로 통계를 이용한 데이터 가공에도 강하다.

OLS 같은 통계추정량을 구할 때도 필요한 coefficients 이외는 residual로 처리하는 방식이기 때문에

회귀방정식에 넣는 column만 바로 적용될 수 있다.

[역으로 기존 RDB 형식으로만 작업하면 굉장히 비효율적으로 수행할 거 같다.]

 

2. 현재 사용하는 판다스 버전

터미널에서 pip install pandas=={버전}를 하면 numpy는 종속이라서 같이 깔린다.

현재 연습용으로 버전은 1.2.4를 쓰고 있다.

import numpy as np
import pandas as pd

데이터프레임에 데이터를 담기 위해 Excel을 썼는데 DRM에 걸려 판다스로 바로 읽는 것은 불가했다.

import xlwings as xw

그래서 xlwings도 깔아줬다.

 

3. 컬럼 추가 방법

# 엑셀 파일 이름
filename = 'test2.xlsx'
# 엑셀 인스턴스 생성
app = xw.App(visible=False)
# 엑셀 읽은 객체 생성
wb = xw.Book(filename)
# 데이터프레임 형태로 읽기
df = wb.sheets(1).used_range.options(pd.DataFrame, index=False).value
# 인스턴스 종료
app.kill()

xlwings를 써서 읽으면 엑셀이 켜진다. 그래서 인스턴스를 잡고 닫을 수 있게 했다.

자료에 따로 index가 따로 없으면 index=False로 해야 한다. (기본값은 True)

 

df도 dt랑 비슷해서 df['컬럼명'][1] 같은 식으로 하나의 cell value를 가져올 수 있다.

[다만 columnal이기 때문에 기준이 되는 column이 먼저 쓰임]

# 컬럼 추가
df['Test'] = np.where(df['Column1'].isnull(), "값 없음", df['Column2'])

컬럼의 기본값 필터링을 위해선 numpy 객체를 쓴다.

where 메서드를 쓰고 3항연산자 형태로 입력하면 기본값이 조건에 맞게 구성된다.

 

 

4. row 필터링

# 필터링
df = df[(df['Test'] != '값 없음')]

파이썬 문법 중 특이하면서도 편리한 부분은 리스트 형태의 변수 안에 조건만 쓰면 알아서 필터링 된다는 점이다.

row 필터링은 컬럼명을 쓰는 부분에 해당하는 컬럼 조건을 써주면 된다.

string 관련 여부를 체크하려면 하기와 같이 쓴다.

df = df[df['abc'].str.contains("포함여부 확인하고 싶은 str")]

 

대전제

모든 컨설팅은 결국 좋은 프로세스를 만드는 데 목적이 있고

좋은 프로세스는 직관적, 효율적이면서 목표 기간간 충분히 지속가능하다는 특성을 가진다.

 

--------------------------------------------------------------------------------------------------------

제1원칙

이때 RPA가 추구하는 1차 목표는 안정성이며 2차로 퍼포먼스이다.

1차 안정성 보장한 후 설계를 하고, 그런 설계로 인한 예상 소요시간이 수용 가능한지 체크해야 한다.

 

제2원칙

필수와 선택을 명확히 구분해야 한다.

요구사항에서 '필수'인 것과 '되면 더 좋은 것(선택)'을 구분해야 이것을 어떻게 처리할지 판단이 된다.

보통은 요구사항에서 들어오면 필수로 인식해서 무조건 이걸 성공시켜야 된다 생각하고 필수로직과 같이 태우기 십상인데

결국 선택적 영역에서 오류가 나서 필수 프로세스가 진행되지 못하는 케이스가 많다.

특히 이런 케이스가 잦은 이유는 요구사항을 내는 주체가 대부분 상대적으로 선택적 영역에 관심이 덜하기 때문이다.

 

제3원칙

RPA로 컨트롤 할 수 있는 것과 없는 것을 구분해야 한다.

컨트롤 할 수 있는 것에는 '대응'이 필요하고, 없는 것에는 'Exception'이 필요하다.

이에 따라 디버그를 할 때도 '대응'이 실패했는지, 'Exception'처리에 실패했는지를 구분할 수 있게 설계해야 한다.

 

제4원칙

직접 인식이 어려울 땐 돌아갈 수 있어야 한다.

https://jnaul.tistory.com/303

 

[RPA] 설계와 개발을 쉽게 하기 위한 Proxy 연상

설계와 개발을 하다보면 바로 정보를 가져올 수 없거나 인식 기점을 직접적으로 가져올 수 없는 경우가 있다. 혹은 직접적으로 가져오는 경우 예외 케이스가 많아지는 경우도 있다. 그 경우 Proxy

jnaul.tistory.com

 

+ Recent posts