[데이터분석][데이터 사이언스][python][Dash]

Python, Dash 및 Plotly를 사용하여 COVID-19 사례 데이터 시각화

Python, Dash 및 Plotly를 사용하여 COVID-19 사례 데이터 시각화

 

나만의 대시 보드 웹 응용 프로그램 만들기 — 오늘!

이 기사는 COVID-19에 대한 것이 아니라 Python & Dash를 사용하여 유용한 웹 애플리케이션 을 만드는 방법에 대해 자세히 설명합니다 . 이 기술을 시작하고 실행하기위한 간단한 가이드로 만들어 졌으며 혼자서 쉽게 수행 할 수 있습니다 !

R & Shiny를 사용하여이 작업을 수행하는 방법에 대해 거의 동일한 기사를 작성 했으며 의도적으로이 두 소프트웨어 스택을 비교하고 싶었습니다. 여기에서는 Python-Dash 방식에 대해 설명하지만 솔루션에 대한 전용 비교 를 수행하는 다른 기사를 작성할 계획입니다 .

 

최종 앱이 어떻게 생겼는지 알아 보려면 앱을 테스트하세요.

https://go.aws/2xsdb7q

다음 단계별 가이드 에서는 대화 형 플롯을 포함하여이 웹 애플리케이션을 만드는 방법을 설명합니다. 소프트웨어 스택은 Python & Dash를 기반으로 하며 오픈 소스입니다. 모두 약 130 줄의 코드입니다.

Btw, 다운로드를위한 GitHub 코드 저장소에 대한 링크 는 기사 하단에 제공됩니다.

목표는 앱 실행시 COVID-19 사례 데이터를 업데이트하고 대시 보드에 데이터를 표시 하는 웹 애플리케이션 을 만드는 것입니다 . 풍모:

  • 코로나 바이러스에 대해 공식적으로 사용 가능한 데이터를 다운로드하고 파싱합니다.
  • 국가 및 주를 선택할 수있는 드롭 다운 메뉴.
  • 선택한 국가의 신규 및 누적 사례 통계를 보여주는 두 개의 플롯. 확인 된 사례, 회복 된 사례 및 사망자를 선택할 수 있습니다.
  1. Python 및 Visual Studio Code를 설정합니다.
  2. Python 프로젝트 및 폴더 구조를 설정합니다.
  3. 데이터를로드하고 전처리하는 논리를 구현합니다.
  4. Dash & Plotly를 사용하여 사용자 인터페이스를 만듭니다.
  5. 서버 로직을 추가하십시오.
  6. [선택 사항] 애플리케이션을 클라우드에 업로드합니다.

먼저 https://www.python.org/downloads/ 에서 최신 안정 버전의 Python 을 다운로드하고 설치 프로그램을 시작하고 진행합니다.

코드 편집기 선택에는 많은 가능성이 있습니다. Visual Studio Code 는 유효한 옵션입니다. 설치하려면 https://code.visualstudio.com/download 에서 설치 프로그램을 다운로드하고 실행 한 후 설치를 완료하세요.

Python 프로젝트 및 폴더 구조 설정

Python에는 pip , pipenv , (ana) conda , 가상 환경 등 여러 패키지 관리 솔루션이 있습니다 . 빠른 설명은이 매체 게시물을 참조하십시오 . 여기서는 가상 환경을 사용 합니다 .

여전히 명령 줄에서 앱이 있어야하는 디렉터리로 이동합니다. 그런 다음 새 앱 디렉터리와 가상 환경을 만듭니다 .

 

cd <folder-with-my-apps>   # Put here the folder of your choice.
mkdir corona-app           # Create a dedicated app directory.
cd corona-app              
virtualenv venv            # Create the virtual environment 'venv'.

 

source venv/bin/activate

 

venv\Scripts\activate

 

pip install dash      # Installs <plotly>, too.
pip install pandas
 

시작 화면에서 왼쪽에있는 " 폴더 열기…"를 클릭 하고 이전에 만든 폴더 ( corona-app )를 선택합니다.

 

VS Code 설정 및 사용자 지정에 대한 자세한 내용은이 전용 자습서를 참조하십시오 . 다음 단계는 필요한 모든 앱 코드를 포함 할 app.py 파일을 만드는 것입니다. 파일 탐색기에서 더하기 버튼을 클릭하고 파일 이름을 입력합니다.

 

이제 코딩을 시작할 수 있습니다!

데이터를로드하고 전처리하는 로직 구현

Visual Studio Code에서 파일이 아직 열려 있지 않은 경우 파일 이름 "app.py"를 클릭합니다. 필요한 라이브러리를로드하려면 다음 줄을 입력하십시오.

 

import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objects as go
from dash.dependencies import Input, Output
import pandas as pd

 

baseURL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/"
def loadData(fileName, columnName):
    data = pd.read_csv(baseURL + fileName) \
             .drop(['Lat', 'Long'], axis=1) \
             .melt(id_vars=['Province/State', 'Country/Region'], 
                 var_name='date', value_name=columnName) \
             .astype({'date':'datetime64[ns]', columnName:'Int64'}, 
                 errors='ignore')
    data['Province/State'].fillna('<all>', inplace=True)
    data[columnName].fillna(0, inplace=True)
    return data

마지막 변환은 해당 열에 대한 날짜 유형 으로의 변환 입니다.

함수 호출하여 loadData를 여러 번 우리는 정화 된 dataframe로드 의 확인 된 사례 , 복구 사례, 그리고 죽음을 . merge 함수 는이 3 개의 데이터 세트를 결합하여 모든 데이터를 포함하는 하나의 데이터 세트를 얻습니다.

 

allData = 
  loadData(
    "time_series_covid19_confirmed_global.csv", "CumConfirmed") \
  .merge(loadData(
    "time_series_covid19_deaths_global.csv", "CumDeaths")) \
  .merge(loadData(
    "time_series_covid19_recovered_global.csv", "CumRecovered"))

 

countries = allData['Country/Region'].unique()
countries.sort()

[2020 년 3 월 27 일 업데이트] : 서버에서 3 월 23 일 파일 이름이 변경 되었기 때문에 여기서도 업데이트해야했습니다.

Dash & Plotly를 사용하여 사용자 인터페이스 만들기

먼저 외부 스타일 시트의 경로와 사용자 지정 글꼴 ( 이 앱 의 R-Shiny 버전과 일치)을 초기화합니다 .

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

external_stylesheets=['https://codepen.io/chriddyp/pen/bWLwgP.css']
tickFont = {'size':12, 'color':"rgb(30,30,30)", \
            'family':"Courier New, monospace"}

 

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.layout = html.Div(
    style={ 'font-family':"Courier New, monospace" }, children=[
        ## ...
    ]
])

세 개의 점 (마지막 코드 블록 참조) 대신 다음 코드 블록을 입력하여 컨트롤이 포함 된 열을 정의합니다.

 

html.H1('Case History of the Coronavirus (COVID-19)'),
        html.Div(className="row", children=[
            html.Div(className="four columns", children=
                html.H5('Country'),
                dcc.Dropdown( 
                    id='country',
                    options=[{'label':c, 'value':c} \
                        for c in countries],
                    value='Italy'
                )
            ]),
            html.Div(className="four columns", children=[
                html.H5('State / Province'),
                dcc.Dropdown(
                    id='state'
                )
            ]),
            html.Div(className="four columns", children=[
                html.H5('Selected Metrics'),
                dcc.Checklist(
                    id='metrics',
                    options=[{'label':m, 'value':m} for m in \
                        ['Confirmed', 'Deaths', 'Recovered']],
                    value=['Confirmed', 'Deaths']
                )
            ])
        ]),
  • 고유 한 국가로 채워진 국가 드롭 다운
  • 주 /도 드롭 다운 . 지금까지 초기화되지 않았습니다.
  • 3 개의 메트릭 이름으로 채워진 Metrics Checklist .

 

dcc.Graph(
        id="plot_new_metrics",
        config={ 'displayModeBar': False }
    ),
    dcc.Graph(
        id="plot_cum_metrics", 
        config={ 'displayModeBar': False }
    )

R-Shiny 소프트웨어 스택 과 달리 Python-Dash에는 표현식 (= data!)을 반응 형으로 만드는 간단한 솔루션이 없습니다. 다음 함수는 지정된 국가 및 주에 대한 모든 데이터를 반환합니다. 이 함수는 코드에서 두 번 (플롯 당 하나) 사용되므로 계산이 두 번 발생하지 않으면 이점이 될 것입니다.

 

def nonreactive_data(country, state):
    data = allData.loc[allData['Country/Region'] == country] \
                  .drop('Country/Region', axis=1)
    if state == '<all>':
        data = data.drop('Province/State', axis=1) \
                   .groupby("date") \
                   .sum() \
                   .reset_index()
    else:
       data = data.loc[data['Province/State'] == state]
    newCases = data.select_dtypes(include='Int64').diff().fillna(0)
    newCases.columns = [column.replace('Cum', 'New') 
                        for column in newCases.columns]
    data = data.join(newCases)
    data['dateStr'] = data['date'].dt.strftime('%b %d, %Y')
    return data

다음 블록은 두 플롯에 사용되는 barchart를 생성 하는 함수를 정의합니다 .

 

colors = { 'Deaths':'rgb(200,30,30)', \
           'Recovered':'rgb(30,200,30)', \ 
           'Confirmed':'rgb(100,140,240)' }
def barchart(data, metrics, prefix="", yaxisTitle=""):
    figure = go.Figure(data=[
        go.Bar(
            name=metric, x=data.date, y=data[prefix + metric],
            marker_line_color='rgb(0,0,0)', marker_line_width=1,
            marker_color=colors[metric]
        ) for metric in metrics
    ])
    figure.update_layout( 
              barmode='group', legend=dict(x=.05, y=0.95), 
              plot_bgcolor='#FFFFFF', font=tickFont) \
          .update_xaxes( 
              title="", tickangle=-90, type='category',  
              showgrid=True, gridcolor='#DDDDDD', 
              tickfont=tickFont, ticktext=data.dateStr,                     
              tickvals=data.date) \
          .update_yaxes(
              title=yaxisTitle, showgrid=True, gridcolor='#DDDDDD')
    return figure

반응 플롯

반응식은 지금까지 대시에서 지원되지 않지만 반응 형 UI 요소는 지원됩니다. 입력 값 중 하나가 변경 되면 ( country , state 또는 metrics ) 다음 콜백 이 실행 됩니다 . 이 경우 후속 함수가 호출되고 출력에 정의 된 변수를 업데이트합니다 ( 그림 ).

이 작업을 수행하기 위해 함수는 정리 된 데이터를로드하고 적절한 함수“ barchart ”를 호출하여 차트를 렌더링합니다 .

 

@app.callback(
    Output('plot_new_metrics', 'figure'), 
    [Input('country', 'value'), Input('state', 'value'), 
     Input('metrics', 'value')]
)
def update_plot_new_metrics(country, state, metrics):
    data = nonreactive_data(country, state)
    return barchart(data, metrics, prefix="New", 
        yaxisTitle="New Cases per Day")
@app.callback(
    Output('plot_cum_metrics', 'figure'), 
    [Input('country', 'value'), Input('state', 'value'), 
     Input('metrics', 'value')]
)
def update_plot_cum_metrics(country, state, metrics):
    data = nonreactive_data(country, state)
    return barchart(data, metrics, prefix="Cum", 
        yaxisTitle="Cumulated Cases")

마지막으로 드롭 다운 메뉴에 표시되는 주 / 도는 사용자가 선택한 국가를 변경할 때 적응해야합니다 . update_states 는 고유 상태 목록을 추출하고 <all>을 추가 하고 전체 목록을 반환하고 선택한 값을 업데이트합니다.

 

@app.callback(
    [Output('state', 'options'), Output('state', 'value')],
    [Input('country', 'value')]
)
def update_states(country):
    states = list(allData.loc[allData['Country/Region'] == country]
        ['Province/State'].unique()
    )
    states.insert(0, '<all>')
    states.sort()
    state_options = [{'label':s, 'value':s} for s in states]
    state_value = state_options[0]['value']
    return state_options, state_value

이제 VS Code의 오른쪽 상단에있는 녹색 "실행"버튼을 누르기 만하면 앱을 실행할 수 있습니다. 재미있게 보내세요 :)

GitHub 코드

위의 모든 코드는 GitHub 에서 찾을 수 있습니다 https://github.com/ploner/coronavirus-py

[선택 사항] 클라우드에 애플리케이션 업로드

특히 Heroku 와 같은 무료 서비스를 사용하면 웹 서버에 앱을 게시하는 것이 매우 쉽습니다 .

단계가 있습니다 :

  • app.py 파일에 다음 줄을 추가 합니다.

 

server = app.server

Heroku CLI (명령 줄 인터페이스)를 설치합니다. https://dash.plot.ly/deployment — "Heroku 예제"섹션 의 지침을 따르십시오 . 기본적으로, 당신은 설치 gunicorn 에 의해  생성, .gitignore , ProcFile 및 requirements.txt , 그리고에 모두 커밋 Heroku가 사용하는 자식을 .

이것은 Medium에 대한 두 번째 게시물이며 첫 번째 게시물과 매우 관련이 있습니다.

R, Shiny & Plotly를 사용하여 눈 깜짝 할 사이에 COVID-19 사례 데이터 시각화

당신은 선도적 인 경우 데이터 과학 팀 과 회원으로 가입하고 있으며, R 및 Python으로 숙련 뿐만 아니라 대쉬 반짝 비교 할 일 목록에있을 수 있습니다. 어떻게 결정하는지 알려주세요.

이 이야기가 마음에 드 셨다면 COVID-19, 분석 및 기계 학습에 대해 데이터 과학을 향하여 게시 한 다음 두 가지 Medium Stories 중 하나를 좋아할 수도 있습니다.

 

[출처] https://ichi.pro/ko/python-dash-mich-plotlyleul-sayonghayeo-covid-19-salye-deiteo-sigaghwa-252406289200911

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86034
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78562
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95291
944 [java dbms][database] [컴] Apache Derby 사용하기 - 1 - Derby 설치 file 졸리운_곰 2021.04.15 1152
943 [spark][sparksql][odbc][jdbc] JDBC and ODBC drivers and configuration parameters file 졸리운_곰 2021.04.14 4127
942 [spark][pyspark][php] Natively Connect to Spark Data in PHP 졸리운_곰 2021.04.14 1700
941 [데이터분석][python] Dash를 사용하는 초보자 및 기타 모든 사용자를위한 Python의 대시 보드 file 졸리운_곰 2021.04.14 1762
940 [데이터분석][python] Dash를 사용하는 초보자 및 기타 모든 사용자를위한 Python의 대시 보드 file 졸리운_곰 2021.04.14 1602
939 [sqlite] SQlite source code analysis-architecture file 졸리운_곰 2021.04.12 1806
938 [SQLite] SQLite 사용자 함수 추가 졸리운_곰 2021.04.12 1662
937 {SQLite] SQLite 페이지 핸들링(3) - 레코드 포맷 졸리운_곰 2021.04.12 1665
936 [SQLite] SQLite 페이지 핸들링(2) - SQLite의 페이지 포맷 file 졸리운_곰 2021.04.12 1495
935 [SQLite] SQLite 페이지 핸들링(1) - SQLite의 구조 file 졸리운_곰 2021.04.12 1486
934 [C/C++ 자료구조] SQLite 의 모든 것 (4부) - Java 에서 사용하기 Database/SQLite file 졸리운_곰 2021.04.12 1662
933 [C/C++] SQLite 의 모든 것 (3부) - C++ 에서 사용하기 Database/SQLite 졸리운_곰 2021.04.12 1719
932 [C/C++ 자료구조] SQLite 의 모든 것 (2부) - Download & Build Database/SQLite file 졸리운_곰 2021.04.12 1665
931 [C/C++ 자료구조] SQLite 의 모든 것 (1부) - 소개 및 FAQ Database/SQLite file 졸리운_곰 2021.04.12 1330
930 [NoSQL] [Redis] Redis Persistence(영속성) 졸리운_곰 2021.04.11 1644
929 [NoSQL] [Cloud] Redis 설치, 사용 방법, 데이터 백업을 위한 RDB & AOF 개념 및 간단한 Redis 사용 사례 연구 file 졸리운_곰 2021.04.11 1716
928 [SPARK][Python][pySpark][아콘 소프트][나무기술] How to Run a Spark Standalone Job 졸리운_곰 2021.04.05 981
927 [SPARK][Python][pySpark][아콘 소프트][나무기술] Real-world Python workloads on Spark: Standalone clusters : 스파크 예제 논란, driver-host 불필요 file 졸리운_곰 2021.04.03 1690
» [데이터분석][데이터 사이언스][python][Dash] Python, Dash 및 Plotly를 사용하여 COVID-19 사례 데이터 시각화 file 졸리운_곰 2021.03.28 1500
925 [데이터분석][머신러닝] When not to use machine learning or AI Adventures in wishful thinking, nonstationarity, and pattern-finding / 기계 학습 또는 AI를 사용하지 않아야하는 경우 희망찬 사고, 비정상 성, 패턴 찾기의 모험 file 졸리운_곰 2021.03.28 21621
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED