PBL Big Data & Database Advance

Cara Import Data ke MongoDB Menggunakan Python dan Flask untuk CRUD Web 

Jika Anda sudah menyiapkan MongoDB di lokal Anda, sekarang saatnya untuk memulai mengimpor data ke MongoDB menggunakan Python dan pustaka pymongo. Berikut adalah panduan langkah demi langkah untuk melakukannya, serta cara membuat aplikasi web CRUD menggunakan Flask.

Langkah 1: Mengimpor Data ke MongoDB Menggunakan Python

Untuk memulai, Anda perlu mengimpor data ke MongoDB. Berikut adalah langkah-langkah yang perlu Anda ikuti:

  1. Instalasi Pustaka pymongo
    Pertama, pastikan Anda telah menginstal pustaka pymongo. Jika belum, Anda bisa menginstalnya dengan perintah:

  2. Sambungkan Python ke MongoDB
    Setelah pustaka terinstal, Anda dapat menghubungkan Python dengan MongoDB menggunakan pymongo. Pastikan MongoDB Anda berjalan di localhost:27017 (atau sesuaikan jika Anda menggunakan konfigurasi yang berbeda).

  3. Konversi Dataset ke Format JSON
    Dataset yang Anda miliki, misalnya dalam format Excel, harus dikonversi menjadi format JSON. Anda bisa melakukannya dengan menggunakan metode to_dict(orient="records") pada dataset.

  4. Import Data ke Koleksi MongoDB
    Setelah dataset dalam format JSON, Anda dapat menggunakan perintah insert_many untuk memasukkan data ke dalam koleksi MongoDB. Berikut adalah skrip Python untuk melakukan semua langkah tersebut:

Skrip Import Data ke MongoDB

Pastikan MongoDB lokal Anda berjalan di localhost:27017. Jika konfigurasi berbeda, sesuaikan.





Penjelasan Skrip:

  1. pymongo digunakan untuk menghubungkan Python dengan MongoDB.
  2. Dataset dari Excel dikonversi ke format JSON menggunakan to_dict(orient="records").
  3. Koleksi netflix_titles di database netflix_db digunakan untuk menyimpan data.
  4. insert_many digunakan untuk memasukkan semua data ke MongoDB.

Cara Menjalankan:

  • Simpan skrip di file Python, misalnya import_netflix.py.
  • Jalankan dengan perintah
python import_netflix.py


Baik, kita akan melanjutkan dengan pembuatan CRUD berbasis web menggunakan Flask di VSCode.

Langkah-langkahnya:

  1. Setup Flask Project: Struktur direktori dasar proyek.
  2. Buat Routes CRUD: Menampilkan, menambahkan, mengedit, dan menghapus data dari MongoDB.
  3. Integrasi Template HTML: Tampilan sederhana menggunakan Flask dan Jinja2.
  4. Test Aplikasi Web: Jalankan server Flask dan akses melalui browser.

Berikut adalah langkah pertama: Setup Flask dan Struktur Proyek.

Struktur Folder:

Buat struktur proyek seperti berikut:


1. Install Flask dan Pymongo

Buat file requirements.txt dan tambahkan:


Jalankan perintah berikut di terminal VSCode untuk menginstal pustaka:


2. Buat File app.py

Berikut adalah kode awal Flask dengan route dasar untuk CRUD:

Penjelasan:

  • Route /: Menampilkan semua data dari MongoDB.
  • Route /add: Formulir untuk menambahkan data baru.
  • Route /edit/<id>: Formulir untuk mengedit data berdasarkan ID.
  • Route /delete/<id>: Menghapus data dari MongoDB.




3. Tambahkan Template HTML

Buat file HTML di folder templates untuk antarmuka:


4. Tambahkan add HTML

5. Jalankan Proyek dengan perintah berikut



6. Hasil




7. Visualisasi Data

    a. Berikut adalah langkah-langkah step-by-step lengkap, termasuk penamaan folder dan file, untuk membantu Anda mengerjakan tugas Database Advanced dan Big Data dengan menggunakan MongoDB dan Python untuk visualisasi data. Saya akan memberikan struktur proyek dan penjelasan lebih rinci.

Struktur Folder dan File Proyek



Step 1: Persiapan dan Instalasi Pustaka

Buat folder netflix_project dan di dalamnya buat struktur folder seperti yang ditunjukkan di atas. Setelah itu, buat file requirements.txt yang berisi daftar pustaka yang dibutuhkan untuk proyek ini.

1.1 requirements.txt

Isi file requirements.txt dengan pustaka-pustaka berikut:


1.2 Instalasi Pustaka

Di dalam terminal VSCode, pastikan Anda berada di dalam folder proyek, lalu jalankan perintah berikut untuk menginstal pustaka yang ada di requirements.txt:

    


Step 2: Import Data ke MongoDB

Sebelum kita membuat visualisasi, pastikan data sudah diimpor ke MongoDB. Anda bisa menggunakan file Excel seperti netflix_titles.xlsx (atau dataset serupa) dan mengonversinya ke MongoDB menggunakan Python dan pymongo.

2.1 Buat Script import_data.py

Di dalam folder /scripts, buat file import_data.py yang akan digunakan untuk mengimpor data ke MongoDB.


2.2 Jalankan Script

Setelah file import_data.py selesai, jalankan script ini untuk mengimpor data ke MongoDB.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Atur tema seaborn
sns.set_theme(style="whitegrid", palette="pastel")

# Baca file Excel
file_path = "netflix_titles.xlsx"  # Ganti dengan path file Anda
df = pd.read_excel(file_path)

# Pembersihan data: Mengganti nilai NaN dengan string kosong
df = df.fillna('')

# Menormalkan nama kolom (mengubah ke huruf kecil dan mengganti spasi dengan "_")
df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")

# Debug: Tampilkan nama kolom
print("Kolom dalam DataFrame:")
print(df.columns)

# Fungsi tambahan untuk menambahkan label data pada grafik
def add_labels(ax):
    for bar in ax.patches:
        ax.annotate(format(bar.get_height(), '.0f'),
                    (bar.get_x() + bar.get_width() / 2, bar.get_height()),
                    ha='center', va='center', size=10, xytext=(0, 5),
                    textcoords='offset points')

# 1. Distribusi Konten Berdasarkan Jenisnya
if "type" in df.columns:
    plt.figure(figsize=(8, 6))
    ax = sns.countplot(data=df, x="type", palette="Set2")
    add_labels(ax)
    plt.title("Distribusi Konten Berdasarkan Jenisnya (Movie vs TV Show)", fontsize=14)
    plt.xlabel("Jenis Konten", fontsize=12)
    plt.ylabel("Jumlah", fontsize=12)
    plt.tight_layout()
    plt.savefig("distribusi_konten.png")
    plt.show()
else:
    print("Kolom 'type' tidak ditemukan!")

# 2. Genre Populer di Netflix
if "listed_in" in df.columns:
    genres = df["listed_in"].str.split(", ", expand=True).stack().value_counts()
    plt.figure(figsize=(12, 6))
    ax = sns.barplot(x=genres.head(10).index, y=genres.head(10).values, palette="muted")
    add_labels(ax)
    plt.title("Genre Populer di Netflix", fontsize=14)
    plt.xlabel("Genre", fontsize=12)
    plt.ylabel("Jumlah", fontsize=12)
    plt.xticks(rotation=45, ha="right")
    plt.tight_layout()
    plt.savefig("genre_populer.png")
    plt.show()
else:
    print("Kolom 'listed_in' tidak ditemukan!")

# 3. Jumlah Konten Berdasarkan Negara Asal
if "country" in df.columns:
    countries = df["country"].str.split(", ", expand=True).stack().value_counts().head(10)
    plt.figure(figsize=(12, 6))
    ax = sns.barplot(x=countries.index, y=countries.values, palette="coolwarm")
    add_labels(ax)
    plt.title("Top 10 Negara dengan Konten Terbanyak", fontsize=14)
    plt.xlabel("Negara", fontsize=12)
    plt.ylabel("Jumlah Konten", fontsize=12)
    plt.xticks(rotation=45, ha="right")
    plt.tight_layout()
    plt.savefig("konten_negara.png")
    plt.show()
else:
    print("Kolom 'country' tidak ditemukan!")

# 4. Tren Rilis Konten di Netflix
if "release_year" in df.columns:
    df["release_year"] = pd.to_numeric(df["release_year"], errors="coerce")
    release_trend = df["release_year"].value_counts().sort_index()
    plt.figure(figsize=(12, 6))
    sns.lineplot(x=release_trend.index, y=release_trend.values, marker="o", color="coral")
    plt.title("Tren Rilis Konten di Netflix", fontsize=14)
    plt.xlabel("Tahun", fontsize=12)
    plt.ylabel("Jumlah Konten", fontsize=12)
    plt.grid(axis="y", linestyle="--", alpha=0.7)
    plt.tight_layout()
    plt.savefig("tren_rilis.png")
    plt.show()
else:
    print("Kolom 'release_year' tidak ditemukan!")

# 5. Durasi Konten: Rata-rata durasi
if "duration" in df.columns:
    df["duration"] = df["duration"].str.extract("(\d+)").astype(float)
    movies_duration = df[df["type"] == "Movie"]["duration"]
    tv_shows_seasons = df[df["type"] == "TV Show"]["duration"]

    # Visualisasi rata-rata durasi film
    plt.figure(figsize=(10, 6))
    sns.histplot(movies_duration.dropna(), bins=20, color="blue", kde=True)
    plt.title("Rata-rata Durasi Film", fontsize=14)
    plt.xlabel("Durasi (Menit)", fontsize=12)
    plt.ylabel("Jumlah Film", fontsize=12)
    plt.tight_layout()
    plt.savefig("durasi_film.png")
    plt.show()

    # Visualisasi jumlah musim TV
    plt.figure(figsize=(10, 6))
    sns.histplot(tv_shows_seasons.dropna(), bins=10, color="orange", kde=True)
    plt.title("Jumlah Musim untuk Acara TV", fontsize=14)
    plt.xlabel("Jumlah Musim", fontsize=12)
    plt.ylabel("Jumlah Acara TV", fontsize=12)
    plt.tight_layout()
    plt.savefig("jumlah_musim_tv.png")
    plt.show()
else:
    print("Kolom 'duration' tidak ditemukan!")

# 6. Rating Populer
if "rating" in df.columns:
    ratings = df["rating"].value_counts()
    plt.figure(figsize=(10, 6))
    ax = sns.barplot(x=ratings.index, y=ratings.values, palette="rocket")
    add_labels(ax)
    plt.title("Rating Populer di Netflix", fontsize=14)
    plt.xlabel("Rating", fontsize=12)
    plt.ylabel("Jumlah Konten", fontsize=12)
    plt.xticks(rotation=45, ha="right")
    plt.tight_layout()
    plt.savefig("rating_populer.png")
    plt.show()
else:
    print("Kolom 'rating' tidak ditemukan!")

print("Visualisasi selesai. Semua hasil telah disimpan dalam file gambar.")


HASIL














Komentar