지난주에는 금요일 상가집 가서 조문하고 토요일 하루 종일 있다가 토요일 오후 6시에나 도착. 이후 일요일에는 내내 누워 있다가 일요일 오후부터 월요일 아침까지 계속 잠만 잤다. 잠깐 눈좀 붙인다는게 월요일 새벽에서나 일어나고 나니까 조금 허무하기는 하더라. 이번주에는 조금 바쁘기도 했고, 몇주동안 괴롭히던 문제를 간신히 해결해서 금요일 적용해서 여유가 있었다. 그래도 주중에 이런저런 일이 많아서 결국에는 금요일 저녁에 완전히 방전이 되었고 토요일에서나 좀 살만해졌다고 해야 할려나.

오늘은 점심에 장인/장모님 모시고 점심 식사를 했다. 세세한 거는 흐흐 페이스북에 올리기는 했지만 말이다. 아쇼카나 마저 봐야겠구만.

반응형

'내 이야기' 카테고리의 다른 글

나를 위한 지름  (0) 2023.09.10
좀 지친것 같다.  (0) 2023.09.08
사람이 변했다.  (0) 2023.08.27
간만에 내 이야기  (0) 2023.08.13
우리는 답을 찾을 것입니다. 늘 그렇듯이 말이죠.  (0) 2023.08.11

2021년 회사 철수 결정 발표하고 나서 이력서 쓰고 걸을때 듣던 노래가 다운타운 베이비 - 블루 이다. 회사 이직하고 적응 하느라, 팀장에게 깨지느라 고생할 때에는 이 노래를 듣지 않았다. 뭐랄까 내게 스트레스를 엄청 받던 시절을 떠올리게 하는 그런 노래라고 해야겠지. 지금은 이직도 하고 팀장도 바뀌고 해서 나름 저리잡고 큰 고민 안하고 다니지만 1년 전만 해도 모델링 결과도 안나오고 팀장은 매주 주간회의 안건으로 화를 내는 상황이었다. 사실 난 일을 하는 것보다 보고서 쓰는 문화를 무척이나 혐오하는 양키 회사를 오래 다녀서  새로운 곳의 문화에 적응하지 못했다. 사실 나는 아직도 이런 회사 분위기에 완전 적능을 한건 아니고 맞춰 나가는 중이다.

예전 책에서 팀장이 보고서의 황제라고 해서 뭔소리인지 이해를 못했는데 여기 와보니 그게 대기업 문화라는 것을 알게 되었다. 이전 회사에서는 그딴거 쓰면 경고 먹는다. 쓸데 없는 거 하지 말고 그 시간에 진짜 일을 하라고 말이다. 거기는 중견기업 정도의 사이즈이니까 대기업은 다른 거겠지 생각하면서 익숙해지려고 노략중이다.

반응형

 확실히 이전 회사 그만두고 나서 주변도 돌아보고 사람들도 좀 챙기게 된 것 같았다. 그때에는 회사에서 그리도 내가 가는 길에서 어떻게든 낙오하지 않으려고 죽어라고 달렸다고 한다면, 회사 그만두게 되고 새로운 회사에서 계약직으로 옮기게 되면서 많이 내려 놓고 앞날에 대해서도 고민을 많이 했다. 예전 회사에서는 끝나지 않을 회사 생활을 생각하면서 어떻게 남은 10년을 잘 채울 수 있을까 생각하면서 살았다면, 지금은 갑자기 회사 그만두고 한달 정도 백수 생활도 해보고 이직하고 그러면서 하루하루 열심히 살아나갔다는 생각이 든다. 일단 새로운 회사에서는 적응을 해야 했고, 적응을 하고 나서는 내가 일할 자리를 잡아야 했고, 이제는 내년 사업계획도 좀 고민하고 그렇게 열심히 살고 있다고 봐야겠지.

 

 끝나지 않을 것 같은 직장생활이 끝나면서, 마음의 여유도 생겼고 주변 친구들도 좀 챙기게 되었다. 예전 회사 동료들 같은 경우를 보면 오히려 회사 그만두고 만나는 경우가 더 잦을 정도라고 해야 할까? 그리고 언젠가부터 친구들 조문가서 주말이면 밤도 세고 장지까지 따라가서 마지막까지 옆에 있어주고는 한다. 예전 같았으면 못했겠지만, 이제 그 정도는 아내가 이해해 주고 좀 쉬게 해준다. 주변 사람들을 챙기고 여유를 갖고 사람들을 볼 수 있게 하는 여유를 갖게 된 것이다. 열심히 달리던 트랙에서 떨어지고 나서 주변 사람들이 보이는 거라고 할까 싶다. 아내는 어찌 되었거나 상가집 가서 밤세우고 하루종일 버스 타고 운구까지 했던 남편을 안타깝게 생각도 해준다. 금요일에 좀 무리한 일정에 새벽까지 술을 마시고 차에서 꾸겨서 잠을 잤더니 오가는 버스 안에서 잠을 잤다고 하더라도 피곤한 것은 변하지 않는다. 서울 올라오면서 2시간 넘게 쉬지 않고 운전을 해야 했으니 말이다.

 

 다음에는 동탄에 가서 친구들이랑 치맥이라도 해야겠다는 생각이 들었다. 주말이 아니라 평일에 좀 여유가 있었으면 좋겠지만, 내가 그럴 여유가 있을지 모르겠다. 하반기에 쓸 수 있는 휴가는 거의 4일 정도 남았고 그 중에 하루는 아무래도 둘째 수능 볼 때 사용해야 하니까 그리 여유가 많은 것은 아니구나. 친구들 보면서 이제 세금에 대해서 고민하고 앞으로 회사를 어떻게 꾸려 나갈까 고민하는 사장님들 보니까, 내가 월급쟁이로서 참 편하게 살았구나 생각이 든다. 친구가 나보고 좀더 열심히 해서 괜찮은 일을 해보지 그랬냐고 말한다. 여기서 말하는 괜찮은 일이란 고시를 봐서 법조인이나 고위 공무원을 해보는게 어떻냐고 묻는 것이다. 어린 나이에는 그렇게 고생하고 몇년을 공부만 하는 삶이 싫었고 주변에서도 별다른 성과를 보지 못하는 사람들을 보면서 싫었는데, 이제 와서 보면 그런 모험을 한 번쯤 해보는 것도 나쁘지는 않았을 것이라고 생각이 든다. 물론 그렇게 살았거나 벤처나 스타트업으로 회사를 다녔으면 지금 나이에 4형제를 키우지는 못했을 테지만 말이다.

반응형

'내 이야기' 카테고리의 다른 글

좀 지친것 같다.  (0) 2023.09.08
간만에 좀 쉬는중  (2) 2023.09.03
간만에 내 이야기  (0) 2023.08.13
우리는 답을 찾을 것입니다. 늘 그렇듯이 말이죠.  (0) 2023.08.11
DP-시즌 2를 봤다.  (0) 2023.08.04

 SAS나 SQL에 익숙해져 있는 사람에게 가장 어려운 부분이 바로 pandas dataframe은 Series의 집합이므로 조건에 따라서 값을 변환하는 경우에는 정상적으로 작동하지 않는다. 아래 코드에서는 np.where() 가 SQL의 CASE WHEN TEN END 처럼 작동할 것이라고 생각했지만 그렇지 않다. 이렇게 row별로 컬럼의 값에 따라서 처리를 다르게 하기 위해서는 for row loop 문으로 처리해야 한다는 문제점이 있습니다. pandas dataframe 레벨에서 모든 문제를 해결하면 좋을텐데, 이게 그렇게 마음처럼 되지는 않으니까 루프문으로 데이터를 생성해야 하는 것입니다.

 np.where(), np.select() 함수는 사용자 정의 함수를 이용해서 작성하는 것보다 훨씬 더 빠릅니다. 예전에는 df.assign() 함수를 이용해서 코드를 변환했는데 이것도 모든 것을 해결할 수 없으므로 이렇게 별도의 사용자 함수를 사용할 수 밖에 없습니다.

 

1. 필요한 라이브러리를 불러옵니다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
In [2]:

2. temp 데이터 프레임을 생성합니다. rgs_dt는 등록일인데, NULL 값일 때 '99999999'로 넣어준다.

temp=pd.DataFrame({'id': [1, 2, 3, 4, 5, 6],
                   'rgs_dt': ['20230101', '20230208', '20221208', '20221021', '20230331', '99999999']})

3. 기준월을 넣어 줍니다.

In [3]:
temp['bas_ym']='202303'

4. np.where()함수를 넣으면 정상 작동하지 않는다는 것을 알 수 있습니다. 에러 코드를 보면 pd.to_datetime()이 조건이 아니라 시리즈 전체에서 작동한다는 것을 알 수 있습니다.

In [4]:
temp['diff']=np.where(temp.rgs_dt=='99999999',
                      99999999,
                      pd.to_datetime(temp.bas_ym, format='%Y%m') - pd.to_datetime(temp.rgs_dt, format='%Y%m%d')
                      )
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-d51adba5b206> in <cell line: 1>()
      1 temp['diff']=np.where(temp.rgs_dt=='99999999',
      2                       99999999,
----> 3                       pd.to_datetime(temp.bas_ym, format='%Y%m') - pd.to_datetime(temp.rgs_dt, format='%Y%m%d')
      4                       )

/usr/local/lib/python3.10/dist-packages/pandas/core/tools/datetimes.py in to_datetime(arg, errors, dayfirst, yearfirst, utc, format, exact, unit, infer_datetime_format, origin, cache)
   1066             result = arg.map(cache_array)
   1067         else:
-> 1068             values = convert_listlike(arg._values, format)
   1069             result = arg._constructor(values, index=arg.index, name=arg.name)
   1070     elif isinstance(arg, (ABCDataFrame, abc.MutableMapping)):

/usr/local/lib/python3.10/dist-packages/pandas/core/tools/datetimes.py in _convert_listlike_datetimes(arg, format, name, tz, unit, errors, infer_datetime_format, dayfirst, yearfirst, exact)
    428 
    429     if format is not None:
--> 430         res = _to_datetime_with_format(
    431             arg, orig_arg, name, tz, format, exact, errors, infer_datetime_format
    432         )

/usr/local/lib/python3.10/dist-packages/pandas/core/tools/datetimes.py in _to_datetime_with_format(arg, orig_arg, name, tz, fmt, exact, errors, infer_datetime_format)
    536 
    537     # fallback
--> 538     res = _array_strptime_with_fallback(
    539         arg, name, tz, fmt, exact, errors, infer_datetime_format
    540     )

/usr/local/lib/python3.10/dist-packages/pandas/core/tools/datetimes.py in _array_strptime_with_fallback(arg, name, tz, fmt, exact, errors, infer_datetime_format)
    471 
    472     try:
--> 473         result, timezones = array_strptime(arg, fmt, exact=exact, errors=errors)
    474     except OutOfBoundsDatetime:
    475         if errors == "raise":

/usr/local/lib/python3.10/dist-packages/pandas/_libs/tslibs/strptime.pyx in pandas._libs.tslibs.strptime.array_strptime()

ValueError: unconverted data remains: 99

5. 2가지 변수를 추가해 줍니다. 

 A. 날짜의 차이는 아래와 같이 간단하게 ().days()로 계산이 가능합니다. :) 네, 아주 쉽지요.

 B. 월의 차이를 계산하려고, #으로 막아 놓은 코드는 정상 작동하지 않습니다. ().days() 와 같은 쉬운 함수가 존재하지 않습니다.

 C. 그래서 어쩔 수 없이 .year(), .month()를 갖고 계산하는 방법 외에는 없습니다. 

In [5]:
temp['diff']=[99999999 if temp.loc[j, 'rgs_dt'] == '99999999'
              else (pd.to_datetime(temp.loc[j, 'bas_ym'], format='%Y%m') - pd.to_datetime(temp.loc[j, 'rgs_dt'], format='%Y%m%d')).days
              for j in temp.index
              ]

#temp['mcn']=[99999999 if temp.loc[j, 'rgs_dt'] == '99999999'
#              else (pd.to_datetime(temp.loc[j, 'bas_ym'], format='%Y%m').to_period('M')
#              - pd.to_datetime(temp.loc[j, 'rgs_dt'], format='%Y%m%d').to_period('M'))
#              for j in temp.index
#              ]


temp['mcn']=[99999999 if temp.loc[j, 'rgs_dt'] == '99999999'
              else (pd.to_datetime(temp.loc[j, 'bas_ym'], format='%Y%m').year -  pd.to_datetime(temp.loc[j, 'rgs_dt'], format='%Y%m%d').year)*12
                   + pd.to_datetime(temp.loc[j, 'bas_ym'], format='%Y%m').month - pd.to_datetime(temp.loc[j, 'rgs_dt'], format='%Y%m%d').month
              for j in temp.index
              ]
In [ ]:
temp
Out[ ]:
idrgs_dtbas_ymdiffmcnmcn1012345
1 20230101 202303 59 <2 * MonthEnds> 2
2 20230208 202303 21 <MonthEnd> 1
3 20221208 202303 83 <3 * MonthEnds> 3
4 20221021 202303 131 <5 * MonthEnds> 5
5 20230331 202303 -30 <0 * MonthEnds> 0
6 99999999 202303 99999999 99999999 99999999
In [ ]:
temp['mcn'].info()
<class 'pandas.core.series.Series'>
RangeIndex: 6 entries, 0 to 5
Series name: mcn
Non-Null Count  Dtype 
--------------  ----- 
6 non-null      object
dtypes: object(1)
memory usage: 176.0+ bytes
In [ ]:
pd.to_datetime('19010101', format='%Y%m%d')
 
Out[ ]:
Timestamp('1901-01-01 00:00:00')

 예전에도 이렇게 코드를 어떻게 해서든 가볍게 짜려고 했지만, 오늘 반나절을 보내고 나서 왜 문제였는지 겨우 알 수 있게 되었습니다. 몇 번이나 코드를 수정했지만 뭔가 개선되는 것은 그리 많지 않았습니다. 그래도 이렇게 파이썬하고도 친해질 수 있어서 다행입니다. 예전에는 SAS나 임팔라만 써서 불안한 점이 있었는데, 지금은 참 이것저것 하는 일도 많고 데이터도 많아서 좋습니다.

반응형

 2021년 4월쯤에 내가 19년 이상 다녔던 회사의 사업부문 철수 발표를 했다. 국내 은행에 입행해서 다른 은행원들처럼 살줄 알았는데, 2년 지나서 외국 은행에 합병되고 외국인 부서장에서 거의 10년 넘게 일을 했다. 마지막 5년은 그래도 한국인 부서장과 일을 했지만 팀장으로 일하면서 매일매일 영어를 쓰고 지역본부 직원들과 회의하고 일하고 업무를 조율하고 팀사람들과 아둥바둥 싸워가며 정말 나를 쥐어짜가며 소모해가며 살았다. 덕분에 방송대 대학원은 휴학을 해야 했고, 중간에 시작했던 컴퓨터 과학과도 제대로 다니지 못할 정도로 정말 일에 치여가며 매일매일 낮에는 일하고 밤에는 코딩하며 회사 프로젝트를 진행하는 업무를 해왔다. 그렇게 살았어도 하나 못한게 있는데, 그게 바로 통계 모델링, 머신러닝 모델링 일이었다. 이걸 제대로 하고 싶어서 공부도 열심히 했고, 팀장이 되어서 빅데이터 솔루션을 도입하려고 노력해왔는데, 뭔가가 제대로 좀 되려고 할때에 회사가 사업부 철수를 해버렸다.

 

 44세에 재취업을 해야 하는 상황에서  빨리 준비를 했고, 다행히 새로운 회사로 옮기게 되었다. 원래 계획은 기존부터 해보고 싶었던 바이오쪽 일을 하기 위해서 1년짜리 연수를 들으면서 재취업 자리를 알아보던가 아니면, 데이터 엔지니어링 코스에 들어가서 처음부터 제대로 수업도 듣고 공부도 해보고 싶었다. 그러나 

반응형

'내 이야기' 카테고리의 다른 글

간만에 좀 쉬는중  (2) 2023.09.03
사람이 변했다.  (0) 2023.08.27
우리는 답을 찾을 것입니다. 늘 그렇듯이 말이죠.  (0) 2023.08.11
DP-시즌 2를 봤다.  (0) 2023.08.04
참 배울게 많은 직군  (2) 2023.07.11

오늘 분석 데이터 점검하다가 내가 실수를 했다는 것을 알아냈다. 아, 진짜 가장 단순한 실수였는데, 왜 그런 바보같은 실수를 저질렀는지 바보같다는 말이 나올 수밖에 없을 정도로 짜증이 났다. 2주 정도의 시간을 날린 것은 그렇다 치고, 선임 차장님에게서 조언을 구해서 그나마 어느 정도 수정할 수 있는 방안을 내일까지 만들어 보려고 한다. 아마 내일 하루 종일 일하고 야근까지 하면 어느 정도 대안을 제시할 수 있을 것도 같다. 예전 회사였으면 많은 고민을 했겠지만, 여기서는 빨리 수습하고 정리해야 하니까 암무래도 이렇게 최선을 다해서 사실을 공유하고 사람들에게 조언을 구할 수 밖에 없다.

그래도 주변에 도움을 주는 사람들이 많기 때문에 다행이라고 할까? 그 덕분에 오늘 하루는 무척이나 바쁘고 정신없이 보내야만 했다. 더군다나 태풍까지 몰려와서 야근할 수 없는 상황이어서 바로 집으로 와서 저녁 먹고 기절해 버렸다. 밥을 먹고 바로 자는 것은 무척이나 안좋은 것이라고 하는데, 언젠가부터 먹으면 바로 졸게 되었다. 집에서는 긴장이 풀려서 그런지도 모르겠다. 눈앞에 책이 무척이나 많은데 제대로 된 책으로 공부한지는 좀 되었구나. 시간이 날때마다 책을 읽어야 하는데, 대부분의 시간은 드라마나 영화 또는 넷플릭스를 보는데 쓰고 있다. 아마 그렇게까지 쉬지 않으면 집에 오자마자 책보고 코딩하고 하는 정신적인 부담값을 견디기가 어려울 것 같기는 하네.

그래도 요즘에는 바로 코딩에 덤비는 것보다는 아무래도 다른 방법으로 바닥부터 차근차근 올라가는데 많은 시간을 두려고 노력하고 있다. 가을이 되면 안방에 가구를 좀 들이고 해야겠다는 생각이 드네. 책을 넣을 책장도 공간이 모자라고 해서 가을에 성과급 나오면 그 돈으로 이것 저것 사볼까 생각중이다.

회사일을 걱정하면서 집에 오는 길이 너무나 힘들었는데, 그래도 좀 쉬고 책도 보고 하니까 재충전이 되는구나. 그래서 오늘 야근을 안하고 집에 오기를 잘했다는 생각이 든다. 내일은 야근 조금 하고 바로 도장으로 가야겠다. 미리 좀 챙겨놔야지.

반응형

'내 이야기' 카테고리의 다른 글

사람이 변했다.  (0) 2023.08.27
간만에 내 이야기  (0) 2023.08.13
DP-시즌 2를 봤다.  (0) 2023.08.04
참 배울게 많은 직군  (2) 2023.07.11
조바심 내지 말자  (0) 2023.06.27

+ Recent posts