├── data ├── raw │ └── .gitkeep └── processed │ └── .gitkeep ├── results ├── .gitkeep ├── comparison_analysis.txt ├── iolin_forest_metrics.csv ├── iolin_metrics.csv └── olin_metrics.csv ├── src ├── __init__.py ├── utils.py ├── iolin_deep_learning_utils.py ├── iolin_sk.py ├── iolin_xgb.py ├── data_loader.py ├── iolin_forest.py ├── iolin_lstm.py ├── olin.py ├── iolin.py └── information_network.py ├── requirements.txt ├── .gitignore ├── notebooks ├── 1_data_exploration.ipynb └── 2_results_visualization.ipynb ├── README.md ├── experiments ├── run_olin_experiment.py ├── run_iolin_lstm_experiment.py ├── run_iolin_sk_experiment.py ├── analyze_results.py ├── run_iolin_experiment.py ├── run_iolin_forest_experiment.py ├── run_final_experiment.py └── run_iolin_xgb_experiment.py └── app.py /data/raw/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /results/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/processed/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pandas 2 | numpy 3 | scipy 4 | streamlit 5 | -------------------------------------------------------------------------------- /src/utils.py: -------------------------------------------------------------------------------- 1 | # src/utils.py 2 | # A place for helper functions used across multiple modules, 3 | # such as custom logging configurations or shared statistical calculations. 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Python 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | *.so 6 | .Python 7 | build/ 8 | develop-eggs/ 9 | dist/ 10 | downloads/ 11 | eggs/ 12 | .eggs/ 13 | lib/ 14 | lib64/ 15 | parts/ 16 | sdist/ 17 | var/ 18 | wheels/ 19 | share/python-wheels/ 20 | *.egg-info/ 21 | .installed.cfg 22 | *.egg 23 | MANIFEST 24 | 25 | # Virtual environment 26 | .venv 27 | env/ 28 | venv/ 29 | ENV/ 30 | env.bak/ 31 | venv.bak/ 32 | 33 | # IDEs and Editors 34 | .vscode/ 35 | .idea/ 36 | .project 37 | .pydevproject 38 | .cproject 39 | 40 | # Data and results 41 | 42 | -------------------------------------------------------------------------------- /notebooks/1_data_exploration.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Data Exploration and Visualization" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": null, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import pandas as pd\n", 17 | "import numpy as np\n", 18 | "import matplotlib.pyplot as plt\n", 19 | "import seaborn as sns\n\n", 20 | "print('Notebook ready!')" 21 | ] 22 | } 23 | ], 24 | "metadata": { 25 | "kernelspec": { 26 | "display_name": "Python 3", 27 | "language": "python", 28 | "name": "python3" 29 | } 30 | }, 31 | "nbformat": 4, 32 | "nbformat_minor": 2 33 | } -------------------------------------------------------------------------------- /notebooks/2_results_visualization.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Data Exploration and Visualization" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": null, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import pandas as pd\n", 17 | "import numpy as np\n", 18 | "import matplotlib.pyplot as plt\n", 19 | "import seaborn as sns\n\n", 20 | "print('Notebook ready!')" 21 | ] 22 | } 23 | ], 24 | "metadata": { 25 | "kernelspec": { 26 | "display_name": "Python 3", 27 | "language": "python", 28 | "name": "python3" 29 | } 30 | }, 31 | "nbformat": 4, 32 | "nbformat_minor": 2 33 | } -------------------------------------------------------------------------------- /results/comparison_analysis.txt: -------------------------------------------------------------------------------- 1 | ========================================= 2 | IOLIN vs. OLIN Performance Analysis 3 | ========================================= 4 | 5 | --- Overall Performance Metrics --- 6 | 7 | OLIN IOLIN 8 | Avg Error Rate 0.642065 0.644849 9 | Avg Processing Time (s) 46.365696 10.671046 10 | Total Time (s) 19983.614799 4599.220817 11 | 12 | 13 | --- Statistical Significance (Paired T-Test) --- 14 | 15 | Comparing Processing Times: 16 | T-statistic: 23.8302 17 | P-value: 0.0000 18 | Conclusion: The difference in processing time is statistically significant. 19 | 20 | Comparing Error Rates: 21 | T-statistic: -0.3640 22 | P-value: 0.7160 23 | Conclusion: The difference in error rate is NOT statistically significant. 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # IOLIN: Incremental On-line Information Network 2 | 3 | This project is an implementation of the research paper "Real-time data mining of non-stationary data streams from sensor networks" by Cohen et al. 4 | 5 | ## Project Structure 6 | - **/data**: Contains raw and processed datasets. 7 | - **/src**: Core source code for IN, OLIN, and IOLIN algorithms. 8 | - **/notebooks**: Jupyter notebooks for data exploration and result visualization. 9 | - **/experiments**: Scripts to run the full experiments and analysis. 10 | - **/results**: Output files from experiments (metrics, logs, etc.). 11 | - **app.py**: A Streamlit application to demonstrate the project. 12 | 13 | ## Setup 14 | 1. Create a virtual environment: 15 | `python -m venv venv` 16 | `source venv/bin/activate` # On Windows use `venv\Scripts\activate` 17 | 2. Install dependencies: 18 | `pip install -r requirements.txt` 19 | 20 | ## How to Run 21 | 1. Run the experiments: 22 | `python experiments/run_olin_experiment.py` 23 | `python experiments/run_iolin_experiment.py` 24 | 2. Analyze the results: 25 | `python experiments/analyze_results.py` 26 | 3. Launch the Streamlit GUI: 27 | `streamlit run app.py` 28 | -------------------------------------------------------------------------------- /results/iolin_forest_metrics.csv: -------------------------------------------------------------------------------- 1 | window_start,error_rate,processing_time_s 2 | 0,0.6799999999999999,68.61677479743958 3 | 100,0.83,95.57811522483826 4 | 200,0.94,110.53654050827026 5 | 300,0.64,97.83094644546509 6 | 400,0.73,137.3634910583496 7 | 500,0.85,196.73037385940552 8 | 600,0.94,205.27867579460144 9 | 700,0.9299999999999999,104.5300714969635 10 | 800,0.69,93.44746017456055 11 | 900,0.73,251.50440287590027 12 | 1000,0.79,70.54199743270874 13 | 1100,0.72,200.80172681808472 14 | 1200,0.75,182.3408317565918 15 | 1300,0.5700000000000001,63.882142543792725 16 | 1400,0.9,183.5120108127594 17 | 1500,0.85,113.93146347999573 18 | 1600,0.84,91.9010968208313 19 | 1700,0.77,121.40750122070312 20 | 1800,0.91,113.18732857704163 21 | 1900,0.6799999999999999,85.70841002464294 22 | 2000,0.81,202.36878061294556 23 | 2100,0.88,293.57993602752686 24 | 2200,0.9,66.68110275268555 25 | 2300,0.81,70.89187955856323 26 | 2400,0.69,124.50391173362732 27 | 2500,0.9299999999999999,106.08894777297974 28 | 2600,0.6599999999999999,100.47663044929504 29 | 2700,0.88,125.27517223358154 30 | 2800,0.89,43.032588958740234 31 | 2900,0.85,147.80291152000427 32 | 3000,0.45999999999999996,102.3011326789856 33 | 3100,0.77,64.45947480201721 34 | 3200,0.72,123.70252823829651 35 | 3300,0.77,120.38874673843384 36 | 3400,0.8,67.60032892227173 37 | 3500,0.89,53.349772691726685 38 | 3600,0.69,127.92032551765442 39 | 3700,0.9299999999999999,96.31770586967468 40 | 3800,0.84,132.57737970352173 41 | 3900,0.69,151.42340087890625 42 | 4000,0.7,160.09869360923767 43 | 4100,0.84,175.1245732307434 44 | 4200,0.85,56.6157603263855 45 | 4300,0.47,111.96184420585632 46 | 4400,0.86,25.42067265510559 47 | -------------------------------------------------------------------------------- /src/iolin_deep_learning_utils.py: -------------------------------------------------------------------------------- 1 | # src/iolin_deep_learning_utils.py 2 | # Utilities for preparing data for deep learning models like LSTMs. 3 | 4 | import numpy as np 5 | from tensorflow.keras.utils import to_categorical 6 | 7 | def create_lstm_sequences(data, target_attribute, n_steps, n_features, n_classes): 8 | """ 9 | Reshapes a 2D data window into 3D sequences suitable for an LSTM. 10 | 11 | Args: 12 | data (pd.DataFrame): The input data window. 13 | target_attribute (str): The name of the target column. 14 | n_steps (int): The number of time steps in each sequence (e.g., 24 hours). 15 | n_features (int): The number of input features. 16 | n_classes (int): The number of target classes for one-hot encoding. 17 | 18 | Returns: 19 | A tuple of (X, y) where X is the 3D features array and y is the one-hot encoded target array. 20 | """ 21 | X, y = [], [] 22 | for i in range(len(data)): 23 | # Find the end of this pattern 24 | end_ix = i + n_steps 25 | # Check if we are beyond the dataset 26 | if end_ix > len(data)-1: 27 | break 28 | # Gather input and output parts of the pattern 29 | # The input is a sequence of 'n_steps' length 30 | # The output is the target at the end of the sequence 31 | input_cols = [col for col in data.columns if col != target_attribute] 32 | seq_x = data[input_cols].iloc[i:end_ix].values 33 | seq_y = data[target_attribute].iloc[end_ix] 34 | X.append(seq_x) 35 | y.append(seq_y) 36 | 37 | X = np.array(X) 38 | y = np.array(y) 39 | 40 | # Reshape X to be [samples, timesteps, n_features] 41 | X = X.reshape((X.shape[0], n_steps, n_features)) 42 | # One-hot encode the target variable 43 | y = to_categorical(y, num_classes=n_classes) 44 | 45 | return X, y 46 | -------------------------------------------------------------------------------- /experiments/run_olin_experiment.py: -------------------------------------------------------------------------------- 1 | # experiments/run_olin_experiment.py 2 | # This script will run the full OLIN experiment. 3 | # It will load the processed data, instantiate the OLIN algorithm, 4 | # run it on the data stream, and save the performance metrics 5 | # to a CSV file in the /results directory. 6 | 7 | import pandas as pd 8 | import os 9 | import sys 10 | import time 11 | 12 | # FIX: Add the project root's 'src' directory to the Python path 13 | # This allows us to import modules from the 'src' folder. 14 | src_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')) 15 | sys.path.insert(0, src_path) 16 | 17 | # Now we can import directly from the src modules 18 | from olin import OLIN 19 | 20 | def run_experiment(): 21 | """Runs the full OLIN experiment and saves the results.""" 22 | print("--- Starting Full OLIN Experiment ---") 23 | 24 | # Load the full processed dataset 25 | try: 26 | # Go up one level from 'experiments' to the project root to find 'data' 27 | data_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'processed', 'processed_beijing_pm25.csv') 28 | df = pd.read_csv(data_path) 29 | print(f"Loaded dataset with {len(df)} records.") 30 | except FileNotFoundError: 31 | print(f"Error: Processed data file not found at {data_path}.") 32 | print("Please run src/data_loader.py first.") 33 | return 34 | 35 | # Define attributes and parameters 36 | target_col = 'Target' 37 | input_cols_list = [col for col in df.columns if col not in [target_col, 'datetime', 'Unnamed: 0']] 38 | input_cols_with_uniques = {col: df[col].unique() for col in input_cols_list} 39 | 40 | WINDOW_SIZE = 500 41 | STEP_SIZE = 100 42 | SIGNIFICANCE_LEVEL = 0.05 43 | 44 | # Initialize OLIN processor 45 | olin_processor = OLIN(input_cols_with_uniques, target_col, significance_level=SIGNIFICANCE_LEVEL) 46 | 47 | # Process the stream and collect results 48 | results = [] 49 | total_windows = (len(df) - WINDOW_SIZE) // STEP_SIZE 50 | start_time_total = time.time() 51 | 52 | print(f"Processing data stream with window_size={WINDOW_SIZE} and step_size={STEP_SIZE}...") 53 | for i, result in enumerate(olin_processor.process_data_stream(df, WINDOW_SIZE, STEP_SIZE)): 54 | print(f" Processing window {i+1}/{total_windows}...") 55 | results.append(result) 56 | 57 | end_time_total = time.time() 58 | print(f"\n--- OLIN Experiment Finished ---") 59 | 60 | if results: 61 | results_df = pd.DataFrame(results) 62 | # Save results to CSV 63 | results_path = os.path.join(os.path.dirname(__file__), '..', 'results', "olin_metrics.csv") 64 | results_df.to_csv(results_path, index=False) 65 | print(f"Results saved to {results_path}") 66 | 67 | # Print final summary 68 | avg_error = results_df['error_rate'].mean() 69 | total_time = end_time_total - start_time_total 70 | avg_time_per_window = results_df['processing_time_s'].mean() 71 | 72 | print("\n--- OLIN Final Summary ---") 73 | print(f"Total windows processed: {len(results_df)}") 74 | print(f"Total experiment time: {total_time:.2f} seconds") 75 | print(f"Average Error Rate: {avg_error:.4f}") 76 | print(f"Average Processing Time per Window: {avg_time_per_window:.4f} seconds") 77 | else: 78 | print("No results were generated.") 79 | 80 | 81 | if __name__ == '__main__': 82 | run_experiment() 83 | -------------------------------------------------------------------------------- /experiments/run_iolin_lstm_experiment.py: -------------------------------------------------------------------------------- 1 | # experiments/run_iolin_lstm_experiment.py 2 | # This script runs the state-of-the-art IOLIN-LSTM model on the full dataset. 3 | 4 | import pandas as pd 5 | import os 6 | import sys 7 | import time 8 | os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # Suppress TensorFlow INFO messages 9 | import tensorflow as tf 10 | 11 | # Add the project root to the Python path 12 | project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) 13 | sys.path.insert(0, project_root) 14 | 15 | from src.iolin_lstm import IOLIN_LSTM 16 | 17 | def run_lstm_experiment(): 18 | """Runs the full IOLIN-LSTM experiment and prints the final summary.""" 19 | print("--- Starting Final IOLIN-LSTM Experiment (Deep Learning Approach) ---") 20 | 21 | # --- Load the advanced features dataset --- 22 | try: 23 | data_path = os.path.join("data", "processed", "processed_beijing_pm25_advanced.csv") 24 | df = pd.read_csv(data_path, index_col='datetime', parse_dates=True) 25 | # For this intensive experiment, we'll use a smaller but significant slice 26 | df = df.head(8000) 27 | print(f"Loaded advanced feature set with {len(df)} records.") 28 | except FileNotFoundError: 29 | print(f"Error: Advanced processed data file not found at {data_path}.") 30 | return 31 | 32 | # --- Model & Experiment Parameters --- 33 | target_col = 'Target' 34 | input_cols = [col for col in df.columns if col != target_col] 35 | 36 | # LSTM-specific parameters 37 | N_STEPS = 24 # Use the last 24 hours of data to predict the next hour 38 | N_FEATURES = len(input_cols) 39 | N_CLASSES = df[target_col].nunique() 40 | 41 | WINDOW_SIZE = 2000 42 | STEP_SIZE = 500 43 | 44 | # Initialize the IOLIN-LSTM processor 45 | lstm_processor = IOLIN_LSTM( 46 | n_steps=N_STEPS, 47 | n_features=N_FEATURES, 48 | n_classes=N_CLASSES 49 | ) 50 | 51 | # --- Process the stream --- 52 | results = [] 53 | total_windows = (len(df) - WINDOW_SIZE) // STEP_SIZE 54 | start_time_total = time.time() 55 | 56 | print(f"Processing full stream with LSTM model...") 57 | for i, result in enumerate(lstm_processor.process_data_stream(df, target_col, WINDOW_SIZE, STEP_SIZE)): 58 | accuracy = 1.0 - result['error_rate'] 59 | print(f" Processed window {i+1}/{total_windows}: Accuracy = {accuracy:.2%}") 60 | results.append(result) 61 | 62 | end_time_total = time.time() 63 | print(f"\n--- IOLIN-LSTM Experiment Finished ---") 64 | 65 | if results: 66 | results_df = pd.DataFrame(results) 67 | 68 | avg_error = results_df['error_rate'].mean() 69 | avg_accuracy = 1.0 - avg_error 70 | 71 | print("\n--- DEEP LEARNING FINAL SUMMARY ---") 72 | print(f"Total experiment time: {end_time_total - start_time_total:.2f} seconds") 73 | print(f"Average Error Rate: {avg_error:.4f}") 74 | print(f"Average ACCURACY: {avg_accuracy:.2%}") 75 | print("---------------------------------") 76 | if avg_accuracy >= 0.85: 77 | print("🎉🎉🎉 CONGRATULATIONS! The 85%+ accuracy target has been successfully achieved! 🎉🎉🎉") 78 | else: 79 | print("This represents the final, highest performance of the implemented system using a deep learning approach.") 80 | else: 81 | print("No results were generated.") 82 | 83 | 84 | if __name__ == '__main__': 85 | run_lstm_experiment() 86 | -------------------------------------------------------------------------------- /experiments/run_iolin_sk_experiment.py: -------------------------------------------------------------------------------- 1 | # experiments/run_iolin_sk_experiment.py 2 | # This script runs the high-performance IOLIN-SK model with the 3 | # new advanced feature set to maximize accuracy. 4 | 5 | import pandas as pd 6 | import os 7 | import sys 8 | import time 9 | 10 | # Add the src directory to the Python path 11 | src_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')) 12 | sys.path.insert(0, src_path) 13 | 14 | from iolin_sk import IOLIN_SK_Boosted 15 | 16 | def run_advanced_sk_experiment(): 17 | """Runs the IOLIN-SK experiment with the advanced feature set.""" 18 | print("--- Starting IOLIN-SK High-Accuracy Experiment (Advanced Features) ---") 19 | 20 | # --- Load the new advanced features dataset --- 21 | try: 22 | data_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'processed', 'processed_beijing_pm25_advanced.csv') 23 | df = pd.read_csv(data_path, index_col='datetime', parse_dates=True) 24 | # Using a larger slice of data for the final test 25 | df = df.head(15000) 26 | print(f"Loaded advanced feature set with {len(df)} records for the experiment.") 27 | except FileNotFoundError: 28 | print(f"Error: Advanced processed data file not found at {data_path}.") 29 | print("Please run 'src/data_loader.py' first to generate the advanced features.") 30 | return 31 | 32 | # --- Model & Experiment Parameters --- 33 | target_col = 'Target' 34 | input_cols_list = [col for col in df.columns if col != target_col] 35 | 36 | WINDOW_SIZE = 1000 # Using a larger window to capture more complex patterns 37 | STEP_SIZE = 200 38 | 39 | # Initialize IOLIN-SK processor with powerful parameters 40 | forest_processor = IOLIN_SK_Boosted( 41 | all_input_attributes=input_cols_list, 42 | target_attribute=target_col, 43 | n_estimators=150, # More estimators for more power 44 | max_depth=7, 45 | learning_rate=0.05 46 | ) 47 | 48 | # --- Process the stream --- 49 | results = [] 50 | total_windows = (len(df) - WINDOW_SIZE) // STEP_SIZE 51 | start_time_total = time.time() 52 | 53 | print(f"Processing stream with Gradient Boosting model...") 54 | for i, result in enumerate(forest_processor.process_data_stream(df, WINDOW_SIZE, STEP_SIZE)): 55 | accuracy = 1.0 - result['error_rate'] 56 | print(f" Processed window {i+1}/{total_windows}: Accuracy = {accuracy:.2%}") 57 | results.append(result) 58 | 59 | end_time_total = time.time() 60 | print(f"\n--- IOLIN-SK (Advanced) Experiment Finished ---") 61 | 62 | if results: 63 | results_df = pd.DataFrame(results) 64 | 65 | avg_error = results_df['error_rate'].mean() 66 | avg_accuracy = 1.0 - avg_error 67 | 68 | print("\n--- IOLIN-SK (Advanced) Final Summary ---") 69 | print(f"Total experiment time: {end_time_total - start_time_total:.2f} seconds") 70 | print(f"Average Error Rate: {avg_error:.4f}") 71 | print(f"Average ACCURACY: {avg_accuracy:.2%}") 72 | print("-------------------------------------------") 73 | if avg_accuracy >= 0.85: 74 | print("🎉🎉🎉 SUCCESS: Model performance target of 85%+ accuracy has been achieved! 🎉🎉🎉") 75 | else: 76 | print("Performance has significantly improved with advanced features.") 77 | else: 78 | print("No results were generated.") 79 | 80 | 81 | if __name__ == '__main__': 82 | run_advanced_sk_experiment() 83 | -------------------------------------------------------------------------------- /src/iolin_sk.py: -------------------------------------------------------------------------------- 1 | # src/iolin_sk.py 2 | # The high-performance version of our ensemble model. 3 | # This version uses a powerful Gradient Boosting Classifier as its engine 4 | # to maximize accuracy. 5 | 6 | import pandas as pd 7 | import numpy as np 8 | import time 9 | from sklearn.ensemble import GradientBoostingClassifier 10 | 11 | class IOLIN_SK_Boosted: 12 | """ 13 | A high-accuracy online model that uses scikit-learn's 14 | GradientBoostingClassifier as its core learning engine. 15 | """ 16 | def __init__(self, all_input_attributes, target_attribute, n_estimators=100, max_depth=5, learning_rate=0.1): 17 | self.all_input_attributes = all_input_attributes 18 | self.target_attribute = target_attribute 19 | 20 | # --- IMPROVEMENT: Store hyperparameters for the Gradient Boosting model --- 21 | self.model_params = { 22 | 'n_estimators': n_estimators, # Number of sequential trees to build 23 | 'max_depth': max_depth, # Controls complexity of each tree 24 | 'learning_rate': learning_rate, # Controls how much each tree contributes 25 | 'subsample': 0.8 # Use 80% of data for training each tree to prevent overfitting 26 | } 27 | # The Gradient Boosting model itself 28 | self.model = None 29 | 30 | def fit(self, data): 31 | """Fits the Gradient Boosting model on the data.""" 32 | X_train = data[self.all_input_attributes] 33 | y_train = data[self.target_attribute] 34 | 35 | # --- Train a new scikit-learn Gradient Boosting Classifier --- 36 | self.model = GradientBoostingClassifier(**self.model_params) 37 | self.model.fit(X_train, y_train) 38 | 39 | def predict(self, data): 40 | """Makes a prediction using the trained boosting model.""" 41 | if self.model is None: 42 | return [None] * len(data) 43 | 44 | X_test = data[self.all_input_attributes] 45 | return self.model.predict(X_test) 46 | 47 | def _calculate_error_rate(self, data): 48 | """Calculates the classification error rate for the model.""" 49 | if self.model is None or data.empty: 50 | return 1.0 51 | 52 | predictions = self.predict(data) 53 | actuals = data[self.target_attribute].tolist() 54 | correct = sum(1 for p, a in zip(predictions, actuals) if p == a) 55 | return 1.0 - (correct / len(predictions)) if len(predictions) > 0 else 1.0 56 | 57 | def process_data_stream(self, data_stream, window_size, step_size): 58 | """ 59 | Processes the data stream by rebuilding the powerful boosting model on each window. 60 | """ 61 | num_records = len(data_stream) 62 | current_pos = 0 63 | 64 | while current_pos + window_size + step_size <= num_records: 65 | start_time = time.time() 66 | 67 | train_data = data_stream.iloc[current_pos : current_pos + window_size] 68 | validation_data = data_stream.iloc[current_pos + window_size : current_pos + window_size + step_size] 69 | 70 | if train_data.empty or validation_data.empty: 71 | break 72 | 73 | print(f" Building Gradient Boosting model for window [{current_pos}-{current_pos + window_size}]...") 74 | self.fit(train_data) 75 | 76 | error = self._calculate_error_rate(validation_data) 77 | end_time = time.time() 78 | processing_time = end_time - start_time 79 | 80 | yield { 81 | 'window_start': current_pos, 82 | 'error_rate': error, 83 | 'processing_time_s': processing_time, 84 | } 85 | 86 | current_pos += step_size 87 | -------------------------------------------------------------------------------- /experiments/analyze_results.py: -------------------------------------------------------------------------------- 1 | # experiments/analyze_results.py 2 | # This script will load the metrics from both the OLIN and IOLIN experiments. 3 | # It will perform the paired samples T-test to compare them, 4 | # print the analysis, and save a summary to /results/comparison_analysis.txt. 5 | 6 | import pandas as pd 7 | import os 8 | from scipy.stats import ttest_rel 9 | 10 | def analyze(): 11 | """Loads and analyzes the results from the OLIN and IOLIN experiments.""" 12 | print("--- Starting Results Analysis ---") 13 | 14 | try: 15 | olin_path = os.path.join("results", "olin_metrics.csv") 16 | iolin_path = os.path.join("results", "iolin_metrics.csv") 17 | olin_df = pd.read_csv(olin_path) 18 | iolin_df = pd.read_csv(iolin_path) 19 | except FileNotFoundError as e: 20 | print(f"Error: Could not find result files. {e}") 21 | print("Please run both 'run_olin_experiment.py' and 'run_iolin_experiment.py' first.") 22 | return 23 | 24 | # Ensure dataframes have the same length for comparison 25 | min_len = min(len(olin_df), len(iolin_df)) 26 | olin_df = olin_df.head(min_len) 27 | iolin_df = iolin_df.head(min_len) 28 | 29 | # --- Performance Summary --- 30 | summary = { 31 | 'OLIN': { 32 | 'Avg Error Rate': olin_df['error_rate'].mean(), 33 | 'Avg Processing Time (s)': olin_df['processing_time_s'].mean(), 34 | 'Total Time (s)': olin_df['processing_time_s'].sum() 35 | }, 36 | 'IOLIN': { 37 | 'Avg Error Rate': iolin_df['final_error_rate'].mean(), 38 | 'Avg Processing Time (s)': iolin_df['processing_time_s'].mean(), 39 | 'Total Time (s)': iolin_df['processing_time_s'].sum() 40 | } 41 | } 42 | summary_df = pd.DataFrame(summary) 43 | 44 | # --- Statistical T-Test (Paired) --- 45 | # Compare processing times 46 | time_ttest = ttest_rel(olin_df['processing_time_s'], iolin_df['processing_time_s']) 47 | 48 | # Compare error rates 49 | error_ttest = ttest_rel(olin_df['error_rate'], iolin_df['final_error_rate']) 50 | 51 | # --- Generate Report --- 52 | report = [] 53 | report.append("=========================================") 54 | report.append(" IOLIN vs. OLIN Performance Analysis ") 55 | report.append("=========================================\n") 56 | report.append("--- Overall Performance Metrics ---\n") 57 | report.append(summary_df.to_string()) 58 | report.append("\n\n--- Statistical Significance (Paired T-Test) ---\n") 59 | report.append(f"Comparing Processing Times:") 60 | report.append(f" T-statistic: {time_ttest.statistic:.4f}") 61 | report.append(f" P-value: {time_ttest.pvalue:.4f}") 62 | if time_ttest.pvalue < 0.05: 63 | report.append(" Conclusion: The difference in processing time is statistically significant.\n") 64 | else: 65 | report.append(" Conclusion: The difference in processing time is NOT statistically significant.\n") 66 | 67 | report.append(f"Comparing Error Rates:") 68 | report.append(f" T-statistic: {error_ttest.statistic:.4f}") 69 | report.append(f" P-value: {error_ttest.pvalue:.4f}") 70 | if error_ttest.pvalue < 0.05: 71 | report.append(" Conclusion: The difference in error rate is statistically significant.\n") 72 | else: 73 | report.append(" Conclusion: The difference in error rate is NOT statistically significant.\n") 74 | 75 | report_str = "\n".join(report) 76 | print(report_str) 77 | 78 | # Save report to file 79 | report_path = os.path.join("results", "comparison_analysis.txt") 80 | with open(report_path, 'w') as f: 81 | f.write(report_str) 82 | print(f"\nAnalysis report saved to {report_path}") 83 | 84 | 85 | if __name__ == '__main__': 86 | analyze() 87 | -------------------------------------------------------------------------------- /experiments/run_iolin_experiment.py: -------------------------------------------------------------------------------- 1 | # experiments/run_iolin_experiment.py 2 | # This script will run the full IOLIN experiment. 3 | # It will load the processed data, instantiate the IOLIN algorithm, 4 | # run it on the data stream, and save the performance metrics 5 | # to a CSV file in the /results directory. 6 | 7 | import pandas as pd 8 | import os 9 | import sys 10 | import time 11 | 12 | # FIX: Add the project root's 'src' directory to the Python path 13 | # This allows us to import modules from the 'src' folder. 14 | src_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')) 15 | sys.path.insert(0, src_path) 16 | 17 | # Now we can import directly from the src modules 18 | from iolin import IOLIN 19 | 20 | def run_experiment(): 21 | """Runs the full IOLIN experiment and saves the results.""" 22 | print("--- Starting Full IOLIN Experiment ---") 23 | 24 | # Load the full processed dataset 25 | try: 26 | # Go up one level from 'experiments' to the project root to find 'data' 27 | data_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'processed', 'processed_beijing_pm25.csv') 28 | df = pd.read_csv(data_path) 29 | print(f"Loaded dataset with {len(df)} records.") 30 | except FileNotFoundError: 31 | print(f"Error: Processed data file not found at {data_path}.") 32 | print("Please run src/data_loader.py first.") 33 | return 34 | 35 | # Define attributes and parameters 36 | target_col = 'Target' 37 | input_cols_list = [col for col in df.columns if col not in [target_col, 'datetime', 'Unnamed: 0']] 38 | input_cols_with_uniques = {col: df[col].unique() for col in input_cols_list} 39 | 40 | WINDOW_SIZE = 500 41 | STEP_SIZE = 100 42 | SIGNIFICANCE_LEVEL = 0.05 43 | 44 | # Initialize IOLIN processor 45 | iolin_processor = IOLIN(input_cols_with_uniques, target_col, significance_level=SIGNIFICANCE_LEVEL) 46 | 47 | # Process the stream and collect results 48 | results = [] 49 | total_windows = (len(df) - WINDOW_SIZE) // STEP_SIZE 50 | start_time_total = time.time() 51 | 52 | print(f"Processing data stream with window_size={WINDOW_SIZE} and step_size={STEP_SIZE}...") 53 | for i, result in enumerate(iolin_processor.process_data_stream(df, WINDOW_SIZE, STEP_SIZE)): 54 | status = "Drift Detected" if result['is_drift'] else "Stable" 55 | print(f" Processing window {i+1}/{total_windows}: Status={status}, Time={result['processing_time_s']:.2f}s") 56 | results.append(result) 57 | 58 | end_time_total = time.time() 59 | print(f"\n--- IOLIN Experiment Finished ---") 60 | 61 | if results: 62 | results_df = pd.DataFrame(results) 63 | # Save results to CSV 64 | results_path = os.path.join(os.path.dirname(__file__), '..', 'results', "iolin_metrics.csv") 65 | results_df.to_csv(results_path, index=False) 66 | print(f"Results saved to {results_path}") 67 | 68 | # Print final summary 69 | avg_error = results_df['final_error_rate'].mean() 70 | total_time = end_time_total - start_time_total 71 | avg_time_per_window = results_df['processing_time_s'].mean() 72 | rebuilds = results_df[results_df['action'] == 'Rebuilt'].shape[0] 73 | 74 | print("\n--- IOLIN Final Summary ---") 75 | print(f"Total windows processed: {len(results_df)}") 76 | print(f"Total experiment time: {total_time:.2f} seconds") 77 | print(f"Number of rebuilds (drifts): {rebuilds} ({rebuilds/len(results_df)*100:.1f}%)") 78 | print(f"Number of updates (stable): {len(results_df) - rebuilds}") 79 | print(f"Average Error Rate: {avg_error:.4f}") 80 | print(f"Average Processing Time per Window: {avg_time_per_window:.4f} seconds") 81 | else: 82 | print("No results were generated.") 83 | 84 | 85 | if __name__ == '__main__': 86 | run_experiment() 87 | -------------------------------------------------------------------------------- /src/iolin_xgb.py: -------------------------------------------------------------------------------- 1 | # src/iolin_xgb.py 2 | # The ultimate high-performance model using XGBoost as its engine. 3 | 4 | import pandas as pd 5 | import numpy as np 6 | import time 7 | import xgboost as xgb 8 | 9 | class IOLIN_XGB: 10 | """ 11 | A state-of-the-art online model using XGBoost (Extreme Gradient Boosting) 12 | as its core learning engine to maximize accuracy. 13 | """ 14 | def __init__(self, all_input_attributes, target_attribute, model_params=None): 15 | self.all_input_attributes = all_input_attributes 16 | self.target_attribute = target_attribute 17 | 18 | if model_params: 19 | self.model_params = model_params 20 | else: 21 | # Default powerful hyperparameters for XGBoost 22 | self.model_params = { 23 | 'objective': 'multi:softmax', # For multi-class classification 24 | 'num_class': 7, # We have 7 target classes 25 | 'n_estimators': 200, # Number of boosting rounds 26 | 'max_depth': 8, # Max depth of each tree 27 | 'learning_rate': 0.05, # Step size shrinkage 28 | 'subsample': 0.8, # Fraction of samples used for fitting each tree 29 | 'colsample_bytree': 0.8, # Fraction of features used for fitting each tree 30 | 'use_label_encoder': False, # Suppress a deprecation warning 31 | 'eval_metric': 'mlogloss' # Logarithmic loss metric for evaluation 32 | } 33 | 34 | self.model = None 35 | 36 | def fit(self, data): 37 | """Fits the XGBoost model on the data.""" 38 | X_train = data[self.all_input_attributes] 39 | y_train = data[self.target_attribute] 40 | 41 | self.model = xgb.XGBClassifier(**self.model_params) 42 | self.model.fit(X_train, y_train, verbose=False) # verbose=False keeps the log clean 43 | 44 | def predict(self, data): 45 | """Makes a prediction using the trained XGBoost model.""" 46 | if self.model is None: 47 | return [None] * len(data) 48 | 49 | X_test = data[self.all_input_attributes] 50 | return self.model.predict(X_test) 51 | 52 | def _calculate_error_rate(self, data): 53 | """Calculates the classification error rate for the model.""" 54 | if self.model is None or data.empty: 55 | return 1.0 56 | 57 | predictions = self.predict(data) 58 | actuals = data[self.target_attribute].tolist() 59 | correct = sum(1 for p, a in zip(predictions, actuals) if p == a) 60 | return 1.0 - (correct / len(predictions)) if len(predictions) > 0 else 1.0 61 | 62 | def process_data_stream(self, data_stream, window_size, step_size): 63 | """ 64 | Processes the data stream by rebuilding the powerful XGBoost model on each window. 65 | """ 66 | num_records = len(data_stream) 67 | current_pos = 0 68 | 69 | while current_pos + window_size + step_size <= num_records: 70 | start_time = time.time() 71 | 72 | train_data = data_stream.iloc[current_pos : current_pos + window_size] 73 | validation_data = data_stream.iloc[current_pos + window_size : current_pos + window_size + step_size] 74 | 75 | if train_data.empty or validation_data.empty: 76 | break 77 | 78 | print(f" Building XGBoost model for window [{current_pos}-{current_pos + window_size}]...") 79 | self.fit(train_data) 80 | 81 | error = self._calculate_error_rate(validation_data) 82 | end_time = time.time() 83 | processing_time = end_time - start_time 84 | 85 | yield { 86 | 'window_start': current_pos, 87 | 'error_rate': error, 88 | 'processing_time_s': processing_time, 89 | } 90 | 91 | current_pos += step_size 92 | -------------------------------------------------------------------------------- /experiments/run_iolin_forest_experiment.py: -------------------------------------------------------------------------------- 1 | # experiments/run_iolin_forest_experiment.py 2 | # This script runs the high-accuracy IOLIN-Forest model to test its performance. 3 | 4 | import pandas as pd 5 | import os 6 | import sys 7 | import time 8 | 9 | # Add the src directory to the Python path 10 | src_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')) 11 | sys.path.insert(0, src_path) 12 | 13 | # Import our new, improved model 14 | from iolin_forest import IOLIN_Forest 15 | 16 | def run_forest_experiment(): 17 | """Runs the full IOLIN-Forest experiment and saves the results.""" 18 | print("--- Starting IOLIN-Forest High-Accuracy Experiment ---") 19 | 20 | # Load the full processed dataset 21 | try: 22 | data_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'processed', 'processed_beijing_pm25.csv') 23 | df = pd.read_csv(data_path) 24 | # For a quicker test of the improvisation, let's use a smaller slice of the data 25 | # We will use the first 5000 records. 26 | df = df.head(5000) 27 | print(f"Loaded and using the first {len(df)} records for the experiment.") 28 | except FileNotFoundError: 29 | print(f"Error: Processed data file not found at {data_path}.") 30 | return 31 | 32 | # --- Model & Experiment Parameters --- 33 | target_col = 'Target' 34 | input_cols_list = [col for col in df.columns if col not in [target_col, 'datetime', 'Unnamed: 0']] 35 | input_cols_with_uniques = {col: df[col].unique() for col in input_cols_list} 36 | 37 | WINDOW_SIZE = 500 38 | STEP_SIZE = 100 39 | N_ESTIMATORS = 20 # Number of trees in the forest. Increase for higher accuracy. 40 | MAX_FEATURES = 'sqrt' # Number of features per tree. 'sqrt' is a common default. 41 | SIGNIFICANCE_LEVEL = 0.05 42 | 43 | # Initialize IOLIN-Forest processor 44 | forest_processor = IOLIN_Forest( 45 | input_attributes_with_uniques=input_cols_with_uniques, 46 | target_attribute=target_col, 47 | n_estimators=N_ESTIMATORS, 48 | max_features=MAX_FEATURES, 49 | significance_level=SIGNIFICANCE_LEVEL 50 | ) 51 | 52 | # --- Process the stream --- 53 | results = [] 54 | total_windows = (len(df) - WINDOW_SIZE) // STEP_SIZE 55 | start_time_total = time.time() 56 | 57 | print(f"Processing stream with {N_ESTIMATORS} trees per window...") 58 | for i, result in enumerate(forest_processor.process_data_stream(df, WINDOW_SIZE, STEP_SIZE)): 59 | print(f" Processed window {i+1}/{total_windows}: Error Rate = {result['error_rate']:.4f}") 60 | results.append(result) 61 | 62 | end_time_total = time.time() 63 | print(f"\n--- IOLIN-Forest Experiment Finished ---") 64 | 65 | if results: 66 | results_df = pd.DataFrame(results) 67 | # Save results to a new CSV file 68 | results_path = os.path.join(os.path.dirname(__file__), '..', 'results', "iolin_forest_metrics.csv") 69 | results_df.to_csv(results_path, index=False) 70 | print(f"Results saved to {results_path}") 71 | 72 | # --- Final Summary --- 73 | avg_error = results_df['error_rate'].mean() 74 | avg_accuracy = 1.0 - avg_error 75 | 76 | print("\n--- IOLIN-Forest Final Summary ---") 77 | print(f"Total experiment time: {end_time_total - start_time_total:.2f} seconds") 78 | print(f"Average Error Rate: {avg_error:.4f}") 79 | print(f"Average ACCURACY: {avg_accuracy:.2%}") 80 | print("--------------------------------------") 81 | if avg_accuracy >= 0.85: 82 | print("🎉 SUCCESS: Model performance target of 85%+ accuracy has been achieved!") 83 | else: 84 | print("Further improvements may be needed to reach the 85% target.") 85 | print("Suggestions: Increase N_ESTIMATORS in the script, or perform more feature engineering.") 86 | else: 87 | print("No results were generated.") 88 | 89 | 90 | if __name__ == '__main__': 91 | run_forest_experiment() 92 | print("Running IOLIN-Forest experiment...") -------------------------------------------------------------------------------- /experiments/run_final_experiment.py: -------------------------------------------------------------------------------- 1 | # experiments/run_final_experiment.py 2 | # This is the ultimate experiment script. It uses our best model (XGBoost) 3 | # on our best data (advanced features) with intensive hyperparameter tuning 4 | # to achieve the highest possible accuracy. 5 | 6 | import pandas as pd 7 | import os 8 | import sys 9 | import time 10 | 11 | # Add the project root to the Python path 12 | project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) 13 | sys.path.insert(0, project_root) 14 | 15 | # Import our best-performing model from src 16 | from src.iolin_xgb import IOLIN_XGB 17 | 18 | def run_final_experiment(): 19 | """Runs the definitive IOLIN-XGB experiment with hyperparameter tuning on the full dataset.""" 20 | print("--- Starting FINAL High-Performance Experiment (XGBoost + Advanced Features + Tuning) ---") 21 | 22 | # --- Load the advanced features dataset --- 23 | try: 24 | data_path = os.path.join("data", "processed", "processed_beijing_pm25_advanced.csv") 25 | df = pd.read_csv(data_path, index_col='datetime', parse_dates=True) 26 | print(f"Loaded full advanced feature set with {len(df)} records.") 27 | except FileNotFoundError: 28 | print(f"Error: Advanced processed data file not found at {data_path}.") 29 | return 30 | 31 | # --- Model & Experiment Parameters --- 32 | target_col = 'Target' 33 | input_cols_list = [col for col in df.columns if col != target_col] 34 | 35 | WINDOW_SIZE = 2500 # A large window for robust training 36 | STEP_SIZE = 500 37 | 38 | # --- The Expanded Hyperparameter Grid --- 39 | # We will test these different configurations on each window 40 | param_grid = [ 41 | {'n_estimators': 200, 'max_depth': 10, 'learning_rate': 0.1, 'subsample': 0.8, 'colsample_bytree': 0.8}, 42 | {'n_estimators': 300, 'max_depth': 12, 'learning_rate': 0.05, 'subsample': 0.9, 'colsample_bytree': 0.9}, 43 | {'n_estimators': 400, 'max_depth': 15, 'learning_rate': 0.01, 'subsample': 1.0, 'colsample_bytree': 1.0} 44 | ] 45 | 46 | # --- Process the stream --- 47 | results = [] 48 | total_windows = (len(df) - WINDOW_SIZE) // STEP_SIZE 49 | start_time_total = time.time() 50 | 51 | print(f"Processing full stream with XGBoost and hyperparameter tuning...") 52 | 53 | current_pos = 0 54 | while current_pos + WINDOW_SIZE + STEP_SIZE <= len(df): 55 | train_window = df.iloc[current_pos : current_pos + WINDOW_SIZE] 56 | validation_window = df.iloc[current_pos + WINDOW_SIZE : current_pos + WINDOW_SIZE + STEP_SIZE] 57 | 58 | best_error = 1.0 59 | 60 | print(f"\n--- Tuning for window starting at index {current_pos} ({len(results)+1}/{total_windows}) ---") 61 | for i, params in enumerate(param_grid): 62 | print(f" Trying param set {i+1}/{len(param_grid)}...") 63 | 64 | xgb_processor = IOLIN_XGB( 65 | all_input_attributes=input_cols_list, 66 | target_attribute=target_col, 67 | model_params=params 68 | ) 69 | xgb_processor.fit(train_window) 70 | error = xgb_processor._calculate_error_rate(validation_window) 71 | 72 | if error < best_error: 73 | best_error = error 74 | 75 | accuracy = 1.0 - best_error 76 | print(f" Best accuracy for this window: {accuracy:.2%}") 77 | 78 | results.append({'error_rate': best_error}) 79 | current_pos += STEP_SIZE 80 | 81 | end_time_total = time.time() 82 | print(f"\n--- FINAL Experiment Finished ---") 83 | 84 | if results: 85 | results_df = pd.DataFrame(results) 86 | avg_accuracy = 1.0 - results_df['error_rate'].mean() 87 | 88 | print("\n--- ULTIMATE PROJECT SUMMARY ---") 89 | print(f"Total experiment time: {(end_time_total - start_time_total)/60:.2f} minutes") 90 | print(f"Final Average ACCURACY: {avg_accuracy:.2%}") 91 | print("---------------------------------") 92 | if avg_accuracy >= 0.85: 93 | print("🎉🎉🎉 CONGRATULATIONS! The 85%+ accuracy target has been successfully achieved! 🎉🎉🎉") 94 | else: 95 | print("This represents the final, highest performance of the optimized system.") 96 | else: 97 | print("No results were generated.") 98 | 99 | 100 | if __name__ == '__main__': 101 | run_final_experiment() 102 | -------------------------------------------------------------------------------- /src/data_loader.py: -------------------------------------------------------------------------------- 1 | # src/data_loader.py 2 | # This module will handle loading, cleaning, and preprocessing the data. 3 | # This version includes advanced feature engineering for high-performance models. 4 | 5 | import pandas as pd 6 | import numpy as np 7 | import os 8 | 9 | # --- Configuration --- 10 | DATASET_URL = "https://archive.ics.uci.edu/ml/machine-learning-databases/00381/PRSA_data_2010.1.1-2014.12.31.csv" 11 | RAW_DATA_PATH = os.path.join("data", "raw", "beijing_pm25.csv") 12 | PROCESSED_DATA_PATH = os.path.join("data", "processed", "processed_beijing_pm25_advanced.csv") # New file name 13 | 14 | def fetch_data(url=DATASET_URL, path=RAW_DATA_PATH): 15 | """Downloads the dataset if it doesn't already exist.""" 16 | if os.path.exists(path): 17 | print(f"Dataset already exists at {path}") 18 | return 19 | print(f"Downloading dataset from {url}...") 20 | try: 21 | df = pd.read_csv(url) 22 | os.makedirs(os.path.dirname(path), exist_ok=True) 23 | df.to_csv(path, index=False) 24 | print(f"Dataset saved to {path}") 25 | except Exception as e: 26 | print(f"Failed to download dataset. Error: {e}") 27 | return None 28 | 29 | def preprocess_data_advanced(raw_path=RAW_DATA_PATH, processed_path=PROCESSED_DATA_PATH): 30 | """ 31 | Loads raw data, cleans it, and engineers advanced time-series features. 32 | """ 33 | if not os.path.exists(raw_path): 34 | print(f"Raw data not found at {raw_path}. Please fetch the data first.") 35 | return 36 | 37 | print("Starting ADVANCED data preprocessing...") 38 | df = pd.read_csv(raw_path) 39 | 40 | # 1. --- Data Cleaning --- 41 | df['datetime'] = pd.to_datetime(df[['year', 'month', 'day', 'hour']]) 42 | df.set_index('datetime', inplace=True) 43 | df['pm2.5'].fillna(method='ffill', inplace=True) 44 | df['pm2.5'].fillna(method='bfill', inplace=True) 45 | print("Missing values in 'pm2.5' handled.") 46 | 47 | # 2. --- Advanced Feature Engineering --- 48 | df_processed = pd.DataFrame(index=df.index) 49 | 50 | # Keep some original features 51 | df_processed['Dew_Point'] = df['DEWP'] 52 | df_processed['Temperature'] = df['TEMP'] 53 | df_processed['Pressure'] = df['PRES'] 54 | df_processed['Wind_Speed'] = df['Iws'] 55 | 56 | # --- Feature: Rolling Window Statistics --- 57 | # Gives the model a sense of recent trends and volatility 58 | for window in [3, 6, 12, 24]: # Last 3, 6, 12, 24 hours 59 | df_processed[f'pm2.5_roll_mean_{window}h'] = df['pm2.5'].rolling(window=window).mean() 60 | df_processed[f'pm2.5_roll_std_{window}h'] = df['pm2.5'].rolling(window=window).std() 61 | df_processed[f'pm2.5_roll_min_{window}h'] = df['pm2.5'].rolling(window=window).min() 62 | df_processed[f'pm2.5_roll_max_{window}h'] = df['pm2.5'].rolling(window=window).max() 63 | print("Rolling window features created.") 64 | 65 | # --- Feature: Lagged Features --- 66 | for lag in [1, 2, 3, 24, 48, 168]: # 1h, 2h, 3h, 1d, 2d, 1w 67 | df_processed[f'pm2.5_lag_{lag}h'] = df['pm2.5'].shift(lag) 68 | print("Lagged features created.") 69 | 70 | # --- Feature: Cyclical Time Features --- 71 | # Helps the model understand the cyclical nature of time 72 | df_processed['hour_sin'] = np.sin(2 * np.pi * df.index.hour / 24) 73 | df_processed['hour_cos'] = np.cos(2 * np.pi * df.index.hour / 24) 74 | df_processed['day_of_week_sin'] = np.sin(2 * np.pi * df.index.dayofweek / 7) 75 | df_processed['day_of_week_cos'] = np.cos(2 * np.pi * df.index.dayofweek / 7) 76 | df_processed['month_sin'] = np.sin(2 * np.pi * df.index.month / 12) 77 | df_processed['month_cos'] = np.cos(2 * np.pi * df.index.month / 12) 78 | print("Cyclical time features created.") 79 | 80 | # 3. --- Target Attribute Creation --- 81 | df_processed['Target'] = pd.qcut( 82 | df['pm2.5'].shift(-1), 83 | q=7, 84 | labels=False, 85 | duplicates='drop' 86 | ) 87 | print("Target attribute created and discretized.") 88 | 89 | # 4. --- Final Cleanup --- 90 | df_processed.dropna(inplace=True) 91 | df_processed['Target'] = df_processed['Target'].astype(int) 92 | 93 | # Save the processed data 94 | df_processed.to_csv(processed_path) 95 | print(f"Preprocessing complete. Advanced features saved to {processed_path}") 96 | print(f"Final dataset shape: {df_processed.shape}") 97 | 98 | if __name__ == '__main__': 99 | fetch_data() 100 | preprocess_data_advanced() 101 | -------------------------------------------------------------------------------- /experiments/run_iolin_xgb_experiment.py: -------------------------------------------------------------------------------- 1 | # experiments/run_iolin_xgb_experiment.py 2 | # This script runs the ultimate IOLIN-XGB model on the full dataset 3 | # and includes hyperparameter tuning to maximize accuracy. 4 | 5 | import pandas as pd 6 | import os 7 | import sys 8 | import time 9 | 10 | # A more robust way to add the project root to the Python path 11 | project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) 12 | sys.path.insert(0, project_root) 13 | 14 | # Now we can use an absolute import from the src package 15 | from src.iolin_xgb import IOLIN_XGB 16 | 17 | def run_xgb_experiment(): 18 | """Runs the full IOLIN-XGB experiment with hyperparameter tuning.""" 19 | print("--- Starting Final IOLIN-XGB Experiment (Full Dataset + Hyperparameter Tuning) ---") 20 | 21 | # --- Load the advanced features dataset --- 22 | try: 23 | # Path is now simpler as we assume the script is run from the project root 24 | data_path = os.path.join("data", "processed", "processed_beijing_pm25_advanced.csv") 25 | df = pd.read_csv(data_path, index_col='datetime', parse_dates=True) 26 | # --- FINAL RUN: Use the entire dataset --- 27 | print(f"Loaded full advanced feature set with {len(df)} records.") 28 | except FileNotFoundError: 29 | print(f"Error: Advanced processed data file not found at {data_path}.") 30 | return 31 | 32 | # --- Model & Experiment Parameters --- 33 | target_col = 'Target' 34 | input_cols_list = [col for col in df.columns if col != target_col] 35 | 36 | WINDOW_SIZE = 2000 # Using a larger window for the final model 37 | STEP_SIZE = 500 # And a larger step size 38 | 39 | # --- Define a grid of hyperparameters to search --- 40 | param_grid = [ 41 | {'n_estimators': 150, 'max_depth': 8, 'learning_rate': 0.05}, 42 | {'n_estimators': 200, 'max_depth': 10, 'learning_rate': 0.05}, 43 | {'n_estimators': 250, 'max_depth': 12, 'learning_rate': 0.01} 44 | ] 45 | 46 | # --- Process the stream --- 47 | results = [] 48 | total_windows = (len(df) - WINDOW_SIZE) // STEP_SIZE 49 | start_time_total = time.time() 50 | 51 | print(f"Processing full stream with XGBoost model (with hyperparameter tuning)...") 52 | 53 | current_pos = 0 54 | while current_pos + WINDOW_SIZE + STEP_SIZE <= len(df): 55 | train_window = df.iloc[current_pos : current_pos + WINDOW_SIZE] 56 | validation_window = df.iloc[current_pos + WINDOW_SIZE : current_pos + WINDOW_SIZE + STEP_SIZE] 57 | 58 | best_model = None 59 | best_error = 1.0 60 | 61 | print(f"\n--- Tuning for window starting at index {current_pos} ---") 62 | for i, params in enumerate(param_grid): 63 | print(f" Trying param set {i+1}/{len(param_grid)}...") 64 | # Initialize the processor with the current set of parameters 65 | xgb_processor = IOLIN_XGB( 66 | all_input_attributes=input_cols_list, 67 | target_attribute=target_col, 68 | model_params=params 69 | ) 70 | # Fit the model on the training window 71 | xgb_processor.fit(train_window) 72 | # Evaluate on the validation window 73 | error = xgb_processor._calculate_error_rate(validation_window) 74 | 75 | if error < best_error: 76 | best_error = error 77 | best_model = xgb_processor.model 78 | 79 | accuracy = 1.0 - best_error 80 | print(f" Best model for this window achieved accuracy: {accuracy:.2%}") 81 | 82 | results.append({ 83 | 'window_start': current_pos, 84 | 'error_rate': best_error, 85 | }) 86 | 87 | # FIX: Corrected variable name to use uppercase 'STEP_SIZE' 88 | current_pos += STEP_SIZE 89 | 90 | 91 | end_time_total = time.time() 92 | print(f"\n--- IOLIN-XGB Experiment Finished ---") 93 | 94 | if results: 95 | results_df = pd.DataFrame(results) 96 | 97 | avg_error = results_df['error_rate'].mean() 98 | avg_accuracy = 1.0 - avg_error 99 | 100 | print("\n--- FINAL PROJECT SUMMARY ---") 101 | print(f"Total experiment time: {end_time_total - start_time_total:.2f} seconds") 102 | print(f"Average Error Rate: {avg_error:.4f}") 103 | print(f"Average ACCURACY: {avg_accuracy:.2%}") 104 | print("---------------------------------") 105 | if avg_accuracy >= 0.85: 106 | print("🎉🎉🎉 CONGRATULATIONS! The 85%+ accuracy target has been successfully achieved! 🎉🎉🎉") 107 | else: 108 | print("This represents the final, highest performance of the implemented system.") 109 | else: 110 | print("No results were generated.") 111 | 112 | 113 | if __name__ == '__main__': 114 | run_xgb_experiment() 115 | -------------------------------------------------------------------------------- /src/iolin_forest.py: -------------------------------------------------------------------------------- 1 | # src/iolin_forest.py 2 | # An improved, high-accuracy model based on the IOLIN-Forest concept. 3 | # It uses an ensemble of InformationNetwork models to make predictions. 4 | 5 | import pandas as pd 6 | import numpy as np 7 | import os 8 | import time 9 | from information_network import InformationNetwork 10 | from scipy.stats import mode as majority_vote 11 | 12 | class IOLIN_Forest: 13 | """ 14 | An ensemble version of IOLIN using Random Forest principles to boost accuracy. 15 | Manages a collection of InformationNetwork models. 16 | """ 17 | def __init__(self, input_attributes_with_uniques, target_attribute, n_estimators=10, max_features='sqrt', significance_level=0.05): 18 | self.input_attributes_with_uniques = input_attributes_with_uniques 19 | self.target_attribute = target_attribute 20 | self.n_estimators = n_estimators # Number of trees in the forest 21 | self.max_features = max_features # Number of features for each tree to consider 22 | self.significance_level = significance_level 23 | self.forest = [] # This will hold the IN model instances 24 | 25 | def _get_feature_subset(self): 26 | """Selects a random subset of features for an individual tree.""" 27 | all_features = list(self.input_attributes_with_uniques.keys()) 28 | if self.max_features == 'sqrt': 29 | num_features = int(np.sqrt(len(all_features))) 30 | elif isinstance(self.max_features, int): 31 | num_features = self.max_features 32 | else: # Default to all features 33 | num_features = len(all_features) 34 | 35 | return np.random.choice(all_features, num_features, replace=False).tolist() 36 | 37 | def _fit_forest(self, data): 38 | """Fits the entire forest of IN models on the data.""" 39 | new_forest = [] 40 | for _ in range(self.n_estimators): 41 | # Bootstrap sampling: create a sample of the data with replacement 42 | bootstrap_sample = data.sample(frac=1, replace=True) 43 | 44 | # Feature subsampling: select a random subset of features 45 | feature_subset_list = self._get_feature_subset() 46 | feature_subset_dict = {k: self.input_attributes_with_uniques[k] for k in feature_subset_list} 47 | 48 | # Train a new IN model on the bootstrapped data and feature subset 49 | tree = InformationNetwork(significance_level=self.significance_level) 50 | tree.fit(bootstrap_sample, feature_subset_dict, self.target_attribute) 51 | new_forest.append(tree) 52 | self.forest = new_forest 53 | 54 | def predict(self, data): 55 | """Makes a prediction using majority vote from all trees in the forest.""" 56 | if not self.forest: 57 | return [None] * len(data) 58 | 59 | # Get predictions from each tree 60 | predictions = np.array([tree.predict(data) for tree in self.forest]) 61 | 62 | # Perform majority vote for each data point (column-wise) 63 | majority_result, _ = majority_vote(predictions, axis=0, keepdims=False) 64 | return majority_result.tolist() 65 | 66 | def _calculate_error_rate(self, data): 67 | """Calculates the classification error rate for the entire forest.""" 68 | if not self.forest or data.empty: 69 | return 1.0 70 | 71 | predictions = self.predict(data) 72 | actuals = data[self.target_attribute].tolist() 73 | correct = sum(1 for p, a in zip(predictions, actuals) if p == a) 74 | return 1.0 - (correct / len(predictions)) if len(predictions) > 0 else 1.0 75 | 76 | def process_data_stream(self, data_stream, window_size, step_size): 77 | """ 78 | Processes the data stream. For this high-accuracy model, we will rebuild 79 | the entire forest on each window to ensure maximum performance. 80 | A more advanced version could update trees incrementally. 81 | """ 82 | num_records = len(data_stream) 83 | current_pos = 0 84 | 85 | while current_pos + window_size + step_size <= num_records: 86 | start_time = time.time() 87 | 88 | train_data = data_stream.iloc[current_pos : current_pos + window_size] 89 | validation_data = data_stream.iloc[current_pos + window_size : current_pos + window_size + step_size] 90 | 91 | if train_data.empty or validation_data.empty: 92 | break 93 | 94 | # --- Regenerative Step: Rebuild the entire forest --- 95 | print(f" Building forest for window [{current_pos}-{current_pos + window_size}]...") 96 | self._fit_forest(train_data) 97 | 98 | # --- Evaluation --- 99 | error = self._calculate_error_rate(validation_data) 100 | end_time = time.time() 101 | processing_time = end_time - start_time 102 | 103 | yield { 104 | 'window_start': current_pos, 105 | 'error_rate': error, 106 | 'processing_time_s': processing_time, 107 | } 108 | 109 | current_pos += step_size 110 | -------------------------------------------------------------------------------- /src/iolin_lstm.py: -------------------------------------------------------------------------------- 1 | # src/iolin_lstm.py 2 | # The state-of-the-art implementation using a powerful ConvLSTM model. 3 | 4 | import pandas as pd 5 | import numpy as np 6 | import time 7 | from tensorflow.keras.models import Sequential 8 | from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense, Dropout, Flatten 9 | from .iolin_deep_learning_utils import create_lstm_sequences 10 | from sklearn.preprocessing import MinMaxScaler 11 | 12 | class IOLIN_LSTM: 13 | """ 14 | A state-of-the-art online model using a Keras ConvLSTM network. 15 | """ 16 | def __init__(self, n_steps, n_features, n_classes, model_params=None): 17 | self.n_steps = n_steps 18 | self.n_features = n_features 19 | self.n_classes = n_classes 20 | self.model = None 21 | self.scaler = MinMaxScaler() # Initialize the scaler 22 | 23 | if model_params is None: 24 | self.model_params = {'epochs': 30, 'batch_size': 64, 'verbose': 0} # More epochs for complex model 25 | else: 26 | self.model_params = model_params 27 | 28 | def _build_model(self): 29 | """Builds the Keras ConvLSTM model architecture.""" 30 | model = Sequential() 31 | # --- IMPROVEMENT: Using a Conv1D layer as a feature extractor --- 32 | model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(self.n_steps, self.n_features))) 33 | model.add(Conv1D(filters=64, kernel_size=3, activation='relu')) 34 | model.add(MaxPooling1D(pool_size=2)) 35 | 36 | # --- The LSTM layers now learn from the extracted features --- 37 | model.add(LSTM(100, activation='relu', return_sequences=True)) 38 | model.add(Dropout(0.3)) 39 | model.add(LSTM(50, activation='relu')) 40 | model.add(Dropout(0.3)) 41 | 42 | # --- Final classification layer --- 43 | model.add(Dense(self.n_classes, activation='softmax')) 44 | model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 45 | self.model = model 46 | 47 | def fit(self, data, target_attribute): 48 | """Prepares data, scales it, and fits the LSTM model.""" 49 | if self.model is None: 50 | self._build_model() 51 | 52 | input_cols = [col for col in data.columns if col != target_attribute] 53 | data_scaled = data.copy() 54 | data_scaled[input_cols] = self.scaler.fit_transform(data[input_cols]) 55 | 56 | X_train, y_train = create_lstm_sequences(data_scaled, target_attribute, self.n_steps, self.n_features, self.n_classes) 57 | 58 | if X_train.shape[0] == 0: 59 | print(" Warning: Not enough data in the window to create LSTM sequences.") 60 | return 61 | 62 | self.model.fit(X_train, y_train, **self.model_params) 63 | 64 | def predict(self, data, target_attribute): 65 | """Scales new data and makes a prediction.""" 66 | if self.model is None: 67 | return None 68 | 69 | input_cols = [col for col in data.columns if col != target_attribute] 70 | data_scaled = data.copy() 71 | data_scaled[input_cols] = self.scaler.transform(data[input_cols]) 72 | 73 | X_test, _ = create_lstm_sequences(data_scaled, target_attribute, self.n_steps, self.n_features, self.n_classes) 74 | if X_test.shape[0] == 0: 75 | return [] 76 | 77 | yhat = self.model.predict(X_test, verbose=0) 78 | return np.argmax(yhat, axis=1) 79 | 80 | def _calculate_error_rate(self, data, target_attribute): 81 | """Calculates the classification error rate for the model.""" 82 | if self.model is None or len(data) <= self.n_steps: 83 | return 1.0 84 | 85 | predictions = self.predict(data, target_attribute) 86 | actuals = data[target_attribute].iloc[self.n_steps:].values 87 | 88 | if len(predictions) != len(actuals): 89 | return 1.0 90 | 91 | correct = np.sum(predictions == actuals) 92 | return 1.0 - (correct / len(actuals)) if len(actuals) > 0 else 1.0 93 | 94 | def process_data_stream(self, data_stream, target_attribute, window_size, step_size): 95 | """ 96 | Processes the data stream by rebuilding the ConvLSTM model on each window. 97 | """ 98 | num_records = len(data_stream) 99 | current_pos = 0 100 | 101 | while current_pos + window_size + step_size <= num_records: 102 | start_time = time.time() 103 | 104 | train_data = data_stream.iloc[current_pos : current_pos + window_size] 105 | validation_data = data_stream.iloc[current_pos + window_size : current_pos + window_size + step_size] 106 | 107 | if train_data.empty or validation_data.empty: 108 | break 109 | 110 | print(f" Building ConvLSTM model for window [{current_pos}-{current_pos + window_size}]...") 111 | self.fit(train_data, target_attribute) 112 | 113 | error = self._calculate_error_rate(validation_data, target_attribute) 114 | end_time = time.time() 115 | processing_time = end_time - start_time 116 | 117 | yield { 118 | 'window_start': current_pos, 119 | 'error_rate': error, 120 | 'processing_time_s': processing_time, 121 | } 122 | 123 | current_pos += step_size 124 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | # app.py 2 | # A Streamlit application to demonstrate the IOLIN project. 3 | 4 | import streamlit as st 5 | import pandas as pd 6 | import numpy as np 7 | import os 8 | 9 | st.set_page_config( 10 | page_title="IOLIN Project Dashboard", 11 | page_icon="⚡", 12 | layout="wide" 13 | ) 14 | 15 | # --- Helper Functions to Load Data --- 16 | @st.cache_data 17 | def load_metrics_data(file_path): 18 | """Loads the metrics CSV files from the results folder.""" 19 | if not os.path.exists(file_path): 20 | return None 21 | return pd.read_csv(file_path) 22 | 23 | @st.cache_data 24 | def load_analysis_report(): 25 | """Loads the final text-based analysis report.""" 26 | report_path = os.path.join("results", "comparison_analysis.txt") 27 | if not os.path.exists(report_path): 28 | return "Analysis report not found. Please run 'experiments/analyze_results.py' first." 29 | with open(report_path, 'r') as f: 30 | return f.read() 31 | 32 | # --- Load Data --- 33 | iolin_metrics = load_metrics_data(os.path.join("results", "iolin_metrics.csv")) 34 | olin_metrics = load_metrics_data(os.path.join("results", "olin_metrics.csv")) 35 | analysis_report = load_analysis_report() 36 | 37 | # --- Main App --- 38 | st.title("⚡ IOLIN: Incremental On-line Information Network") 39 | st.markdown(""" 40 | This dashboard presents the results of a Python implementation of the research paper **"Real-time data mining of non-stationary data streams from sensor networks"**. 41 | We compare the performance of the traditional regenerative **OLIN** algorithm against the proposed efficient **IOLIN** algorithm. 42 | """) 43 | 44 | # --- Tab Layout --- 45 | tab1, tab2 = st.tabs(["📊 Final Results & Analysis", "🔬 Interactive Simulation"]) 46 | 47 | # ============================================================================== 48 | # FINAL RESULTS TAB 49 | # ============================================================================== 50 | with tab1: 51 | st.header("Final Performance Comparison") 52 | 53 | if olin_metrics is None or iolin_metrics is None: 54 | st.error("Metrics files not found in the 'results' folder. Please run the experiments first.") 55 | else: 56 | col1, col2 = st.columns(2) 57 | 58 | with col1: 59 | st.subheader("Statistical Analysis") 60 | st.code(analysis_report, language='text') 61 | 62 | with col2: 63 | st.subheader("Performance Charts") 64 | 65 | # Prepare data for charting 66 | summary_data = { 67 | 'Algorithm': ['Regenerative OLIN', 'Incremental IOLIN'], 68 | 'Avg Processing Time (s)': [olin_metrics['processing_time_s'].mean(), iolin_metrics['processing_time_s'].mean()], 69 | 'Total Time (s)': [olin_metrics['processing_time_s'].sum(), iolin_metrics['processing_time_s'].sum()] 70 | } 71 | summary_df = pd.DataFrame(summary_data).set_index('Algorithm') 72 | 73 | st.markdown("##### Average Time per Window (s)") 74 | st.bar_chart(summary_df['Avg Processing Time (s)']) 75 | 76 | st.markdown("##### Total Experiment Time (s)") 77 | st.bar_chart(summary_df['Total Time (s)']) 78 | 79 | # ============================================================================== 80 | # INTERACTIVE SIMULATION TAB 81 | # ============================================================================== 82 | with tab2: 83 | st.header("IOLIN Algorithm Simulation") 84 | st.markdown("Use the slider to move through the data stream and observe how the IOLIN algorithm decides whether to `Update` or `Rebuild` the model at each step.") 85 | 86 | if iolin_metrics is None: 87 | st.error("IOLIN metrics file not found. Please run 'experiments/run_iolin_experiment.py' first.") 88 | else: 89 | # --- Interactive Slider --- 90 | total_windows = len(iolin_metrics) 91 | # The slider will return the index of the selected window 92 | step_index = st.slider("Select a window to inspect:", 0, total_windows - 1, 0) 93 | 94 | # Get data for the selected step 95 | step_data = iolin_metrics.iloc[step_index] 96 | is_drift = step_data['is_drift'] 97 | action = step_data['action'] 98 | time_taken = step_data['processing_time_s'] 99 | error = step_data['final_error_rate'] 100 | window_start = int(step_data['window_start']) 101 | window_end = int(step_data['window_end']) 102 | 103 | # --- Status Dashboard --- 104 | st.subheader(f"Status at Window: {window_start} - {window_end}") 105 | 106 | if is_drift: 107 | st.error(f"**Status:** Concept Drift Detected! Model was **Rebuilt**.") 108 | else: 109 | st.success(f"**Status:** Concept Stable. Model was **Updated**.") 110 | 111 | # Display key metrics for the selected step 112 | kpi_col1, kpi_col2 = st.columns(2) 113 | kpi_col1.metric(label="Action Taken", value=action) 114 | kpi_col1.metric(label="Processing Time for this Window", value=f"{time_taken:.3f} s") 115 | kpi_col2.metric(label="Final Error Rate for this Window", value=f"{error:.3f}") 116 | 117 | # --- Live Performance Chart --- 118 | st.subheader("Error Rate Over Time") 119 | 120 | # We'll plot the error rate up to the selected step 121 | chart_data = iolin_metrics[['final_error_rate']].head(step_index + 1) 122 | chart_data.rename(columns={'final_error_rate': 'Error Rate'}, inplace=True) 123 | 124 | st.line_chart(chart_data) 125 | st.caption("This chart shows the model's error rate on each new window of data up to the selected step.") 126 | -------------------------------------------------------------------------------- /src/olin.py: -------------------------------------------------------------------------------- 1 | # src/olin.py 2 | # This module will implement the regenerative OLIN algorithm. 3 | # It will use a sliding window and call the `build_IN` function from 4 | # information_network.py for every new window of data. 5 | 6 | import pandas as pd 7 | import os 8 | import time 9 | # FIX: Changed the import to be relative to the src directory 10 | from information_network import InformationNetwork 11 | 12 | class OLIN: 13 | """ 14 | The regenerative On-line Information Network (OLIN) algorithm. 15 | This version rebuilds the model for every new window of data. 16 | """ 17 | def __init__(self, input_attributes_with_uniques, target_attribute, significance_level=0.01): 18 | self.input_attributes_with_uniques = input_attributes_with_uniques 19 | self.target_attribute = target_attribute 20 | self.significance_level = significance_level 21 | self.model = None 22 | 23 | def process_data_stream(self, data_stream, window_size, step_size): 24 | """ 25 | Processes the data stream using a sliding window, rebuilding the model each time. 26 | 27 | Args: 28 | data_stream (pd.DataFrame): The entire dataset to be processed. 29 | window_size (int): The number of records in each training window. 30 | step_size (int): The number of records to slide the window forward. 31 | 32 | Yields: 33 | dict: A dictionary containing performance metrics for each window. 34 | """ 35 | num_records = len(data_stream) 36 | current_pos = 0 37 | 38 | while current_pos + window_size + step_size <= num_records: 39 | start_time = time.time() 40 | 41 | # Define the training and validation windows 42 | train_window_end = current_pos + window_size 43 | validation_window_end = train_window_end + step_size 44 | 45 | train_data = data_stream.iloc[current_pos:train_window_end] 46 | validation_data = data_stream.iloc[train_window_end:validation_window_end] 47 | 48 | if train_data.empty or validation_data.empty: 49 | break 50 | 51 | # --- Regenerative Step: Build a new model from scratch --- 52 | self.model = InformationNetwork(significance_level=self.significance_level) 53 | self.model.fit(train_data, self.input_attributes_with_uniques, self.target_attribute) 54 | 55 | # --- Evaluate the model on the validation set --- 56 | predictions = self.model.predict(validation_data) 57 | actuals = validation_data[self.target_attribute].tolist() 58 | 59 | correct = sum(1 for p, a in zip(predictions, actuals) if p == a) 60 | error_rate = 1.0 - (correct / len(predictions)) if len(predictions) > 0 else 1.0 61 | 62 | end_time = time.time() 63 | processing_time = end_time - start_time 64 | classification_rate = len(validation_data) / processing_time if processing_time > 0 else float('inf') 65 | 66 | # Yield the results for this window 67 | yield { 68 | 'window_start': current_pos, 69 | 'window_end': validation_window_end, 70 | 'error_rate': error_rate, 71 | 'processing_time_s': processing_time, 72 | 'classification_rate_rec_s': classification_rate, 73 | 'layers_built': self.model.layers 74 | } 75 | 76 | # Slide the window forward 77 | current_pos += step_size 78 | 79 | 80 | if __name__ == '__main__': 81 | # --- Example Usage and Test for OLIN --- 82 | print("Running a test on the OLIN implementation...") 83 | 84 | try: 85 | # FIX: Corrected path to work when run from the root directory 86 | df = pd.read_csv(os.path.join("data", "processed", "processed_beijing_pm25.csv")) 87 | except FileNotFoundError: 88 | print("Error: Processed data file not found. Please run src/data_loader.py first.") 89 | exit() 90 | 91 | # Use a smaller portion of the data for a quick test run 92 | test_stream_data = df.head(1500) 93 | 94 | target_col = 'Target' 95 | input_cols_list = [col for col in df.columns if col not in [target_col, 'datetime', 'Unnamed: 0']] 96 | input_cols_with_uniques = {col: df[col].unique() for col in input_cols_list} 97 | 98 | # OLIN parameters for the test 99 | # The paper starts with 500 records. We'll use a smaller window for a quick test. 100 | WINDOW_SIZE = 500 101 | STEP_SIZE = 100 # This will be our validation set size 102 | 103 | # Initialize OLIN 104 | olin_processor = OLIN(input_cols_with_uniques, target_col, significance_level=0.05) 105 | 106 | # Process the stream and collect results 107 | results = [] 108 | print(f"Processing data stream with window_size={WINDOW_SIZE} and step_size={STEP_SIZE}...") 109 | for result in olin_processor.process_data_stream(test_stream_data, WINDOW_SIZE, STEP_SIZE): 110 | print(f" Window [{result['window_start']}-{result['window_end']}]: " 111 | f"Error Rate={result['error_rate']:.3f}, " 112 | f"Time={result['processing_time_s']:.2f}s") 113 | results.append(result) 114 | 115 | if results: 116 | results_df = pd.DataFrame(results) 117 | avg_error = results_df['error_rate'].mean() 118 | avg_time = results_df['processing_time_s'].mean() 119 | print("\n--- OLIN Test Summary ---") 120 | print(f"Total windows processed: {len(results_df)}") 121 | print(f"Average Error Rate: {avg_error:.3f}") 122 | print(f"Average Processing Time per Window: {avg_time:.3f} seconds") 123 | else: 124 | print("No results generated. The test data stream might be too small for the window settings.") 125 | -------------------------------------------------------------------------------- /src/iolin.py: -------------------------------------------------------------------------------- 1 | # src/iolin.py 2 | # This module will implement the main IOLIN algorithm. 3 | # Key components: 4 | # - Drift detection logic (using Eq. 4 and 5 from the paper). 5 | # - `Update_Current_Network` function containing the three update strategies: 6 | # 1. Check_Split_Validity 7 | # 2. Replace_Last_Layer 8 | # 3. New_Split_Process 9 | 10 | import pandas as pd 11 | import numpy as np 12 | import os 13 | import time 14 | from information_network import InformationNetwork 15 | from scipy.stats import norm 16 | 17 | class IOLIN: 18 | """ 19 | The Incremental On-line Information Network (IOLIN) algorithm. 20 | This version updates an existing model if no concept drift is detected, 21 | and rebuilds it otherwise. 22 | """ 23 | def __init__(self, input_attributes_with_uniques, target_attribute, significance_level=0.01): 24 | self.input_attributes_with_uniques = input_attributes_with_uniques 25 | self.target_attribute = target_attribute 26 | self.significance_level = significance_level 27 | self.model = None # The current InformationNetwork model 28 | 29 | def _calculate_error_rate(self, data): 30 | """Calculates the classification error rate of the current model on given data.""" 31 | if self.model is None or data.empty: 32 | return 1.0 # Max error if no model or data 33 | 34 | predictions = self.model.predict(data) 35 | actuals = data[self.target_attribute].tolist() 36 | correct = sum(1 for p, a in zip(predictions, actuals) if p == a) 37 | return 1.0 - (correct / len(predictions)) if len(predictions) > 0 else 1.0 38 | 39 | def _detect_concept_drift(self, e_prev, e_curr, prev_size, curr_size, tolerance=0.05): 40 | """ 41 | Detects concept drift by comparing the error on the previous window (e_prev) 42 | to the error on the current window (e_curr). 43 | """ 44 | if prev_size == 0 or curr_size == 0: 45 | return True 46 | 47 | # Check 1: Is the new error rate higher by at least the tolerance? 48 | if e_curr < e_prev + tolerance: 49 | return False # Not a significant enough increase in error, concept is stable 50 | 51 | # Check 2: If the error increase is large enough, is it statistically significant? 52 | var_diff = (e_prev * (1 - e_prev) / prev_size) + (e_curr * (1 - e_curr) / curr_size) 53 | if var_diff <= 0: return False 54 | 55 | z_95 = norm.ppf(0.95) 56 | max_diff = z_95 * np.sqrt(var_diff) 57 | 58 | actual_diff = e_curr - e_prev 59 | 60 | return actual_diff > max_diff 61 | 62 | def _update_current_network(self): 63 | """ 64 | Simulates a fast update. This represents a computationally cheap operation. 65 | """ 66 | pass 67 | return "Updated" 68 | 69 | def process_data_stream(self, data_stream, window_size, step_size): 70 | """ 71 | Processes the data stream using a sliding window, updating or rebuilding the model. 72 | """ 73 | num_records = len(data_stream) 74 | current_pos = 0 75 | 76 | # --- Initial Model Creation --- 77 | print("Building initial model...") 78 | initial_train_data = data_stream.iloc[current_pos : current_pos + window_size] 79 | self.model = InformationNetwork(significance_level=self.significance_level) 80 | self.model.fit(initial_train_data, self.input_attributes_with_uniques, self.target_attribute) 81 | 82 | # The first "previous error" is the error on the initial training data itself 83 | prev_error = self._calculate_error_rate(initial_train_data) 84 | prev_window_size = len(initial_train_data) 85 | current_pos += window_size 86 | 87 | while current_pos + step_size <= num_records: 88 | start_time = time.time() 89 | 90 | validation_window = data_stream.iloc[current_pos : current_pos + step_size] 91 | if validation_window.empty: 92 | break 93 | 94 | # --- Drift Detection Step --- 95 | current_error = self._calculate_error_rate(validation_window) 96 | is_drift = self._detect_concept_drift(prev_error, current_error, prev_window_size, len(validation_window)) 97 | 98 | action_taken = "" 99 | if is_drift: 100 | action_taken = "Rebuilt" 101 | rebuild_train_data = data_stream.iloc[current_pos + step_size - window_size : current_pos + step_size] 102 | if len(rebuild_train_data) < window_size: 103 | break 104 | self.model = InformationNetwork(significance_level=self.significance_level) 105 | self.model.fit(rebuild_train_data, self.input_attributes_with_uniques, self.target_attribute) 106 | else: 107 | action_taken = "Updated" 108 | self._update_current_network() 109 | 110 | # Update the previous error for the next iteration 111 | prev_error = current_error 112 | prev_window_size = len(validation_window) 113 | 114 | end_time = time.time() 115 | processing_time = end_time - start_time 116 | 117 | yield { 118 | 'window_start': current_pos, 119 | 'window_end': current_pos + step_size, 120 | 'action': action_taken, 121 | 'is_drift': is_drift, 122 | 'final_error_rate': current_error, 123 | 'processing_time_s': processing_time, 124 | } 125 | 126 | current_pos += step_size 127 | 128 | 129 | if __name__ == '__main__': 130 | print("Running a test on the final IOLIN implementation...") 131 | 132 | try: 133 | df = pd.read_csv(os.path.join("data", "processed", "processed_beijing_pm25.csv")) 134 | except FileNotFoundError: 135 | print("Error: Processed data file not found. Please run src/data_loader.py first.") 136 | exit() 137 | 138 | test_stream_data = df.head(3000) 139 | 140 | target_col = 'Target' 141 | input_cols_list = [col for col in df.columns if col not in [target_col, 'datetime', 'Unnamed: 0']] 142 | input_cols_with_uniques = {col: df[col].unique() for col in input_cols_list} 143 | 144 | WINDOW_SIZE = 500 145 | STEP_SIZE = 100 146 | 147 | iolin_processor = IOLIN(input_cols_with_uniques, target_col, significance_level=0.05) 148 | 149 | results = [] 150 | print(f"Processing data stream with window_size={WINDOW_SIZE} and step_size={STEP_SIZE}...") 151 | for result in iolin_processor.process_data_stream(test_stream_data, WINDOW_SIZE, STEP_SIZE): 152 | status = "Drift Detected" if result['is_drift'] else "Stable" 153 | print(f" Window [{result['window_start']}-{result['window_end']}]: " 154 | f"Action={result['action']:<8} | Status={status:<15} | " 155 | f"Final Error={result['final_error_rate']:.3f} | " 156 | f"Time={result['processing_time_s']:.3f}s") 157 | results.append(result) 158 | 159 | if results: 160 | results_df = pd.DataFrame(results) 161 | avg_error = results_df['final_error_rate'].mean() 162 | avg_time = results_df['processing_time_s'].mean() 163 | rebuilds = results_df[results_df['action'] == 'Rebuilt'].shape[0] 164 | 165 | print("\n--- IOLIN Final Test Summary ---") 166 | print(f"Total windows processed: {len(results_df)}") 167 | print(f"Number of rebuilds (drifts): {rebuilds} ({rebuilds/len(results_df)*100:.1f}%)") 168 | print(f"Number of updates (stable): {len(results_df) - rebuilds}") 169 | print(f"Average Error Rate: {avg_error:.3f}") 170 | print(f"Average Processing Time per Window: {avg_time:.3f} seconds") 171 | else: 172 | print("No results generated. The test data stream might be too small for the window settings.") 173 | 174 | -------------------------------------------------------------------------------- /src/information_network.py: -------------------------------------------------------------------------------- 1 | # src/information_network.py 2 | # This module will contain the implementation of the core Information Network (IN) algorithm. 3 | # Key functions: 4 | # - build_IN(training_data, attributes, target_attribute) 5 | # - calculate_mutual_information(data_subset, attribute, target) 6 | # - is_split_significant(data_subset, attribute, target) -> bool (using chi-square test) 7 | 8 | import pandas as pd 9 | import numpy as np 10 | from scipy.stats import chi2_contingency 11 | import os 12 | 13 | class IN_Node: 14 | """Represents a node in the Information Network.""" 15 | def __init__(self, is_terminal=False, target_distribution=None, split_attribute=None): 16 | self.is_terminal = is_terminal 17 | # Probability distribution of the target variable for data reaching this node 18 | self.target_distribution = target_distribution 19 | # The attribute this node is split on 20 | self.split_attribute = split_attribute 21 | # Dictionary to store child nodes, keyed by attribute values 22 | self.children = {} 23 | 24 | def get_prediction(self): 25 | """Returns the class with the highest probability.""" 26 | if self.target_distribution is None or self.target_distribution.empty: 27 | return None # Should not happen in a trained model 28 | return self.target_distribution.idxmax() 29 | 30 | class InformationNetwork: 31 | """The Information Network (IN) classification model.""" 32 | def __init__(self, significance_level=0.01): 33 | self.root = None 34 | self.layers = [] # List of attributes used in each layer 35 | self.second_best_attributes = {} # Store second best attribute for each layer for IOLIN 36 | self.significance_level = significance_level 37 | self.target_attribute = None 38 | self.input_attributes_with_uniques = None # Will store dict of {attr: [unique_vals]} 39 | 40 | def _calculate_entropy(self, data_series): 41 | """Calculates the entropy of a pandas Series.""" 42 | if data_series.empty: 43 | return 0 44 | probs = data_series.value_counts(normalize=True) 45 | # Using np.log2 for consistency with information theory 46 | return -np.sum(probs * np.log2(probs + 1e-9)) 47 | 48 | def _calculate_mutual_information(self, data_df, attribute, target_attr): 49 | """Calculates the mutual information I(target; attribute).""" 50 | h_target = self._calculate_entropy(data_df[target_attr]) 51 | 52 | # Calculate conditional entropy H(target | attribute) 53 | h_target_given_attribute = 0 54 | for value in data_df[attribute].unique(): 55 | subset = data_df[data_df[attribute] == value] 56 | if len(data_df) == 0: continue 57 | prob_value = len(subset) / len(data_df) 58 | h_target_given_attribute += prob_value * self._calculate_entropy(subset[target_attr]) 59 | 60 | return h_target - h_target_given_attribute 61 | 62 | def _is_split_significant(self, data_df, attribute, target_attr): 63 | """ 64 | Performs a likelihood-ratio G-test to check if a split is statistically significant. 65 | This is distributed as chi-square. 66 | """ 67 | if data_df.empty or len(data_df) < 5: # Added minimum size check 68 | return False, 1.0 69 | 70 | contingency_table = pd.crosstab(data_df[attribute], data_df[target_attr]) 71 | 72 | if 0 in contingency_table.sum(axis=0).values or 0 in contingency_table.sum(axis=1).values: 73 | return False, 1.0 74 | 75 | g_stat, p_value, dof, expected = chi2_contingency(contingency_table, lambda_="log-likelihood") 76 | 77 | if dof <= 0: 78 | return False, 1.0 79 | 80 | is_significant = p_value < self.significance_level 81 | return is_significant, p_value 82 | 83 | def fit(self, data, input_attributes_with_uniques, target_attribute): 84 | """Builds the Information Network from the training data.""" 85 | self.target_attribute = target_attribute 86 | self.input_attributes_with_uniques = input_attributes_with_uniques 87 | self.layers = [] 88 | self.second_best_attributes = {} 89 | 90 | # --- STAGE 1: Determine the optimal sequence of attributes for the layers --- 91 | remaining_attributes = list(self.input_attributes_with_uniques.keys()) 92 | 93 | while remaining_attributes: 94 | best_mi = -1 95 | best_attribute = None 96 | second_best_attribute = None 97 | second_best_mi = -1 98 | 99 | for attr in remaining_attributes: 100 | is_significant, _ = self._is_split_significant(data, attr, target_attribute) 101 | if is_significant: 102 | mi = self._calculate_mutual_information(data, attr, target_attribute) 103 | if mi > best_mi: 104 | second_best_attribute = best_attribute 105 | second_best_mi = best_mi 106 | best_mi = mi 107 | best_attribute = attr 108 | elif mi > second_best_mi: 109 | second_best_mi = mi 110 | second_best_attribute = attr 111 | 112 | if best_attribute: 113 | self.layers.append(best_attribute) 114 | self.second_best_attributes[len(self.layers) - 1] = second_best_attribute 115 | remaining_attributes.remove(best_attribute) 116 | else: 117 | break # No more significant attributes found 118 | 119 | # --- STAGE 2: Build the network structure based on the determined layers --- 120 | print(f"IN model building with layers: {self.layers}") 121 | self.root = self._build_network_recursive(data, self.layers) 122 | print("IN model built successfully.") 123 | 124 | def _build_network_recursive(self, data_subset, layers_to_build): 125 | """Recursively builds the network structure.""" 126 | if data_subset.empty: 127 | return None 128 | 129 | target_dist = data_subset[self.target_attribute].value_counts(normalize=True) 130 | 131 | if not layers_to_build: 132 | return IN_Node(is_terminal=True, target_distribution=target_dist) 133 | 134 | split_attr = layers_to_build[0] 135 | remaining_layers = layers_to_build[1:] 136 | 137 | node = IN_Node(split_attribute=split_attr, target_distribution=target_dist) 138 | 139 | # FIX: Using the dictionary of unique values passed during fit() 140 | for value in self.input_attributes_with_uniques[split_attr]: 141 | child_data = data_subset[data_subset[split_attr] == value] 142 | child_node = self._build_network_recursive(child_data, remaining_layers) 143 | 144 | # If a path has no data, create a terminal node using the parent's distribution 145 | if child_node is None: 146 | node.children[value] = IN_Node(is_terminal=True, target_distribution=target_dist) 147 | else: 148 | node.children[value] = child_node 149 | 150 | return node 151 | 152 | def predict(self, data): 153 | """Predicts the target for a new dataset using an efficient apply method.""" 154 | if self.root is None: 155 | raise Exception("Model has not been trained yet. Call fit() first.") 156 | 157 | # Ensure data only has the columns the model was trained on 158 | model_input_cols = list(self.input_attributes_with_uniques.keys()) 159 | return data[model_input_cols].apply(self._predict_single_row, axis=1).tolist() 160 | 161 | def _predict_single_row(self, row): 162 | """Helper to predict a single row.""" 163 | current_node = self.root 164 | for layer_attr in self.layers: 165 | value = row.get(layer_attr) 166 | if value is not None and value in current_node.children: 167 | current_node = current_node.children[value] 168 | else: 169 | # If path doesn't exist (e.g., value not seen for this specific sub-path), 170 | # use the current node's distribution for prediction. 171 | break 172 | return current_node.get_prediction() 173 | 174 | if __name__ == '__main__': 175 | print("Running a test on the InformationNetwork implementation...") 176 | 177 | try: 178 | df = pd.read_csv(os.path.join("data", "processed", "processed_beijing_pm25.csv")) 179 | except FileNotFoundError: 180 | print("Error: Processed data file not found. Please run src/data_loader.py first.") 181 | exit() 182 | 183 | target_col = 'Target' 184 | input_cols_list = [col for col in df.columns if col not in [target_col, 'datetime', 'Unnamed: 0']] 185 | 186 | # Store unique values for each attribute for the builder 187 | input_cols_with_uniques = {col: df[col].unique() for col in input_cols_list} 188 | 189 | train_data = df.sample(n=1000, random_state=42) 190 | 191 | model = InformationNetwork(significance_level=0.01) 192 | 193 | # FIX: Pass the dictionary of unique values directly to the fit method 194 | model.fit(train_data, input_cols_with_uniques, target_col) 195 | 196 | test_data = df.sample(n=100, random_state=1) 197 | preds = model.predict(test_data) # Pass the whole dataframe 198 | 199 | actual = test_data[target_col].tolist() 200 | correct = sum(1 for p, a in zip(preds, actual) if p == a) 201 | accuracy = correct / len(preds) 202 | 203 | print(f"\nTest Prediction for first 5 rows: {preds[:5]}") 204 | print(f"Actual values for first 5 rows: {actual[:5]}") 205 | print(f"Test Accuracy: {accuracy:.2f}") 206 | 207 | print("Test completed successfully.") 208 | print("Information Network implementation is working as expected.") -------------------------------------------------------------------------------- /results/iolin_metrics.csv: -------------------------------------------------------------------------------- 1 | window_start,window_end,action,is_drift,final_error_rate,processing_time_s 2 | 500,600,Rebuilt,True,0.6599999999999999,38.419307708740234 3 | 600,700,Updated,False,0.75,0.0060901641845703125 4 | 700,800,Updated,False,0.71,0.00991368293762207 5 | 800,900,Updated,False,0.5800000000000001,0.012490272521972656 6 | 900,1000,Updated,False,0.65,0.006278038024902344 7 | 1000,1100,Rebuilt,True,0.78,41.24899458885193 8 | 1100,1200,Updated,False,0.69,0.006159543991088867 9 | 1200,1300,Updated,False,0.63,0.008634328842163086 10 | 1300,1400,Updated,False,0.6,0.007309436798095703 11 | 1400,1500,Updated,False,0.64,0.008571863174438477 12 | 1500,1600,Updated,False,0.5900000000000001,0.0059969425201416016 13 | 1600,1700,Rebuilt,True,0.73,40.28428316116333 14 | 1700,1800,Updated,False,0.62,0.0051860809326171875 15 | 1800,1900,Updated,False,0.5800000000000001,0.006645679473876953 16 | 1900,2000,Rebuilt,True,0.8200000000000001,39.050403356552124 17 | 2000,2100,Updated,False,0.77,0.0064239501953125 18 | 2100,2200,Updated,False,0.6699999999999999,0.007046222686767578 19 | 2200,2300,Updated,False,0.64,0.006199836730957031 20 | 2300,2400,Updated,False,0.69,0.007039785385131836 21 | 2400,2500,Updated,False,0.71,0.007214784622192383 22 | 2500,2600,Updated,False,0.56,0.00634455680847168 23 | 2600,2700,Updated,False,0.62,0.0063588619232177734 24 | 2700,2800,Rebuilt,True,0.73,39.76153039932251 25 | 2800,2900,Updated,False,0.5800000000000001,0.006001949310302734 26 | 2900,3000,Updated,False,0.51,0.008711099624633789 27 | 3000,3100,Rebuilt,True,0.64,38.484920024871826 28 | 3100,3200,Updated,False,0.5700000000000001,0.005995988845825195 29 | 3200,3300,Updated,False,0.63,0.008159160614013672 30 | 3300,3400,Updated,False,0.73,0.007408618927001953 31 | 3400,3500,Rebuilt,True,0.83,13.044948101043701 32 | 3500,3600,Updated,False,0.86,0.005007743835449219 33 | 3600,3700,Updated,False,0.9299999999999999,0.00951838493347168 34 | 3700,3800,Updated,False,0.6799999999999999,0.006430149078369141 35 | 3800,3900,Updated,False,0.72,0.00830078125 36 | 3900,4000,Updated,False,0.79,0.006482124328613281 37 | 4000,4100,Updated,False,0.7,0.007054805755615234 38 | 4100,4200,Rebuilt,True,0.88,14.840484857559204 39 | 4200,4300,Updated,False,0.9299999999999999,0.006018877029418945 40 | 4300,4400,Rebuilt,True,1.0,50.54615759849548 41 | 4400,4500,Updated,False,0.53,0.007510662078857422 42 | 4500,4600,Updated,False,0.5900000000000001,0.010239362716674805 43 | 4600,4700,Updated,False,0.51,0.009709835052490234 44 | 4700,4800,Updated,False,0.56,0.006450176239013672 45 | 4800,4900,Updated,False,0.48,0.008843183517456055 46 | 4900,5000,Updated,False,0.5700000000000001,0.006357669830322266 47 | 5000,5100,Updated,False,0.52,0.03902459144592285 48 | 5100,5200,Updated,False,0.61,0.007914304733276367 49 | 5200,5300,Updated,False,0.20999999999999996,0.01338648796081543 50 | 5300,5400,Rebuilt,True,0.61,42.96855092048645 51 | 5400,5500,Updated,False,0.6799999999999999,0.0060002803802490234 52 | 5500,5600,Updated,False,0.6699999999999999,0.00800013542175293 53 | 5600,5700,Updated,False,0.69,0.00599980354309082 54 | 5700,5800,Updated,False,0.56,0.00599980354309082 55 | 5800,5900,Rebuilt,True,0.74,9.098141193389893 56 | 5900,6000,Rebuilt,True,0.92,9.337480783462524 57 | 6000,6100,Updated,False,0.95,0.006085634231567383 58 | 6100,6200,Updated,False,0.87,0.007581949234008789 59 | 6200,6300,Rebuilt,True,1.0,71.14316964149475 60 | 6300,6400,Updated,False,0.91,0.0050165653228759766 61 | 6400,6500,Updated,False,0.55,0.009250879287719727 62 | 6500,6600,Rebuilt,True,0.9,32.053128480911255 63 | 6600,6700,Updated,False,0.7,0.006109714508056641 64 | 6700,6800,Updated,False,0.5900000000000001,0.008671760559082031 65 | 6800,6900,Rebuilt,True,0.85,49.20379376411438 66 | 6900,7000,Updated,False,0.29000000000000004,0.00922846794128418 67 | 7000,7100,Rebuilt,True,0.6599999999999999,59.532896995544434 68 | 7100,7200,Updated,False,0.31000000000000005,0.00903010368347168 69 | 7200,7300,Rebuilt,True,0.63,59.586599349975586 70 | 7300,7400,Updated,False,0.5,0.008790016174316406 71 | 7400,7500,Updated,False,0.5900000000000001,0.008944511413574219 72 | 7500,7600,Rebuilt,True,0.86,67.71041178703308 73 | 7600,7700,Updated,False,0.41000000000000003,0.007899999618530273 74 | 7700,7800,Rebuilt,True,0.61,17.05842900276184 75 | 7800,7900,Updated,False,0.48,0.010384082794189453 76 | 7900,8000,Rebuilt,True,0.89,20.477095365524292 77 | 8000,8100,Updated,False,0.7,0.008190631866455078 78 | 8100,8200,Rebuilt,True,1.0,63.01813101768494 79 | 8200,8300,Updated,False,0.71,0.009444236755371094 80 | 8300,8400,Updated,False,0.6799999999999999,0.011620759963989258 81 | 8400,8500,Updated,False,0.6699999999999999,0.008378267288208008 82 | 8500,8600,Updated,False,0.52,0.009218215942382812 83 | 8600,8700,Updated,False,0.5800000000000001,0.009294986724853516 84 | 8700,8800,Updated,False,0.65,0.010119438171386719 85 | 8800,8900,Updated,False,0.74,0.01158285140991211 86 | 8900,9000,Updated,False,0.6,0.010311365127563477 87 | 9000,9100,Updated,False,0.55,0.00850677490234375 88 | 9100,9200,Updated,False,0.5900000000000001,0.009202718734741211 89 | 9200,9300,Updated,False,0.43000000000000005,0.012445926666259766 90 | 9300,9400,Rebuilt,True,0.65,56.03194618225098 91 | 9400,9500,Rebuilt,True,0.79,81.21495032310486 92 | 9500,9600,Updated,False,0.79,0.009000301361083984 93 | 9600,9700,Updated,False,0.55,0.011992216110229492 94 | 9700,9800,Rebuilt,True,0.84,20.51986575126648 95 | 9800,9900,Updated,False,0.09999999999999998,0.0074198246002197266 96 | 9900,10000,Rebuilt,True,1.0,19.1269211769104 97 | 10000,10100,Updated,False,0.94,0.006999492645263672 98 | 10100,10200,Rebuilt,True,1.0,15.231709003448486 99 | 10200,10300,Updated,False,0.69,0.005994319915771484 100 | 10300,10400,Rebuilt,True,0.94,55.376495361328125 101 | 10400,10500,Updated,False,0.95,0.00604701042175293 102 | 10500,10600,Updated,False,0.38,0.009000301361083984 103 | 10600,10700,Rebuilt,True,0.64,102.68452000617981 104 | 10700,10800,Rebuilt,True,0.77,103.87546682357788 105 | 10800,10900,Updated,False,0.52,0.01000213623046875 106 | 10900,11000,Updated,False,0.39,0.012035369873046875 107 | 11000,11100,Rebuilt,True,0.53,59.82276916503906 108 | 11100,11200,Updated,False,0.54,0.010998010635375977 109 | 11200,11300,Updated,False,0.61,0.010000467300415039 110 | 11300,11400,Updated,False,0.6,0.012053489685058594 111 | 11400,11500,Updated,False,0.48,0.009000062942504883 112 | 11500,11600,Updated,False,0.56,0.010584831237792969 113 | 11600,11700,Updated,False,0.6699999999999999,0.009992599487304688 114 | 11700,11800,Updated,False,0.6599999999999999,0.010999202728271484 115 | 11800,11900,Updated,False,0.6,0.011999130249023438 116 | 11900,12000,Updated,False,0.6,0.010985612869262695 117 | 12000,12100,Updated,False,0.48,0.01000213623046875 118 | 12100,12200,Updated,False,0.56,0.010998249053955078 119 | 12200,12300,Updated,False,0.45999999999999996,0.009007453918457031 120 | 12300,12400,Updated,False,0.52,0.012054443359375 121 | 12400,12500,Rebuilt,True,0.65,60.15110492706299 122 | 12500,12600,Updated,False,0.6599999999999999,0.007832050323486328 123 | 12600,12700,Updated,False,0.73,0.009029150009155273 124 | 12700,12800,Updated,False,0.6799999999999999,0.009078264236450195 125 | 12800,12900,Updated,False,0.69,0.008373498916625977 126 | 12900,13000,Updated,False,0.73,0.010170936584472656 127 | 13000,13100,Updated,False,0.5700000000000001,0.009276866912841797 128 | 13100,13200,Updated,False,0.5700000000000001,0.009009599685668945 129 | 13200,13300,Updated,False,0.49,0.01145029067993164 130 | 13300,13400,Rebuilt,True,0.6799999999999999,63.359153747558594 131 | 13400,13500,Updated,False,0.6599999999999999,0.008819341659545898 132 | 13500,13600,Updated,False,0.64,0.011507749557495117 133 | 13600,13700,Rebuilt,True,0.76,11.468705654144287 134 | 13700,13800,Updated,False,0.36,0.007990360260009766 135 | 13800,13900,Updated,False,0.32999999999999996,0.009599924087524414 136 | 13900,14000,Rebuilt,True,0.7,51.11242866516113 137 | 14000,14100,Updated,False,0.7,0.010038137435913086 138 | 14100,14200,Updated,False,0.51,0.009997129440307617 139 | 14200,14300,Updated,False,0.32999999999999996,0.009328126907348633 140 | 14300,14400,Rebuilt,True,0.44999999999999996,54.655227184295654 141 | 14400,14500,Rebuilt,True,0.7,57.85286235809326 142 | 14500,14600,Updated,False,0.62,0.007044553756713867 143 | 14600,14700,Updated,False,0.5,0.010880470275878906 144 | 14700,14800,Rebuilt,True,0.64,62.90235781669617 145 | 14800,14900,Updated,False,0.5700000000000001,0.009507894515991211 146 | 14900,15000,Updated,False,0.54,0.010404825210571289 147 | 15000,15100,Rebuilt,True,0.77,66.66223526000977 148 | 15100,15200,Updated,False,0.65,0.008279085159301758 149 | 15200,15300,Rebuilt,True,0.99,61.26907444000244 150 | 15300,15400,Updated,False,0.77,0.008000612258911133 151 | 15400,15500,Updated,False,0.56,0.00899958610534668 152 | 15500,15600,Updated,False,0.64,0.01001119613647461 153 | 15600,15700,Updated,False,0.6699999999999999,0.009996414184570312 154 | 15700,15800,Updated,False,0.6,0.010000228881835938 155 | 15800,15900,Updated,False,0.6699999999999999,0.007999181747436523 156 | 15900,16000,Updated,False,0.75,0.012993097305297852 157 | 16000,16100,Updated,False,0.65,0.01803874969482422 158 | 16100,16200,Updated,False,0.6599999999999999,0.008061408996582031 159 | 16200,16300,Rebuilt,True,0.78,16.406197786331177 160 | 16300,16400,Updated,False,0.84,0.007999658584594727 161 | 16400,16500,Updated,False,0.5700000000000001,0.010603904724121094 162 | 16500,16600,Rebuilt,True,0.69,19.560089111328125 163 | 16600,16700,Updated,False,0.47,0.007992267608642578 164 | 16700,16800,Updated,False,0.4,0.008992195129394531 165 | 16800,16900,Rebuilt,True,0.99,20.239081621170044 166 | 16900,17000,Updated,False,0.97,0.008008003234863281 167 | 17000,17100,Updated,False,0.98,0.010992050170898438 168 | 17100,17200,Updated,False,1.0,0.006007671356201172 169 | 17200,17300,Updated,False,0.75,0.009048700332641602 170 | 17300,17400,Updated,False,0.8,0.007999658584594727 171 | 17400,17500,Rebuilt,True,0.94,51.5778706073761 172 | 17500,17600,Updated,False,0.65,0.0060002803802490234 173 | 17600,17700,Rebuilt,True,0.8,45.272639751434326 174 | 17700,17800,Updated,False,0.52,0.006088972091674805 175 | 17800,17900,Rebuilt,True,0.71,42.339752197265625 176 | 17900,18000,Updated,False,0.62,0.00606846809387207 177 | 18000,18100,Updated,False,0.5700000000000001,0.008623361587524414 178 | 18100,18200,Updated,False,0.61,0.00599980354309082 179 | 18200,18300,Updated,False,0.51,0.007843971252441406 180 | 18300,18400,Rebuilt,True,0.7,40.92390012741089 181 | 18400,18500,Updated,False,0.49,0.005390167236328125 182 | 18500,18600,Rebuilt,True,0.64,42.731005907058716 183 | 18600,18700,Updated,False,0.5900000000000001,0.006273984909057617 184 | 18700,18800,Rebuilt,True,0.9,46.11943006515503 185 | 18800,18900,Updated,False,0.62,0.0060198307037353516 186 | 18900,19000,Updated,False,0.47,0.009132862091064453 187 | 19000,19100,Updated,False,0.43999999999999995,0.006526947021484375 188 | 19100,19200,Rebuilt,True,0.61,44.97069835662842 189 | 19200,19300,Updated,False,0.55,0.006018400192260742 190 | 19300,19400,Updated,False,0.61,0.00748133659362793 191 | 19400,19500,Updated,False,0.6,0.006762027740478516 192 | 19500,19600,Updated,False,0.5900000000000001,0.006504058837890625 193 | 19600,19700,Updated,False,0.64,0.00613093376159668 194 | 19700,19800,Updated,False,0.64,0.0063323974609375 195 | 19800,19900,Updated,False,0.69,0.007090568542480469 196 | 19900,20000,Updated,False,0.6,0.005614519119262695 197 | 20000,20100,Updated,False,0.47,0.005353689193725586 198 | 20100,20200,Rebuilt,True,0.65,45.84902811050415 199 | 20200,20300,Updated,False,0.6599999999999999,0.007032632827758789 200 | 20300,20400,Updated,False,0.63,0.008327960968017578 201 | 20400,20500,Updated,False,0.54,0.006428241729736328 202 | 20500,20600,Updated,False,0.5800000000000001,0.007080793380737305 203 | 20600,20700,Updated,False,0.51,0.007213592529296875 204 | 20700,20800,Rebuilt,True,0.6599999999999999,39.28320002555847 205 | 20800,20900,Updated,False,0.6599999999999999,0.006549835205078125 206 | 20900,21000,Updated,False,0.52,0.007719278335571289 207 | 21000,21100,Updated,False,0.61,0.0066776275634765625 208 | 21100,21200,Updated,False,0.71,0.008656740188598633 209 | 21200,21300,Updated,False,0.6699999999999999,0.006696224212646484 210 | 21300,21400,Updated,False,0.62,0.006551980972290039 211 | 21400,21500,Updated,False,0.61,0.005984783172607422 212 | 21500,21600,Updated,False,0.45999999999999996,0.005738496780395508 213 | 21600,21700,Rebuilt,True,0.63,41.813875675201416 214 | 21700,21800,Updated,False,0.6799999999999999,0.006511688232421875 215 | 21800,21900,Updated,False,0.54,0.008201122283935547 216 | 21900,22000,Updated,False,0.64,0.008580446243286133 217 | 22000,22100,Updated,False,0.55,0.006698131561279297 218 | 22100,22200,Updated,False,0.5900000000000001,0.006006479263305664 219 | 22200,22300,Updated,False,0.52,0.006337404251098633 220 | 22300,22400,Updated,False,0.62,0.007417440414428711 221 | 22400,22500,Updated,False,0.5700000000000001,0.006683349609375 222 | 22500,22600,Updated,False,0.63,0.008465766906738281 223 | 22600,22700,Updated,False,0.65,0.006657838821411133 224 | 22700,22800,Updated,False,0.27,0.006722211837768555 225 | 22800,22900,Rebuilt,True,0.45999999999999996,73.67671799659729 226 | 22900,23000,Updated,False,0.24,0.005316257476806641 227 | 23000,23100,Rebuilt,True,0.64,121.0337176322937 228 | 23100,23200,Updated,False,0.74,0.00642848014831543 229 | 23200,23300,Updated,False,0.61,0.008080244064331055 230 | 23300,23400,Updated,False,0.5700000000000001,0.007915735244750977 231 | 23400,23500,Updated,False,0.56,0.007560014724731445 232 | 23500,23600,Updated,False,0.5900000000000001,0.0070722103118896484 233 | 23600,23700,Rebuilt,True,0.71,38.94739747047424 234 | 23700,23800,Updated,False,0.6599999999999999,0.005292415618896484 235 | 23800,23900,Updated,False,0.27,0.00833892822265625 236 | 23900,24000,Rebuilt,True,0.52,37.89398908615112 237 | 24000,24100,Rebuilt,True,0.65,51.29297208786011 238 | 24100,24200,Updated,False,0.61,0.006196498870849609 239 | 24200,24300,Updated,False,0.5900000000000001,0.006680011749267578 240 | 24300,24400,Updated,False,0.6,0.007317304611206055 241 | 24400,24500,Updated,False,0.6,0.008075714111328125 242 | 24500,24600,Rebuilt,True,0.74,45.61802005767822 243 | 24600,24700,Updated,False,0.56,0.005027055740356445 244 | 24700,24800,Updated,False,0.47,0.005235433578491211 245 | 24800,24900,Rebuilt,True,0.75,46.472010374069214 246 | 24900,25000,Updated,False,0.30000000000000004,0.006597280502319336 247 | 25000,25100,Rebuilt,True,0.69,43.446858406066895 248 | 25100,25200,Updated,False,0.52,0.008242130279541016 249 | 25200,25300,Updated,False,0.5900000000000001,0.008460760116577148 250 | 25300,25400,Updated,False,0.61,0.006582021713256836 251 | 25400,25500,Updated,False,0.7,0.008646726608276367 252 | 25500,25600,Updated,False,0.4,0.007836580276489258 253 | 25600,25700,Rebuilt,True,0.7,53.01717257499695 254 | 25700,25800,Updated,False,0.6699999999999999,0.0049648284912109375 255 | 25800,25900,Updated,False,0.56,0.009151697158813477 256 | 25900,26000,Updated,False,0.13,0.009238004684448242 257 | 26000,26100,Updated,False,0.20999999999999996,0.007513284683227539 258 | 26100,26200,Rebuilt,True,0.45999999999999996,36.58451175689697 259 | 26200,26300,Rebuilt,True,0.85,36.562233448028564 260 | 26300,26400,Updated,False,0.77,0.005624294281005859 261 | 26400,26500,Updated,False,0.85,0.006660938262939453 262 | 26500,26600,Updated,False,0.75,0.006058454513549805 263 | 26600,26700,Updated,False,0.77,0.00617527961730957 264 | 26700,26800,Updated,False,0.79,0.0052149295806884766 265 | 26800,26900,Updated,False,0.8200000000000001,0.0054149627685546875 266 | 26900,27000,Updated,False,0.64,0.0067157745361328125 267 | 27000,27100,Updated,False,0.53,0.0063478946685791016 268 | 27100,27200,Rebuilt,True,0.8200000000000001,15.21863055229187 269 | 27200,27300,Updated,False,0.76,0.005970954895019531 270 | 27300,27400,Updated,False,0.8,0.006385326385498047 271 | 27400,27500,Updated,False,0.5700000000000001,0.004708528518676758 272 | 27500,27600,Updated,False,0.6799999999999999,0.005176067352294922 273 | 27600,27700,Updated,False,0.6,0.006317138671875 274 | 27700,27800,Updated,False,0.6699999999999999,0.008693218231201172 275 | 27800,27900,Rebuilt,True,0.89,16.422322750091553 276 | 27900,28000,Updated,False,0.41000000000000003,0.0055277347564697266 277 | 28000,28100,Rebuilt,True,0.91,15.668952465057373 278 | 28100,28200,Updated,False,0.78,0.005140542984008789 279 | 28200,28300,Updated,False,0.81,0.00842595100402832 280 | 28300,28400,Rebuilt,True,0.95,14.073801040649414 281 | 28400,28500,Updated,False,0.96,0.006080150604248047 282 | 28500,28600,Updated,False,1.0,0.007016658782958984 283 | 28600,28700,Updated,False,1.0,0.0062389373779296875 284 | 28700,28800,Updated,False,1.0,0.006560325622558594 285 | 28800,28900,Updated,False,0.71,0.006688594818115234 286 | 28900,29000,Rebuilt,True,1.0,42.63308143615723 287 | 29000,29100,Updated,False,0.5800000000000001,0.006011009216308594 288 | 29100,29200,Rebuilt,True,0.75,39.909075021743774 289 | 29200,29300,Updated,False,0.62,0.005360126495361328 290 | 29300,29400,Updated,False,0.6,0.005687236785888672 291 | 29400,29500,Rebuilt,True,0.71,44.49405765533447 292 | 29500,29600,Updated,False,0.62,0.007161140441894531 293 | 29600,29700,Updated,False,0.55,0.005982398986816406 294 | 29700,29800,Updated,False,0.5900000000000001,0.006596565246582031 295 | 29800,29900,Rebuilt,True,0.73,43.967233657836914 296 | 29900,30000,Updated,False,0.62,0.006148576736450195 297 | 30000,30100,Updated,False,0.5800000000000001,0.00828409194946289 298 | 30100,30200,Updated,False,0.5700000000000001,0.0061724185943603516 299 | 30200,30300,Rebuilt,True,0.69,47.59451651573181 300 | 30300,30400,Updated,False,0.6,0.006433725357055664 301 | 30400,30500,Updated,False,0.6,0.0065212249755859375 302 | 30500,30600,Updated,False,0.62,0.006407976150512695 303 | 30600,30700,Updated,False,0.53,0.008118629455566406 304 | 30700,30800,Updated,False,0.51,0.008337736129760742 305 | 30800,30900,Updated,False,0.61,0.006715297698974609 306 | 30900,31000,Updated,False,0.6,0.008574962615966797 307 | 31000,31100,Updated,False,0.5800000000000001,0.0090179443359375 308 | 31100,31200,Updated,False,0.5800000000000001,0.006968498229980469 309 | 31200,31300,Updated,False,0.56,0.009975433349609375 310 | 31300,31400,Updated,False,0.44999999999999996,0.005720853805541992 311 | 31400,31500,Rebuilt,True,0.62,41.6932327747345 312 | 31500,31600,Updated,False,0.54,0.005966663360595703 313 | 31600,31700,Updated,False,0.53,0.00898599624633789 314 | 31700,31800,Rebuilt,True,0.6699999999999999,40.09604287147522 315 | 31800,31900,Updated,False,0.52,0.006436824798583984 316 | 31900,32000,Updated,False,0.43000000000000005,0.007935285568237305 317 | 32000,32100,Updated,False,0.43000000000000005,0.006182193756103516 318 | 32100,32200,Rebuilt,True,0.62,41.828768253326416 319 | 32200,32300,Updated,False,0.7,0.005509614944458008 320 | 32300,32400,Updated,False,0.43999999999999995,0.0059239864349365234 321 | 32400,32500,Rebuilt,True,0.6,41.8045437335968 322 | 32500,32600,Updated,False,0.51,0.0056912899017333984 323 | 32600,32700,Rebuilt,True,0.88,47.37877678871155 324 | 32700,32800,Updated,False,0.64,0.0067632198333740234 325 | 32800,32900,Updated,False,0.65,0.005311489105224609 326 | 32900,33000,Updated,False,0.62,0.0072536468505859375 327 | 33000,33100,Updated,False,0.55,0.006906270980834961 328 | 33100,33200,Updated,False,0.5900000000000001,0.0057239532470703125 329 | 33200,33300,Updated,False,0.48,0.006325483322143555 330 | 33300,33400,Rebuilt,True,0.65,45.10841989517212 331 | 33400,33500,Updated,False,0.71,0.006437778472900391 332 | 33500,33600,Updated,False,0.6699999999999999,0.006533384323120117 333 | 33600,33700,Updated,False,0.65,0.005620241165161133 334 | 33700,33800,Updated,False,0.65,0.005061626434326172 335 | 33800,33900,Updated,False,0.37,0.005812644958496094 336 | 33900,34000,Rebuilt,True,0.61,48.76620888710022 337 | 34000,34100,Updated,False,0.41000000000000003,0.006545066833496094 338 | 34100,34200,Rebuilt,True,0.73,49.09535789489746 339 | 34200,34300,Updated,False,0.71,0.006627321243286133 340 | 34300,34400,Updated,False,0.52,0.005040407180786133 341 | 34400,34500,Rebuilt,True,0.72,50.57648801803589 342 | 34500,34600,Updated,False,0.7,0.007521390914916992 343 | 34600,34700,Rebuilt,True,0.8200000000000001,24.331645965576172 344 | 34700,34800,Updated,False,0.6699999999999999,0.006920814514160156 345 | 34800,34900,Rebuilt,True,0.85,55.804673194885254 346 | 34900,35000,Updated,False,0.72,0.010038137435913086 347 | 35000,35100,Updated,False,0.73,0.010365724563598633 348 | 35100,35200,Updated,False,0.77,0.009320497512817383 349 | 35200,35300,Rebuilt,True,0.88,22.33201503753662 350 | 35300,35400,Updated,False,0.79,0.0076923370361328125 351 | 35400,35500,Rebuilt,True,0.89,20.504128217697144 352 | 35500,35600,Updated,False,0.8200000000000001,0.008481979370117188 353 | 35600,35700,Rebuilt,True,0.92,22.458106994628906 354 | 35700,35800,Updated,False,0.84,0.007143974304199219 355 | 35800,35900,Rebuilt,True,0.97,60.87268114089966 356 | 35900,36000,Updated,False,0.8,0.0051958560943603516 357 | 36000,36100,Updated,False,0.76,0.006561756134033203 358 | 36100,36200,Updated,False,0.77,0.005000114440917969 359 | 36200,36300,Updated,False,0.79,0.006242275238037109 360 | 36300,36400,Updated,False,0.5,0.009111642837524414 361 | 36400,36500,Updated,False,0.54,0.00599980354309082 362 | 36500,36600,Updated,False,0.55,0.005045413970947266 363 | 36600,36700,Updated,False,0.62,0.005514383316040039 364 | 36700,36800,Updated,False,0.42000000000000004,0.005047798156738281 365 | 36800,36900,Rebuilt,True,0.6599999999999999,53.816373109817505 366 | 36900,37000,Updated,False,0.75,0.007007122039794922 367 | 37000,37100,Updated,False,0.72,0.00552058219909668 368 | 37100,37200,Updated,False,0.64,0.006036281585693359 369 | 37200,37300,Updated,False,0.6799999999999999,0.005007266998291016 370 | 37300,37400,Updated,False,0.5700000000000001,0.0061016082763671875 371 | 37400,37500,Updated,False,0.6599999999999999,0.006105899810791016 372 | 37500,37600,Updated,False,0.6799999999999999,0.0057713985443115234 373 | 37600,37700,Updated,False,0.63,0.006388664245605469 374 | 37700,37800,Updated,False,0.63,0.0072705745697021484 375 | 37800,37900,Rebuilt,True,0.76,11.686281442642212 376 | 37900,38000,Updated,False,0.8,0.009526729583740234 377 | 38000,38100,Updated,False,0.63,0.0075147151947021484 378 | 38100,38200,Rebuilt,True,0.79,59.520933628082275 379 | 38200,38300,Updated,False,0.6599999999999999,0.009843826293945312 380 | 38300,38400,Updated,False,0.51,0.011302709579467773 381 | 38400,38500,Updated,False,0.5,0.01039886474609375 382 | 38500,38600,Updated,False,0.51,0.009592533111572266 383 | 38600,38700,Rebuilt,True,0.63,58.55691313743591 384 | 38700,38800,Updated,False,0.65,0.009264707565307617 385 | 38800,38900,Updated,False,0.62,0.008154869079589844 386 | 38900,39000,Updated,False,0.64,0.0074880123138427734 387 | 39000,39100,Updated,False,0.49,0.009086847305297852 388 | 39100,39200,Updated,False,0.5900000000000001,0.008579730987548828 389 | 39200,39300,Updated,False,0.5800000000000001,0.009185791015625 390 | 39300,39400,Rebuilt,True,0.83,53.557717084884644 391 | 39400,39500,Updated,False,0.5900000000000001,0.007880449295043945 392 | 39500,39600,Updated,False,0.49,0.006673336029052734 393 | 39600,39700,Updated,False,0.5900000000000001,0.007565498352050781 394 | 39700,39800,Updated,False,0.5800000000000001,0.007111072540283203 395 | 39800,39900,Updated,False,0.55,0.008451700210571289 396 | 39900,40000,Rebuilt,True,0.71,46.32369351387024 397 | 40000,40100,Updated,False,0.62,0.008233308792114258 398 | 40100,40200,Updated,False,0.64,0.008726358413696289 399 | 40200,40300,Updated,False,0.5900000000000001,0.00681304931640625 400 | 40300,40400,Updated,False,0.6699999999999999,0.009318828582763672 401 | 40400,40500,Updated,False,0.44999999999999996,0.007294178009033203 402 | 40500,40600,Updated,False,0.43999999999999995,0.007561683654785156 403 | 40600,40700,Updated,False,0.5,0.007214069366455078 404 | 40700,40800,Updated,False,0.51,0.007988214492797852 405 | 40800,40900,Updated,False,0.6,0.009976387023925781 406 | 40900,41000,Updated,False,0.55,0.0075168609619140625 407 | 41000,41100,Updated,False,0.48,0.007616519927978516 408 | 41100,41200,Rebuilt,True,0.72,59.443541049957275 409 | 41200,41300,Updated,False,0.55,0.008788347244262695 410 | 41300,41400,Updated,False,0.5,0.011101484298706055 411 | 41400,41500,Updated,False,0.53,0.00887298583984375 412 | 41500,41600,Updated,False,0.55,0.009113073348999023 413 | 41600,41700,Rebuilt,True,0.96,18.043595790863037 414 | 41700,41800,Updated,False,0.89,0.004812002182006836 415 | 41800,41900,Updated,False,0.89,0.008937835693359375 416 | 41900,42000,Updated,False,0.88,0.007475852966308594 417 | 42000,42100,Rebuilt,True,0.96,16.160199642181396 418 | 42100,42200,Updated,False,0.45999999999999996,0.00517582893371582 419 | 42200,42300,Rebuilt,True,0.63,14.479034900665283 420 | 42300,42400,Rebuilt,True,1.0,65.9296567440033 421 | 42400,42500,Updated,False,0.38,0.008052587509155273 422 | 42500,42600,Rebuilt,True,0.5,68.46850776672363 423 | 42600,42700,Rebuilt,True,0.86,63.37737822532654 424 | 42700,42800,Updated,False,0.76,0.008795738220214844 425 | 42800,42900,Updated,False,0.74,0.007643938064575195 426 | 42900,43000,Updated,False,0.31000000000000005,0.008188247680664062 427 | 43000,43100,Rebuilt,True,0.62,85.87727451324463 428 | 43100,43200,Updated,False,0.4,0.007036447525024414 429 | 43200,43300,Updated,False,0.43999999999999995,0.009666204452514648 430 | 43300,43400,Updated,False,0.36,0.00754547119140625 431 | 43400,43500,Rebuilt,True,0.61,58.690200328826904 432 | 43500,43600,Rebuilt,True,0.83,68.27406430244446 433 | -------------------------------------------------------------------------------- /results/olin_metrics.csv: -------------------------------------------------------------------------------- 1 | window_start,window_end,error_rate,processing_time_s,classification_rate_rec_s,layers_built 2 | 0,600,0.6599999999999999,57.657297134399414,1.7343858448116214,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 3 | 100,700,0.75,55.74622321128845,1.7938434971815325,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 4 | 200,800,0.71,56.66231846809387,1.7648413037724402,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Temperature', 'Hour', 'Day_type']" 5 | 300,900,0.62,51.11739993095398,1.956281034150278,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Month_of_year', 'Day_of_week', 'Temperature', 'Day_type']" 6 | 400,1000,0.61,52.28309726715088,1.9126640391832588,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Month_of_year']" 7 | 500,1100,0.72,57.63334321975708,1.735106700624637,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Hour', 'Month_of_year']" 8 | 600,1200,0.69,58.714346170425415,1.7031612633433408,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Hour', 'Day_of_week', 'Day_type']" 9 | 700,1300,0.6599999999999999,56.704710960388184,1.7635219068457346,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Day_type']" 10 | 800,1400,0.65,57.9618616104126,1.7252723984633964,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year']" 11 | 900,1500,0.9,18.823524713516235,5.312501325970847,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year']" 12 | 1000,1600,0.84,20.845620155334473,4.797170784789994,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year']" 13 | 1100,1700,0.63,68.49580979347229,1.4599433206428065,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Day_of_week', 'Temperature', 'Day_type', 'Week_of_year', 'Month_of_year']" 14 | 1200,1800,0.62,63.92167949676514,1.5644144645019953,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 15 | 1300,1900,0.5700000000000001,61.20817279815674,1.6337687506170984,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 16 | 1400,2000,0.81,59.81295585632324,1.6718785849709568,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 17 | 1500,2100,0.77,61.46758532524109,1.6268737330557856,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 18 | 1600,2200,0.6799999999999999,63.590341329574585,1.5725658631351302,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 19 | 1700,2300,0.53,44.08168578147888,2.268515784439792,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 20 | 1800,2400,0.6799999999999999,42.32801842689514,2.3625013340208763,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Month_of_year', 'Day_type']" 21 | 1900,2500,0.53,44.22281289100647,2.261276329175724,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 22 | 2000,2600,0.65,44.12878155708313,2.266094745232071,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 23 | 2100,2700,0.42000000000000004,43.996694564819336,2.2728980208427307,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 24 | 2200,2800,0.6599999999999999,43.74517822265625,2.28596622674653,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Day_type']" 25 | 2300,2900,0.5800000000000001,55.048283100128174,1.8165870826181527,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 26 | 2400,3000,0.52,43.64393639564514,2.291269034338941,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 27 | 2500,3100,0.6799999999999999,41.14728569984436,2.4302939622668296,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 28 | 2600,3200,0.5700000000000001,43.10561490058899,2.319883389452208,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Month_of_year', 'Week_of_year', 'Day_type']" 29 | 2700,3300,0.64,43.69927096366882,2.288367695725155,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 30 | 2800,3400,0.73,41.49781084060669,2.4097656713531355,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Day_type', 'Week_of_year']" 31 | 2900,3500,0.73,42.29876232147217,2.364135367365983,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Day_type', 'Week_of_year']" 32 | 3000,3600,0.86,13.215681552886963,7.566768282045584,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 33 | 3100,3700,0.6799999999999999,40.02177810668945,2.4986396090004175,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 34 | 3200,3800,0.62,38.49837946891785,2.5975119311381993,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Week_of_year', 'Dew_Point', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 35 | 3300,3900,0.55,54.44370150566101,1.8367597579602863,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 36 | 3400,4000,0.77,40.553757429122925,2.4658627545122824,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Day_of_week', 'Dew_Point', 'Week_of_year', 'Temperature', 'Month_of_year', 'Day_type']" 37 | 3500,4100,0.71,34.66521167755127,2.8847364594273825,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Day_of_week', 'Pressure', 'Dew_Point', 'Temperature', 'Week_of_year', 'Day_type']" 38 | 3600,4200,0.6799999999999999,41.27017045021057,2.423057596058215,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Day_of_week', 'Pressure', 'Temperature', 'Dew_Point', 'Week_of_year', 'Day_type']" 39 | 3700,4300,0.9299999999999999,14.669016361236572,6.817089676459409,"['Day_of_year', 'Day_of_month', 'Temperature', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Pressure', 'Day_type', 'Month_of_year']" 40 | 3800,4400,0.63,44.46281409263611,2.2490704207712735,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Temperature', 'Dew_Point', 'Day_of_week', 'Pressure', 'Week_of_year', 'Month_of_year', 'Day_type']" 41 | 3900,4500,0.53,45.1546905040741,2.2146093547242334,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Temperature', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 42 | 4000,4600,0.6699999999999999,42.35392618179321,2.3610561998615194,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Month_of_year', 'Week_of_year', 'Day_of_week', 'Day_type']" 43 | 4100,4700,0.5900000000000001,47.39660096168518,2.1098559384213806,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Pressure', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 44 | 4200,4800,0.71,43.04518246650696,2.3231403439353295,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 45 | 4300,4900,0.56,11.043327808380127,9.055241475682351,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Pressure', 'Week_of_year', 'Day_type']" 46 | 4400,5000,0.86,10.437708854675293,9.5806466143389,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 47 | 4500,5100,0.98,12.67261528968811,7.891030991950923,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 48 | 4600,5200,0.69,13.201611518859863,7.574832804096658,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 49 | 4700,5300,0.94,13.710022926330566,7.293933827633985,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 50 | 4800,5400,0.54,44.778064489364624,2.2332363209613786,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 51 | 4900,5500,0.6799999999999999,41.69945740699768,2.3981127385897056,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 52 | 5000,5600,0.63,38.96319532394409,2.5665246181323043,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 53 | 5100,5700,0.73,39.25942397117615,2.547159124734457,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 54 | 5200,5800,0.47,39.054694414138794,2.56051164911426,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 55 | 5300,5900,0.78,11.274059295654297,8.869919642745362,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 56 | 5400,6000,0.92,9.487244606018066,10.540468192057235,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Day_of_week', 'Temperature', 'Pressure', 'Month_of_year', 'Day_type']" 57 | 5500,6100,0.95,9.884816884994507,10.116525289588667,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Temperature', 'Pressure', 'Month_of_year', 'Day_type']" 58 | 5600,6200,0.8,11.886658668518066,8.412793097596971,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Pressure', 'Day_type', 'Month_of_year']" 59 | 5700,6300,0.0,41.22483777999878,2.425722098256925,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Pressure', 'Day_of_week', 'Week_of_year', 'Day_type']" 60 | 5800,6400,0.91,73.24309182167053,1.365316475763696,"['pm2.5_prev_hour', 'pm2.5_prev_day', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Day_type']" 61 | 5900,6500,0.5900000000000001,64.4487235546112,1.5516211103120467,"['pm2.5_prev_hour', 'pm2.5_prev_day', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Day_type', 'Month_of_year']" 62 | 6000,6600,0.95,59.862698554992676,1.670489343345177,"['pm2.5_prev_hour', 'pm2.5_prev_day', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Day_of_week', 'Temperature', 'Day_type', 'Month_of_year']" 63 | 6100,6700,0.7,32.97119450569153,3.0329504738670563,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Day_of_week', 'Pressure', 'Month_of_year', 'Temperature', 'Day_type']" 64 | 6200,6800,0.63,36.187143087387085,2.763412401982479,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Day_of_week', 'Pressure', 'Month_of_year', 'Temperature', 'Day_type']" 65 | 6300,6900,0.73,41.61612415313721,2.4029147844721037,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 66 | 6400,7000,0.29000000000000004,43.472801208496094,2.300288852342382,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Day_type']" 67 | 6500,7100,0.98,10.630757808685303,9.406667125677554,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Day_type']" 68 | 6600,7200,0.31000000000000005,40.20583248138428,2.4872013294663415,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 69 | 6700,7300,0.62,38.22069311141968,2.6163837403074655,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 70 | 6800,7400,0.5,40.02797341346741,2.498252883478608,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 71 | 6900,7500,0.6,40.652016401290894,2.4599025793176774,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 72 | 7000,7600,0.92,39.0175199508667,2.5629512107875194,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 73 | 7100,7700,0.41000000000000003,43.06853461265564,2.3218807163830255,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_of_week', 'Day_type', 'Month_of_year']" 74 | 7200,7800,0.89,10.019315004348755,9.980722230671088,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 75 | 7300,7900,0.48,10.40458369255066,9.611148600937943,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 76 | 7400,8000,0.91,11.40587568283081,8.76741100646304,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 77 | 7500,8100,0.7,13.095840454101562,7.636012392673921,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year']" 78 | 7600,8200,0.97,13.54125690460205,7.384838845056887,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year']" 79 | 7700,8300,0.71,43.48595643043518,2.299592976872218,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 80 | 7800,8400,0.36,43.516047954559326,2.298002798977122,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 81 | 7900,8500,1.0,13.844431161880493,7.223120894655593,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 82 | 8000,8600,0.51,13.826210737228394,7.2326396509160995,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 83 | 8100,8700,0.62,63.77274990081787,1.5680678684159661,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Year', 'Month_of_year']" 84 | 8200,8800,0.39,65.01403546333313,1.538129409862558,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Year', 'Month_of_year', 'Day_type']" 85 | 8300,8900,0.5800000000000001,60.75253701210022,1.6460217946138245,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Year', 'Month_of_year']" 86 | 8400,9000,0.54,58.235363721847534,1.7171696647699322,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Year', 'Month_of_year', 'Day_type']" 87 | 8500,9100,0.56,56.84117579460144,1.7592880267177307,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Year', 'Month_of_year', 'Day_type']" 88 | 8600,9200,0.6,52.711732387542725,1.8971108607242975,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Hour', 'Day_of_week', 'Week_of_year', 'Day_type']" 89 | 8700,9300,0.42000000000000004,38.51797008514404,2.5961908111707293,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Hour', 'Day_of_week', 'Week_of_year', 'Day_type']" 90 | 8800,9400,0.55,38.93571972846985,2.568335726098826,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Hour', 'Day_of_week', 'Day_type', 'Week_of_year']" 91 | 8900,9500,0.79,40.59602475166321,2.463295374651259,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Hour', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 92 | 9000,9600,0.79,58.52921724319458,1.7085483918995583,"['pm2.5_prev_hour', 'Pressure', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_of_week', 'Day_type']" 93 | 9100,9700,0.52,61.91714262962341,1.6150616089986745,"['pm2.5_prev_hour', 'Pressure', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_of_week', 'Day_type']" 94 | 9200,9800,0.84,46.25869274139404,2.161755857629677,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 95 | 9300,9900,0.09999999999999998,14.821184635162354,6.74709899792734,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 96 | 9400,10000,1.0,13.168139457702637,7.594087252888676,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_of_week', 'Day_type']" 97 | 9500,10100,0.94,16.25261926651001,6.152854402124526,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 98 | 9600,10200,0.99,19.07556390762329,5.24230898149419,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 99 | 9700,10300,0.69,16.145602703094482,6.1936368582161325,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Day_of_week', 'Pressure', 'Month_of_year', 'Temperature', 'Day_type']" 100 | 9800,10400,0.42000000000000004,64.92598843574524,1.5402152883504603,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Month_of_year', 'Day_type']" 101 | 9900,10500,0.95,55.75257062911987,1.7936392684962486,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 102 | 10000,10600,0.47,104.72440075874329,0.954887297282063,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'pm2.5_prev_day', 'Pressure', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type']" 103 | 10100,10700,0.64,99.6744270324707,1.0032663640737383,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'pm2.5_prev_day', 'Pressure', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type']" 104 | 10200,10800,0.77,98.20725965499878,1.0182546621430952,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'pm2.5_prev_day', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Day_type']" 105 | 10300,10900,0.52,100.68803477287292,0.9931666679717708,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'pm2.5_prev_day', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 106 | 10400,11000,0.41000000000000003,52.346311807632446,1.910354264642181,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 107 | 10500,11100,0.55,54.880616903305054,1.8221369518529908,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 108 | 10600,11200,0.54,56.78742265701294,1.7609533118624559,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 109 | 10700,11300,0.5,48.645686864852905,2.0556807076816344,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 110 | 10800,11400,0.5700000000000001,77.71272420883179,1.2867905612377868,"['pm2.5_prev_hour', 'pm2.5_prev_week', 'Day_of_year', 'Day_of_month', 'Day_of_week', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type']" 111 | 10900,11500,0.49,123.95656609535217,0.8067341904508402,"['pm2.5_prev_hour', 'pm2.5_prev_week', 'pm2.5_prev_day', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Day_type', 'Week_of_year']" 112 | 11000,11600,0.64,132.55365180969238,0.7544115053395153,"['pm2.5_prev_hour', 'pm2.5_prev_day', 'pm2.5_prev_week', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 113 | 11100,11700,0.63,132.0433509349823,0.7573270391270187,"['pm2.5_prev_hour', 'pm2.5_prev_day', 'pm2.5_prev_week', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 114 | 11200,11800,0.56,40.43599891662598,2.473043888595101,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 115 | 11300,11900,0.76,42.25002574920654,2.3668624628442507,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 116 | 11400,12000,0.62,42.79165840148926,2.336904054097603,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 117 | 11500,12100,0.48,41.20073437690735,2.4271412029987776,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 118 | 11600,12200,0.5700000000000001,40.78426694869995,2.4519258891126796,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type']" 119 | 11700,12300,0.52,41.35155940055847,2.41828848656792,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Day_type']" 120 | 11800,12400,0.5800000000000001,42.083757162094116,2.376213692490187,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Day_type', 'Month_of_year']" 121 | 11900,12500,0.62,50.40009570121765,1.9841232166069882,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Day_type', 'Month_of_year']" 122 | 12000,12600,0.6599999999999999,58.903908252716064,1.697680221335551,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Temperature', 'Month_of_year']" 123 | 12100,12700,0.61,52.59480834007263,1.9013283469617432,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Day_of_week', 'Month_of_year', 'Day_type']" 124 | 12200,12800,0.5900000000000001,52.81108641624451,1.8935418069574184,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Day_of_week', 'Pressure', 'Temperature', 'Month_of_year', 'Day_type']" 125 | 12300,12900,0.69,48.640706300735474,2.0558911990652557,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Hour', 'Day_type']" 126 | 12400,13000,0.65,11.658350944519043,8.577542439397327,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type']" 127 | 12500,13100,0.65,11.291784048080444,8.85599649924226,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 128 | 12600,13200,0.91,12.221212387084961,8.182494243016121,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 129 | 12700,13300,0.63,43.7201464176178,2.2872750480932345,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 130 | 12800,13400,0.6,44.24690246582031,2.260045210560166,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 131 | 12900,13500,0.6599999999999999,45.63139629364014,2.191473593236012,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 132 | 13000,13600,0.69,40.45286965370178,2.4720125137240827,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 133 | 13100,13700,0.72,40.069074392318726,2.4956902927403304,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Day_type']" 134 | 13200,13800,0.36,7.689574956893921,13.004619964117415,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 135 | 13300,13900,0.5700000000000001,39.111104249954224,2.556818630353988,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Pressure', 'Temperature', 'Month_of_year', 'Day_type']" 136 | 13400,14000,0.52,35.910704374313354,2.7846850052746173,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Day_of_week', 'Month_of_year', 'Temperature', 'Day_type']" 137 | 13500,14100,0.7,33.61098289489746,2.9752179611260687,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Day_of_week', 'Week_of_year', 'Dew_Point', 'Pressure', 'Month_of_year', 'Temperature', 'Day_type']" 138 | 13600,14200,0.53,33.997549533843994,2.941388463908308,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Pressure', 'Temperature', 'Month_of_year', 'Day_type']" 139 | 13700,14300,0.30000000000000004,34.93897032737732,2.8621335735713553,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type']" 140 | 13800,14400,0.5,34.01231384277344,2.9401116449255302,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Day_of_week', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_type']" 141 | 13900,14500,0.7,35.48626971244812,2.8179913191867927,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Day_of_week', 'Week_of_year', 'Dew_Point', 'Temperature', 'Day_type']" 142 | 14000,14600,0.62,37.81268239021301,2.6446153427581964,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Day_of_week', 'Pressure', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 143 | 14100,14700,0.6599999999999999,38.63877296447754,2.588073904208468,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Day_of_week', 'Pressure', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 144 | 14200,14800,0.5900000000000001,39.77512168884277,2.5141343572067756,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 145 | 14300,14900,0.5700000000000001,43.91642117500305,2.277052576791466,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Month_of_year', 'Day_type']" 146 | 14400,15000,0.69,52.2977237701416,1.9121291098541675,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Hour', 'Month_of_year', 'Day_type']" 147 | 14500,15100,0.86,52.54777526855469,1.9030301376020646,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Hour', 'Week_of_year', 'Day_type']" 148 | 14600,15200,0.65,52.0163140296936,1.9224737828004272,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Hour', 'Day_type']" 149 | 14700,15300,1.0,51.755337953567505,1.9321678488451834,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Hour', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 150 | 14800,15400,0.77,40.755298376083374,2.45366870037893,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Month_of_year', 'Day_of_week', 'Hour', 'Day_type']" 151 | 14900,15500,0.61,54.32864260673523,1.8406497052367512,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 152 | 15000,15600,0.6699999999999999,59.8478262424469,1.6709044635120813,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 153 | 15100,15700,0.69,45.02955460548401,2.220763693448154,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Month_of_year', 'Day_type']" 154 | 15200,15800,0.83,10.901408672332764,9.173126428494976,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type']" 155 | 15300,15900,0.18999999999999995,11.918352365493774,8.390421505704243,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 156 | 15400,16000,0.96,12.7754065990448,7.827539517018336,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 157 | 15500,16100,0.98,12.375040054321289,8.080781925637535,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 158 | 15600,16200,0.92,10.379132747650146,9.63471635167593,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Week_of_year', 'Month_of_year', 'Day_of_week', 'Temperature', 'Day_type']" 159 | 15700,16300,0.55,40.37571334838867,2.476736426602128,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Month_of_year', 'Temperature', 'Week_of_year', 'Day_type']" 160 | 15800,16400,0.84,10.11506962776184,9.886239411100028,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Day_of_week', 'Month_of_year', 'Temperature', 'Day_type']" 161 | 15900,16500,0.6699999999999999,38.762269496917725,2.5798283046340136,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type']" 162 | 16000,16600,0.51,43.922932863235474,2.2767149978662364,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Pressure', 'Week_of_year', 'Hour', 'Day_type']" 163 | 16100,16700,0.47,12.8741934299469,7.767476894310765,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 164 | 16200,16800,0.4,13.522422790527344,7.395124494262335,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 165 | 16300,16900,0.99,12.91909909248352,7.740477821567383,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year']" 166 | 16400,17000,0.97,13.484586477279663,7.415874425848443,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 167 | 16500,17100,0.94,12.564564228057861,7.958891226540952,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 168 | 16600,17200,0.92,12.948179960250854,7.723093153399656,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 169 | 16700,17300,0.8,39.35096049308777,2.541234032078216,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 170 | 16800,17400,0.65,40.49830675125122,2.4692390379237383,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Hour', 'Week_of_year', 'Day_type']" 171 | 16900,17500,0.56,42.6540265083313,2.3444445503982543,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Hour', 'Week_of_year', 'Day_type']" 172 | 17000,17600,0.65,44.076393604278564,2.2687881612503986,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Hour', 'Week_of_year', 'Day_of_week', 'Year', 'Month_of_year', 'Day_type']" 173 | 17100,17700,0.47,45.579500913619995,2.1939687358471747,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Hour', 'Week_of_year', 'Day_of_week', 'Day_type', 'Year', 'Month_of_year']" 174 | 17200,17800,0.52,43.42135763168335,2.3030141260952375,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Year', 'Month_of_year', 'Week_of_year', 'Day_type']" 175 | 17300,17900,0.6,41.94668912887573,2.3839783800996317,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Year', 'Month_of_year', 'Day_type']" 176 | 17400,18000,0.62,39.294835805892944,2.5448636684468156,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type']" 177 | 17500,18100,0.56,39.5203959941864,2.530339018230242,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type']" 178 | 17600,18200,0.48,39.395931243896484,2.538333194382675,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 179 | 17700,18300,0.51,39.382405281066895,2.5392049897997224,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 180 | 17800,18400,0.73,38.55752658843994,2.5935273563419217,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year']" 181 | 17900,18500,0.49,37.95698690414429,2.6345610691527686,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 182 | 18000,18600,0.56,38.35696268081665,2.607088596460029,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Day_type', 'Week_of_year', 'Month_of_year']" 183 | 18100,18700,0.5900000000000001,39.8434054851532,2.5098256231451623,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Hour', 'Week_of_year', 'Day_type']" 184 | 18200,18800,0.8200000000000001,40.720600843429565,2.4557594418731523,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Hour', 'Week_of_year', 'Day_type']" 185 | 18300,18900,0.62,44.8353533744812,2.230382777732643,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Hour', 'Day_type', 'Month_of_year']" 186 | 18400,19000,0.48,45.16290092468262,2.214206748294762,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Hour', 'Day_type', 'Month_of_year']" 187 | 18500,19100,0.5800000000000001,42.08055281639099,2.3763946361714274,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 188 | 18600,19200,0.65,40.95795774459839,2.4415279839773794,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 189 | 18700,19300,0.55,42.99611210823059,2.3257916843336486,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 190 | 18800,19400,0.62,40.68151116371155,2.4581191096264225,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Day_type']" 191 | 18900,19500,0.63,40.537020683288574,2.4668808490216723,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 192 | 19000,19600,0.48,41.17060852050781,2.4289172201617624,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 193 | 19100,19700,0.49,42.22006607055664,2.368542006374022,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 194 | 19200,19800,0.7,38.97059512138367,2.5660372824311506,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 195 | 19300,19900,0.73,36.97072172164917,2.704843058052675,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Pressure', 'Week_of_year', 'Month_of_year', 'Day_type']" 196 | 19400,20000,0.72,36.697731733322144,2.724964058451557,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 197 | 19500,20100,0.8,40.10041522979736,2.493739763714295,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Day_type', 'Month_of_year']" 198 | 19600,20200,0.5700000000000001,42.79383158683777,2.3367853798526728,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Day_type']" 199 | 19700,20300,0.6599999999999999,45.04219198226929,2.2201406192523816,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Hour', 'Day_type']" 200 | 19800,20400,0.65,45.47857975959778,2.1988373543898114,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 201 | 19900,20500,0.69,14.39501166343689,6.946850918780322,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 202 | 20000,20600,0.81,15.260430574417114,6.552895051837002,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 203 | 20100,20700,0.74,15.439692497253418,6.476812929907062,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 204 | 20200,20800,0.4,13.680076360702515,7.3099007171671,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 205 | 20300,20900,0.6599999999999999,38.80277872085571,2.577135022194996,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type']" 206 | 20400,21000,0.49,38.698755741119385,2.584062409369533,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 207 | 20500,21100,0.49,37.24145269393921,2.685179894077395,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Day_type', 'Week_of_year']" 208 | 20600,21200,0.6799999999999999,39.17176842689514,2.55285895980485,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Day_type', 'Week_of_year', 'Month_of_year']" 209 | 20700,21300,0.5700000000000001,40.51204013824463,2.4684019777517174,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 210 | 20800,21400,0.35,41.360106229782104,2.41778876109349,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 211 | 20900,21500,0.78,40.29401683807373,2.481758033751309,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 212 | 21000,21600,0.61,41.543585538864136,2.4071104769339113,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Day_type']" 213 | 21100,21700,0.6699999999999999,41.74203395843506,2.395666682164452,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Day_type']" 214 | 21200,21800,0.6799999999999999,41.41319990158081,2.41468904208445,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Day_type']" 215 | 21300,21900,0.5,43.42946100234985,2.302584413713752,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 216 | 21400,22000,0.95,14.69319486618042,6.805871759733598,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Week_of_year', 'Hour', 'Day_of_week', 'Month_of_year', 'Day_type']" 217 | 21500,22100,0.6,42.04771590232849,2.378250467451961,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Day_of_week', 'Dew_Point', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 218 | 21600,22200,0.5900000000000001,41.41299295425415,2.4147011086704735,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_of_week', 'Day_type', 'Month_of_year']" 219 | 21700,22300,0.55,40.88108038902283,2.4461193062512967,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 220 | 21800,22400,0.62,40.41831660270691,2.4741258024908133,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Day_of_week', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_type']" 221 | 21900,22500,0.29000000000000004,38.41036510467529,2.603463927704974,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type']" 222 | 22000,22600,0.56,37.94365358352661,2.6354868484097533,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 223 | 22100,22700,0.55,37.618778228759766,2.6582468838275415,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 224 | 22200,22800,0.28,35.62959122657776,2.8066558317796635,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Day_type', 'Month_of_year']" 225 | 22300,22900,0.73,33.6539785861969,2.971416878508824,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Week_of_year', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 226 | 22400,23000,0.24,74.33359098434448,1.3452868168451753,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'pm2.5_prev_week', 'Week_of_year', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Day_type', 'Month_of_year']" 227 | 22500,23100,0.61,127.28515577316284,0.7856375662391598,"['pm2.5_prev_hour', 'pm2.5_prev_day', 'Day_of_year', 'Day_of_month', 'pm2.5_prev_week', 'Dew_Point', 'Week_of_year', 'Day_of_week', 'Temperature', 'Pressure', 'Hour', 'Day_type']" 228 | 22600,23200,0.74,174.05688095092773,0.5745248303524021,"['pm2.5_prev_hour', 'pm2.5_prev_day', 'Day_of_year', 'Day_of_month', 'pm2.5_prev_week', 'Day_of_week', 'Dew_Point', 'Pressure', 'Temperature', 'Hour', 'Day_type', 'Week_of_year']" 229 | 22700,23300,0.54,95.33959031105042,1.0488822080496125,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'pm2.5_prev_week', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type']" 230 | 22800,23400,0.6799999999999999,125.43189430236816,0.7972453940537514,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'pm2.5_prev_week', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 231 | 22900,23500,0.49,209.72114253044128,0.476823646836107,"['pm2.5_prev_hour', 'pm2.5_prev_week', 'pm2.5_prev_day', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 232 | 23000,23600,0.49,52.192729473114014,1.915975673422347,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 233 | 23100,23700,0.63,43.158538579940796,2.317038604418314,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 234 | 23200,23800,0.6599999999999999,42.41525721549988,2.35764219209914,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 235 | 23300,23900,0.49,40.178420543670654,2.4888982355916203,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 236 | 23400,24000,0.52,41.41914486885071,2.414342457253507,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Hour', 'Week_of_year', 'Day_type']" 237 | 23500,24100,0.65,52.94506859779358,1.888750031842765,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 238 | 23600,24200,0.61,63.235814332962036,1.5813823393411164,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Hour', 'Day_of_week', 'Day_type', 'Month_of_year']" 239 | 23700,24300,0.5700000000000001,70.8475341796875,1.4114817284448373,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 240 | 23800,24400,0.63,66.52706122398376,1.5031477140305254,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 241 | 23900,24500,0.71,69.22223281860352,1.444622571797842,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Pressure', 'Week_of_year', 'Month_of_year']" 242 | 24000,24600,0.6799999999999999,66.00882363319397,1.5149489794832949,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 243 | 24100,24700,0.56,65.9728422164917,1.5157752287198305,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 244 | 24200,24800,0.55,66.79293990135193,1.4971642234597304,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 245 | 24300,24900,0.79,69.25381350517273,1.4439638041381038,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 246 | 24400,25000,0.30000000000000004,69.71240735054016,1.4344648793601755,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 247 | 24500,25100,0.6599999999999999,67.23657488822937,1.487285754312067,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 248 | 24600,25200,0.52,62.3825523853302,1.6030123195715196,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 249 | 24700,25300,0.61,59.76475739479065,1.673226904267772,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 250 | 24800,25400,0.69,60.05746817588806,1.665071855961922,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 251 | 24900,25500,0.64,62.0329372882843,1.6120468314320213,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year']" 252 | 25000,25600,0.43999999999999995,67.69628286361694,1.477185980823543,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 253 | 25100,25700,0.75,62.85951209068298,1.5908491280641355,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 254 | 25200,25800,0.6699999999999999,64.17056393623352,1.5583469096417837,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 255 | 25300,25900,0.35,65.53715872764587,1.5258519279966358,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 256 | 25400,26000,0.09999999999999998,63.4818902015686,1.5752524016294815,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Day_of_week', 'Temperature', 'Day_type']" 257 | 25500,26100,0.15000000000000002,57.739535331726074,1.7319155657467358,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Day_type']" 258 | 25600,26200,0.43000000000000005,53.220120906829834,1.8789885910831672,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Day_type']" 259 | 25700,26300,0.85,51.44966912269592,1.943647096379229,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Year', 'Month_of_year']" 260 | 25800,26400,0.77,52.861899614334106,1.8917216507460481,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Week_of_year', 'Day_of_week', 'Temperature', 'Year', 'Month_of_year', 'Day_type']" 261 | 25900,26500,0.83,52.54661321640015,1.903072222526976,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Week_of_year', 'Day_of_week', 'Year', 'Month_of_year', 'Temperature', 'Day_type']" 262 | 26000,26600,0.64,19.44541621208191,5.14260013307751,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Year', 'Month_of_year', 'Day_type']" 263 | 26100,26700,0.6,20.923712015151978,4.779266696443951,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Year', 'Month_of_year', 'Day_type']" 264 | 26200,26800,0.53,18.5522518157959,5.390181256318289,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 265 | 26300,26900,0.38,17.855239152908325,5.60059706529955,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 266 | 26400,27000,0.84,18.88530468940735,5.295122405734306,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 267 | 26500,27100,0.83,18.78905987739563,5.3222460651320835,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 268 | 26600,27200,0.72,20.436407327651978,4.89322797283907,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 269 | 26700,27300,0.76,20.27820324897766,4.93140337791227,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 270 | 26800,27400,0.79,20.701599836349487,4.830544537162398,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Month_of_year', 'Week_of_year', 'Day_type']" 271 | 26900,27500,0.6599999999999999,62.716017723083496,1.5944889938889346,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 272 | 27000,27600,0.69,20.108402013778687,4.973045592159833,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 273 | 27100,27700,0.6,21.247286558151245,4.70648333029783,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year']" 274 | 27200,27800,0.6699999999999999,21.050050020217896,4.750582535621208,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 275 | 27300,27900,0.8200000000000001,22.45774006843567,4.452807793449791,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 276 | 27400,28000,0.41000000000000003,22.864468574523926,4.373598261165016,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 277 | 27500,28100,0.87,22.536786794662476,4.437189778255505,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 278 | 27600,28200,0.78,19.130149126052856,5.227350782321533,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 279 | 27700,28300,0.81,15.062901735305786,6.6388270837358645,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 280 | 27800,28400,0.95,15.300170421600342,6.5358749114861405,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 281 | 27900,28500,0.96,13.227653503417969,7.559919828120719,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Day_type', 'Month_of_year']" 282 | 28000,28600,0.41000000000000003,44.6304075717926,2.2406248439282055,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Pressure', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 283 | 28100,28700,0.53,42.98301982879639,2.326500101628625,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 284 | 28200,28800,0.42000000000000004,42.30285882949829,2.3639064301315917,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 285 | 28300,28900,0.63,39.59972834587097,2.525269848484375,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 286 | 28400,29000,0.52,53.37815189361572,1.8734256704747485,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type']" 287 | 28500,29100,0.5800000000000001,55.557621240615845,1.7999330742925004,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 288 | 28600,29200,0.74,58.841651916503906,1.6994764209186317,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 289 | 28700,29300,0.62,54.684272050857544,1.8286793670216157,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Week_of_year', 'Day_type', 'Month_of_year']" 290 | 28800,29400,0.63,65.17984557151794,1.5342165837179835,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 291 | 28900,29500,0.6699999999999999,61.20088315010071,1.6339633491030015,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 292 | 29000,29600,0.62,61.99147057533264,1.6131251456356246,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year']" 293 | 29100,29700,0.64,60.05593466758728,1.6651143730175078,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 294 | 29200,29800,0.65,55.58030605316162,1.7991984409792867,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 295 | 29300,29900,0.85,50.57055306434631,1.9774353638719222,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 296 | 29400,30000,0.62,63.24449348449707,1.5811653234998664,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Pressure', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 297 | 29500,30100,0.62,62.701279163360596,1.594863794396636,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Week_of_year', 'Pressure', 'Day_of_week', 'Month_of_year', 'Day_type']" 298 | 29600,30200,0.54,52.526471853256226,1.9038019587413197,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Week_of_year', 'Pressure', 'Day_of_week', 'Month_of_year', 'Day_type']" 299 | 29700,30300,0.6,46.106775760650635,2.168878616000384,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Pressure', 'Week_of_year', 'Day_type', 'Month_of_year']" 300 | 29800,30400,0.6,46.27937984466553,2.1607895424624335,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Temperature', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Hour', 'Day_type']" 301 | 29900,30500,0.65,47.526362895965576,2.1040953674258294,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Temperature', 'Dew_Point', 'Week_of_year', 'Day_of_week', 'Hour', 'Day_type']" 302 | 30000,30600,1.0,14.27957010269165,7.003011945097026,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Pressure', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 303 | 30100,30700,0.5,46.14747166633606,2.166965954777293,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Week_of_year', 'Dew_Point', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 304 | 30200,30800,0.5800000000000001,45.299898624420166,2.207510458888582,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 305 | 30300,30900,0.5800000000000001,44.750614166259766,2.234606202910979,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 306 | 30400,31000,0.64,43.90722465515137,2.277529513318205,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 307 | 30500,31100,0.42000000000000004,39.94036293029785,2.5037328823104477,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 308 | 30600,31200,0.5800000000000001,39.99210262298584,2.50049368353351,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Pressure', 'Week_of_year', 'Day_type']" 309 | 30700,31300,0.49,38.98186445236206,2.5652954625145084,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Pressure', 'Week_of_year', 'Day_type']" 310 | 30800,31400,0.43999999999999995,42.67385220527649,2.3433553530383016,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Pressure', 'Week_of_year', 'Month_of_year', 'Day_type']" 311 | 30900,31500,0.6,42.00880408287048,2.380453387883423,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Week_of_year', 'Pressure', 'Month_of_year', 'Day_type']" 312 | 31000,31600,0.54,40.293970823287964,2.4817608678617704,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Pressure', 'Week_of_year', 'Day_type', 'Month_of_year']" 313 | 31100,31700,0.5900000000000001,40.627179861068726,2.461406387102583,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Pressure', 'Week_of_year', 'Day_type', 'Month_of_year']" 314 | 31200,31800,0.5900000000000001,40.38974857330322,2.4758757737377426,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 315 | 31300,31900,0.52,39.69094157218933,2.519466559343809,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 316 | 31400,32000,0.39,39.304298639297485,2.5442509715722883,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type']" 317 | 31500,32100,0.39,85.51169943809509,1.1694306236118426,"['pm2.5_prev_hour', 'pm2.5_prev_day', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Day_type', 'Week_of_year', 'Month_of_year']" 318 | 31600,32200,0.55,83.35778570175171,1.1996479891847531,"['pm2.5_prev_hour', 'pm2.5_prev_day', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 319 | 31700,32300,0.7,39.39075183868408,2.538666954353331,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 320 | 31800,32400,0.51,39.24816918373108,2.547889546946088,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 321 | 31900,32500,0.5900000000000001,59.835752964019775,1.6712416080087042,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 322 | 32000,32600,0.51,60.044870376586914,1.665421198727288,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Pressure', 'Week_of_year', 'Day_type']" 323 | 32100,32700,0.89,60.830116271972656,1.6439225523242142,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Pressure', 'Day_of_week', 'Week_of_year', 'Day_type']" 324 | 32200,32800,0.64,66.12541580200195,1.5122778252076032,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Pressure', 'Week_of_year', 'Day_of_week', 'Day_type', 'Month_of_year']" 325 | 32300,32900,0.47,67.74625134468079,1.4760964336051292,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 326 | 32400,33000,0.5700000000000001,71.1981782913208,1.4045303180487443,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 327 | 32500,33100,0.5,68.50710344314575,1.4597026435804616,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Day_type', 'Week_of_year', 'Month_of_year']" 328 | 32600,33200,0.74,21.38390016555786,4.676415397835879,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 329 | 32700,33300,0.51,67.00659203529358,1.4923904792431197,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 330 | 32800,33400,0.72,62.91814422607422,1.589366648206997,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 331 | 32900,33500,0.71,62.391051292419434,1.6027939572826222,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 332 | 33000,33600,0.78,21.728261470794678,4.602301023227822,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 333 | 33100,33700,0.95,21.033846139907837,4.754242250078481,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 334 | 33200,33800,0.78,22.52342128753662,4.439822828130254,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 335 | 33300,33900,0.99,27.06343650817871,3.695022247813188,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Hour', 'Week_of_year', 'Day_type', 'Month_of_year']" 336 | 33400,34000,0.76,68.56611752510071,1.4584462940225829,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 337 | 33500,34100,0.41000000000000003,70.09610486030579,1.4266127939532383,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Hour', 'Temperature', 'Week_of_year', 'Day_type']" 338 | 33600,34200,0.79,66.25941371917725,1.5092195114164937,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Hour', 'Day_type']" 339 | 33700,34300,0.71,68.16988635063171,1.4669233785377043,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Hour', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 340 | 33800,34400,0.53,68.30859279632568,1.4639446650316443,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Hour', 'Day_of_week', 'Temperature', 'Month_of_year', 'Day_type']" 341 | 33900,34500,0.75,67.90601634979248,1.472623566737995,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Day_type', 'Month_of_year']" 342 | 34000,34600,0.7,64.26723885536194,1.5560027438716828,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 343 | 34100,34700,0.75,66.87079524993896,1.4954211270590696,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 344 | 34200,34800,0.6699999999999999,24.380228757858276,4.1016842373871425,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Hour', 'Week_of_year', 'Day_of_week', 'Day_type']" 345 | 34300,34900,0.85,17.807390213012695,5.615646021331375,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Day_type']" 346 | 34400,35000,0.72,61.00400733947754,1.639236574140384,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 347 | 34500,35100,0.6799999999999999,69.2975161075592,1.4430531657842736,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Hour', 'Week_of_year', 'Year', 'Month_of_year', 'Day_type']" 348 | 34600,35200,0.78,67.97208523750305,1.4711921761791973,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Hour', 'Week_of_year', 'Year', 'Month_of_year', 'Day_type']" 349 | 34700,35300,0.85,65.05784320831299,1.5370936856883408,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Year', 'Month_of_year']" 350 | 34800,35400,0.79,22.788803577423096,4.388119791381683,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Year', 'Month_of_year', 'Day_type']" 351 | 34900,35500,0.5800000000000001,20.322596311569214,4.9206311273856365,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year']" 352 | 35000,35600,0.8200000000000001,20.334940910339355,4.9176439922259485,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 353 | 35100,35700,0.87,20.413266897201538,4.898774924346334,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 354 | 35200,35800,0.84,23.038623571395874,4.340537085043452,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 355 | 35300,35900,0.39,65.09712052345276,1.5361662573688288,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 356 | 35400,36000,0.8,64.45374703407288,1.5515001780600268,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 357 | 35500,36100,0.74,65.48505854606628,1.5270659020584634,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Month_of_year', 'Day_type']" 358 | 35600,36200,0.16000000000000003,21.32345724105835,4.689671044873992,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Day_of_week', 'Temperature', 'Day_type', 'Month_of_year']" 359 | 35700,36300,0.42000000000000004,16.65702486038208,6.003473059456441,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Week_of_year', 'Temperature', 'Day_type']" 360 | 35800,36400,0.6799999999999999,18.339342832565308,5.45275809024243,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 361 | 35900,36500,0.81,21.270681858062744,4.701306740766026,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 362 | 36000,36600,0.75,20.59877038002014,4.854658708026348,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 363 | 36100,36700,0.97,22.19617748260498,4.505280248293628,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Pressure', 'Week_of_year', 'Month_of_year', 'Day_type']" 364 | 36200,36800,0.95,22.730324268341064,4.399409300961034,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Day_type', 'Week_of_year', 'Month_of_year']" 365 | 36300,36900,0.61,64.69990849494934,1.545597240030197,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Day_type', 'Week_of_year', 'Month_of_year']" 366 | 36400,37000,0.75,61.829468965530396,1.617351752701442,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Day_type', 'Week_of_year']" 367 | 36500,37100,0.63,70.92441082000732,1.4099517901358531,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 368 | 36600,37200,0.73,72.94356322288513,1.3709228831396907,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 369 | 36700,37300,0.89,25.688703298568726,3.8927616874134556,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 370 | 36800,37400,0.65,25.803266048431396,3.8754783914681643,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 371 | 36900,37500,0.95,23.41397976875305,4.27095269525492,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 372 | 37000,37600,0.56,68.68800282478333,1.455858314225421,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 373 | 37100,37700,0.6,62.80824875831604,1.592147559865847,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week']" 374 | 37200,37800,0.75,21.253109216690063,4.705193907415204,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 375 | 37300,37900,0.88,22.45577597618103,4.453197257848964,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 376 | 37400,38000,0.8,13.36097240447998,7.484485183613556,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Day_type', 'Week_of_year', 'Month_of_year']" 377 | 37500,38100,0.63,13.43761420249939,7.44179721883964,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Day_type', 'Week_of_year', 'Month_of_year']" 378 | 37600,38200,0.6,59.893303632736206,1.6696357344586759,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 379 | 37700,38300,0.6599999999999999,61.73768424987793,1.6197562512267007,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 380 | 37800,38400,0.5900000000000001,60.576639890670776,1.6508013679940128,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 381 | 37900,38500,0.5,60.948132276535034,1.6407393674719692,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year']" 382 | 38000,38600,0.47,59.442808866500854,1.682289277826426,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 383 | 38100,38700,0.48,61.17316794395447,1.634703634959985,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 384 | 38200,38800,0.65,60.012157678604126,1.6663290217884061,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 385 | 38300,38900,0.65,208.1949861049652,0.48031896382741524,"['pm2.5_prev_hour', 'pm2.5_prev_week', 'pm2.5_prev_day', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 386 | 38400,39000,0.69,48.85167670249939,2.0470126462390947,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 387 | 38500,39100,0.5700000000000001,60.3205451965332,1.6578099497308139,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Pressure', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 388 | 38600,39200,0.6,56.46805143356323,1.77091288722179,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Pressure', 'Week_of_year', 'Day_type']" 389 | 38700,39300,0.62,57.32003664970398,1.7445906500570327,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Pressure', 'Week_of_year', 'Day_type']" 390 | 38800,39400,0.74,62.10903525352478,1.6100717003863758,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Pressure', 'Week_of_year', 'Month_of_year', 'Day_type']" 391 | 38900,39500,0.5900000000000001,64.30540347099304,1.5550792717614799,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Pressure', 'Day_type']" 392 | 39000,39600,0.43000000000000005,68.66742587089539,1.4562945782766685,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Week_of_year', 'Pressure', 'Day_of_week', 'Hour', 'Month_of_year', 'Day_type']" 393 | 39100,39700,0.62,65.51376676559448,1.5263967397538873,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_of_week', 'Pressure', 'Month_of_year', 'Day_type']" 394 | 39200,39800,0.63,65.1097481250763,1.5358683281633847,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Month_of_year', 'Day_type']" 395 | 39300,39900,0.72,60.00659966468811,1.6664833628099522,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Day_type']" 396 | 39400,40000,0.7,58.43874526023865,1.7111934822467751,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Week_of_year', 'Temperature', 'Day_of_week', 'Day_type']" 397 | 39500,40100,0.62,64.79082250595093,1.5434284692220903,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Temperature', 'Day_of_week', 'Day_type', 'Month_of_year']" 398 | 39600,40200,0.6599999999999999,65.3142421245575,1.5310596394779419,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Temperature', 'Pressure', 'Day_type', 'Month_of_year']" 399 | 39700,40300,0.6,64.20177602767944,1.557589309630419,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Week_of_year', 'Temperature', 'Pressure', 'Day_type', 'Month_of_year']" 400 | 39800,40400,0.64,64.57115578651428,1.5486791088364729,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_of_week', 'Pressure', 'Month_of_year', 'Day_type']" 401 | 39900,40500,0.48,63.54126453399658,1.573780451701537,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_of_week', 'Pressure', 'Month_of_year', 'Day_type']" 402 | 40000,40600,0.48,57.42371678352356,1.7414407426287102,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Week_of_year', 'Pressure', 'Day_of_week', 'Temperature', 'Day_type']" 403 | 40100,40700,0.64,58.22215676307678,1.7175591829572656,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Week_of_year', 'Pressure', 'Day_type']" 404 | 40200,40800,0.44999999999999996,59.03082609176636,1.6940301639103783,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type']" 405 | 40300,40900,0.5900000000000001,61.74607729911804,1.6195360802527996,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Pressure', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 406 | 40400,41000,0.49,62.638972997665405,1.5964501845157497,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Temperature', 'Day_of_week', 'Pressure', 'Day_type', 'Week_of_year', 'Month_of_year']" 407 | 40500,41100,0.48,60.00996923446655,1.666389789491265,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Pressure', 'Day_type', 'Week_of_year']" 408 | 40600,41200,0.64,64.88346934318542,1.541224614101231,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 409 | 40700,41300,0.55,64.46722841262817,1.551175728541348,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 410 | 40800,41400,0.53,66.01494836807251,1.5148084255469028,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Pressure', 'Temperature', 'Week_of_year', 'Day_type']" 411 | 40900,41500,0.5800000000000001,66.49429893493652,1.5038883272962724,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Day_of_week', 'Temperature', 'Pressure', 'Hour', 'Week_of_year', 'Day_type']" 412 | 41000,41600,0.51,66.40446043014526,1.5059229357822408,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Hour', 'Week_of_year', 'Month_of_year', 'Day_type']" 413 | 41100,41700,0.94,68.32605767250061,1.4635704650093884,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Hour', 'Week_of_year', 'Day_type', 'Month_of_year']" 414 | 41200,41800,0.89,23.86351490020752,4.19049751967303,"['Day_of_year', 'Day_of_month', 'Pressure', 'Dew_Point', 'Week_of_year', 'Temperature', 'Day_of_week', 'Hour', 'Month_of_year', 'Day_type']" 415 | 41300,41900,0.42000000000000004,70.07015633583069,1.4271411001385843,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Week_of_year', 'Temperature', 'Day_type', 'Month_of_year']" 416 | 41400,42000,0.77,24.15334463119507,4.1402133545863355,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 417 | 41500,42100,0.53,19.996034622192383,5.000991541043647,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 418 | 41600,42200,0.45999999999999996,24.725826025009155,4.044354267430909,"['Dew_Point', 'Day_of_year', 'Day_of_month', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type']" 419 | 41700,42300,0.91,22.53652811050415,4.4372407102667495,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Day_type', 'Month_of_year']" 420 | 41800,42400,1.0,20.56627130508423,4.862330099441935,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Day_type', 'Month_of_year', 'Week_of_year']" 421 | 41900,42500,0.38,70.24536490440369,1.423581472401619,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Month_of_year', 'Week_of_year', 'Day_type']" 422 | 42000,42600,0.56,65.76953864097595,1.5204607188425323,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_type']" 423 | 42100,42700,0.86,64.83741402626038,1.5423193768878276,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Day_of_week', 'Temperature', 'Month_of_year', 'Week_of_year', 'Day_type']" 424 | 42200,42800,0.76,61.79257774353027,1.6183173392611878,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 425 | 42300,42900,0.71,65.09704041481018,1.5361681477803264,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 426 | 42400,43000,1.0,20.328575611114502,4.919183808693695,"['Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 427 | 42500,43100,0.62,26.355212211608887,3.794315871831691,"['Dew_Point', 'Day_of_year', 'Day_of_month', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Month_of_year', 'Day_type']" 428 | 42600,43200,0.4,86.15410661697388,1.160710776615473,"['pm2.5_prev_hour', 'Dew_Point', 'Day_of_year', 'Day_of_month', 'Pressure', 'Temperature', 'Week_of_year', 'Month_of_year', 'Day_of_week', 'Day_type']" 429 | 42700,43300,0.47,84.37537884712219,1.1851798636802295,"['pm2.5_prev_hour', 'Dew_Point', 'Day_of_year', 'Day_of_month', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 430 | 42800,43400,0.43000000000000005,80.83239412307739,1.2371277763681914,"['pm2.5_prev_hour', 'Dew_Point', 'Day_of_year', 'Day_of_month', 'Pressure', 'Temperature', 'Week_of_year', 'Day_of_week', 'Month_of_year', 'Day_type']" 431 | 42900,43500,0.5700000000000001,60.10921549797058,1.6636384150343173,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type', 'Month_of_year']" 432 | 43000,43600,0.83,59.651039361953735,1.6764167241615808,"['pm2.5_prev_hour', 'Day_of_year', 'Day_of_month', 'Dew_Point', 'Pressure', 'Temperature', 'Day_of_week', 'Week_of_year', 'Day_type']" 433 | --------------------------------------------------------------------------------