================================================================================
  Experiment 16: Linear Regression Temperature Prediction (Beijing PRSA)
================================================================================

FULL QUESTION:
Using the provided historical IoT environmental sensor dataset, develop a Linear Regression model to predict temperature using PM2.5, PM10, pressure, dew point, and wind speed. Train and evaluate the model, and predict the temperature for a new set of sensor readings.

SHORT QUESTION:
Multiple Linear Regression predicting temperature from PM2.5, PM10, PRES, DEWP, and WSPM with test evaluation (R2, MAE, MSE, RMSE).

================================================================================
README & SETUP INSTRUCTIONS:
================================================================================
# Experiment 16: Linear Regression Temperature Prediction

## Objective
Train a Multiple Linear Regression model predicting Temperature (`TEMP`) using `PM2.5`, `PM10`, Atmospheric Pressure (`PRES`), Dew Point (`DEWP`), and Wind Speed (`WSPM`).

## Dataset
UCI Beijing Multi-Site Air Quality dataset (`PRSA_Data_Aotizhongxin_20130301-20170228.csv`).

## Requirements
```bash
pip install pandas scikit-learn streamlit
```

## How to Run
- **CLI Mode:**
  ```bash
  python temperature_cli.py
  ```
- **Streamlit Web Dashboard:**
  ```bash
  streamlit run temperature_app.py
  ```

================================================================================
SOURCE CODE FILES:
================================================================================

1. temperature_cli.py
--------------------------------------------------------------------------------
import os
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
data_path = os.path.join(BASE_DIR, "PRSA_Data_Aotizhongxin_20130301-20170228.csv") if os.path.exists(os.path.join(BASE_DIR, "PRSA_Data_Aotizhongxin_20130301-20170228.csv")) else "PRSA_Data_Aotizhongxin_20130301-20170228.csv"
data = pd.read_csv(data_path)

features = ["PM2.5", "PM10", "PRES", "DEWP", "WSPM"]
target = "TEMP"

required_columns = features + [target]
missing_columns = [col for col in required_columns if col not in data.columns]
if missing_columns:
    print("Missing columns:", missing_columns)
    exit()

data = data[features + [target]].dropna()

X = data[features]
y = data[target]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=42
)

model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = mse ** 0.5
r2 = r2_score(y_test, y_pred)

print("Model Evaluation:")
print(f"R2 Score : {r2:.4f}")
print(f"RMSE     : {rmse:.4f}")

sample = [[45.0, 80.0, 1012.0, 5.0, 2.1]]
pred = model.predict(sample)[0]
print(f"Predicted Temperature for sample [45.0, 80.0, 1012.0, 5.0, 2.1]: {pred:.2f} C")
--------------------------------------------------------------------------------

2. temperature_app.py
--------------------------------------------------------------------------------
import streamlit as st
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

st.title("Beijing Temperature Prediction")

features = ["PM2.5", "PM10", "PRES", "DEWP", "WSPM"]
target = "TEMP"

data = pd.read_csv("PRSA_Data_Aotizhongxin_20130301-20170228.csv")[features + [target]].dropna()
X = data[features]
y = data[target]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)
model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
st.write(f"R2 Score: {r2_score(y_test, y_pred):.4f}")
st.write(f"RMSE: {mean_squared_error(y_test, y_pred) ** 0.5:.4f}")

pm25 = st.number_input("PM2.5", value=80.0)
pm10 = st.number_input("PM10", value=120.0)
pressure = st.number_input("Pressure", value=1012.0)
dewpoint = st.number_input("Dew Point", value=5.0)
windspeed = st.number_input("Wind Speed", value=2.5)

if st.button("Predict Temperature"):
    pred = model.predict([[pm25, pm10, pressure, dewpoint, windspeed]])[0]
    st.success(f"Predicted Temperature: {pred:.2f} °C")
--------------------------------------------------------------------------------
