2023년 10월 20일 금요일

[2023-10-20] jupyter notebook plot with plotly (인터렉티브 챠트 그리기, feat. 굿즈샵)

jupyter notebook plot with plotly 

인터렉티브 챠트 그리기

안녕하세요. 클스 입니다.

1. 개요


- 데이터 분석을 하다보면 jupyter EDA 과정이나 분석 결과를 시각화하는 데 Jupyter Notebook을 
   많이 사용한다.

- 그런데 matplotlib, seaborn 등을 사용해서 많이 그리게 되는데 문제는 정적인 이미지로 챠트가
   그려지기 때문에 좀 더 세분화하여 보려면 챠트를 다시 그려야 한다.

- 이때 챠트의 범위를 지정하여 세분화를 자동으로 할 수 있게 interactive한 챠트를 그릴 수 있는 것이
   바로 plotly이다. 


2. 소스 및 데이터


- 데이터는 아래와 같이 tm, 001 이다. data.csv 로 저장해둔다

tm,001
2023-10-19 00:00:00,2.071314
2023-10-19 00:10:00,2.0601258
2023-10-19 00:20:00,2.0492716
2023-10-19 00:30:00,2.0405643
2023-10-19 00:40:00,2.0341525
2023-10-19 00:50:00,2.0311875
2023-10-19 01:00:00,2.0286407
2023-10-19 01:10:00,2.0251791
2023-10-19 01:20:00,2.025551
2023-10-19 01:30:00,2.026254
2023-10-19 01:40:00,2.0247104
2023-10-19 01:50:00,2.0253887
2023-10-19 02:00:00,2.0254912
2023-10-19 02:10:00,2.029705
2023-10-19 02:20:00,2.0295382
2023-10-19 02:30:00,2.0286813
2023-10-19 02:40:00,2.028376

- plotly로 시각화 하기

import plotly.express as px
import pandas as pd

df_chart = pd.read_csv('data.csv')
df_chart['tm'] = pd.to_datetime(df_chart['tm'])
df_chart.set_index('tm')

start_dt = df_chart['tm'].iloc[0]
end_dt = df_chart['tm'].iloc[-1]
print(f'{start_dt} - {end_dt}')

fig = px.line(df_chart, x="tm", y="001", title='시각별 2차 압력 ', text="001")
fig.update_xaxes(
# tickvals=pd.date_range(start=start_dt, end=end_dt, freq='6H'),
title_text='시간',
tickangle=-45,
tickformat='%Y-%m-%d(%a) %H:%M',
showticklabels=True,
showspikes=True,
spikemode='toaxis',
ticks="outside",
tickwidth=2,
tickcolor='crimson',
ticklen=10,
)
fig.update_yaxes(title_text='2nd 압력', ticks="outside", tickwidth=2,
tickcolor='crimson', ticklen=10, col=1)
fig.update_traces(textposition="bottom right")
fig.show()

결과



아래 그래프에서 범위를 지정하면 좀더 상세하게 볼 수 있다.




- matplotlib 으로 시각화 하기 (한글을 표시하기위해 나눔고딕 폰트가 필요하다)

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from matplotlib.dates import DateFormatter
from matplotlib import dates

path = '/Library/Fonts/NanumGothic.otf'
fontprop = fm.FontProperties(fname=path, size=18)

df_chart = pd.read_csv('data.csv')
df_chart['tm'] = pd.to_datetime(df_chart['tm'])
df_chart.set_index('tm')

start_dt = df_chart['tm'].iloc[0]
end_dt = df_chart['tm'].iloc[-1]
print(f'{start_dt} - {end_dt}')

# 그래프 그리기
plt.figure(figsize=(20, 5))

# 데이터를 플롯
plt.plot(df_chart['tm'], df_chart['001'], label='Data', color='b')

# X 레이블을 6시간 간격으로 설정
ax = plt.gca()
date_format = DateFormatter("%Y-%m-%d %H:%M(%a)")
ax.xaxis.set_major_formatter(date_format)
ax.xaxis.set_major_locator(dates.HourLocator(interval=3)) # 시간 간격

plt.xticks(rotation=45) # X 레이블의 날짜/시간을 회전하여 가독성 향상

plt.title('시각에 따른 압력 데이터', fontsize=14, fontproperties=fontprop) # 제목 설정
plt.xlabel('시각', fontsize=12, fontproperties=fontprop) # X 레이블 설정
plt.ylabel('2차 압력값', fontsize=12, fontproperties=fontprop) # Y 레이블 설정

plt.legend() # 범례 추가
plt.grid() # 그리드 추가

# 그래프 표시
plt.tight_layout() # 그래프를 화면에 맞게 조정
plt.show()

- 결과


만약 날짜 범위를 조절하려면 소스를 수정해서 다시 그려줘야 한다.


3. 결론


- 인터렉티브한 그래프는 plotly로 그리자.
https://plotly.com/

이상 클스 였습니다.


이것저것 귀여운 것 파는 샵
집순희 굿즈샵 : https://marpple.shop/kr/cutykids?page=0




라벨: , , , , , , , , ,

2023년 4월 4일 화요일

[2023-04-04] Pandas 2.0 릴리즈 되었습니다.

[2023-04-04] Pandas 2.0 릴리즈 되었습니다. 

안녕하세요. 클스 입니다.


Pandas는 Python으로 데이터 분석을 위해 많이 사용하고, 생태계도 넓습니다.

지속적으로 업데이트가 이뤄지기도 합니다. 대용량 빠른 처리를 위해 Polars로 나왔지만 아직 생태계는

Pandas가 넓기 때문에 기본적으로는 Pandas를 알아야 합니다

plotly 같이 시각화를 하는 library도 pandas가 설치되어 있지 않으면 아예 설치가 안됩니다.

그리고 Polars도 to_pandas 와 같이 호환되는 함수를 제공합니다.


다만, 아쉬웠던 점은 대용량 처리, 메모리 그리고 속도였습니다. 이런 것을 해결하기 위해 Polars가 나왔습니다.

그러나 Pandas 가 놀지만 않죠... 2.0에 속도를 향상시키기 위해 PyArrow 가 들어왔습니다.


주의) Pandas 1.5.3이 삭제가 됩니다. 그래서 virtual env를 하나 생성해서 설치하는 것을 권장 드립니다.


자세한 내용 보기 »

라벨: , ,

2023년 3월 6일 월요일

주소로 고객 검색 서비스 구축하기(feat. Elastic Search v 8.6.2, MacOS) - 3탄

주소로 고객 검색 서비스 구축하기(feat. Elastic Search,  MacOS) - 3탄

안녕하세요. 클스 입니다.


* 목표

- Elastic Search & Kibana 설치 (1탄) - 보기

- Elastic Search Client for Python 설치 및 프로그램 (2탄) - 보기

- 주소 데이터 검색 구조 설계 및 bulk 생성/업로드 (3탄)  - 현재글

- 주소 데이터 검색 구조 설계 및 bulk 생성/업로드 (3.5탄)  - Polars vs Pandas

- 대량으로 검색 하기 (4탄)

- 데이터 백업 및 복구 <유지관리> (5탄)

자세한 내용 보기 »

라벨: ,

2021년 1월 12일 화요일

Google Colab 에 영구적인 Package 설치 방법

Google Colab 에 영구적인 Package 설치 방법


1. 개요

Google Colab을 이용하면 머신러닝에 필요한 자원을 할당받아 활용할 수 있다.

그러나 주어진 세션의 한계 (12시간 마다 초기화), 혹은 런타임 초기화 시 모든 설치된 Package가 사라진다.

여러 패키지를 사용한다면 매번 설치하는 번거로움 있다.

그래서 영구적인 설정 법을 설명한다.


2. 개념

Colab을 연결해서 사용하기 시작하면 구글 드리이브에 아래 2개 디렉토리가 자동으로 생성된다.

'/content/notebooks'
'/content/mnt/My Drive/Colab Notebooks'

Colab을에서 기본으로 만들어주다 보니 
'/content/notebooks' 이 디렉토리는 세션이 종료되거나,
런타임을 초기화 하면 전부 지워진다.


그래서 내 드라이브 하위에 생성된 '/content/mnt/My Drive/Colab Notebooks' 이 디렉토리와
심볼릭 링크를 걸어서 사용하면 된다.


3. 방법 및 소스

소스는 Colab에 붙혀넣고 실행하면 된다. 나는 다른 폴더에 만들고 싶었으나 오류가 발생하였다.

# 구글 드라이브에 Python Package 영구 설치
# 이후 모든 Notebook 파일 시작에 상단을 추가해서 실행해줘야 함. 단 1회만 하면됨

import os, sys
from google.colab import drive

drive.mount('/content/mnt')

nb_path = '/content/notebooks'
nb_package_path = nb_path + '/packages'
my_path = '/content/mnt/My Drive/Colab Notebooks'

os.symlink(my_path, nb_path, target_is_directory=True)
sys.path.insert(0, nb_package_path)


# Python Package 설치

!pip install --target=$nb_package_path jdc
!pip install --target=$nb_package_path ray
!pip install --target=$nb_package_path modin[ray]

# 설치된 패키지 테스트

!ls '/content/notebooks/packages'
!ls '/content/notebooks'
!ls '/content/mnt/My Drive/Colab Notebooks/packages'

# 세션 / 런타임 초기화

1) 메뉴 > 런타임 > 런타임 초기화
2) 구글 드라이브 마운트

import os, sys
from google.colab import drive

drive.mount('/content/mnt')

3) 디렉토리 내용 보기
!ls '/content/mnt/My Drive/Colab Notebooks/packages'



!ls '/content/notebooks/packages'
여기는 마운트가 안되서 오류남

4) 마운트하고 심볼릭 링크 연결함

import os, sys
from google.colab import drive

drive.mount('/content/mnt')

nb_path = '/content/notebooks'
nb_package_path = nb_path + '/packages'
my_path = '/content/mnt/My Drive/Colab Notebooks'

os.symlink(my_path, nb_path, target_is_directory=True)
sys.path.insert(0, nb_package_path)

5) 파일 확인
!ls '/content/notebooks/packages'

여기서 sys.path.insert(0, nb_package_path) 이렇게 Path를 넣어줘야 패키지 로딩시 기본위치가 됨

이상입니다.


라벨: , , ,