Spaces:
Sleeping
Sleeping
import streamlit as st | |
import requests | |
import plotly.graph_objects as go | |
from datetime import datetime, timedelta | |
from dotenv import load_dotenv | |
import os | |
# Load API Key from .env | |
load_dotenv() | |
API_KEY = os.getenv("API_KEY") # Fetch from .env file | |
# API Endpoints | |
BASE_URL = "https://api.apilayer.com/exchangerates_data/latest" | |
HISTORICAL_URL = "https://api.apilayer.com/exchangerates_data/timeseries" | |
# Streamlit Page Configuration | |
st.set_page_config(page_title="💱 Currency Converter", page_icon="💰", layout="wide") | |
# Title | |
st.title("💱 Currency Converter") | |
# Fetch available currencies | |
def get_currencies(): | |
url = f"{BASE_URL}?apikey={API_KEY}" | |
response = requests.get(url).json() | |
if "rates" in response: | |
return sorted(response["rates"].keys()) | |
return ["USD", "INR", "EUR", "GBP", "CAD"] # Default if API fails | |
currencies = get_currencies() | |
# Input Section | |
col1, col2 = st.columns(2) | |
with col1: | |
amount = st.number_input("Enter Amount:", min_value=0.01, step=0.01) | |
with col2: | |
from_currency = st.selectbox("From Currency", currencies, index=currencies.index("USD")) | |
to_currency = st.selectbox("To Currency", currencies, index=currencies.index("INR")) | |
# Function to Convert Currency | |
def convert_currency(amount, from_currency, to_currency): | |
url = f"{BASE_URL}?base={from_currency}&apikey={API_KEY}" | |
response = requests.get(url).json() | |
if "rates" in response and to_currency in response["rates"]: | |
exchange_rate = response["rates"][to_currency] | |
converted_amount = amount * exchange_rate | |
return converted_amount, exchange_rate | |
else: | |
return None, None | |
# Fetch Historical Data | |
def get_historical_data(from_currency, to_currency): | |
end_date = datetime.today().strftime("%Y-%m-%d") | |
start_date = (datetime.today() - timedelta(days=30)).strftime("%Y-%m-%d") | |
url = f"{HISTORICAL_URL}?apikey={API_KEY}&start_date={start_date}&end_date={end_date}&base={from_currency}&symbols={to_currency}" | |
response = requests.get(url).json() | |
if "rates" in response: | |
dates = sorted(response["rates"].keys()) # Sort dates | |
rates = [response["rates"][date][to_currency] for date in dates] | |
return dates, rates | |
return [], [] | |
# Convert Button | |
if st.button("Convert Now"): | |
if from_currency == to_currency: | |
st.warning("⚠️ Please select different currencies!") | |
else: | |
converted_amount, exchange_rate = convert_currency(amount, from_currency, to_currency) | |
if converted_amount: | |
# Black Font Output | |
st.write(f"### 💵 {amount} {from_currency} = **{converted_amount:.2f} {to_currency}**") | |
st.write(f"#### 📈 Exchange Rate: **{exchange_rate:.4f}**") | |
# Display Graph | |
dates, rates = get_historical_data(from_currency, to_currency) | |
if dates: | |
fig = go.Figure() | |
fig.add_trace(go.Scatter(x=dates, y=rates, mode="lines+markers", name=f"{from_currency} to {to_currency}")) | |
fig.update_layout(title=f"{from_currency} to {to_currency} Exchange Rate (Last 30 Days)", xaxis_title="Date", yaxis_title="Exchange Rate") | |
st.plotly_chart(fig) | |
else: | |
st.error("❌ Error: Unable to fetch exchange rates.") | |