7.6 KiB
7.6 KiB
📊 Perbaikan Dashboard Sentimen - Data Realtime
🎯 Ringkasan Perubahan
Semua fungsi di dashboard telah diperbaiki untuk menggunakan data realtime yang dinamis bukan data dummy. Sistem sekarang secara otomatis merefresh data ketika ada perubahan di database dan menampilkan timestamp setiap kali data diupdate.
🔄 Perbaikan Utama
1. Database Functions (database.py)
✅ Ditambahkan helper functions untuk deteksi data baru:
get_tweet_count()- Menghitung total tweet di databaseget_latest_crawl_time()- Mendapatkan waktu crawl terakhir
Fungsi: Digunakan untuk cache invalidation yang akurat
2. Sentiment Analysis Page (page_modules/sentiment_page.py)
Perbaikan Cache:
- ✅ Cache sekarang menggunakan
get_tweet_count()bukanlen(df) - ✅ Cache otomatis dihapus saat ada tweet baru
- ✅ Prediksi sentimen direfresh otomatis saat database berubah
- ✅ Session state
_last_total_tweetsmelacak versi database
Timestamp Dinamis:
- ✅ Pie Chart menampilkan waktu update: "Diupdate: DD/MM/YYYY HH:MM:SS"
- ✅ Bar Chart menampilkan waktu update + persentase sentimen
- ✅ Trend Chart menampilkan waktu update realtime
- ✅ Semua metric selalu menampilkan timestamp terkini
Import Baru:
from database import engine, get_tweet_count, get_latest_crawl_time
3. Crawling Page (page_modules/crawling_page.py)
Metrics Update:
- ✅
_render_metrics()sekarang menampilkan timestamp: "🔄 Data diperbarui: DD/MM/YYYY HH:MM:SS" - ✅ Total tweet, hari, tanggal selalu diambil fresh dari database
- ✅ Setiap kali halaman dimuat, data diambil ulang
4. Preprocessing Page (page_modules/preprocessing_page.py)
Cache Improvement:
- ✅ Cache menggunakan
get_tweet_count()untuk invalidation - ✅ Session state
_pp_last_total_tweetsmelacak versi database - ✅ Old cache entries otomatis dihapus
- ✅ Preprocessing direfresh saat ada data baru
5. Main App (app.py)
Smart Refresh Interval:
- ✅ Auto-refresh interval dinamis:
- 30 detik jika ada data baru dalam 5 menit terakhir
- 60 detik jika tidak ada aktivitas crawler baru
- ✅ Sidebar menampilkan status crawler
- ✅ Sidebar baru: Widget "🔄 Update Terbaru" menampilkan:
- Tanggal dan waktu update terakhir
- Format: DD/MM/YYYY HH:MM:SS WIB
Auto-refresh Configuration:
st_autorefresh(
interval=refresh_interval, # Dynamic berdasarkan aktivitas
key="auto_refresh_dashboard"
)
📊 Data Flow Realtime
┌─────────────────────┐
│ Crawler Service │ ← Data baru setiap N menit
│ (python3 crawler) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ SQLite Database │ ← 429+ tweets dengan timestamp
│ (data_sentimen...) │
└──────────┬──────────┘
│
┌─────┴──────┬────────────┬──────────┐
▼ ▼ ▼ ▼
┌──────────┐ ┌─────────┐ ┌──────────┐ ┌────────┐
│Crawling │ │Preprocess│ │Sentiment │ │Sidebar │
│Page │ │ Page │ │ Page │ │ Info │
└──────────┘ └─────────┘ └──────────┘ └────────┘
│ │ │ │
└────────────┴───────────┴───────────┘
│
▼
┌──────────────────────┐
│ Smart Cache Busting │
│ (get_tweet_count) │
└──────────────────────┘
│
▼
┌──────────────────────┐
│ Fresh Data Show │
│ + Realtime Timestamp │
└──────────────────────┘
⚙️ Cara Kerja Cache Invalidation
Sebelumnya (Dummy/Stale):
Cache Key = "sent_realtime_2026-05-09_2026-05-09_450"
├─ Bergantung pada `len(df)` - tidak akurat
├─ Jika ada tweet baru tidak terdeteksi
└─ Data lama tetap ditampilkan
Sesudahnya (Realtime & Dynamic):
Cache Key = "sent_realtime_2026-05-09_2026-05-09_429"
├─ Bergantung pada total tweet di database
├─ Saat tweet baru masuk (429 → 430):
│ └─ Cache key berubah otomatis
│ └─ Prediksi sentimen refresh
│ └─ Timestamp diupdate ke waktu terbaru
└─ Data selalu fresh ✓
🔍 Timestamp Ditampilkan Di
-
✅ Ambil Data Twitter
- Caption: "🔄 Data diperbarui: DD/MM/YYYY HH:MM:SS"
-
✅ Bersihkan Data
- Tidak ada perubahan (inherited dari session state)
-
✅ Analisis Sentimen
- Pie Chart: "Diupdate: DD/MM/YYYY HH:MM:SS"
- Bar Chart: "Diupdate: DD/MM/YYYY HH:MM:SS" + persentase
- Trend Chart: "Diupdate: DD/MM/YYYY HH:MM:SS"
-
✅ Sidebar
- "🔄 Update Terbaru" widget menampilkan waktu crawl terakhir
📈 Data yang Sekarang Realtime
| Data | Sebelumnya | Sesudahnya |
|---|---|---|
| Total Tweet | Dummy | ✅ Fresh dari DB |
| Tanggal Awal | Hardcoded | ✅ Dinamis dari data |
| Tanggal Akhir | Hardcoded | ✅ Dinamis dari data |
| Sentimen Positif | Cached | ✅ Recomputed setiap data baru |
| Sentimen Netral | Cached | ✅ Recomputed setiap data baru |
| Sentimen Negatif | Cached | ✅ Recomputed setiap data baru |
| Pie Chart | Stale | ✅ Refresh + Timestamp |
| Bar Chart | Stale | ✅ Refresh + Timestamp + % |
| Trend Chart | Stale | ✅ Refresh + Timestamp |
| Word Cloud | Cached | ✅ Recomputed setiap data baru |
| Waktu Update | ❌ Tidak ada | ✅ Ditampilkan di sidebar |
🚀 Cara Menggunakan
1. Jalankan Crawler (di terminal terpisah)
python3 crawler.py
2. Jalankan Dashboard
streamlit run app.py
3. Monitor Data
- Sidebar menampilkan status crawler dan waktu update terbaru
- Dashboard auto-refresh setiap 30-60 detik
- Saat ada data baru, prediksi sentimen otomatis direfresh
- Timestamp ditampilkan di setiap chart/metric
✅ Verifikasi
Untuk memastikan perbaikan bekerja:
# 1. Check database functions
python3 -c "from database import get_tweet_count, get_latest_crawl_time; print('Count:', get_tweet_count()); print('Latest:', get_latest_crawl_time())"
# 2. Run syntax check
python3 -m py_compile app.py page_modules/*.py
# 3. Start dashboard
streamlit run app.py
📝 File yang Dimodifikasi
- ✅
database.py- Tambah helper functions - ✅
app.py- Smart refresh + sidebar info - ✅
page_modules/sentiment_page.py- Cache busting + timestamps - ✅
page_modules/crawling_page.py- Metrics timestamp - ✅
page_modules/preprocessing_page.py- Cache busting
🎯 Hasil Akhir
SEBELUM:
- Data dummy / stale
- Cache tidak pernah di-refresh
- Timestamp tidak ditampilkan
- Perlu manual refresh untuk melihat data baru
SESUDAHNYA:
- ✅ Data selalu realtime fresh
- ✅ Cache auto-refresh saat ada data baru
- ✅ Timestamp ditampilkan di semua metric dan chart
- ✅ Auto-refresh setiap 30-60 detik
- ✅ Dashboard responsif terhadap perubahan data
Status: ✅ COMPLETED Semua fungsi telah diperbaiki untuk menggunakan data realtime yang dinamis sesuai fungsinya.