Upgrade to Pro — share decks privately, control downloads, hide ads and more …

データ分析者にとってのDjango: StreamlitやDashとの比較

ksnt
October 07, 2023
1.1k

データ分析者にとってのDjango: StreamlitやDashとの比較

DjangoCongress JP 2023登壇資料

ksnt

October 07, 2023
Tweet

Transcript

  1. 発表の概要 • 自己紹介 • Djangoとわたし • StreamlitとDashとわたし • DjangoとStreamlitとDash •

    Jupyter notebook上でDashを使う • StreamlitおよびDjangoで生成AIアプリ • まとめ
  2. データ分析職 の中での私の 立ち位置 • 大きく分けて3つの名前(役割名) • データエンジニア、データサイエンティスト、 データアナリスト • データエンジニアはデータ分析基盤をつくる

    • データサイエンティストはアルゴリズムを開 発 • データアナリストは… • 私の所属していた会社ではデータアナリストはUS 側ではデータエバンジェリストとも呼ばれる • 顧客対応(お客さんと一緒にデータの有効な 活用方法を議論、データ分析の結果を報告) • データの分析(pandas, geopandas, scikit-learn, QGIS) • SaaSを提供 • Djangoを使用 • エンジニアチームが主導
  3. Djangoとわたし • 前職を退職し以前から興味があった職業訓練校へ • Webエンジニアを目指すコース • 2023年7月〜9月末(3か月) • 学んだこと: コンピュータ基礎、HTML、CSS、SQL、Python、Django

    • 毎日赤坂にあるビルの一室で授業・演習 • 一冊Djangoの本を読んでみた! • MTV(MVT?) • クラスベースビュー, 関数ベースビュー
  4. 職業訓練校でDjangoを学ぶ – いいね機能 の実装 10 class ArticlePost(models.Model): … likes =

    models.ManyToManyField(CustomUser, verbose_name='likes’, related_name='article_post') def like_post(request, post_id): post = ArticlePost.objects.get(pk=post_id) user = request.user if user in post.likes.all(): post.likes.remove(user) post.likes_count -= 1 else: post.likes.add(user) post.likes_count += 1
  5. 職業訓練校でDjangoを学ぶ – いいね機能 の実装 11 <form action="{% url 'onelineapp:like_post' record.pk

    %}" method="POST"> {% csrf_token %} {% if user in record.likes.all %} <button type="submit", name="post_id" value="{{ record.id }}"><i class="fa fa-heart-o" style="color:blue" id="heart-icon">Unlike</i></button> {% else %} <button type="submit", name="post_id" value="{{ record.id }}"><i class="fa fa-heart" style="color:red" id="heart-icon">Like</i></button> {% endif %} </form>
  6. Streamlitと Dashと わたし(1) • Dashとの出会い • Python for Shinyとの触れ込み (2018年頃)

    • もともとRユーザー • ラクしてWebアプリを作成したい(データ 分析に注力したい) • ドキュメントの翻訳をしたり • Streamlitとの出会い • Courseraで講義を発見 • 使ってみると超簡単にフロントエンドが書 ける・デプロイできる • pydeckが使えた • PyCon JP 2020チュートリアルでも使用
  7. Streamlitと Dashとわた し(3) • Streamlitの利点 • Snowflakeが買収 • Snowflakeとの連携 •

    データ分析職にとってのSnowflakeの存在感 • Tableauと組み合わせて使うこともできる • https://docs.streamlit.io/knowledge- base/tutorials/databases/tableau
  8. DjangoとDashとStreamlit • DjangoにReactを組みあわせる < DjangoにDashを組み合わせる < Dashのみでつ くる • イマドキのフロントエンドづくりがカンタン!

    • django-plotly-dashというパッケージがあるのでDjangoとDashの組み合わせは可能だ が使うのは調べた限りでは大変そう • DashはHTMLになれている人がコンポーネントをつくっていくと便利(Reactだと 大変) • 「DashからReactへ」という道もよいのでは?(for データ分析のひとたち) • React (for フロントエンドの人)
  9. Jupyter notebookを 使って DashでWebアプリ 的なものをつくる https://github.com/plotly-dash- book/events/blob/main/20201205/da sh/plotly_dash_hands_on.ipynb 注) グラフが表示されないときはコマンドライン

    で以下を実行してください。 $ jupyter labextension install jupyterlab-plotly $ jupyter labextension install @jupyter-widgets/jupyterlab-manager plotlywidget
  10. 生成AIアプリ(OpenAIのAPIを使 う)をStreamlitで作ってみる import streamlit as st import openai openai.api_key =

    "YOUR_API_KEY“ prompt = st.chat_input("どんな画像が欲しいですか?") if prompt: response = openai.Image.create( prompt=prompt, n=1, size="512x512" ) image_url = response['data'][0]['url'] st.image(image_url)
  11. 生成AIアプリ(OpenAIのAPIを使 う)をDjangoで作ってみる(2) - settings.pyの編集 #settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth',

    'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ‘chatapp’, # アプリの登録 ]
  12. 生成AIアプリ(OpenAIのAPIを使 う)をDjangoで作ってみる(3) - プロジェクトのurls.pyの編集 # project_name/urls.py from django.contrib import admin

    from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('chatapp/', include('chatapp.urls')), # chatappの URLインクルード ]
  13. 生成AIアプリ(OpenAIのAPIを使 う)をDjangoで作ってみる(5) - Viewを記述 # chatapp/views.py from django.shortcuts import render

    import openai openai.api_key = “YOUR_API_KEY“ def chatbot_view(request): if request.method == 'POST': prompt = request.POST.get('prompt', '') if prompt: response = openai.Image.create( prompt=prompt, n=1, size="512x512" ) image_url = response['data'][0]['url'] return render(request, 'chatbot.html', {'image_url': image_url}) return render(request, 'chatbot.html')
  14. 生成AIアプリ(OpenAIのAPIを使 う)をDjangoで作ってみる(6) - テンプレートを記述 <!-- myapp/templates/chatbot.html --> <!DOCTYPE html> <html>

    <head> <meta charset="utf-8"> <title>Chatbot Image Generator</title> </head> <body> <h1>Chatbot Image Generator</h1> <form method="post"> {% csrf_token %} <label for="prompt">どんな画像が欲しいですか?</label> <input type="text" name="prompt" id="prompt" required> <input type="submit" value="生成"> </form> {% if image_url %} <img src="{{ image_url }}" alt="Generated Image"> {% endif %} </body> </html>