원래 보통 분석할 때 Jupyter Notebook에서 많이 진행했다.

 

새로운 프로젝트를 진행하면서 VSCode를 처음 사용해 봤는데, 

프로젝트 디렉토리 관리, Extensions를 통한 편의성 등이 비교도 안되게 편했다.

 

다만, 로컬PC에 있는 VSCode 작업공간 내에서 .ipynb 파일을 생성해서 작업하는 것은 가능했지만,

개발 서버에 존재하는 docker container 안에 있는 jupyter notebook을 파이썬 인터프리터로 사용하지 못해

개발 서버에서 테스트하기가 어려웠다.

 

그래서 찾아보니 VScode에는 "Connect to a remote Jupyter Server" 기능이 존재한다. **참고1

여기에 실행 중인 Jupyter Notebook 주소를 넣으면 해당 인터프리터 내에 존재하는 파이썬 커널 사용이 가능하다.

(처음에 F1 단축키 누른 후,  "Notebook: Select Notebook Kernel" 선택하면 다음 버튼으로 선택 가능하다.) **참고2

 

 

※ "Connect to a remote Jupyter Server" 기능은 VScode 내에 python (또는 jupyter) Extension이

    설치되어 있어야 보이는 것 같다. 

 

※ 로컬 PC에 Docker Desktop을 설치하면 Extension을 활용해서 진행할 수 있다는 의견이 있었으나,

    라이선스 이슈가 걸려서 실행하지 않았다.

 

**참고

1. https://code.visualstudio.com/docs/datascience/notebooks-web#_connect-to-a-remote-jupyter-server

 

Jupyter Notebooks on the web

Working with Jupyter notebooks on the web with Visual Studio Code.

code.visualstudio.com

2. https://code.visualstudio.com/docs/datascience/jupyter-notebooks#_connect-to-a-remote-jupyter-server

 

Working with Jupyter Notebooks in Visual Studio Code

Working with Jupyter Notebooks in Visual Studio Code.

code.visualstudio.com

 

데이터를 분석하거나 모델링 하는 업무는 어떤 언어, 어떤 개발환경(IDE)를 사용하던지 핵심에는 차이가 없다.

파이썬은 입문 난이도 및 확장성을 고려했을 때 가장 효율적인 언어이다.

 

서비스에 모델 결과를 제공하기 위해서는 .py 스크립트로 작성하지만,

코드 한줄 한줄마다의 결과를 관찰하며 모니터링 하기엔 주피터 노트북을 사용하는 것이 효율적이다.

(jupyter notebook 또는 jupyter lab)

 

주피터 노트북에서 분석한 결과는 해당 노트북 파일의 링크를 바로 공유할 수도 있고,

내보내기를 통해서 다양한 파일 포맷으로 다운받을 수 있다. (pdf, html, slide 등)

 

nbconvert와 RISE 패키지는 이러한 변환 or 노트북 환경에서의 슬라이드쇼 보기를 지원한다.

- nbconvert : .ipynb 노트북 파일을 HTML, LaTeX, PDF, 마크다운 등 정적인 포맷 파일로 전환

- RISE : 즉각적으로 주피터 노트북을 슬라이드쇼 형태로 보기 (Reveal.js - Jupyter/IPython Slideshow Extension)

Primarily, the nbconvert tool allows you to convert a Jupyter .ipynb notebook document file into another static format including HTML, LaTeX, PDF, Markdown, reStructuredText, and more. 
nbconvert can also add productivity to your workflow when used to execute notebooks programmatically.

With RISE, a Jupyter notebook extension, you can instantly turn your jupyter notebook into a live reveal.js-based presentation.

 

plotly로 분석결과를 시각화 했을 때 인터랙티브한 그래프를 손쉽게 그릴 수 있다.

이 때 pdf 파일로 출력하는 경우 해당 기능을 출력물에서 온전히 사용하기 어렵다.

 

슬라이드 타입은 PPT 같은 느낌을 줄 수 있으나,

이를 위한 사이즈 조정, 포매팅 작업이 더 손이 많이 간다고 판단했다.

 

따라서 HTML 파일로 출력하고자 했고,

jupyter notebook 내에 download 기능은 설치오류가 있어서 

서버 커맨드 라인에서 pip install을 통해 nbconvert를 설치하고,

커맨드라인 명령어를 통해서 파일을 생성했다.

 

최종 결과 코드는 아래와 같다.

--execute 명령어를 입력하지 않으면 plotly 그래프 결과물이 보이지 않는다.

--no-input 명령어를 입력하면 input으로 들어가는 코드 부분이 출력되지 않아 결과만 깔끔하게 볼 수 있다.

jupyter nbconvert --to html --execute --no-input /work_dir/temp.ipynb
# --execute : 실행
# --no-input : 코드 없이

 

 

 

 

[참고]

 - nbconvert: Convert Notebooks to other formats — nbconvert 7.2.10 documentation

 - RISE — RISE 5.7.1

최초에 블로그에 글을 쓰기로 한 것은 취업 포트폴리오를 정리하기 위한 목적이었다.

하지만 뭔가 공부한 내용을 깔끔하게 정리하지 못했고,

공모전 수상이라던가 하는 거창한 성과가 없었기에 블로그는 그저 애매한 낙서장처럼 되었다.

그리고 시간이 많이 지났다.

 

다시금 글을 쓰려는 이유는 글쓰는 능력을 기르는 것이 중요하고,

기록되고 기억되지 않는 하루는 사실 없었던 하루가 아닐까 하는 두려움 때문이다.

 

어떤 방식으로든 내 생각을 정리하고 표현하는 능력을 길러야한다.

가장 좋은 연습 방법은 내가 경험하고 깨닳은 내용을 글로 쓰는 것이다.

 

또한 지나간 하루하루는 저마다 강한 생명력을 가지지 않는다.

그래서 우리는 특별한 일 없이 지나간 하루를 기억하지 못한채 계속 다가오는 내일을 맞이한다.

오늘의 나는 과거 하루하루 있었던 경험과 생각의 결과물이니,

그저 가만히 흘러만 가는 하루는 어쩌면 오늘의 나에게 도움되지 못하는 버려진 하루가 되는게 아닐까?

그래서 하루를 정리하고, 생각하고 고민한 내용들을 정리하기 위해서 또 기록하려고 한다.

 

그래서 다시 블로그를 시작하려고 한다.

양질의 글을 써낼 재주도, 시간도 없다.

단지 오늘 회사에서 일하며 해결했던 문제들, 오늘 고민한 생각들을 자연스레 써내려 갈 예정이다.

 

이 또한 오래가지 않을 수 있지만

지금 당장 필요하다고 생각되는 일을, 

당장 오늘부터 작게라도 실천할 수 있는 사람이 된 것에 감사하며 글을 마친다.

파이썬 및 판다스는 분석가 입장에서 개발적인 지식이 많지 않아도

코드를 활용해서 분석할 수 있게끔 도와주는 훌륭한 도구이다.

 

대용량 데이터를 분석하다보면 결국 한정된 서버자원으로 많은 데이터를 다뤄야하는 순간이 오고,

이 때 분산처리를 활용하는 등의 방법도 있지만,

기존에 판다스로 구성된 코드라면 여러가지 방법으로 메모리 사용량을 줄일 수 있다.

 

여기에 대한 아이디어는 아래 영상을 많이 참고했다. (가급적 이 글보다 영상을 정독하는 것을 추천한다.)

→ https://www.youtube.com/watch?v=0Vm9Yi_ig58

 

위 영상에 나오는 내용 중 내가 채택한 방식은 아래 두가지이다.

 - 데이터프레임에 사용할 컬럼 타입을 효율적으로 지정

 - 파일 저장 포맷을 변경 (csv → parquet)

 

 

1. reduce memery usage

 - 각 컬럼의 전체 값을 스캔한 후 최대, 최소값에 따라 최소한의 가능한 타입을 지정해준다. (float, int)

   이렇게 했을때 약 20~70% 까지 메모리 사용량이 감소하는 것을 확인했다.

   object 타입은 category 타입으로 지정해주면 메모리 사용량이 감소한다.

   메모리 사용량을 측정할 때는 파이썬 패키지 중 memory_profiler를 활용했다.

   (여담이지만 나중에 고생하는 것보다 최초 코드 작성 시에 코드 레벨로 메모리를 프로파일하면 좋았을 것 같다.)

 

 - 데이터가 작은 경우 타입을 조정했을 때 오히려 메모리 사용량이 커지는 경우도 존재했는데,

   무시 가능한 수준으로 보인다.

 

 - 스캔하여 적정한 타입을 찾는 것도 시간이 걸리는 일이라,

   해당 데이터에 얼마나 자주 접근해야하는지 등을 기준으로 두어 위 방법을 적용할지 선택하면 좋을 것이다.

 

2. pyarrow parquet 파일로 저장할 때 halffloat (float16) 타입은 저장이 불가한 오류

 - 위 방식으로 최소한의 타입을 지정하다보면 float16으로 컬럼타입을 지정해주는 경우가 있다.

   이 상태로 판다스의 to_parquet() 기능으로 저장하면 halffloat 타입은 지원하지 않는다는 오류가 발생한다.

   이 경우의 조치 방식은 두가지이다.

   1) float16 > float32 로 변경 후 저장 : 이 방식은 간단하지만 최초 메모리 사용량을 줄이고자 했던 취지에 반한다.

   2) pyarrow에서 engine='fastparquet' 활용

      - pyarrow로 데이터를 처리할 때 엔진을 pyarrow와 fastparquet 중 선택할 수 있다.

        default는 pyarrow로 설정되어 있는데, 필요한 경우 fastparquet을 엔진으로 사용할 수 있다는 걸 알아두면 좋다.

 

 

- 참고 : Parquet에서 Unhandled type for Arrow to Parquet schema conversion: halffloat 이 발생할 때 (velog.io)

Airflow는 목적에 따라 직렬, 병렬로 Task를 배치 및 실행 가능하다.

 

그 중 Dynamic Tasks는 Dag에서 병렬의 개수를 미리 정하지 않아도,

Task가 실행하는 메서드와 연결되어 유연한 병렬 Task 실행을 도와준다.

 

이 때 Command 생성을 위해 사용하는 메서드에 @Task 데코레이터를 사용해 개별 Task를 생성할 수 있고,

데코레이터 없이 메서드를 생성한 후, 실행하는 Operator만 운영할 수도 있다.

 

Command Task → Dynamic Tasks 구조로 연결된 경우 앞선 Command Task가 정상적으로 수행되면

여기서의 xcom 결과를 받아 따라오는 Dynamic Task가 실행되어야 하지만 Skip 되는 에러가 발생.

 

결론적으로 Command Task의 결과가 None 값을 보내주면

Command Task는 Success로 마킹한 채로 Dynamic Task로 넘어가지만,

Dynamic Task에서 실행할 병렬 Task는 0개이므로, 이 전체 Tasks는 Skipped로 처리된다.

 

어느 Task에서도 에러로 표기해주지 않아 문제 원인을 정확히 파악하는데 시간이 많이 걸렸다.



데이터->결과로 가는 것이 아니라
목적->데이터->결론으로 가는 것이다.

분석 목적을 명확히 하지 않으면, 있는 데이터만으로 짜맞추기만 하고, 실제로 필요한 분석을 하지 못할 수 있다.

문제를 해결할 때 정확한 단 하나의 정답이 존재하는게 아니다. 스스로 정의한 문제를 표현하고, 해결하기에 가장 적합해보이는 결론에 도달해야 한다.

결과와 결론은 다르다. 단순히 수치가 얼마나 증가했고, 평균이 얼마이고를 알고 싶은 것이 아니다. 실제로 어떤 변화가 있었고, 그에 따라 어떤 액션을 해야할지를 시사하는 것이 더욱 중요하다.

문제 > 원인 > 해결방안 순서로 간다.
원인을 파악하지 않고 문제에서 바로 해결방안으로 가지 않도록 주의한다. 그러다간 포괄적이고 의미없는 해결방안만 나올 것이다.
가능한 넒은 범위에서 원인을 떠올리고, 가설이 실제로 맞는지 데이터로 증명한다. 그리고 거기에 따른 해결방안을 연결할 수 있다면 보다 실천가능한 실질적인 해결 방안에 도달할 수 있다.

원인을 떠올릴 때 각 가설별로 여러 단계의 왜를 걸쳐 고민할 필요가 있다. 피상적으로 드러난 것이 실질적인 원인이라기 보단 더 근원적인 원인에 의한 현상일 수 있다.

어쨌든 데이터를 보기 전에 풀고자하는 문제가 무엇인지 명확히 해야한다.

파이썬에서 __name__ 자기자신(모듈)을 호출

  - 직접 실행 > __main__

  - 모듈 호출 > 모듈명

 

직접 코드를 실행할 때와 모듈을 호출했을 때 __name__의 값이 달라지기에

테스트에 사용하고 실제로는 사용하지 않을 코드를 구별하여 효율적인 코드작성을 도움

 

if __name__=="__main__":
    <직접 테스트엔 사용하고 모듈 호출시에는 사용하지 않을 코드 작성>

 

 

# 참고 : 파이썬 if __name__ == "__main__" 의미 (madplay.github.io)

 - 증상 : 로컬 저장소에서 코드 변경, 커밋하고 푸시할 때 진행중 문구만 나오며 완료되지 않음

 

 - 원인 : '21.8.13일부터 깃허브 비밀번호 정책 변경 (계정 보안을 위해 기존에는 개인비밀번호 외 다른 수단을 권장 -> 필수로 변경)

    ㅇ 깃허브 관련 정책 공지 : https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/#what-you-need-to-do-today

 

Token authentication requirements for Git operations | The GitHub Blog

Beginning August 13th, 2021, we will no longer accept account passwords when authenticating Git operations on GitHub.com.

github.blog

 

  - 해결 : 깃허브 계정에서 PAT (Personal Access Token) 생성 후 비밀번호처럼 사용 (실제로 비밀번호 넣는 곳에 이 토큰을 입력)

     ㅇ 깃허브 계정 토큰생성 방법 :  https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token

 

Creating a personal access token - GitHub Docs

Personal access tokens (PATs) are an alternative to using passwords for authentication to GitHub when using the GitHub API or the command line. If you want to use a PAT to access resources owned by an organization that uses SAML SSO, you must authorize the

docs.github.com

 

 

 

혹 제가 잘못 이해한 부분이 있다면 알려주시면 업데이트 하겠습니다.

'분석 > Github' 카테고리의 다른 글

[github] 초보자의 깃허브 탐방  (0) 2018.04.19
[깃허브] 생활코딩(2)  (0) 2018.02.01
[깃허브] 생활코딩(1)  (0) 2018.02.01
[Git] 깃허브를 배워보자  (0) 2018.01.29

(영화 쇼생크탈출에 대한 스포일러가 포함되어 있으니 영화를 먼저 보신 후 게시물 읽기를 권장드립니다.)

 

 

주말 낮 시간. 영화 쇼생크탈출을 봤다.

누명을 쓰고 쇼생크 감옥에 들어간 남자의 생활. 그리고 탈출.

이 것은 우리의 삶과 아주 닮아 있다.

나는 탈출을 원하고 있으며, 주인공 앤디 듀프레인에게 나를 투영해 대리만족을 느낀다.

대리만족에서 그치지 않고 나에게로 가져오기 위해서 배울 점이 많다.

 

  1. 누명을 쓰고 감옥에 들어갔지만, 상황을 탓하지 않고 방법을 찾는다.
    • 그 누구도 나에게 지금처럼 살으라 이야기한 적은 없지만, 나는 현재에 살고 있다. 다만 운이 좋게도 일할 수 있는 직장과 건강한 신체를 가지고 있다. 주어진 환경에서 최선의 방법을 찾고 실천해야한다.

 

  1. 적응하고 익숙해지는 것을 경계하고, 깨어있어야 한다.
    • 마가복음 13장 35절 : "그러므로 깨어 있으라. 집 주인이 언제올진 알 수 없다. 해가 저물때인지, 밤 중일지, 닭이울 때인지, 새벽인지 알수 없다." (Watch therefore: for ye know not what hour your Lord doth come.)
    • 지내다 보면 무엇이든 익숙해지고, 편해진다. 그래야 우리는 주어진 에너지를 효율적으로 쓸 수 있다. 하지만 궁극적인 목표, 내 자유를 위해 끊임없이 생각해야한다. 만들어진 편안함은 나를 위한 것이 아니다. 깨어있으면서 노력한다면 원하던 그 때가 불현듯 다가왔을 때 잡을 수 있을 것이다.
    • 브룩스는 오랜기간 쇼생크교도소에서 도서관 사서를 지내던 인물이다. 교도소 안에서는 상대적으로 배운 사람이었고, 그가 잘 해낼 수 있는 역할을 했다. 사회에 나갔을 때 이미 노쇠하고 뒤쳐진 그는 적응하지 못했고, 적응된 곳으로 다시 돌아가고 싶어 했다. 끝내 그는 자살하고 말았다. 그 어느 곳도, 누구도 나를 끝까지 책임질 수 없다. 나를 이해하고, 세상을 이해한 뒤 내가 세상에 어떻게 기여하고 날 지킬 수 있을 지 고민해야한다.

 

  1. 탈출을 위해선 오랜 시간 수 많은 시련을 견뎌내야한다.
    • 듀프레인은 약 20년도 넘게 수감생활을 했다. 그 과정에서 입에 담기 어려운 나쁜 일을 당하기도 했고, 오랜 기간 독방생활을 하기도 했다. 이런 일상의 시련을 버텨내지 못하면 급해지고, 급해지면 궁극적으로 일을 그르칠 수 있다. 열정적으로 행동하고, 차갑게 판단해야 한다. 따뜻하게 데우면서도, 뜨겁지 않아야 한다.

 

  1. 결정적인 순간에 큰 위험과 어려움을 버텨낼 각오가 필요하다.
    • Andy dufresne who crawled through a river of shit and came out clean on the other side. Andy dufresne headed for the pacific.
    • 탈출을 결심하고 행한 날 밤, 듀프레인은 사람 하나 간신히 누워서 통과할 수 있는 구멍으로 축구경기장의 5배가 되는 거리를 오물을 뒤집어쓰며 기어갔다. 치밀하게 준비한 것도 대단하지만 그럼에도 어려움을 견뎌내고, 큰 고통을 참아야하는 순간이 있을 것이다. 자유에 대한 갈망, 내 길에 대한 확신이 있다면 이 고통은 짧은 순간이 될 것이다.

 

  1. 자유를 향한 갈망을 떠벌리고 다닐 필요가 없다.
    • 듀프레인은 조용한 사람이었다. 난 내 일상, 작은 계획이라도 생기면 말하고 떠벌리는 것을 좋아한다. 때로 이런 말들이 긍정적으로 돌아오는 경우가 있지만, 자유에 대한 갈망은 다를 것이다. 사람들은 대부분 남아있을 것이고, 마음 속 깊이 탈출을 원하지만 그렇게 행하지 못하고 있음을 알고 있을 것이다. 이 때 탈출하겠다는 사람은 이상해보이면서도 시기의 대상이 될 수 있다. 이런 것들 말고도 공유할 수 있는 소재가 많으며, 내가 보여주고 싶다면 성취한 뒤에 보여주면된다. 조급하지도 말고 가볍지도 말자.

 

' > 리뷰' 카테고리의 다른 글

[독서] 데이터 문해력  (0) 2021.12.09
[책리뷰] Still Me - jojo moyes (조조모예스 스틸미)  (0) 2020.02.27

규칙적인 일상의 시작점을 정의하고, 이를 따르는 습관을 만들자.

거창한 것이 아니다. 매일 퇴근 후에 해야할 여러가지를 알고 있다면 이를 실천하는 일만 남았다.

 

때때로 이런 것들이 무겁게 다가와 실천하지 못하고 쉽게 퍼져있거나, 유튜브를 보기만 한다.

그래서 자리에 앉아 이제부터 내가 할 일을 작성하는 것으로 이것을 시작하자.

작성하려고 자리에 앉기 전에 복잡한 생각은 하지 않고, 퇴근 후 나의 목표는 오직 할 일을 작성할 수 있게 책상에 앉는 것이다.

 

사이클의 입구에 도착해 문고리를 잡았다면, 관성에 의해 사이클을 완주하는 것이 더욱 쉬워질 것이다.

오늘, 지금 앉아서 무엇을 할지 적어보자.

 

목표를 선정했다면 거기에 도달하기 위해 가장 중요한 것은 꾸준한 반복과 인내심이다.

하루 아침에 목표지점까지 날 이끌어줄 급행열차는 존재하지 않는다.

매일 우리의 행동으로 인해 일정 확률로 우린 성장할 수 있다.

 

 

E가 나의 성장도이고, p가 어떤 하루에 내가 성장하는 가중치라고 하자.

즉, 내가 오늘 아무것도 하지 않으면 p=0 또는 마이너스가 되는 것이고, 오늘 내가 뭔가라도 한다면 p=0.3 처럼 조금씩 성장할 수 있다.

 

이는 아주 사소해보여서 얼마되지 않아보이겠지만, 시간이 지날수록 복리로 엄청나게 불어날 수 있다.

우리가 통제할 수 있는 것은 p=0 이 되지 않도록 매일 꾸준히 시작하는 것이다.

앉아서 아주 사소하게 진행했다고 해도 된다. 그걸로도 충분하다.

 

복리를 기대한다면 젊어서는 시간이 무기이고, 나이가 들수록 시간이 금처럼 여겨진다.

매일매일 아주 가벼운 나만의 시작을 정하고, 이를 실천하자.

일주일, 한달, 심지어 일년 전과 달라진게 없어보여도 포기하지 말고 매일 꾸준히 실천하자.

그게 우리가 기대할 수 있는 가장 정직하고 확실한 성장이다.

+ Recent posts