Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"name": "Python 3",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/python:1-3.11-bullseye",
"customizations": {
"codespaces": {
"openFiles": [
"README.md",
"submissions/Raushan/main.py"
]
},
"vscode": {
"settings": {},
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance"
]
}
},
"updateContentCommand": "[ -f packages.txt ] && sudo apt update && sudo apt upgrade -y && sudo xargs apt install -y <packages.txt; [ -f requirements.txt ] && pip3 install --user -r requirements.txt; pip3 install --user streamlit; echo '✅ Packages installed and Requirements met'",
"postAttachCommand": {
"server": "streamlit run submissions/Raushan/main.py --server.enableCORS false --server.enableXsrfProtection false"
},
"portsAttributes": {
"8501": {
"label": "Application",
"onAutoForward": "openPreview"
}
},
"forwardPorts": [
8501
]
}
1 change: 1 addition & 0 deletions submissions/Raushan/.python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.13
87 changes: 87 additions & 0 deletions submissions/Raushan/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# India Growth Metrics Dashboard

_Submitted by: Raushan Bhanu_

## 🌟 Live Demo

🔗 **[View Live Demo](https://india-growth-metrics-dashboard.streamlit.app)**

## 📸 Screenshots

- **Dashboard Overview**

![Dashboard Overview](./demo-images/dashboard-overview.png)

- **Cities Comparison**

![Cities Comparison](./demo-images/cities-comparison.png)

- **Mobile View**

![Mobile View](./demo-images/mobile-view.png)

## 🛠️ Tech Stack

- **Frontend**: Streamlit (Python)
- **Database**: CSV (Pandas DataFrames)
- **Visualization**: Plotly, Seaborn, Matplotlib, Pydeck
- **Deployment**: Streamlit Cloud

## ✨ Unique Features

- **AI-Powered Analytics**: Trend prediction, anomaly detection, and correlation analysis across urban metrics.
- **Interactive City Mapping**: Visualizes metrics geospatially using scalable Pydeck markers.
- **Dynamic Data Exploration**: Customizable visualizations, comparisons, and filtering tools for city-wise insights.

---

## 🚀 Getting Started

### Prerequisites

- Python 3.8+
- Option 1: [`uv` package manager](https://github.com/astral-sh/uv)
- Option 2: Traditional `pip` and `requirements.txt`

---

### 🧩 Installation & Running the App

#### ✅ Option 1: Using `uv` (recommended)

```bash
# Step 1: Clone the repository
git clone https://github.com/RaushanBhanu/Letscode-Community-Challenge-1.git
cd Letscode-Community-Challenge-1/submissions/Raushan

# Step 2: Create and activate a virtual environment
uv venv
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate # Windows

# Step 3: Install dependencies using uv
uv sync

# Step 4: Generate mock data (if needed)
uv run generate_mock_data.py

# Step 5: Run the Streamlit app
streamlit run main.py
```

#### ✅ Option 2: Using `pip`

```bash
# Step 1: Clone the repository
git clone https://github.com/RaushanBhanu/Letscode-Community-Challenge-1.git
cd Letscode-Community-Challenge-1/submissions/Raushan

# Step 2: Install dependencies
pip install -r requirements.txt

# Step 3: Generate mock data (if needed)
python generate_mock_data.py

# Step 4: Run the app
streamlit run main.py
```
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added submissions/Raushan/demo-images/mobile-view.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
71 changes: 71 additions & 0 deletions submissions/Raushan/generate_mock_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import pandas as pd
import random

# Define cities and years
cities = [
"Mumbai",
"Delhi",
"Bangalore",
"Hyderabad",
"Chennai",
"Kolkata",
"Pune",
"Ahmedabad",
"Jaipur",
"Lucknow",
]
years = list(range(2019, 2029)) # 5 years

# Define metrics and value ranges
metrics = {
"GDP": (50, 300),
"GNI": (45, 290),
"GDP per Capita": (5000, 25000),
"Unemployment Rate": (3, 15),
"Inflation Rate": (2, 10),
"FDI": (0.5, 15),
"Export/Import Ratio": (0.5, 2.0),
"Public Debt % of GDP": (30, 90),
"HDI": (0.5, 0.9),
"Life Expectancy": (65, 82),
"Infant Mortality Rate": (2, 30),
"Literacy Rate": (70, 99),
"Education Index": (0.4, 0.95),
"Gender Inequality Index": (0.2, 0.7),
"Population Growth Rate": (0.5, 3.0),
"Urban Population %": (50, 100),
"Healthcare Expenditure per Capita": (200, 2000),
"Physicians per 1000": (0.5, 4),
"Hospital Beds per 1000": (1, 6),
"Access to Clean Water %": (60, 100),
"Vaccination Coverage %": (60, 100),
"CO2 Emissions per Capita": (1, 8),
"Renewable Energy %": (10, 60),
"Forest Area %": (5, 40),
"Air Quality Index": (50, 300),
"Environmental Performance Index": (20, 80),
"Corruption Perceptions Index": (20, 80),
"Internet Penetration %": (40, 95),
"Mobile Subscriptions per 100": (60, 130),
"Infrastructure Quality Index": (2, 8),
"Political Stability Index": (-2.5, 2.5),
"Gini Coefficient": (25, 50),
"Poverty Rate": (5, 40),
"Social Protection Coverage %": (30, 100),
}

# Generate mock data
data = []
for city in cities:
for year in years:
entry = {"City": city, "Year": year}
for metric, (low, high) in metrics.items():
entry[metric] = round(random.uniform(low, high), 2)
data.append(entry)

# Create DataFrame
df_mock_data = pd.DataFrame(data)

# Save to CSV
csv_path = "india_city_growth_metrics_mock_data.csv"
df_mock_data.to_csv(csv_path, index=False)
Loading