Link google colab drive : https://colab.research.google.com/drive/1g6C94schh1f2s50RaVJxBX4klHMkJM5H?usp=sharing
import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# requests digunakan untuk mengirim permintaan HTTP ke situs web
# BeautifulSoup digunakan untuk mem-parsing HTML dari sius web yang di-scrape
# pandas untuk memanipulasi data dan pengelolaan data dalam format tabel
# matplotlib.pyplot untuk membuat visualisasi data
# Library visualisasi data berbasis matplotlib dengan desain yang lebih menarik
url = "https://stockanalysis.com/list/sp-500-stocks/"
# Url sari halaman web yang berisi daftar saham S&P500 yang akan di-scrape
def scrape_sp500_data(url):
# Mendefinisikan fungsi scrape_sp500_data untuk mengambil data dari URL yang diberikan.
try:
with requests.Session() as session:
response = session.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# Membuka sesi HTTP dengan requests.Session.
# Mengambil konten halaman dengan session.get(url).
# Memastikan permintaan berhasil dengan response.raise_for_status().
# Mem-parsing HTML halaman menggunakan BeautifulSoup.
table = soup.select_one('table')
if not table:
raise ValueError("Tabel data tidak ditemukan di halaman.")
# Mencari elemen tabel dalam HTML dengan select_one.
# Jika tabel tidak ditemukan, muncul pesan error.
headers = [th.text.strip() for th in table.select('thead th')]
rows = table.select('tbody tr')
data = [[col.text.strip() for col in row.select('td')] for row in rows]
# headers Mengambil teks dari elemen thead th (header tabel).
# rows Mengambil semua baris data (tr) dari tbody.
# data Menyusun setiap kolom dalam baris ke dalam list dua dimensi.
df = pd.DataFrame(data, columns=headers)
df = df.rename(columns={
'Symbol': 'Tickers',
'Company Name': 'Company',
'Market Cap': 'MCap',
'Stock Price': 'Price',
'% Change': '24h Change %',
})
# Membuat DataFrame menggunakan pandas.
# Mengganti nama kolom untuk lebih mudah dipahami dan digunakan.
df = df[['Tickers', 'Company', 'MCap', 'Price', '24h Change %']].copy()
df['Price'] = pd.to_numeric(df['Price'], errors='coerce')
df['24h Change %'] = pd.to_numeric(df['24h Change %'].str.replace('%', ''), errors='coerce')
df['MCap'] = df['MCap'].str.replace('[^\d]', '', regex=True).astype(float)
# Memilih kolom penting untuk analisis.
# Mengubah tipe data kolom Price dan 24h Change % menjadi numerik.
# Membersihkan kolom MCap dengan menghapus karakter non-numerik dan mengonversi menjadi tipe float.
bins = [0, 50, 100, 200, 500, 1000, float('inf')]
labels = ['<50', '50-100', '100-200', '200-500', '500-1000', '>1000']
df['Price Range'] = pd.cut(df['Price'], bins=bins, labels=labels)
# Menambahkan kategori rentang harga berdasarkan nilai Price.
# bins Batas rentang harga.
# labels Label untuk setiap rentang.
def visualize_data(df):
top_companies = df.nlargest(10, 'MCap')
plt.figure(figsize=(14, 6))
sns.barplot(x='MCap', y='Company', data=top_companies, palette='viridis')
plt.title("Top 10 Companies by Market Cap")
plt.xlabel("Market Cap (in trillions)")
plt.ylabel("Company")
plt.show()
price_range_counts = df['Price Range'].value_counts().sort_index()
plt.figure(figsize=(10, 6))
sns.barplot(x=price_range_counts.index, y=price_range_counts.values, palette='muted')
plt.title("Distribution of Companies by Price Range")
plt.xlabel("Price Range (USD)")
plt.ylabel("Number of Companies")
plt.show()
# Fungsi untuk visualisasi data:
# nlargest Memilih 10 perusahaan dengan kapitalisasi pasar terbesar.
# Membuat bar plot menggunakan seaborn.barplot.
# Menambahkan judul dan memformat sumbu.
sp500_data = scrape_sp500_data(url)
if sp500_data is not None:
print("Scraped Data (Sample):")
print(sp500_data.head())
# Memanggil fungsi scrape_sp500_data dan menampilkan contoh data jika berhasil.
csv_file = "S&P500.csv"
sp500_data.to_csv(csv_file, index=False)
print(f"Data saved to {csv_file}")
#Menyimpan data ke file CSV dengan nama S&P500.csv.
else:
print("Gagal mendapatkan data.")
# Menampilkan pesan jika data gagal diambil.