Pandas가 너무 유명하다보니

수 많은 alternative 라이브러리들이 쏟아지고 있으며 특히, 속도를 개선한 유형이 많다.

 

그러다가 Pandas 보다 100배 더 빠르다는 불오리를 발견하게 되었다.

- https://hwisnu.bearblog.dev/fireducks-pandas-but-100x-faster

 

 

응?! FireDocks가 대체 뭔데, 이런 성능을 보여준다는거지?!

- https://fireducks-dev.github.io/

 

 

성능이 너무 잘 나와서인지 최근 엄청난 뉴스들이 쏟아지고 있다.

성능도 성능이지만, 기존에 Pandas로 작성한 코드를 그대로 사용할 수 있다는 점도 또 하나의 매력이다.

 

실제 측정한 성능은 어떻게 될까?

- https://fireducks-dev.github.io/docs/benchmarks/

 

 

자기들이 측정한 것이라 믿지 못할 수도 있겠지만,

실험한 환경 및 코드를 모두 공개하고 있으니 거짓말은 아닐 것이다 ^^

 

직접 코드를 한 번 돌려봤다.

테스트 환경은 Google Colab을 사용했다.

 

 

현재 최신 버전은 v1.1.5 이다.

 

테스트를 하기 위한 데이터를 생성하고,

실제 groupby 및 mean 실행을 통해 연산을 하는 소요 시간 측정 코드를 작성했다.

 

 

Pandas로 실행을 했을 때엔 3초의 시간이 소요되었는데,

FireDucks는 눈 깜짝 할 사이에 실행이 되어버리는 것을 볼 수 있다.

 

 

라이브러리 호출 부분만 변경했을 뿐인데, 성능이 좋아진다면 사용하지 않을 이유가 없을 것 같다.

 

라이선스는 "the 3-Clause BSD License (the Modified BSD License)"이다.

- https://github.com/fireducks-dev/fireducks

 

 

이렇게 훌륭한 라이브러리를 누가 만들었을까!?

- https://www.nec.com/en/press/202310/global_20231019_01.html

 

 

응?! 여기에서 갑자기 NEC ?!

어쩐지 공식 홈페이지에서 지원하는 언어가 English 외에 Japanese가 있더라니...

 

한 때는 가전제품도 생산을 해서 가끔 눈에 띄이곤 했는데,

요즘은 B2B 사업이나 통신 설비 등에 주력해서인지 주변에서 잘 보이진 않는다.

하지만, 11만명 이상의 임직원이 있는 글로벌한 기업이다.

 

 AI 및 클라우드 사업도 한다고 하던데,

이런 훌륭한 라이브러리도 만들어서 공개하고.... 괜찮은데!?

반응형

안드레 카파시(Andrej Karpathy)와 더불어

초보 병아리들을 위한 강의에 정말 진심인 또 한 명의 명장, 앤드류 응(Andrew Ng) 아저씨 !!!

 

이번에는 파이썬 그것도 그냥 파이썬이 아니라 AI 파이썬 강의를 가지고 찾아오셨다.

- https://www.deeplearning.ai/short-courses/ai-python-for-beginners/

 

 

살짝 아쉬운 점은 한국어 더빙 또는 한글 자막이 있으면 좋았겠지만,

영어 자막 정도로 만족해야 한다. (훌륭한 무료 강의인데, 이것만으로도 감지덕지!)

 

 

출석부 도장 쾅!

 

 

동영상 녹화 강의 단점을 해소하기 위한 AI Chatbot을 제공해준다.

아쉽게도 한글은 안되고 영어로만 된단다.

 

Python 공부와 영어 공부를 한 번에 해결할 수 있다! (원영적 사고!)

 

 

강의를 꾸준하게 듣게 하기 위해 여러가지 수단을 동원하는 듯~ ^^

 

 

가장 멋진 부분 !!!

실습을 하는 환경도 하나의 화면에 같이 제공을 해준다 !!!

 

 

그냥 일반적은 그런 Python 초보 강의가 아니다.

"AI Python" 제목을 달고 있는 강의이다.

 

어떤 차이가 있냐고?

실습 프로젝트 자체가 다르다.

 

Custom Recipe Generator(맞춤형 레시피 생성기): Create an AI-powered tool that generates unique recipes based on available ingredients. You’ll use variables, f-strings, and AI prompts to craft personalized culinary creations.

 

- Smart To-Do List(스마트 할 일 목록): Build an intelligent task manager that not only stores your to-do items but also prioritizes them using AI. You’ll apply your knowledge of lists, dictionaries, and decision-making code to enhance productivity.

 

- Travel Blog Analyzer(여행 블로그 분석기): Develop a program that reads travel blog entries and uses AI to extract key information like restaurant names and popular dishes. This exercise showcases your ability to work with files and leverage AI for text analysis.

 

- Dream Vacation Planner(꿈의 여행 일정 설계자): Create a sophisticated itinerary generator that takes a multi-city trip plan and uses AI to suggest daily activities, including restaurant recommendations. You’ll work with CSV files, dictionaries, and AI prompts to build this comprehensive travel tool.

 

- Data Visualization Project(데이터 시각화 프로젝트): Using popular Python libraries like matplotlib, you’ll create visual representations of data. This could involve plotting price trends of used cars or visualizing travel statistics from your vacation planner.

 

- Web Data Extraction(웹 데이터 추출): Use the BeautifulSoup library to scrape web pages and extract useful information, opening up a world of data for your projects.

 

- Real-time Data Application(실시간 데이터 응용 프로그램): Build a program that interacts with web APIs to fetch and process real-time data, such as current weather information or live currency exchange rates.

 

 

AI와 Python에 관심이 있는 초보자들을 대상으로 하고 있는 훌륭한 강의이다.

이 모든 것이 무료로 제공되는데도 공부를 하지 않는 다면 .... 반성해야 한다!!!

 

반응형

요즘 저녁에 러닝을 하기 위해 격일로 조금 일찍 퇴근을 하는데.

비 예보가 있다는 것을 미처 인지하지 못해서 일도 못하고 러닝도 못하는 그런 사태가...

 

이런 핑계(?)로 갑자기 날씨 정보를 API로 얻어오는 것을 한 번 해보고 싶어졌다.

갑자기? 갑자기!

 

날씨 정보를 어디에서 얻어와야 할까!?

당연히 기상청 !!!

https://www.data.go.kr/data/15084084/openapi.do

 

무료인데다가 심지어 샘플 코드까지 제공해주고 있다.

샘플코드 - Python

 

사용을 위해서는 오른쪽 상단에 위치한 "활용신청"을 클릭하면 된다.

활용신청

 

적절한 내용으로 작성하여 신청하면, 즉시 승인이 된다.

신청 결과

 

상세 내용을 보면 다음과 같이 인증키 정보를 확인할 수 있다.

상세 내용

 

이제 잘 동작하는지 검증을 해보자.

 

1. Python 환경을 맞춰야 한다.

- requests 모듈을 사용하기 위해 설치가 필요하다.

 

2. 지역 위경도값을 확인하자.

- 공공데이터 포털에서 제공하는 참고문서를 다운로드 받아야 한다.

  . 기상청41_단기예보 조회서비스_오픈API활용가이드_(240715).zip

 

- 압축을 풀면 문서 파일이 2개 나오는데, 위경도 정보가 있는 엑셀 파일을 확인하면 된다.

 

- 내가 확인하고자 하는 지역의 X, Y 값을 확인하면 된다.

 

3. 코드 작성

- 다음과 같이 간단한 코드를 작성해보자.

  . API 키는 일반 인증키(Decoding )으로 사용했다.

 

- 실행 결과는 다음과 같이 나온다.

 

 

각 값들의 의미나 활용 관련하여서는 다운로드 받은 참고 자료 中 워드 파일을 살펴보면 된다.

sample

 

일단 기본적인 확인을 해봤으니,

아침에 자동으로 알람 오도록 만들어봐야겠다! ^^

반응형

[문제] Python으로 "Hello world!"를 가장 간단하게 출력하는 방법은?

[정답] 다음과 같은 방법을 생각해낸 사람은 파이썬 고수!!!

Hello world!

 

 

[문제] "python -m antigravity"를 실행하면 어떤 결과가 나올까?

[정답] 'antigravity'의 뜻은 반중력이며, 모든 것을 밀어내는 성질을 의미한다.

antigravity

 

응?! 아무것도 출력되는 것 없이 그냥 끝난다. 그런데... 갑자기 웹 브라우져가 실행되는데...

https://xkcd.com/353/

 

설마 XKCD를 처음보는 분이 계실리가.....?!

 

계실 수도 있으니 ^^ 설명을 해보자면,

 

랜들 먼로(Randall Munroe)가 일주일에 3번 연재하는 Web-Comic으로

공대 개그, Geek스러운 개그가 주된 유머 코드이다.

 

XKCD

 

웹사이트 메뉴 中 WHAT IF? 컨텐츠를 기반으로 책도 출간했다. 번역본도 있다.

아주 위험한 과학책

 

재밌지 않나!?

python CLI 가지고 별 이상한 일이 다 생긴다 ^^

 

 

[문제] python 으로 그래픽 UI를 어떻게 표현할 수 있는지 쉽게 설명할 수 있는 방법은?

[정답] python 에는 오랜 역사(?)를 갖고 있는 거북이(turtle) 모듈이 있다.

turtle demo

 

응!? turtle demo도 지원해준다고!?

turtle example

 

신기한(?) 윈도우가 하나 실행된다.

examples

 

하나 골라 보자.

clock example

 

turtle 모듈을 이용한 예제 코드도 볼 수 있고,

윈도우 하단의 "START"를 클릭하면 실행 결과도 확인할 수 있다.

 

"python -m turtledemo" 실행 하나만으로 이런 어플이 뜬다니,

대체 이런 것들은 어디에 숨어있었던 것인지...

 

그동안 Python을 몇 년 동안 만져왔는데, 지금까지 이런 것들을 전혀 몰랐다니!

 

 

생각보다 재미있어서 이런 것들 찾아서 몇 번 더 포스팅해보겠다 ^^

 

 

반응형

Chapter04. 데이터 요약하

 

정신없이 달리다보니 어느덧 반환점을 돌고 있다. 앗싸~!!!

 

▶ 내용 요약

04-1. 통계로 요약하기

- df.describe()
  . 25%/50%/75% 가 아닌 다른 범위를 알고 싶을 때 : df.describe(percentiles=[0.3, 06, 0.9])
  . object 컬럼의 값 통계를 보고 싶을 때 : df.describe(include='object')


- 일반적인 수학 함수
  . df.mean() / df.median() / df.max() / df.min()


- df.quantile() / sr.quantile() : 분위수
  . df.quantile(0.25)
  . df.quantile([0.25, 0.5, 0.75])


- df.var() : 분산
  . 평균을 먼저 구한 뒤, 평균과 각 데이터 차이를 제곱해서 더한 뒤 데이터 갯수로 나눔


- df.std() : 표준 편차
  . 분산에 루트를 씌운 값

 

import numpy as np

diff = df['대출건수'] - df['대출건수'].mean()
np.sqrt( np.sum(diff**2) / (len(df) - 1) )


- df.mode() : 최빈값. 제일 자주 나오는 값


04-2. 분포 요약하기

- 산점도 : plt.scatter(df['column1'], df['column2'], alpha=0.1)


- 히스토그램
  . plt.hist(df['column1'], bins=5) : y축 폭을 5로 해서 그려라
  . plt.historgram_bin_edge(df['column1'], bins=5)

 

- 상자 수염 그림
  . 상자에서부터 1.5배 IQR 거리 안에서 가장 멀리 떨어져 있는 것 까지 표시

 

plt.boxplot( df[ ['column1', 'column2'] ])
plt.yscale('column')
plt.show()

 

 

▶ 기본 미션

p. 279의 확인 문제 5번 풀고 인증하기

 

기본 미션

 

우와 문제 스케일이 좀 크다 ^^

 

① 데이터 확보

  - https://www.data4library.kr/ 접속해서 데이터를 확보하자.

  - '데이터 제공' 탭을 통해서 데이터를 내려 받을 수 있다.

 

도서관 정보나루

 

② 데이터 읽어들이기

  - 다운로드 받은 데이터를 불러들여서 기본 모양을 살펴보자.

  - 특히, encoding을 신경써야 한다 !!! (정부차원에서 이거 그냥 UTF-8 쓰도록 강제해야하는 것 아닌가)

pd.read_csv()

 

③ Column 상태 확인 및 수정

  - '발행년도'를 가지고 통계를 내야 하는데, 수치형이 맞는지 확인하고, 아니아면 변경을 해야한다.

 

astype()

 

  - 그런데, 위와 같이 에러가 발생한다.

  - 이유는 제일 밑에 나와 있다. "2022(2021)"처럼 입력되어 있는 데이터가 있다보니 casting이 안되는 것이다.

 

  - '("를 포함한 데이터가 얼마나 있는지 확인해보고, '(*)' 부분을 삭제하도록 하자.

 

replace()

 

  - 다시 casting 해보자.

 

error

 

  - 또 에러가 나온다. 숫자가 아닌 데이터가 많은 것 같다.

  - 확인해보자.

 

숫자가 아닌 데이터

 

  - 이거.... 쉽게 갈 수 있는 길을 너무 어렵게 가는 것 같은데....

  - 일단 '.'을 포함한 것들이 많아 보이니 이를 먼저 처리해보자.

 

replace()

 

  - 아직도 243개나 남았다.

  - 데이터를 한 번 더 확인해보고 처리해보자.

 

replace()

 

  - 이제 85개 밖에 안남았다.

  - 데이터 확인해보고, 숫자가 아닌 것들을 전부 날려버리자.

replace()

 

  - astype()을 적용하기 위해서는 ''(공백), NaN 값이 있으면 안된다.

  - ''(공백)을 NaN으로 변환하고, NaN을 모두 0으로 변환해 astype()을 돌리자.

 

astype()

 

  - 드디어 int64 dtype으로 변환되었다.

 

④ draw Histogram

  - 이제 Boolean Indexing을 이용해서 원하는 범위를 한정하고, histogram을 그리면 된다.

histogram

 

 

▶ 선택미션

Ch.04(04-1)에서 배운 8가지 기술통계량(평균, 중앙값, 최솟값, 최댓값, 분위수, 분산, 표준편차, 최빈값)의 개념을 정리하기

 

일반적인 개념 정의는 너무나 잘 정리된 내용이 여기 저기 많이 있으므로 ^^

앞에서 만든 데이터를 가지고 직접 확인해보면서 살펴보겠다.

 

발행년도에 따른 대출건수가 어떻게 되는지를 scatter() 로 표현해봤다.

 

scatter()

 

8가지 기술통계량을 직접 확인해보자.

 

기술통계량

 

① max / ② min : 해당 값의 최댓값 / 최솟값

③ mean / ④ median

    . 평균값은 전체 데이터의 합을 전체 갯수로 나눈값이고,

    . 중앙값은 데이터를 줄 세웠을 때 중간 위치에 해당하는 실제값을 의미한다.

⑤ quantile

    . 분위수를 알려주는 것인데, 일반적으로는 IQR(InterQuartile Range, 사분범위) 사용

    . 명시적으로 원하는 분위수를 확인할 수도 있다.

⑥ var / ⑦ std

    . 분산은 각 데이터와 평균의 차이의 제곱의 총합을 전체 데이터 갯수만큼 나눠준 값이다.

    . 표준편차는 분산에 루트를 씌운 값이다.

⑧ mode

    . 최빈값은 데이터 값 중에서 가장 많은 빈도로 나오는 것을 의미한다.

 

 

우리 모두 파이팅 !!!

반응형

Chapter 03

 

어느덧 3주차 스터디까지 왔다! 와아 ~~~~ !!!

2주차 우수혼공족에 선정되어 간식 선물까지 받았다 ~~~ !!! 꺄아 ~~~~ !!!

 

우수혼공족

 

▶ 요약

3-1. 불필요한 데이터 삭제하기
- *.loc[]
  . slicing(슬라이싱)
    ( *.loc[:, '번호':'등록일자'] )
  . boolean array(불리언 배열)
    ( df.loc[:, df.column != 'map'] )
- *.drop()
  . 지칭하는 column을 삭제
    ( *.drop(column_name, axis=1) )
  . 지칭하는 row를 삭제
    ( *.drop([0,1]) # 0행, 1행을 삭제 )
- *.dropna()
  . NaN 값을 1개라도 갖고 있으면 column 삭제
    ( *.dropna(axis=1) )
  . NaN 값을 모두 갖고 있으면 column 삭제
    ( *.dropna(axis=1, how='all') )
- *.duplicated()
  . 지정한 columns의 값이 동일하면 중복된 행의 값을 리턴
    ( *.duplicated(subset=['도서명','저자','ISBN'], keep=False) )
- *.groupby()
  . 지정한 columns의 값이 동일한 것들을 묶어줌
    ( *.groupby(by=['도서명', '저자', 'ISBN', '권'], dropna=False).sum() )

3-2. 잘못된 데이터 수정하기
- *.info()
  . DataFrame의 다양한 통계를 보여주는 유용한 method
- *.isna()
  . NaN 값을 갖고 있는 column을 보여줌
    ( *.isna().sum() )
- Nan
  . None
  . np.nan
- *.fillna()
  . NaN 값을 갖고 있는 columns에 지정한 값을 채움
    ( *.fillna('없음') )
    ( *['부가기호'].fillna('없음') )
    ( *.fillna( {'부가기호':'없음'} ) )
- *.replace()
  . 값 exchange
    ( *.replace(np.nan, '없음') )
    ( *.replace( [np.nan, '2021'], ['없음', '21']) )
    ( *.replace( {np.nan: '없음', '2021' : '21']) )
    ( *.replace( {'부가기호': np.nan}, '없음') )
    ( *.replace( {'부가기호': {np.nan : '없음'}, '발행년도': {'2021' : '21'}} ) )
  . 정규표현식
    ( *.replace( {'발행년도': {r'\d{2}(\d{2})' : r'\1'}}, regex=True) )

 

 

▶ 기본 미션

p. 182의 확인 문제 2번 풀고 인증하기

 

[문제]

1번 문제의 df1 데이터프레임에서 'col1' 열의 합을 계산하는 명령으로 올바르지 않은 것은 무엇인가요?

 

 

df1['col1'].sum()

df1[['col1']].sum()

df1.loc[:, df1.columns == 'col1'].sum()

df1.loc[:, [False,False,True]].sum()

 

 

※ 위 문제에서 bold 표기한 부분은 책에서 잘못된 부분을 수정한 내용입니다.

    - 문제에서 "것은" 부분이 빠져있었습니다.

    - 보기에서 "df"가 아니라 "df1"이라고 해야합니다.

 

[풀이]

④ 에서 boolean으로 표기된 내역을 보면 [False,False,True]로 되어있기에 'col1'이 아니라 'col3'의 합계가 출력된다.

 

그러면, 이것을 검증해보자.

 

일단, 데이터를 준비해봤다.

NaN 값을 처리하기 위해 Numpy의 np.nan을 사용했다.

 

 

각 보기의 값을 확인해보자.

 

 

확인 끝~

 

 

▶ 선택 미션

p. 219의 확인 문제 5번 풀고 인증하기

 

[문제]

다음과 같은 df 데이터프레임에서 df.replace(r'ba.*', 'new', regex=True)의 결과는 무엇인가요?

 

보기는 생략.

 

※ 위 문제에서 bold 표기한 부분은 책에서 잘못된 부분을 수정한 내용입니다.

    - 문제에서 "같은" 부분이 빠져있었습니다.

 

[풀이]

정규식을 이용한 replace() 문제이다.

정규식을 보면 r'ba.*' 부분을 살펴보면 'ba'로 시작하는 문자열을 지칭하고 있다.

그래서 'ba'로 시작하는 문자열을 'new'로 바꿔치기하면 된다.

 

교재(책) 보기로 보면 ③ 번에 해당하는 결과가 정답이 된다.

 

이것을 검증해보자.

 

 

 

이번 Chapter는 비교적 수월했다.

남은 기간 스스로에게 파이팅 !!!

 

반응형

 

매번 타이밍을 놓쳐서 참여하지 못했던 "혼공학습단"인데,

드디어 모집 공고를 제 때 발견(!)하여 바로 신청할 수 있었다.

 

공짜로 참여할 수 있는 것만으로도 감지덕지인데,

열심히 공부하면 상품권도 준다고 그러고 ... 매주 간식도 주신단다 ~~~ !!!

 

정말 리뷰어 활동할 때도 느꼈지만,

한빛미디어는 정말 밝게 빛나는 햇빛이다 !!!

 

 

신청하고선... 뽑히기를 간절히 바라며... 기다리고 있었는데, 선정 메일이 도착을 해버렸다 !!!!

 

혼공학습단으로 선정이 되면 뭘 해야 되냐고?

말 그대로 빡세게 공부하면 된다!!! ^^

 

완주를 목표로 파이팅 !!!

 

반응형

나름의 이유로 시스템에서 메일을 보내야할 일이 있는데,

이왕이면 Gmail을 이용해보고 싶어서 살펴보기로 했다.

 

일단 Gmail을 통해 이메일을 보내기 위해서

미리 셋팅을 해줘야 할 것이 있다.

 

 

Gmail의 설정 화면으로 이동한 뒤에

 

 

IMAP 사용 설정을 해주면 된다.

 

 

그런데, Python 코드에서 Gmail 인증 부분을 구현해야 이메일 발송을 할 수 있을텐데,

2가지 방법 중 하나를 선택해야 한다.

 

1. 로그인 PASSWORD
2. 앱 PASSWORD

 

로그인 PASSWORD를 사용하기에는 왠지 찝찝한 느낌이 들기에

앱 PASSWORD를 사용하도록 해보겠다. (보안은 중요하다!!! ^^)

 

 

Google 계정 관리 화면에 일단 들어가보자.

 

 

어?! 그런데, 찾고자 하는 "앱 비밀번호" 부분이 안보인다.

 

 

2단계 인증을 사용한다고 해야 원하는 항목이 등장한다.

2단계 인증을 사용하게 되면 조금 불편할 수도 있지만, 보안을 위한 일이니 감수하자!!! ^____^

 

 

전화 및 인증 기기 등을 잘 확인하면서 진행하면 되는데,

 

 

개인적으로 OTP 앱까지 추가해주는 것을 추천한다.

 

자~ 이제, "앱 비밀번호" 항목을 볼 수 있다.

 

 

우리 입맛에 맞게 생성 진행하면 된다.

 

 

그러면 16 digit을 만들어 준다.

 

 

저 비밀번호는 다시 안알려준다. 미리 잘 기억/기록 해야 한다.

 

 

자~ 이제 Gmail에서 준비할 것은 모두 끝났다.

이제 Python 코딩을 시작해보자.

 

 
  #!/usr/bin/env python3
  """
  Send email via Gmail SMTP
  """

  __author__ = "whatwant"
  __version__ = "0.1.0"
  __license__ = "BEER-WARE"

  import smtplib
  from email.mime.text import MIMEText
  from email.mime.multipart import MIMEMultipart

  def send_email(sender_email, receiver_email, app_password, subject, text, html):
      message = MIMEMultipart("alternative")
      message["Subject"] = subject
      message["From"] = sender_email
      message["To"] = receiver_email

      part1 = MIMEText(text, "plain")
      part2 = MIMEText(html, "html")

      message.attach(part1)
      message.attach(part2)

      with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
          server.login(sender_email, app_password)
          server.sendmail(sender_email, receiver_email, message.as_string())

  if __name__ == "__main__":
      sender_email = "whatwant@whatwant.com"
      receiver_email = "whatwant@gmail.com"
      app_password = "xxx"
 
      subject = "This is a lucky email from Python"
      text = "whatwant is a good man."
      html = f"<html><body><p>{text}</p></body></html>"
 
      send_email(sender_email, receiver_email, app_password, subject, text, html)

 

여전히 예쁘지 않은 코드이지만, 그래도 동작한다!

실행하면 된다.

 

 

메일이 잘 도착했다!!!

 

첨부파일까지 보내는 것까지 하려고 했는데, 지금 당장은 필요하지 않기에...^^

나중에 필요로 할 때 해보겠다! ^^

 

반응형

+ Recent posts