Netflix İzleme Geçmişi Panosu 2: Streamlit ile Panoya Dönüştürmek

İlk bölümde Netflix izleme geçmişimi indirip temizledim ve not defterinde ona sorular sordum: En çok hangi diziyi izlemişim, hangi günler daha çok izliyorum, maraton günüm hangisi? Ama not defteri, cevabı görmek için her seferinde kod çalıştırmayı gerektiriyor. Bu bölümde aynı kodu, tıklayıp filtreleyebileceğin bir web panosuna çeviriyoruz. Hem de HTML ya da JavaScript bilmeden, sadece Python ile.

Uygulamanın tüm kodu GitHub’da: pop-kultur-kodluyorum / netflix-pano.

Streamlit nedir?

Streamlit, Python koduyla web uygulaması yapmayı sağlayan açık kaynak bir kütüphane. Veri bilimcilerin en sevdiği araçlardan biri, çünkü mantığı çok basit: Bir Python dosyası yazıyorsun, st.title("Merhaba") dersen sayfada başlık, st.bar_chart(veri) dersen grafik çıkıyor. Biri bir düğmeye bastığında ya da bir filtreyi değiştirdiğinde Streamlit dosyayı yukarıdan aşağı yeniden çalıştırır ve sayfayı günceller.

Bu “her etkileşimde yeniden çalıştır” fikri başta garip gelebilir, ama işi çok kolaylaştırıyor: Kodu not defterinde yazar gibi yukarıdan aşağı yazıyorsun, gerisini Streamlit hallediyor.

Kurulum

Streamlit kendi bilgisayarında çalışır (Colab’da doğrudan çalışmaz). Terminalde:

pip install streamlit pandas altair

Kurulumu denemek için streamlit hello yazabilirsin; tarayıcında bir örnek uygulama açılır.

Uygulamanın parçaları

Uygulama tek bir dosya: app.py. Altı bölümden oluşuyor. Tamamı GitHub’da; burada her bölümün önemli satırlarını anlatıyorum.

1. Temizleme fonksiyonları: ilk bölümden aynen

Tarihleri çözen tarihi_coz ve diziyi filmden ayıran ayir fonksiyonlarını ilk bölümden hiç değiştirmeden taşıdım. Hepsini tek bir fonksiyonda topladım:

@st.cache_data
def veriyi_hazirla(ham):
df = ham.rename(columns={"Title": "baslik", "Date": "tarih"})
df["tarih"] = tarihi_coz(df["tarih"])
df = df.dropna(subset=["tarih"])
df[["isim", "tur"]] = df["baslik"].apply(lambda b: pd.Series(ayir(b)))
# ... ikinci adım: tekrar eden ön ekleri dizi say
return df

@st.cache_data satırı bir dekoratör: fonksiyonun üstüne yapışan bir etiket gibi düşün. Streamlit’e “bu fonksiyonu aynı veriyle tekrar çağırırlarsa baştan hesaplama, önceki sonucu ver” diyor. Her filtre değişikliğinde dosya yeniden çalıştığı için bu önemli; yoksa binlerce satırı her tıklamada yeniden temizlerdik.

2. Dosyayı almak

dosya = st.file_uploader("NetflixViewingHistory.csv dosyanı yükle", type="csv")
if dosya is None:
st.info("Henüz dosya yüklemedin. Aşağıda hayali bir örnek veriyle gösteriyorum.")
df = veriyi_hazirla(ornek_veri())
else:
df = veriyi_hazirla(pd.read_csv(dosya))

st.file_uploader sayfaya bir dosya yükleme kutusu koyar. Kullanıcı henüz dosya seçmediyse None döner; o zaman pano boş kalmasın diye hayali bir örnek veri gösteriyoruz. Bu örnek veri tamamen uydurma dizi isimlerinden oluşuyor.

3. Filtreler: kenar çubuğu

with st.sidebar:
yillar = sorted(df["tarih"].dt.year.unique())
secilen_yillar = st.multiselect("Yıl", yillar, default=yillar)
tur = st.radio("Tür", ["Hepsi", "Dizi", "Film"], horizontal=True)
f = df[df["tarih"].dt.year.isin(secilen_yillar)]
if tur != "Hepsi":
f = f[f["tur"] == tur]

with st.sidebar: bloğunun içine yazılan her şey sol taraftaki kenar çubuğuna gider. st.multiselect birden fazla yıl seçmeye, st.radio türlerden birini seçmeye yarıyor. Seçimler sıradan Python değişkenlerine düşüyor; sonra pandas ile tabloyu filtreliyoruz. Sayfanın geri kalanı hep bu filtrelenmiş f tablosunu kullanıyor, böylece bir filtre değişince tüm pano birlikte değişiyor.

4. Özet kartları

k1, k2, k3, k4 = st.columns(4)
k1.metric("Toplam kayıt", len(f))
k2.metric("Farklı dizi", f.loc[f["tur"] == "Dizi", "isim"].nunique())
k3.metric("Film", int((f["tur"] == "Film").sum()))
k4.metric("Maraton günü", f"{gunluk.max()} kayıt")

st.columns(4) sayfayı dört eşit sütuna böler, metric da her sütuna büyük bir sayı koyar. Panonun en üstündeki özet buradan geliyor.

5. Grafikler

Streamlit’in kendi st.bar_chart fonksiyonu hızlı ama günlerin sırasını alfabetik yapıyor (Cuma, Cumartesi, Çarşamba…). Haftanın günlerini doğru sırada göstermek ve renkleri seçmek için Streamlit’le birlikte gelen Altair kütüphanesini kullandım. Aynı çubuk grafiği üç yerde kullanacağım için küçük bir fonksiyon yazdım:

def cubuk(veri, x, y, renk=BOGURTLEN, sira=None, x_baslik="", y_baslik="Kayıt"):
return (
alt.Chart(veri)
.mark_bar(color=renk, cornerRadiusEnd=4)
.encode(
x=alt.X(x, sort=sira, title=x_baslik),
y=alt.Y(y, title=y_baslik),
tooltip=[x, y],
)
)

sort=sira parametresine ["Pazartesi", "Salı", ...] listesini verince günler doğru sıraya diziliyor. tooltip da fareyle çubuğun üzerine gelince sayıyı gösteriyor. Grafiği sayfaya koymak için st.altair_chart(grafik) yeterli. (GitHub’daki tam sürümde eksen biçimleri için birkaç ayar daha var.)

En çok izlenen 10 dizi ise grafik değil tablo: st.dataframe(ilk10, hide_index=True). Uzun dizi isimleri tabloda daha rahat okunuyor.

6. Bir diziye yakından bak

diziler = f.loc[f["tur"] == "Dizi", "isim"].value_counts().index.tolist()
secilen = st.selectbox("Dizi seç", diziler)
d = f[f["isim"] == secilen]

st.selectbox bir açılır menü koyar. Liste en çok izlenenden en aza doğru sıralı. Bir dizi seçince ilk ve son izleme tarihini ve o dizinin aylara göre grafiğini gösteriyoruz. Bir diziyi birkaç haftada bitirip bitirmediğini ya da yıllara yayıp yaymadığını bu grafikte görebiliyorsun.

Çalıştırmak

  1. GitHub’dan netflix-pano klasörünü indir (ya da depoyu klonla).
  2. Terminalde o klasöre gir ve pip install -r requirements.txt yaz.
  3. streamlit run app.py yaz. Tarayıcında pano açılır.
  4. Netflix’ten indirdiğin NetflixViewingHistory.csv dosyasını yükleme kutusuna sürükle.

Dosyayı Netflix’ten nasıl indireceğini ilk bölümde adım adım anlattım.

Panoyu internete koymak

Panoyu arkadaşlarınla paylaşmak istersen Streamlit Community Cloud’u kullanabilirsin: GitHub hesabınla giriş yapıp deponu ve app.py dosyasını seçiyorsun, uygulama birkaç dakika içinde bir web adresinde yayına giriyor. Uygulama kimsenin verisini kendi içinde taşımıyor; her ziyaretçi kendi dosyasını yüklüyor.

Gizlilik notu: Uygulama yüklenen dosyayı hiçbir yere kaydetmiyor, sadece açık olan oturumda işliyor. Yine de ham CSV dosyanı GitHub gibi herkese açık bir yere koyma. İzleme geçmişi, ne zaman uyanık olduğuna kadar çok şey anlatır. Paylaşırken sadece toplamları ve grafikleri paylaş; ben de bu yazıda öyle yaptım.

Panoda ne gördüm?

Kendi verimi yükleyince pano şunları gösterdi:

  • Ağustos 2019’dan bu yana toplam 4.986 kayıt, 487 farklı dizi ve 350 film.
  • Haftanın en çok izlediğim günü Pazar, ikinci sırada Pazartesi. Hafta içinin diğer günleri birbirine çok yakın.
  • Maraton günümde 36 kayıt var.

Kendin dene

  • Kenar çubuğuna bir saat filtresi ekleyemezsin, çünkü Netflix dosyasında saat yok. Ama bir ay filtresi ekleyebilirsin: st.slider ile 1-12 arası seçim yap.
  • “En çok izlenen 10 dizi” yerine kullanıcının kaç dizi görmek istediğini seçmesini sağla: st.number_input("Kaç dizi?", 5, 30, 10).
  • Bir arkadaşınla karşılaştır: İki dosya yükletip iki kişinin haftalık çubuklarını yan yana göster.

Bir sonraki pop kültür projesinde Netflix verisini bir adım daha ileri taşıyıp basit bir öneri sistemi yazacağız: “Netflix’te Ne İzlesem?”


Hatice Özbolat | Teknoloji ve AI Rehberi sitesinden daha fazla şey keşfedin

Son gönderilerin e-postanıza gönderilmesi için abone olun.

Comments

Bir yanıt yazın