Django Project ToDoList - 1

개요

  • Django 한 그릇 뚝딱 교재의 내용에서 멀티캠퍼스 강의에 맞게 일부 수정함
  • 2019년 버전이고 현재는 2023년이기 때문에 소스코드 변경 사항이 필요할 거 같아서 글을 남김

교재 홍보

Untitled

Step 01 - 깃허브 Repo 생성

  • 아래와 같이 깃허브에서 Repo를 생성한다.
  • Repo명 : ToDoList-with-Django

Untitled

Step 02 - 바탕화면으로 Git Clone

  • 이 때 중요한 것은 본인 경로에 한글이 없도록 하는 것이 중요하다.
  • 간혹 한글이 있는 경우 인코딩 문제로 라이브러리 설치 등 되지 않을 수가 있다.
  • 복사할 때는 $ 는 제외한다.
$ git clone https://github.com/your_account_id/ToDoList-with-Django.git

Untitled

대전 공기관 태블로 강의 실습

개요

  • 본 튜토리얼은 실제 공기관에서 진행할 때 수강생들이 직접 보고 할 수 있도록 만든 샘플 자료입니다.
  • 무단 복사 및 블로그 게시는 금지입니다.

Step 01. Tableau Public 다운로드

Untitled

Untitled

Untitled

Step 02. Tableau Desktop 설치 시작

Untitled

Untitled

Step 03. 태블로 화면 확인 및 파일 불러오기

  • 아래 화면에서 Microsoft Excel 파일 불러온다.

Untitled

Untitled

Step 04. 워크시트 1 - 지역별 근로자 수 현황

  • 엑셀 데이터를 불러온 후, 시트로 이동한다.

Untitled

필자의 직무전환, 이직, 그리고 연봉 점프업 1편

개요

  • 수강생들이 가장 궁금해 하는 연봉에 대한 여러가지 이야기
  • 그리고 필자의 이야기
  • 마케팅, SI, 스타트업, 그리고 프리랜서의 이야기
  • 약 2편에 걸쳐서 연재할 예정

어느 오픈 카톡방에서..

첫번째 꿈은 선교 그리고 NGO

  • 20대의 꿈은 쉽게 말하면 돈을 버는 직업은 아니었다. 20대만 해도 커리어의 중요성 보다는 그저 가치 중심으로 살았다. 기본적인 철학.
  • 사고 전환의 계기 : 호주 워킹홀리데이(2011년)
    • 지금은 호주 달러가 매우 약했지만, 운이 좋았던 탓인지 그 당시에는 미국 달러보다 높았다. 이 때 나는 호주에서 약 4개월의 일을 했다. 투잡, 쓰리잡을 하면서, 소위 허드렛일을 하면서 저축한돈이 약 1천 2백만원 가량 되었다 (세금 환급 포함)
  • 그 당시 한국에서 일을 하는 걸 선택하는 대신, 호주에서 일했던 경험이 나에게는 신선한 충격이었다.
    • 같은 일을 하더라도 어느 지역, 어느 나라에서 하느냐에 따라 모을 수 있는 자산의 크기는 달랐다.
    • 이 4개월의 경험이 9년 후, 향후 내가 프리랜서와 현재 일을 선택하는데 주저함이 없도록 만들어 버렸다.
  • 호주에서 돌아와도 여전히 선교와 NGO의 꿈은 놓지 않았고, 관련 대학원에 진학했다. 그리고 여기에서 또 한번의 충격을 받는다.
    • 석사를 졸업한 형의 2014년 NGO 월급여 150만원 –> 2년 뒤 그 형은 NGO를 그만두고 멕시칸 음식을 팔기 시작했다.

IT 기술 그리고 빅데이터의 시대에의 적응

  • 첫번째 꿈을 접고 난 후, 방황을 했던 필자는 지도교수님이 잠깐 알려준 데이터 마이닝에 꽂히기 시작했다. 그리고 그 선택이 현재의 인생이 되었다.
  • DataCamp를 통해 당시 핫했던 R을 공부하기 시작했다. 다행스러웠던 것은 그래도 영어를 충실히 배웠기 때문에, 영어로 공부하는 것에 대해 거부감이 없었다. 그렇게 독학을 1년 넘게 하기 시작했다.
    • 이 때, 기초 프로그래밍, 통계, 머신러닝 등을 모두 독학했다.
    • 공모전에도 혼자 나가기 시작했다. 성과를 낸 건 아니었다. 그러나 공모전에 혼자 나가면서 데이터 분석의 개념과 방향성에 대해 잡히기 시작했다.
  • 그런데, 중요한 것은 이것들은 모두 다른 일을 하면서 직장을 마치고 난 후, 주말에 꾸준하게 공부했다라는 것이다. 여기에서 수강생들에게 조언하는 것이 있다.
    • 그리고 이 지점이 내가 읽어보라고 추천하는 글과 다른 지점이다.
    • 현실적으로 모든 수강생이 좋은 회사에 들어갈수는 없다. 현재 나의 전공, 나이, 학력이 중요하다.
    • 진로 컨설팅을 할 때, 나이가 어리고, 어느정도 대학 학사를 보유했다면 필자는 수강생에게 보다 높은 곳을 지원할 것을 권한다. 지원해서 인턴이라도 할 수 있으면 하라고 권한다. 첫직장에 삼성전자 인턴 경험을 했다고 가정해보자. 두번째 직장을 구하는 것은 훨씬 쉽다.
    • 문제는 그렇지 못한 전공, 나이, 학력을 가지고 있을 때다. 가장 고민이 되는 사람들은 30대 초반의 비전공자, 전문대/고졸이다. 이 수강생이 좋은 회사에 신입으로 들어갈 확률은? 필자는 0으로 본다. 그럼 시작해야 할 곳은 좋지 못할 직장에서 시작할 가능성이 크다. 이 지점이 바로 모순점이다. 첫번째 직장이 중요하다고 하는데, 30대 초반의 비전공자, 전문대/고졸 출신에게 좋지 못할 직장에서 시작하라고 권하는 것이 맞는 컨설팅인가?
    • 필자는 맞다고 본다. 그런데, 선택 기준이 있다. 선택 기준은 SI 업체, 마케팅 대행 업체에 들어간다고 해도 고객사가 누구냐에 따라 달라진다.
    • 기본적으로 IT/빅데이터 산업 구조는 하청구조이다. 하청이라는 것은 원청이 존재하고, 원천에서 사업을 발주하여 여러 SI업체에 외주를 준다. 이 때, 본인이 능력을 발휘하여 고객사에게 인정을 받았다면, 비록 현실은 SI업체에서 저임금을 받고 있지만, 실력은 이미 고객사(대기업) 수준으로 인정을 받았다는 것을 의미한다.

첫번째 직무 - 마케팅 관련

  • 필자가 경험했던 시나리오다. 필자가 IT/빅데이터 직무를 시작했을 때의 스펙은 다음과 같다.
    • 필자의 나이 30대 초반, 학점은행 경영학사, IT/빅데이터 관련 자격증 없음, 국비교육 2회 수료
    • 당시, 대기업에 들어갈 확률 0 / 공기업에 취업할 확률 0
  • 그래서, 필자는 경력이 중요하다고 판단했고, 그 경력을 이루기 위해 중소업체에 100여군데에 이력서를 내기 시작했다.
    • 이 때, 면접까지 간 업체의 수는 5군데 남짓. 이 시기가 독학으로 공부한지 1년이 넘을 때다.
  • 처음에는 SI 업체에 가고 싶었다. 그러나 받아주는 곳은 한군데도 없었다. 그게 그 때 당시의 내 실력이었다.
  • 그래서, 마케팅 관련쪽으로도 지원서를 넣기 시작했고, 그리고 프랜차이즈컨설팅 업체로 이직하게 되었다.
    • 원했던 직무는 아니었다. 그러나 대안이 없었다. SI업체에서 경력을 쌓고 싶었지만 받아주는 곳이 없었던 필자에게 그 와 유사한 일을 시작할 수 있는 것만으로도 감사할 따름이었다.
  • 일하면서 배운 기술 : Google Analytics, Google Tag Manager, Data Studio, 제안서

두번째 직무 - 데이터분석 관련

  • 일을 하면서, 원래 가고자 했던 SI 업체에 이력서를 계속 넣었다. 일을 하면서도 이력서를 넣는 일은 마다하지 않았고, 공부도 틈날 때마다 계속 했다. 이 때에도 약 50여군데는 넣었던 거 같다.
  • 그리고 드디어 기회를 잡았다. 대표님이 당시 LG CNS 출신이셨고, 이제 막 회사를 차렸다. 입사할 당시, 나와 같이 경력이 미천한 사람만 4명 있었다.
    • 강남역 조그만 사무실에서 대표님 포함 5명 + 그 외 다양한 자문을 주신 분들이 있었다.
  • 여기에서 매우 귀중한 기회를 잡게 된다.
    • 회사의 업력이 짧았기 때문에, 단독으로 공기관 입찰은 불가했다. 그런데, 당시 다른 회사에 얹혀서 프로젝트를 하던 중(보통 하청의 재하청이라 말함) 담당 프로젝트 매니저로부터 강의를 제안 받는다. R로 하는 머신러닝 강의
    • 당시 필자는 이미 R로 DataCamp를 통해서 꾸준하게 공부를 해왔던 터라, 강의 준비할 시간은 있었다.
    • 그런데, 강의 경력은? 없었다. 그런데 강의를 하라고 부탁을 받은 것이다. 그리고 대표님도, 이 회사에 R을 할 수 있는 사람은 나뿐이라, 내가 꼭 해야 한다는 것이다.
    • 이 강의가 인생의 전환 포인트가 되었다. 향후 세번째 회사로 이직할 때도 그 회사 대표님이 이 강의를 언급하면서, 짧은 경력에 어떻게 여기에서 강의를 했느냐고 물어볼 정도였으니…
  • 업무 성과의 중요성 : 그리고 오퍼를 받기 시작함
    • 약 3일간의 강의를 진행하였고, 그 후에 3번의 강의를 더하게 된다.
    • 그런데, 분석 관련 미팅 및 프로젝트를 하게 되면서 고객사로부터 계약직 제의를 받기 시작했다.
  • 이 때, 필자는 이직 타이밍을 재기 시작했다.
  • 일하면서 배운 기술 : IT기술 영업, 제안서, AWS, AZURE, GCP 클라우드, Python, SQL, 그리고 IT 프로그래밍 강의

세번째 직무 - 빅데이터 팀장

  • 수강생들에게 하고 싶은 말이 여기에 있다. 첫번째 직장이 중요하다! 그러나, 더 중요한 것은 SI에서 일을 시작했다면, 고객사로부터 인정을 받는 것이 중요하다. 고객사로부터 인정을 받았다면, 그 때가 이직할 타이밍이고, 그리고 이직할 타이밍에서 중요한 건 내가 이직하려고 하는 회사의 산업구조를 이해하는 것이 중요하다.
  • 이 부분은 2편에서 연재할 예정

직무를 전환할 때 반드시 필요한 것 2가지

  • 1일 블로그와 깃허브
  • 필자의 수업을 들었던 수강생들과 가끔 저녁 및 식사를 할 때가 종종 있다. 그럼, 그 친구들이 나로부터 들었던 말 중 기억나는 것을 얘기할 때 마다, 1일 블로그와 깃허브를 종종 말한다.
  • 필자가 가장 아쉬워 하는 것 중의 하나가, 만약 2013년, 14년, 16년 프로그래밍을 처음 접하던 시절부터 블로그와 깃허브를 꾸준히 했더라면.. 하는 아쉬움이 늘 존재한다.
  • 블로그는 본격적으로 프리로 전환한 2020년부터 하기 시작했다. 만약 그 전부터 꾸준히 했더라면, 어땠을까? 하는 아쉬움이 늘 존재한다. 그랬다면 최소 1000개의 글이 내 블로그에 존재할지도 모르겠다.
  • 신입에게 내 성실성과 꾸준함을 객관화 시킬 수 있는 것은 어쩌면 프로그래밍 관련 블로그 뿐일지도 모른다.
  • 참고로 이 글은 3년간 작성한 글의 447번째 글이 될 것이다.

2023년 상반기 결산 - 좋은 인연, 박사학위, 자격증, 출판, 유럽여행

개요

  • 블로그를 3년간 운영하면서 회고 또는 결산하는 글을 써본적은 없었다.
  • 요즘에 역 시차적응 때문인지.. 최근 중요한 결정을 내린 후폭풍인지.. 새벽에 자주 잠이 깨는데, 일어난 김에 몇가지 회고의 글을 남겨보려고 한다. (글쓰는 현재 지금 시각 새벽 2시다..)

좋은 인연

  • 상반기에도 좋은 인연이 생겼다.

    • 수많은 학생들, 새로운 기회의 확장, 새로운 학교 및 새로운 과정에서의 여러 만남들
      • 2개 기관은 작년에 이어서 진행한 건, 1개 기관은 신규로 진행한 건
      • 강의 평가가 모두 좋게 나와서 감사할 뿐이다.
    • 취업준비생 및 재직자 대상으로 약 100여명 넘는 사람들을 만난 듯 하다.
    • 모두 원하는 일과 취업 잘되기를 기도 및 소망한다.
    • 과거 3년전에 만났던 수강생도 최근에 결혼을 했다. 결혼하거든 연락 꼭 주세요 ㅎㅎ
  • 상반기 가장 좋은 인연은 공저자 Sara를 만난 것이다.

(파이썬) 빅데이터 분석기사 실기 - 제2유형, 회귀

작업형 2유형 최종정리

  • 작업형1 : 3문제 (30점), 데이터 전처리
  • 작업형2 : 1문제 (40점), 분류/회귀 예측 모델링
  • 작업형3 : 2문제 (30점), 가설 검정

주요 라이브러리

  • palmerpenguins : 팔머펭귄 데이터셋의 목표는 iris 데이터셋의 대안으로 데이터 탐색 및 시각화를 위한 데이터셋 제공.
  • scikit-learn : 머신러닝을 위한 라이브러리
  • lightgbm : LightGBM은 Microsoft에서 개발한 오픈 소스 기계 학습 라이브러리로, 대용량 데이터셋에서 빠른 속도와 높은 성능을 제공하는 것이 특징

주의

  • 각 코드에 대한 설명은 별도로 하지 않습니다.

데이터 파일 불러오기

import pandas as pd 
from palmerpenguins import load_penguins 

penguins = load_penguins()
penguins['ID'] = penguins.reset_index().index + 1
penguins.head()

Untitled

(파이썬) 빅데이터 분석기사 실기 - 제2유형, 분류

작업형 2유형 최종정리

  • 작업형1 : 3문제 (30점), 데이터 전처리
  • 작업형2 : 1문제 (40점), 분류/회귀 예측 모델링
  • 작업형3 : 2문제 (30점), 가설 검정

주요 라이브러리

  • palmerpenguins : 팔머펭귄 데이터셋의 목표는 iris 데이터셋의 대안으로 데이터 탐색 및 시각화를 위한 데이터셋 제공.
  • scikit-learn : 머신러닝을 위한 라이브러리
  • lightgbm : LightGBM은 Microsoft에서 개발한 오픈 소스 기계 학습 라이브러리로, 대용량 데이터셋에서 빠른 속도와 높은 성능을 제공하는 것이 특징

주의

  • 각 코드에 대한 설명은 별도로 하지 않습니다.

데이터 불러오기

import pandas as pd 
from palmerpenguins import load_penguins 

penguins = load_penguins()
penguins['ID'] = penguins.reset_index().index + 1
penguins.head()

Untitled

(파이썬) 빅데이터 분석기사 실기 준비 - 제3유형

작업형 3유형 최종정리

  • 작업형1 : 3문제 (30점), 데이터 전처리
  • 작업형2 : 1문제 (40점), 분류/회귀 예측 모델링
  • 작업형3 : 2문제 (30점), 가설 검정

라이브러리 확인

  • 파이썬에서 가설검정을 위한 통계와 관련된 라이브러리는 크게 2가지이다.
    • scipy : SciPy는 수치 계산, 최적화, 선형 대수, 신호 및 이미지 처리, 통계 분석 등과 같은 과학적 계산 작업을 수행하는 데 사용됨
    • statsmodels : Statsmodels는 통계 분석과 추정을 위한 파이썬 라이브러리로, 선형 회귀, 로지스틱 회귀, 시계열 분석, 비모수적 추정 등 다양한 통계 모델을 지원함.
  • SciPy와 Statsmodels는 각각의 독립성과 기능을 가지고 있으며, 과학적 계산과 통계 분석을 위한 파이썬 생태계에서 함께 사용되는 보완적인 라이브러리임.

주의

  • 여기에서는 각 검정의 구체적인 원리 설명은 하지 않는다.
  • 코드 위주로만 확인을 하도록 한다.

One Sample T-Test

  • 가설검정
    • 귀무가설 : 붓꽃의 sepal_length의 평균은 5.5이다.
    • 대립가설 : 붓꽃의 sepal_length의 평균은 5.5이 아니다.
import seaborn as sns
import pandas as pd

iris_df = sns.load_dataset("iris")
iris_df.head()

Untitled

Python Pandas 날짜 데이터 다루기

개요

  • 연도, 월, 주만 있는 컬럼을 날짜 데이터 타입으로 변경하려면 어떻게 해야할까?
  • 약간의 트릭이 필요하다

데이터 생성

  • 가상의 데이터를 생성한다.
import pandas as pd

data = [
    {"year": 2020, "month": 1, "week": 2, "company" : "A회사", "revenue_pct" : 49},
    {"year": 2020, "month": 1, "week": 2, "company" : "B회사", "revenue_pct" : 51},
    {"year": 2021, "month": 1, "week": 2, "company" : "A회사", "revenue_pct" : 37},
    {"year": 2021, "month": 1, "week": 2, "company" : "B회사", "revenue_pct" : 63},
    {"year": 2022, "month": 12, "week": 1, "company" : "A회사", "revenue_pct" : 70},
    {"year": 2022, "month": 12, "week": 1, "company" : "B회사", "revenue_pct" : 30},
]

df = pd.DataFrame(data)
df

Untitled

ChatGPT 방식

  • chatGPT에서 알려준 방식으로 진행해본다.
df["date"] = pd.to_datetime(df["year"].astype(str) + df["week"].astype(str) + '1', format="%Y%W%w")
df

Untitled

  • 기대했던 것은 2022-12-1 일 방식인데, 2022-01-03이다.
  • 만약, 전체데이터가 있다면, date 날짜가 중복될 수 있다.

수정된 방식

  • 아래와 같이 수정하도록 한다.
    • 두번째 라인 코드 7-6 은 일종의 특정 일자를 지정하는 것이다.
df["date"] = pd.to_datetime(df["year"].astype(str) + "-" + df["month"].astype(str))
df["date"] = df["date"] + pd.to_timedelta(df["week"] * 7 - 6, unit="D")
df

Untitled

출간 기념, Streamlit으로 프로젝트 한방에 끝내기 with 파이썬(2023, Sara & Evan)

  • 책을 출간하였습니다.

book.jpg

Streamlit이란

  • Streamlit은 데이터 분석가가 간단한 코드 몇줄로 빠르게 웹앱을 만들어 줄 수 있는 Python 라이브러리입니다.

누가 읽어야 할까요?

  • 데이터 분석가 : 웹개발은 모르지만 대시보드를 만들어야 하는 분
  • 국비교육 수강중인 비전공자 : Java 웹개발로 머신러닝 플랫폼을 만들어야 하는 분
  • 개별적인 포트폴리오가 필요한 취업준비생 : ML/DL 알고리즘 익히는 것도 어려운데, 웹개발은 언제 배우죠?

데모 페이지

Untitled

Streamlit와 BigQuery 활용한 배포 (API)

사전학습

실습 순서

  • 서울시 부동산 실거래가를 API 크롤링으로 가져온다.
  • JSON 형태의 데이터를 pandas 데이터프레임으로 변환한다.
  • 데이터프레임을 BigQuery에 전체 데이터를 저장한다.
  • 저장된 데이터프레임을 BigQuery에서 일부 컬럼만 불러온다.

실습 1 - API 크롤링에서 빅쿼리로 데이터 저장

  • .streamlit/secrets.toml 을 열고 아래와 같이 설정한다.
  • seoul_api_key는 서울 열린데이터 광장을 의미한다.
  • gcp_service_account 아래 내용은 api keyjson 파일로 열면 확인할 수 있다.
# .streamlit/secrets.toml
[public_data_api]
seoul_api_key = 'your_api_key'

[gcp_service_account]
type = "service_account"
project_id = "your_project_id"
private_key_id = "your_private_key_id"
private_key = "your_private_key"
client_email = "your_client_email"
client_id = "your_client_id"
auth_uri = "https://accounts.google.com/o/oauth2/auth"
token_uri = "https://oauth2.googleapis.com/token"
auth_provider_x509_cert_url = "https://www.googleapis.com/oauth2/v1/certs"
client_x509_cert_url = "your_client_x509_cert_url"
  • utils.py를 생성하고 아래와 같이 설정을 저장한다.
import streamlit as st
from google.oauth2 import service_account

SERVICE_KEY = st.secrets.public_data_api.seoul_api_key

# Create API client.
credentials = service_account.Credentials.from_service_account_info(
    # Very Important Point
    st.secrets["gcp_service_account"]
)
  • [aptCrawling.py](http://aptCrawling.py) 를 아래와 같이 작성한다.
# -*- coding:utf-8 -*-
import requests
import pandas as pd

# Google Cloud
from google.cloud import bigquery
import pandas_gbq

# API Key Settings
from utils import credentials, SERVICE_KEY
client = bigquery.Client(credentials=credentials)

def aptCrawling(SERVICE_KEY):
    data = None
    for j in range(1,2):
        url = f'http://openapi.seoul.go.kr:8088/{SERVICE_KEY}/json/tbLnOpendataRtmsV/{1+((j-1)*1000)}/{j*1000}'
        print(url)
        req = requests.get(url)
        content = req.json()
        con = content['tbLnOpendataRtmsV']['row']
        result = pd.DataFrame(con)
        data = pd.concat([data, result])
    data = data.reset_index(drop=True)
    data['DEAL_YMD'] = pd.to_datetime(data['DEAL_YMD'], format=("%Y%m%d"))

    return data

def save2BQ(data):
    table_name = "seoul.realestate"
    project_id = "streamlit-dashboard-369600"

    # Save the DataFrame to BigQuery
    pandas_gbq.to_gbq(data,
                      table_name,
                      project_id=project_id, if_exists='replace')

if __name__ == "__main__":
    data = aptCrawling(SERVICE_KEY)
    save2BQ(data)
  • 아래와 같이 실행해보자.
$ python aptCrawling.py
http://openapi.seoul.go.kr:8088/your_api_key/json/tbLnOpendataRtmsV/1/1000
100%|████████████████████████████████████████████████████████████| 1/1 [00:00<?, ?it/s]
  • 이번에는 BigQuery 콘솔에서 확인해본다.

Untitled