236 lines
7.6 KiB
Markdown
236 lines
7.6 KiB
Markdown
# 📊 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 database
|
|
- `get_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()` bukan `len(df)`
|
|
- ✅ Cache otomatis dihapus saat ada tweet baru
|
|
- ✅ Prediksi sentimen direfresh otomatis saat database berubah
|
|
- ✅ Session state `_last_total_tweets` melacak 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:
|
|
```python
|
|
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_tweets` melacak 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:
|
|
```python
|
|
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
|
|
|
|
1. ✅ **Ambil Data Twitter**
|
|
- Caption: "🔄 Data diperbarui: DD/MM/YYYY HH:MM:SS"
|
|
|
|
2. ✅ **Bersihkan Data**
|
|
- Tidak ada perubahan (inherited dari session state)
|
|
|
|
3. ✅ **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"
|
|
|
|
4. ✅ **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)
|
|
```bash
|
|
python3 crawler.py
|
|
```
|
|
|
|
### 2. Jalankan Dashboard
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
# 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
|
|
|
|
1. ✅ `database.py` - Tambah helper functions
|
|
2. ✅ `app.py` - Smart refresh + sidebar info
|
|
3. ✅ `page_modules/sentiment_page.py` - Cache busting + timestamps
|
|
4. ✅ `page_modules/crawling_page.py` - Metrics timestamp
|
|
5. ✅ `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.
|