Plotly Dash ile Streamlit: Geri Çağırma Grafiği mi, Baştan Çalışan Betik mi?
Karşılaştırma

Plotly Dash ile Streamlit: Geri Çağırma Grafiği mi, Baştan Çalışan Betik mi?

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 6 dk okuma

Dash bir panoyu bileşen ağacı ve bu bileşenleri birbirine bağlayan geri çağırma fonksiyonlarıyla kurar; Streamlit ise sayfayı yukarıdan aşağı okunan bir betik gibi yazdırır ve her etkileşimde betiği yeniden çalıştırır. Bu fark; kod uzunluğunu, durumun nerede tutulduğunu ve panonun büyüdükçe nasıl davrandığını belirler.

Bir bakışta

  1. Dash'te etkileşim açıkça tanımlanır, Streamlit'te betiğin akışından doğar. Dash'te hangi bileşenin hangisini güncelleyeceği geri çağırma tanımında yazılıdır; Streamlit'te bileşen değeri değişince betik baştan çalışır.
  2. Basit bir filtreli grafik Streamlit'te daha az satırla kurulur. Dash aynı iş için önce yerleşimi, sonra girdi ve çıktıyı bağlayan fonksiyonu ister.
  3. Durum yönetimi iki araçta farklı yerde yaşar. Streamlit'te kullanıcıya özgü değerler oturum durumunda tutulur; Dash'te geri çağırmaların genel değişkenleri değiştirmemesi, paylaşılan verinin istemci tarafı depoda ya da sunucuda tutulması gerekir.
  4. Sayfa düzeni ve görünüm üzerinde Dash daha ince denetim verir. Dash HTML bileşenleri stil ve sınıf adı alır; Streamlit hazır sütun, sekme ve kapsayıcılarla hızlı ama daha kalıplı bir düzen sunar.
  5. Seçim, panonun ömrüne ve kullanıcı sayısına bağlıdır. Ekip içi hızlı analiz aracı Streamlit'e, uzun ömürlü ve çok ekranlı kurumsal pano Dash'e doğal olarak oturur.

Asıl fark: bağlanan bileşenler mi, baştan çalışan betik mi?

Dash belgeleri bir Dash uygulamasını iki parçadan oluşan bir yapı olarak anlatır. İlk parça yerleşimdir: uygulamanın nasıl görüneceğini tanımlayan bileşen ağacı. İkinci parça etkileşimdir: bir girdi bileşeninin özelliği değiştiğinde Dash'in otomatik olarak çağırdığı ve başka bir bileşenin özelliğini güncelleyen geri çağırma fonksiyonları. Hangi değişikliğin neyi tetikleyeceği kodda açıkça yazılıdır.

Streamlit'te ise ayrı bir yerleşim tanımı yoktur. Streamlit belgelerine göre ekranda bir şeyin güncellenmesi gerektiğinde, yani kaynak kod değiştiğinde ya da kullanıcı bir bileşenle etkileşime girdiğinde, betiğin tamamı yukarıdan aşağı yeniden çalışır. Bileşenler betiğin içinde sıradan Python değişkenleri gibi değer döndürür; sayfa, betiğin satır sırasıyla oluşur.

Bu fark yalnız bir yazım tercihi değildir. Dash'te etkileşim grafiği büyüdükçe bağlantılar kodda görünür kalır ve yalnızca ilgili fonksiyonlar çalışır. Streamlit'te betik kısa ve okunaklı kalır, ama her etkileşimde baştan çalıştığı için pahalı işlemlerin önbelleğe alınması ve kalıcı değerlerin oturum durumunda tutulması gerekir.

Aynı filtreli satış grafiği iki araçta

Bir bölge seçildiğinde o bölgenin aylık satışlarını gösteren basit bir pano düşünün. Veri bir pandas tablosunda, grafik Plotly Express ile çiziliyor.

Dash'te önce yerleşim kurulur, sonra açılır menüyü grafiğe bağlayan geri çağırma yazılır:

app = Dash() app.layout = html.Div([dcc.Dropdown(bolgeler, id="bolge"), dcc.Graph(id="grafik")])

@callback(Output("grafik", "figure"), Input("bolge", "value")) def guncelle(bolge): return px.bar(df[df.bolge == bolge], x="ay", y="satis")

Streamlit'te aynı iş betiğin akışı içinde yazılır:

bolge = st.selectbox("Bölge", bolgeler) st.plotly_chart(px.bar(df[df.bolge == bolge], x="ay", y="satis"))

Streamlit sürümü kısa ve doğrudan okunur. Dash sürümü daha uzundur ama bileşenlerin kimlikleri ve aralarındaki bağ açıkça tanımlıdır. Panoya ikinci bir filtre, birbirine bağlı menüler ve aynı veriyi kullanan bir tablo eklendiğinde Dash'te yeni geri çağırmalar eklenir; Streamlit'te betik uzar ve her etkileşimde tamamı yeniden çalışır. Grafik nesnesi her iki araçta da aynı Plotly figürüdür; görselleştirme bilgisi araçtan araca taşınabilir.

Ölçüt ölçüt Dash ve Streamlit

  • Ölçüt: Programlama modeli. Dash: yerleşim ve geri çağırmalar ayrı tanımlanır. / Streamlit: yukarıdan aşağı okunan betik, her etkileşimde yeniden çalışır.
  • Ölçüt: Başlangıç hızı. Dash: bileşen kimlikleri ve girdi-çıktı tanımları öğrenilmelidir. / Streamlit: birkaç komutla ilk sayfa çıkar.
  • Ölçüt: Etkileşim karmaşıklığı. Dash: bağlı filtreler, birden çok çıktı, grafikteki tıklamanın başka bileşeni güncellemesi gibi senaryolar geri çağırmalarla açıkça kurulur. / Streamlit: basit filtrelerde çok pratik, karmaşık bağımlılıklarda betiğin akışını düşünmek gerekir.
  • Ölçüt: Durum. Dash: geri çağırmalar genel değişkenleri değiştirmemelidir; paylaşılan veri istemci tarafı depoda ya da sunucuda tutulur. / Streamlit: oturum durumu her kullanıcı oturumuna özgü değerleri saklar.
  • Ölçüt: Görünüm denetimi. Dash: HTML bileşenleri stil ve sınıf adı alır, sayfa CSS ile ayrıntılı biçimlendirilir. / Streamlit: sütun, sekme ve kapsayıcı gibi hazır düzen öğeleri ve tema ayarları.
  • Ölçüt: Grafik kütüphanesi. Dash: Plotly ile doğal bütünlük. / Streamlit: Plotly dahil birden çok grafik kütüphanesini görüntüleyebilir.
Şekil 1

Streamlit hızla başlatır, Dash etkileşimi ve düzeni açıkça denetler

Plotly DashStreamlit
Programlama modeliYerleşim ve geri çağırmalarHer etkileşimde baştan çalışan betik
İlk panoDaha fazla tanım gerekirBirkaç komutla çıkar
Bağlı filtrelerGeri çağırmalarla açıkça kurulurBetik akışıyla, büyüdükçe zorlaşır
Kullanıcı durumuİstemci deposu ya da sunucuOturum durumu
Görünüm denetimiStil, sınıf adı ve CSS ile ayrıntılıHazır düzen öğeleri ve tema
Kaynak: Sayfa içeriği; Dash ve Streamlit resmî belgelerine dayanır.Mindset Institute

Durum ve ölçek: pano çok kullanıcıya açıldığında

Ekip içinde tek kişinin kullandığı bir pano ile çok sayıda çalışanın aynı anda açtığı bir pano farklı sorunlar çıkarır ve iki araç bu soruna farklı yerden yaklaşır.

Dash belgeleri temel bir ilkeyi vurgular: geri çağırmalar kendi kapsamları dışındaki değişkenleri değiştirmemelidir, genel değişkenleri değiştirmek güvenli değildir. Gerekçe ölçeklenmedir; durumsuz bir uygulamaya daha fazla işlem gücü eklemek kolaydır ve belgeler üretimde uygulamanın birden çok çalışan süreçle (örneğin gunicorn ile) çalıştırılmasını anlatır. Bir kullanıcının seçimi genel değişkene yazılırsa, başka bir süreçteki ya da başka bir kullanıcının ekranı yanlış veriyi gösterebilir. Paylaşılması gereken ara sonuçlar bu yüzden istemci tarafında bir depo bileşeninde ya da sunucu tarafı önbellekte tutulur.

Streamlit'te her tarayıcı sekmesi ayrı bir oturumdur ve her yeniden çalıştırma temiz bir sayfayla başlar; çalıştırmalar arasında hiçbir değişken paylaşılmaz. Kullanıcıya özgü değerler oturum durumunda, tüm kullanıcılar için ortak ve pahalı hesaplar ise önbellek dekoratörüyle tutulur. Önbelleklenmemiş bir veritabanı sorgusu, her kaydırıcı hareketinde yeniden çalışır ve kullanıcı sayısı arttıkça sunucuyu zorlar.

Bir araçtan ötekine geçerken yapılan hatalar

Ekipler çoğu zaman bir prototipi Streamlit'te kurup büyüdüğünde Dash'e taşır ya da bir Dash deneyiminden sonra Streamlit'e geçer. Her iki yönde de aynı düşünce alışkanlıkları sorun çıkarır.

Dash'e geçen biri, Streamlit'teki gibi değeri bir değişkende tutmaya çalışır ve geri çağırmanın içinde genel bir listeyi günceller. Doğrusu, paylaşılacak veriyi bir depo bileşenine yazmak ya da sunucu tarafında önbelleğe almaktır. Dash'te tek bir büyük geri çağırma her filtre değişiminde veriyi yeniden çeker; Dash belgelerindeki örnekte olduğu gibi veriyi çeken ve gösteren adımları ayrı geri çağırmalara bölmek, yalnız birim değiştiğinde verinin yeniden indirilmesini önler.

Streamlit'e geçen biri ise her etkileşimde betiğin baştan çalıştığını unutur: veriyi her seferinde dosyadan okur, sayaç gibi değerleri normal değişkende tutar ve her tıklamada sıfırlandıklarını görür. Doğrusu, pahalı okumayı önbellek dekoratörüyle sarmak ve kalıcı değerleri oturum durumuna yazmaktır.

Şekil 2

Geçişte asıl iş, durumu doğru yere taşımaktır

Sık yapılan
Doğrusu
Dash geri çağırmasında genel değişkeni güncellemek
Paylaşılan veriyi depo bileşenine ya da sunucu önbelleğine yazmak
Dash'te tek geri çağırmada veriyi her filtrede yeniden çekmek
Veriyi çeken ve gösteren adımları ayrı geri çağırmalara bölmek
Streamlit'te veriyi her etkileşimde dosyadan okumak
Okumayı önbellek dekoratörüyle sarmak
Streamlit'te sayaç ya da seçimi normal değişkende tutmak
Kalıcı değeri oturum durumuna yazmak
Kaynak: Sayfa içeriği; Dash veri paylaşımı ve Streamlit oturum durumu belgelerine dayanır.Mindset Institute

Hangi durumda hangisi?

Streamlit'i seçin: • Analizi hızla etkileşimli hale getirip ekip arkadaşlarına göstermek istiyorsanız. • Pano tek sayfalık, filtreleri birbirinden bağımsız ve kullanıcı sayısı sınırlıysa. • Ekipte web geliştirme deneyimi yoksa ve kodun bir analiz betiği gibi okunması önemliyse. • Prototip aşamasındaysanız ve ihtiyacın netleşmesini bekliyorsanız.

Dash'i seçin: • Birbirine bağlı filtreler, grafikteki seçimin diğer bileşenleri güncellemesi gibi çok adımlı etkileşimler gerekiyorsa. • Pano kurumsal görünüm kurallarına uymak zorundaysa ve sayfa düzeni ayrıntılı denetlenecekse. • Uygulama uzun süre yaşayacak, çok kullanıcıya açılacak ve birden çok sunucu sürecinde çalıştırılacaksa. • Ekip zaten Plotly grafikleriyle çalışıyorsa.

Birlikte kullanım da mümkündür: aynı Plotly figür fonksiyonları ortak bir Python modülünde tutulursa, hızlı deneme Streamlit'te yapılır, kalıcı pano Dash'te kurulur ve grafik kodu iki yerde tekrar yazılmaz.

Bu araçları Mindset programlarında nerede çalışırsınız

Python ile Veri Görselleştirme ve Üretken Tasarım eğitimi, Python'da görselleştirmeye girişten etkileşimli ve dinamik görselleştirmelere uzanır; iki aracın da üzerine kurulduğu grafik mantığını burada çalışırsınız.

Data Science Uzmanlığı Sertifika Programı'nın veri görselleştirme modülü Plotly ile etkileşimli görselleştirmeyi ve pano tasarım ilkelerini yönetim sunumuna hazır bir görselleştirme paketi çalışmasıyla birleştirir; analizini bir panoya dönüştürmesi gereken veri ekipleri için uygundur.

İlgili Mindset programı

Python ile Veri Görselleştirme ve Üretken Tasarım

Sık sorulanlar

Sık sorulan sorular

Dash ve Streamlit'te aynı Plotly grafikleri kullanılabilir mi?

Evet. Dash grafikleri bir grafik bileşeninin figür özelliği olarak gösterir; Streamlit ise Plotly figürünü kendi grafik komutuyla görüntüler. Grafiği üreten fonksiyon bir Python modülüne alınırsa iki uygulamada da aynen kullanılır. Değişen yalnızca grafiği ekrana koyan satır ve kullanıcı seçimini fonksiyona ileten mekanizmadır.

Kurumsal renkler ve özel sayfa düzeni gerekiyorsa hangisi daha uygun?

Görünüm üzerinde ayrıntılı denetim gerekiyorsa Dash daha esnektir: HTML bileşenleri stil ve sınıf adı alır, sayfa kendi CSS dosyalarınızla biçimlendirilebilir. Streamlit tema ayarları ve sütun, sekme gibi hazır düzen öğeleri sunar; bu, hızlı ve tutarlı bir görünüm sağlar ama piksel düzeyinde kurumsal tasarım isteyen projelerde sınırlayıcı olabilir.

Jupyter not defterindeki bir analizi panoya taşımanın en kısa yolu hangisi?

Streamlit genellikle en kısa yoldur, çünkü not defterindeki hücreler sırayla bir betiğe aktarılıp filtreler araya eklenebilir. Dash'te ise analiz yerleşim ve geri çağırma olarak yeniden düzenlenir. Dash belgeleri örnek kodların bir not defteri hücresinde de çalıştırılabildiğini belirtir; bu, Dash'e geçişte denemeyi kolaylaştırır ama yapıyı yeniden kurma işini ortadan kaldırmaz.

Pano büyük bir veri tablosuyla çalışıyorsa nelere dikkat edilmeli?

Her iki araçta da veri, her etkileşimde yeniden okunmamalıdır. Streamlit'te okuma ve dönüştürme fonksiyonları önbellek dekoratörüyle sarılır. Dash'te veriyi yükleyen adım ayrı tutulur, sonuçlar sunucu tarafında önbelleğe alınır ve tarayıcıya yalnızca grafiğin ihtiyaç duyduğu özet gönderilir. Ham tabloyu doğrudan tarayıcıya taşımak iki araçta da sayfayı yavaşlatır.

Hangisini önce öğrenmek daha mantıklı?

Python ile veri analizi yapıyor ve sonucu hızla göstermek istiyorsanız Streamlit kısa sürede verim sağlar ve betik düşüncesine yakındır. Dash ise geri çağırma kavramını öğrenmeyi gerektirir, ama bu kavram web uygulamalarındaki olay mantığını da öğretir. Uzun vadede kurumsal pano geliştirecek biri için Dash'e yatırım, ilk prototipler için Streamlit iyi bir başlangıçtır.

Plotly Dash mı Streamlit mi? Python Panosu İçin Seçim