노트북 내려보면서 쓰는게 목에 너무 무리가 간다고 생각이 들어서 모니터암과 노트북 거치대를 저렴한 것으로 들여 놓으려고 준비했다. 음화화핫. 이게 끝나면 키보드랑 마우스 교체하는 것도 생각중인데, 일단 그거는 이게 끝난 다음에 시작해도 늦지 않을테니 그때 가서 생각하면 될 것 같기도 하다. 그동안 회사에서 사용하는 키보드를 교체하지 못했던 이유중에 하나가 새거를 사면 기존의 것을 어디에 두나였는데, 이번에 노트북 거치대 사면 키보드랑 마우스 일체형이니까 이참에 교체하면 좋을 것 같다. 회사에서 쓸 기계식 키보드만 하나 알아보면 될 것 같구나. 

 

모니터암 : 지마켓에서 샀어요.

키보드 거치대 : 쿠팡에서 샀어요. 

반응형

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

일이 끝난줄 알았는데, 그게 아니었다.  (0) 2023.09.18
이번주는 정말 무리해서 일했다.  (0) 2023.09.15
좀 지친것 같다.  (0) 2023.09.08
간만에 좀 쉬는중  (2) 2023.09.03
사람이 변했다.  (0) 2023.08.27

 분석 업무 때문에 며칠을 조용히 앉아서 코딩만 했던 지난주, 이번주에는 다른 부서와 저녁 먹고 새로운 업무를 찾아와서 오늘 하루만에 어느 정도 진도를 뽑을 수 있었다. 선임 차장님이 해당 자료를 빠르게 찾아준 덕분에 반나절만에 진도를 뽑을 수 있었고, 덕분에 원래 해야 하는 분석 업무는 내일로 미뤄놨다. 요즘에는 파이썬 코딩에 어느 정도 익숙해져 있고 함수를 쓰는 것도 익숙해진 덕분에 예전처럼 하나하나 날코딩을 하는 일은 최소한으로 줄일 수 있고 시간 측정하는 것이 있어서 마냥 기다리지 않아서 좋았다. 아, 그리고 오늘 얕은 복사, 깊은 복사를 이해하게 된 것도 하나의 좋은 소득이었다.

 

 예전에 팀장을 하면서 코딩하고 쿼리 짜고 데이터 분석하는 일은 손에서 놓지 않았는데, 그 덕분에 이직하고 나서도 정말 잘 적응할 수 있었다. 아마 코딩도 제대로 하지 못했다면 제대로 자리를 잡기는 커녕 오자마자 시작했던 프로젝트도 제대로 마무리 못지고 그만뒀을 확률이 아주 높았을 꺼라는 생각을 하고는 한다. 예전 회사에서 해보고 싶었던 파이썬과 임파를 이용한 코딩을 하고 있는데, 이게 예전 SAS만큼 자동화가 많이 되어서 정말 최소한의 고생을 하고도 빠르게 데이터를 생성할 수 있게 해준다. 내일은 데이터 정리 마무리 하고 모델 돌려보고 정리하는 일을 하려고 한다.

 

 이렇게 보면 참 일도 많고 그동안 찾아다니면서 영업했던 것이 하나하나 성과를 맺는 것 같아서 분석 업무 적용하는데 많은 도움이 되고 있다고 생각한다. 이직한지 이제 겨우 1년 반 정도 되었지만 아직도 적응하고 자리를 잡으려고 최선을 다해서 노력하고 있다. 늘 노력하면서 살아왔지만, 여기서는 자리를 잡아야 한다는 강박관념이 있다. 예전 부서에서는 다들 일이 많았고 전산부처럼 매일매일 해야 하는 일이 있었다면, 이곳에서는 일을 안해도 눈치가 보일뿐 별다른 것은 없다. 물론 내년에 재계약이 될런지는 좀 다른 문제이기는 하지만 말이다. 좀 지친 것 같기는 한데, 내일 하루 열심히 일하고 저녁에는 운동가고 하면 좀 나아질 것 같다. 주말에는 도서관에 가서 강의도 좀 듣고 코딩도 해야겠구나 생각중이다.

반응형

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

이번주는 정말 무리해서 일했다.  (0) 2023.09.15
나를 위한 지름  (0) 2023.09.10
간만에 좀 쉬는중  (2) 2023.09.03
사람이 변했다.  (0) 2023.08.27
간만에 내 이야기  (0) 2023.08.13

지난주에는 금요일 상가집 가서 조문하고 토요일 하루 종일 있다가 토요일 오후 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나 임팔라만 써서 불안한 점이 있었는데, 지금은 참 이것저것 하는 일도 많고 데이터도 많아서 좋습니다.

반응형

+ Recent posts