diff --git a/Project Final/.ipynb_checkpoints/Project-checkpoint.ipynb b/Project Final/.ipynb_checkpoints/Project-checkpoint.ipynb deleted file mode 100644 index 3924940..0000000 --- a/Project Final/.ipynb_checkpoints/Project-checkpoint.ipynb +++ /dev/null @@ -1,532 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Project Notebook\n", - "This is the full and complete notebook that takes in the data from NOAA and processes it into frames to be used in the PredNet architecture and produce a resulting prediction." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import os\n", - "from tqdm import tqdm" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#Getting a list of files in raw data folder\n", - "filenames = os.listdir('D:/Nico/Desktop/processed_data')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "header_wanted = [\n", - " 'HOURLYVISIBILITY',\n", - " 'HOURLYDRYBULBTEMPC',\n", - " 'HOURLYWETBULBTEMPC',\n", - " 'HOURLYDewPointTempC',\n", - " 'HOURLYRelativeHumidity',\n", - " 'HOURLYWindSpeed',\n", - " 'HOURLYWindGustSpeed',\n", - " 'HOURLYStationPressure',\n", - " 'HOURLYPressureTendency',\n", - " 'HOURLYPressureChange',\n", - " 'HOURLYSeaLevelPressure',\n", - " 'HOURLYPrecip',\n", - " 'HOURLYAltimeterSetting']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "usecols = ['DATE','STATION'] + header_wanted" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#Loading all files into a pandas Dataframe\n", - "tqdm.pandas()\n", - "df = pd.concat([pd.read_csv('D:/Nico/Desktop/processed_data/{}'.format(x), usecols=usecols, low_memory=False) for x in tqdm(filenames)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At this point all the data has been loaded into a single dataframe and any data changes have been made. The next step is to break the data up by WBAN and place in a 2D array at the appropriate grid cell. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stations = pd.read_csv(\"../Playground/stations_unique.csv\", usecols = ['STATION_ID', 'LON_SCALED', 'LAT_SCALED'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "height = 20\n", - "width = 40" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mask = [([0] * width) for i in range(height)]\n", - "\n", - "wban_loc = dict(zip(stations.STATION_ID,zip(stations.LON_SCALED,stations.LAT_SCALED)))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grid = [([pd.DataFrame()] * width) for i in range(height)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for key, value in tqdm(wban_loc.items()):\n", - " mask[value[1]][value[0]] = 1\n", - " grid[value[1]][value[0]] = df.loc[df.STATION == key]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.imshow(mask)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#TODO Handle different sized data some stacks too short\n", - "def create_frames(data,height, width, depth):\n", - " days = []\n", - " frames = []\n", - " for i in tqdm(range(depth)):\n", - " frame = np.zeros((height,width,12))\n", - " for y in range(height):\n", - " for x in range(width):\n", - " if(not data[y][x].empty):\n", - " frame[y][x] = data[y][x].iloc[[i],1:13].values.flatten()\n", - " if((i+1)%24 != 0):\n", - " frames.append(frame)\n", - " else:\n", - " frames.append(frame)\n", - " days.append(frames)\n", - " frames = []\n", - " return days" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def average_grid_fill(mask,data, height, width):\n", - " \n", - " for i in range(height):\n", - " for j in range(width):\n", - " if(mask[i][j] != 1):\n", - " neighbors = get_neighbors(j,i,data)\n", - " data[i][j] = np.mean(neighbors)\n", - " \n", - " return data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_neighbors(x,y,g):\n", - " neighbors = []\n", - " for i in [y-1,y,y+1]:\n", - " for j in [x-1,x,x+1]:\n", - " if(i >= 0 and j >= 0):\n", - " if(i != y or j != x ):\n", - " try:\n", - " neighbors.append(g[i][j])\n", - " except:\n", - " pass\n", - " return neighbors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def store_sequence(frames):\n", - " import hickle as hkl\n", - " source_list = []\n", - " \n", - " for days in range(len(frames)):\n", - " for day in range(len(frames[days])):\n", - " source_list += '{}'.format(days)\n", - " \n", - " hkl.dump(frames, './data/train/x_train.hkl')\n", - " hkl.dump(source_list, './data/train/x_sources.hkl')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Splits is a dictionary holding train, test, val\n", - "the values for train, test, and val are lists of tuples holding category and folder name\n", - "in the end each image gets a source associated with it\n", - "there is only one data and one source hickle dump for each of train test and val" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "frames = create_frames(grid, height, width,504)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#TODO use loop to average each frame\n", - "for x in tqdm(range(len(frames))):\n", - " for y in range(len(frames[0])):\n", - " frames[x][y] = average_grid_fill(mask, frames[x][y], height, width )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "store_sequence(frames)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np_frames = np.array(frames)\n", - "np_frames.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "store_sequence(np_frames)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At this point I have processed the data and made it into discrete frames of data and it is time to run it through the PredNet architecture for training." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], - "source": [ - "np.random.seed(123)\n", - "from six.moves import cPickle\n", - "\n", - "from keras import backend as K\n", - "from keras.models import Model\n", - "from keras.layers import Input, Dense, Flatten\n", - "from keras.layers import LSTM\n", - "from keras.layers import TimeDistributed\n", - "from keras.callbacks import LearningRateScheduler, ModelCheckpoint\n", - "from keras.optimizers import Adam\n", - "\n", - "from prednet import PredNet\n", - "from data_utils import SequenceGenerator" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "WEIGHTS_DIR = './weights/'\n", - "DATA_DIR = './data/'" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "save_model = True # if weights will be saved\n", - "weights_file = os.path.join(WEIGHTS_DIR, 'prednet_weather_weights.hdf5') # where weights will be saved\n", - "json_file = os.path.join(WEIGHTS_DIR, 'prednet_weather_model.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Data files\n", - "#TODO: Use the files from NOAA and process them into proper frames\n", - "train_file = os.path.join(DATA_DIR,'train/', 'x_train.hkl')\n", - "train_sources = os.path.join(DATA_DIR, 'train/', 'x_sources.hkl')\n", - "#val_file = os.path.join(DATA_DIR, 'X_val.hkl')\n", - "#val_sources = os.path.join(DATA_DIR, 'sources_val.hkl')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Training parameters\n", - "nb_epoch = 1\n", - "batch_size = 4\n", - "samples_per_epoch = 500\n", - "N_seq_val = 100 # number of sequences to use for validation" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Model parameters\n", - "n_channels, im_height, im_width = (12, 20, 40)\n", - "input_shape = (n_channels, im_height, im_width) if K.image_data_format() == 'channels_first' else (im_height, im_width, n_channels)\n", - "stack_sizes = (n_channels, 48, 96)\n", - "R_stack_sizes = stack_sizes\n", - "A_filt_sizes = (3, 3)\n", - "Ahat_filt_sizes = (3, 3, 3)\n", - "R_filt_sizes = (3, 3, 3)\n", - "layer_loss_weights = np.array([1., 0., 0.]) # weighting for each layer in final loss; \"L_0\" model: [1, 0, 0, 0], \"L_all\": [1, 0.1, 0.1, 0.1]\n", - "layer_loss_weights = np.expand_dims(layer_loss_weights, 1)\n", - "nt = 24 # number of timesteps used for sequences in training\n", - "time_loss_weights = 1./ (nt - 1) * np.ones((nt,1)) # equally weight all timesteps except the first\n", - "time_loss_weights[0] = 0" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "prednet = PredNet(stack_sizes, R_stack_sizes,\n", - " A_filt_sizes, Ahat_filt_sizes, R_filt_sizes,\n", - " output_mode='error', return_sequences=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "inputs = Input(shape=(nt,) + input_shape)\n", - "errors = prednet(inputs) # errors will be (batch_size, nt, nb_layers)\n", - "errors_by_time = TimeDistributed(Dense(1, trainable=False), weights=[layer_loss_weights, np.zeros(1)], trainable=False)(errors) # calculate weighted error by layer\n", - "errors_by_time = Flatten()(errors_by_time) # will be (batch_size, nt)\n", - "final_errors = Dense(1, weights=[time_loss_weights, np.zeros(1)], trainable=False)(errors_by_time) # weight errors by time\n", - "model = Model(inputs=inputs, outputs=final_errors)\n", - "model.compile(loss='mean_absolute_error', optimizer='adam')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "input_1 (InputLayer) (None, 24, 20, 40, 12) 0 \n", - "_________________________________________________________________\n", - "pred_net_1 (PredNet) (None, 24, 3) 1645548 \n", - "_________________________________________________________________\n", - "time_distributed_1 (TimeDist (None, 24, 1) 4 \n", - "_________________________________________________________________\n", - "flatten_1 (Flatten) (None, 24) 0 \n", - "_________________________________________________________________\n", - "dense_2 (Dense) (None, 1) 25 \n", - "=================================================================\n", - "Total params: 1,645,577\n", - "Trainable params: 1,645,548\n", - "Non-trainable params: 29\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "model.summary()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "truth = []\n", - "for i in range(20):\n", - " truth.append(np.random.randint(255,size=(1)))\n", - "output = np.array(truth)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "train_generator = SequenceGenerator(train_file, train_sources, nt, batch_size=batch_size, shuffle=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lr_schedule = lambda epoch: 0.001 if epoch < 75 else 0.0001 # start with lr of 0.001 and then drop to 0.0001 after 75 epochs\n", - "callbacks = [LearningRateScheduler(lr_schedule)]\n", - "#history = model.fit(np_frames, output ,batch_size, nb_epoch, callbacks=callbacks)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/1\n" - ] - } - ], - "source": [ - "history = model.fit_generator(train_generator, samples_per_epoch / batch_size, nb_epoch, callbacks=callbacks)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/Project Final/Evaluation/Evalutation.ipynb b/Project Final/Evaluation/Evalutation.ipynb new file mode 100644 index 0000000..6e6fd4b --- /dev/null +++ b/Project Final/Evaluation/Evalutation.ipynb @@ -0,0 +1,240 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "import os\n", + "import numpy as np\n", + "from six.moves import cPickle\n", + "import matplotlib\n", + "matplotlib.use('Agg')\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.gridspec as gridspec\n", + "%matplotlib inline\n", + "from keras import backend as K\n", + "from keras.models import Model, model_from_json\n", + "from keras.layers import Input, Dense, Flatten\n", + "\n", + "from prednet import PredNet\n", + "from data_utils import SequenceGenerator\n", + "\n", + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "n_plot = 40\n", + "batch_size = 10\n", + "nt = 24" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "WEIGHTS_DIR = '../Training/weights/'\n", + "DATA_DIR = '../data/'\n", + "RESULTS_SAVE_DIR = './weather_results/'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "weights_file = os.path.join(WEIGHTS_DIR, 'prednet_weather_weights.hdf5')\n", + "json_file = os.path.join(WEIGHTS_DIR, 'prednet_weather_model.json')\n", + "test_file = os.path.join(DATA_DIR, 'x_test.hkl')\n", + "test_sources = os.path.join(DATA_DIR, 'sources_test.hkl')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Load trained model\n", + "f = open(json_file, 'r')\n", + "json_string = f.read()\n", + "f.close()\n", + "train_model = model_from_json(json_string, custom_objects = {'PredNet': PredNet})\n", + "train_model.load_weights(weights_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Create testing model (to output predictions)\n", + "layer_config = train_model.layers[1].get_config()\n", + "layer_config['output_mode'] = 'prediction'\n", + "data_format = layer_config['data_format'] if 'data_format' in layer_config else layer_config['dim_ordering']\n", + "test_prednet = PredNet(weights=train_model.layers[1].get_weights(), **layer_config)\n", + "input_shape = list(train_model.layers[0].batch_input_shape[1:])\n", + "input_shape[0] = nt\n", + "inputs = Input(shape=tuple(input_shape))\n", + "predictions = test_prednet(inputs)\n", + "test_model = Model(inputs=inputs, outputs=predictions)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "test_generator = SequenceGenerator(test_file, test_sources, nt, sequence_start_mode='unique', data_format=data_format)\n", + "X_test = test_generator.create_all()\n", + "X_hat = test_model.predict(X_test, batch_size)\n", + "if data_format == 'channels_first':\n", + " X_test = np.transpose(X_test, (0, 1, 3, 4, 2))\n", + " X_hat = np.transpose(X_hat, (0, 1, 3, 4, 2))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Compare MSE of PredNet predictions vs. using last frame. Write results to prediction_scores.txt\n", + "mse_model = np.nanmean( (X_test[:, 1:] - X_hat[:, 1:])**2 ) # look at all timesteps except the first\n", + "mse_prev = np.nanmean( (X_test[:, :-1] - X_test[:, 1:])**2 )\n", + "if not os.path.exists(RESULTS_SAVE_DIR): os.mkdir(RESULTS_SAVE_DIR)\n", + "f = open(RESULTS_SAVE_DIR + 'prediction_scores.txt', 'w')\n", + "f.write(\"Model MSE: %f\\n\" % mse_model)\n", + "f.write(\"Previous Frame MSE: %f\" % mse_prev)\n", + "f.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model MSE:\t 14.119876861572266\n", + "Prev Frame MSE:\t 0.02834348939359188\n" + ] + } + ], + "source": [ + "print(\"Model MSE:\\t {}\\nPrev Frame MSE:\\t {}\".format(mse_model,mse_prev))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 63%|███████████████████████████████████████████████████▉ | 19/30 [09:38<05:35, 30.47s/it]" + ] + } + ], + "source": [ + "# Plot some predictions\n", + "aspect_ratio = float(X_hat.shape[3]) / X_hat.shape[2]\n", + "plt.figure(figsize = (nt, 7*2*aspect_ratio))\n", + "gs = gridspec.GridSpec(2*7, nt)\n", + "gs.update(wspace=0., hspace=0.2)\n", + "plot_save_dir = os.path.join(RESULTS_SAVE_DIR, 'prediction_plots/')\n", + "if not os.path.exists(plot_save_dir): os.mkdir(plot_save_dir)\n", + "plot_idx = np.random.permutation(X_test.shape[0])[:n_plot]\n", + "for i in tqdm(plot_idx):\n", + " for t in range(nt):\n", + " for c in range(7):\n", + " plt.subplot(gs[t + c*2*nt])\n", + " plt.imshow(X_test[i,t,:,:,c], interpolation='none')\n", + " plt.tick_params(axis='both', which='both', bottom='off', top='off', left='off', right='off', labelbottom='off', labelleft='off')\n", + " if t==0: plt.ylabel('Actual', fontsize=10)\n", + "\n", + " plt.subplot(gs[t + (c*2+1)*nt])\n", + " plt.imshow(X_hat[i,t,:,:,c], interpolation='none')\n", + " plt.tick_params(axis='both', which='both', bottom='off', top='off', left='off', right='off', labelbottom='off', labelleft='off')\n", + " if t==0: plt.ylabel('Predicted', fontsize=10)\n", + "\n", + " plt.savefig(plot_save_dir + 'plot_' + str(i) + '.png')\n", + " plt.clf()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig=plt.figure(figsize=(15,10))\n", + "columns = 3\n", + "rows = 4\n", + "for i in range(1,columns+rows +1):\n", + " fig.add_subplot(rows,columns,i)\n", + " plt.imshow(X_test[0,0,:,:,i-1],X_hat[0,0,:,:,i-1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "X_hat[0][0][0][0][2]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Project Final/data_utils.py b/Project Final/Evaluation/data_utils.py similarity index 95% rename from Project Final/data_utils.py rename to Project Final/Evaluation/data_utils.py index 863ddbd..c192e6f 100644 --- a/Project Final/data_utils.py +++ b/Project Final/Evaluation/data_utils.py @@ -45,7 +45,9 @@ class SequenceGenerator(Iterator): def next(self): with self.lock: - index_array, current_index, current_batch_size = next(self.index_generator) + index_array = next(self.index_generator) + current_index = index_array[0] + current_batch_size = len(index_array) batch_x = np.zeros((current_batch_size, self.nt) + self.im_shape, np.float32) for i, idx in enumerate(index_array): idx = self.possible_starts[idx] diff --git a/Project Final/keras_utils.py b/Project Final/Evaluation/keras_utils.py similarity index 100% rename from Project Final/keras_utils.py rename to Project Final/Evaluation/keras_utils.py diff --git a/Project Final/prednet.py b/Project Final/Evaluation/prednet.py similarity index 100% rename from Project Final/prednet.py rename to Project Final/Evaluation/prednet.py diff --git a/Project Final/Preprocessing/preprocess_data.ipynb b/Project Final/Preprocessing/preprocess_data.ipynb new file mode 100644 index 0000000..93fa3fc --- /dev/null +++ b/Project Final/Preprocessing/preprocess_data.ipynb @@ -0,0 +1,2106 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Preprocess the raw data from NOAA\n", + "This notebook is setup to take in the CSV from NOAA and remove the unneccasary data. This will also seperate out each station for later positioning." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import os\n", + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "#Getting a list of files in raw data folder\n", + "filenames = os.listdir('./full_grid')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "header_wanted = [\n", + " 'HOURLYVISIBILITY',\n", + " 'HOURLYDRYBULBTEMPC',\n", + " 'HOURLYWETBULBTEMPC',\n", + " 'HOURLYDewPointTempC',\n", + " 'HOURLYRelativeHumidity',\n", + " 'HOURLYWindSpeed',\n", + " 'HOURLYWindGustSpeed',\n", + " 'HOURLYStationPressure',\n", + " 'HOURLYPressureTendency',\n", + " 'HOURLYPressureChange',\n", + " 'HOURLYSeaLevelPressure',\n", + " 'HOURLYPrecip',\n", + " 'HOURLYAltimeterSetting']" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "usecols = ['DATE','STATION'] + header_wanted" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████████| 82/82 [02:07<00:00, 1.55s/it]\n" + ] + } + ], + "source": [ + "#Loading all files into a pandas Dataframe\n", + "tqdm.pandas()\n", + "df = pd.concat([pd.read_csv('./full_grid/{}'.format(x), usecols=usecols, low_memory=False) for x in tqdm(filenames)])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "406" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Getting the station names\n", + "stations = pd.read_csv(\"./stations_unique.csv\", usecols = ['STATION_ID','LAT_SCALED', 'LON_SCALED'])\n", + "wban_list = stations['STATION_ID'].tolist()\n", + "len(wban_list)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "#removes any letters or oddities that appear with numbers for any of the data\n", + "def remove_letters(headers,dataframes):\n", + " for i in tqdm(headers):\n", + " dataframes[i].replace(regex=True,inplace=True,to_replace=r'\\D',value=r'')\n", + " dataframes[i] = dataframes[i].apply(pd.to_numeric)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████████████████████████████| 13/13 [1:18:33<00:00, 362.54s/it]\n" + ] + } + ], + "source": [ + "remove_letters(header_wanted,df)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 406/406 [10:29<00:00, 1.55s/it]\n" + ] + } + ], + "source": [ + "by_station_list = []\n", + "# Divides dataframe into smaller dataframes of a single WBAN and stores in a list in order of wban_list\n", + "for i in tqdm(wban_list):\n", + " by_station_list.append(df.loc[df.STATION == i])\n", + "del df" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Int64Index: 46719 entries, 109127 to 155845\n", + "Data columns (total 15 columns):\n", + "STATION 46719 non-null object\n", + "DATE 46719 non-null object\n", + "HOURLYVISIBILITY 43438 non-null float64\n", + "HOURLYDRYBULBTEMPC 46196 non-null float64\n", + "HOURLYWETBULBTEMPC 44790 non-null float64\n", + "HOURLYDewPointTempC 46195 non-null float64\n", + "HOURLYRelativeHumidity 46195 non-null float64\n", + "HOURLYWindSpeed 44852 non-null float64\n", + "HOURLYWindGustSpeed 6657 non-null float64\n", + "HOURLYStationPressure 44796 non-null float64\n", + "HOURLYPressureTendency 0 non-null float64\n", + "HOURLYPressureChange 0 non-null float64\n", + "HOURLYSeaLevelPressure 0 non-null float64\n", + "HOURLYPrecip 2096 non-null float64\n", + "HOURLYAltimeterSetting 46197 non-null float64\n", + "dtypes: float64(13), object(2)\n", + "memory usage: 5.7+ MB\n" + ] + } + ], + "source": [ + "by_station_list[0].info()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 406/406 [00:21<00:00, 18.75it/s]\n" + ] + } + ], + "source": [ + "#Sets the date info as the index\n", + "for i in tqdm(range(len(by_station_list))):\n", + " by_station_list[i]['STATION_ID'] = by_station_list[i]['STATION']\n", + " by_station_list[i] = by_station_list[i].set_index(pd.DatetimeIndex(by_station_list[i]['DATE']))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
STATIONDATEHOURLYVISIBILITYHOURLYDRYBULBTEMPCHOURLYWETBULBTEMPCHOURLYDewPointTempCHOURLYRelativeHumidityHOURLYWindSpeedHOURLYWindGustSpeedHOURLYStationPressureHOURLYPressureTendencyHOURLYPressureChangeHOURLYSeaLevelPressureHOURLYPrecipHOURLYAltimeterSettingSTATION_ID
DATE
2016-08-01 00:15:00WBAN:001842016-08-01 00:151000.0245.024.4245.0100.00.0NaN2999.0NaNNaNNaNNaN3004.0WBAN:00184
2016-08-01 00:35:00WBAN:001842016-08-01 00:35175.0242.024.4242.0100.00.0NaN2999.0NaNNaNNaNNaN3004.0WBAN:00184
2016-08-01 00:55:00WBAN:001842016-08-01 00:55400.0242.024.4242.0100.00.0NaN2999.0NaNNaNNaNNaN3004.0WBAN:00184
2016-08-01 01:15:00WBAN:001842016-08-01 01:15100.0240.023.9240.0100.00.0NaN2999.0NaNNaNNaNNaN3004.0WBAN:00184
2016-08-01 01:35:00WBAN:001842016-08-01 01:35500.0240.023.9240.0100.00.0NaN3000.0NaNNaNNaNNaN3005.0WBAN:00184
2016-08-01 01:55:00WBAN:001842016-08-01 01:55700.0241.023.9241.0100.00.0NaN2999.0NaNNaNNaNNaN3004.0WBAN:00184
2016-08-01 02:15:00WBAN:001842016-08-01 02:15700.0241.023.9241.0100.00.0NaN2999.0NaNNaNNaNNaN3004.0WBAN:00184
2016-08-01 02:35:00WBAN:001842016-08-01 02:35200.0236.023.3236.0100.00.0NaN2998.0NaNNaNNaNNaN3003.0WBAN:00184
2016-08-01 02:55:00WBAN:001842016-08-01 02:5550.0235.023.3235.0100.00.0NaN2999.0NaNNaNNaNNaN3004.0WBAN:00184
2016-08-01 03:15:00WBAN:001842016-08-01 03:15150.0237.023.9237.0100.00.0NaN2999.0NaNNaNNaNNaN3004.0WBAN:00184
2016-08-01 03:35:00WBAN:001842016-08-01 03:3550.0238.023.9238.0100.00.0NaN2998.0NaNNaNNaNNaN3003.0WBAN:00184
2016-08-01 03:55:00WBAN:001842016-08-01 03:5575.0237.023.9237.0100.00.0NaN2998.0NaNNaNNaNNaN3003.0WBAN:00184
2016-08-01 04:15:00WBAN:001842016-08-01 04:15700.0233.023.3233.0100.00.0NaN2999.0NaNNaNNaNNaN3004.0WBAN:00184
2016-08-01 04:35:00WBAN:001842016-08-01 04:35500.0234.023.3234.0100.00.0NaN3000.0NaNNaNNaNNaN3005.0WBAN:00184
2016-08-01 04:55:00WBAN:001842016-08-01 04:551000.0240.023.9240.0100.00.0NaN2999.0NaNNaNNaNNaN3004.0WBAN:00184
2016-08-01 05:15:00WBAN:001842016-08-01 05:15700.0237.023.9237.0100.00.0NaN3000.0NaNNaNNaNNaN3005.0WBAN:00184
2016-08-01 05:35:00WBAN:001842016-08-01 05:35500.0237.023.9237.0100.00.0NaN3001.0NaNNaNNaNNaN3006.0WBAN:00184
2016-08-01 05:55:00WBAN:001842016-08-01 05:55700.0239.023.9239.0100.00.0NaN3000.0NaNNaNNaNNaN3005.0WBAN:00184
2016-08-01 06:15:00WBAN:001842016-08-01 06:15700.0245.024.4245.0100.00.0NaN3001.0NaNNaNNaNNaN3006.0WBAN:00184
2016-08-01 06:35:00WBAN:001842016-08-01 06:351000.0249.025.0249.0100.00.0NaN3002.0NaNNaNNaNNaN3007.0WBAN:00184
2016-08-01 06:55:00WBAN:001842016-08-01 06:551000.0253.025.6253.0100.00.0NaN3002.0NaNNaNNaNNaN3007.0WBAN:00184
2016-08-01 07:15:00WBAN:001842016-08-01 07:151000.0256.025.6256.0100.00.0NaN3003.0NaNNaNNaNNaN3008.0WBAN:00184
2016-08-01 07:35:00WBAN:001842016-08-01 07:351000.0265.026.7265.0100.00.0NaN3004.0NaNNaNNaNNaN3009.0WBAN:00184
2016-08-01 07:55:00WBAN:001842016-08-01 07:551000.0271.026.8267.098.00.0NaN3004.0NaNNaNNaNNaN3009.0WBAN:00184
2016-08-01 08:15:00WBAN:001842016-08-01 08:151000.0276.027.0269.096.00.0NaN3004.0NaNNaNNaNNaN3009.0WBAN:00184
2016-08-01 08:35:00WBAN:001842016-08-01 08:351000.0283.027.1264.089.00.0NaN3004.0NaNNaNNaNNaN3009.0WBAN:00184
2016-08-01 08:55:00WBAN:001842016-08-01 08:551000.0290.027.3269.088.05.0NaN3004.0NaNNaNNaNNaN3009.0WBAN:00184
2016-08-01 09:15:00WBAN:001842016-08-01 09:151000.0292.027.4268.087.00.0NaN3004.0NaNNaNNaNNaN3009.0WBAN:00184
2016-08-01 09:35:00WBAN:001842016-08-01 09:351000.0296.027.4267.084.03.0NaN3004.0NaNNaNNaNNaN3009.0WBAN:00184
2016-08-01 09:55:00WBAN:001842016-08-01 09:55NaN302.027.2260.078.00.0NaN3004.0NaNNaNNaNNaN3009.0WBAN:00184
...................................................
2018-07-31 14:35:00WBAN:001842018-07-31 14:35NaN278.0NaN228.074.00.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 14:55:00WBAN:001842018-07-31 14:55NaN277.0NaN231.076.06.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 15:15:00WBAN:001842018-07-31 15:15NaN273.0NaN229.077.0NaNNaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 15:35:00WBAN:001842018-07-31 15:35NaN273.0NaN237.081.00.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 15:55:00WBAN:001842018-07-31 15:55NaN272.0NaN236.081.03.0NaNNaNNaNNaNNaNNaN2996.0WBAN:00184
2018-07-31 16:15:00WBAN:001842018-07-31 16:15NaN274.0NaN238.081.03.0NaNNaNNaNNaNNaNNaN2996.0WBAN:00184
2018-07-31 16:35:00WBAN:001842018-07-31 16:35NaN275.0NaN237.080.00.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 16:55:00WBAN:001842018-07-31 16:55NaN275.0NaN236.079.00.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 17:15:00WBAN:001842018-07-31 17:15NaN274.0NaN235.079.00.0NaNNaNNaNNaNNaNNaN2994.0WBAN:00184
2018-07-31 17:35:00WBAN:001842018-07-31 17:35NaN272.0NaN238.082.00.0NaNNaNNaNNaNNaNNaN2994.0WBAN:00184
2018-07-31 17:55:00WBAN:001842018-07-31 17:55NaN267.0NaN240.085.03.0NaNNaNNaNNaNNaNNaN2994.0WBAN:00184
2018-07-31 18:15:00WBAN:001842018-07-31 18:15NaN262.0NaN244.090.00.0NaNNaNNaNNaNNaNNaN2994.0WBAN:00184
2018-07-31 18:35:00WBAN:001842018-07-31 18:35NaN259.0NaN249.094.00.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 18:55:00WBAN:001842018-07-31 18:55NaN257.0NaN257.0100.00.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 19:15:00WBAN:001842018-07-31 19:15NaN257.0NaN255.099.00.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 19:35:00WBAN:001842018-07-31 19:35NaN254.0NaN254.0100.00.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 19:55:00WBAN:001842018-07-31 19:55NaN251.0NaN251.0100.00.0NaNNaNNaNNaNNaNNaN2996.0WBAN:00184
2018-07-31 20:15:00WBAN:001842018-07-31 20:15NaN250.0NaN250.0100.00.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 20:35:00WBAN:001842018-07-31 20:35NaN248.0NaN248.0100.00.0NaNNaNNaNNaNNaNNaN2995.0WBAN:00184
2018-07-31 20:55:00WBAN:001842018-07-31 20:55NaN243.0NaN243.0100.00.0NaNNaNNaNNaNNaNNaN2996.0WBAN:00184
2018-07-31 21:15:00WBAN:001842018-07-31 21:15NaN240.0NaN240.0100.00.0NaNNaNNaNNaNNaNNaN2997.0WBAN:00184
2018-07-31 21:35:00WBAN:001842018-07-31 21:35NaN239.0NaN239.0100.00.0NaNNaNNaNNaNNaNNaN2996.0WBAN:00184
2018-07-31 21:55:00WBAN:001842018-07-31 21:55NaN236.0NaN236.0100.00.0NaNNaNNaNNaNNaNNaN2997.0WBAN:00184
2018-07-31 22:15:00WBAN:001842018-07-31 22:15NaN235.0NaN235.0100.00.0NaNNaNNaNNaNNaNNaN2996.0WBAN:00184
2018-07-31 22:35:00WBAN:001842018-07-31 22:35NaN234.0NaN234.0100.00.0NaNNaNNaNNaNNaNNaN2997.0WBAN:00184
2018-07-31 22:55:00WBAN:001842018-07-31 22:55700.0235.023.3235.0100.0NaNNaN2993.0NaNNaNNaNNaN2998.0WBAN:00184
2018-07-31 23:15:00WBAN:001842018-07-31 23:15700.0233.023.3233.0100.0NaNNaN2993.0NaNNaNNaNNaN2998.0WBAN:00184
2018-07-31 23:35:00WBAN:001842018-07-31 23:351000.0232.023.3232.0100.00.0NaN2993.0NaNNaNNaNNaN2998.0WBAN:00184
2018-07-31 23:55:00WBAN:001842018-07-31 23:55700.0233.023.3233.0100.00.0NaN2993.0NaNNaNNaNNaN2998.0WBAN:00184
2018-07-31 23:59:00WBAN:001842018-07-31 23:59NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNWBAN:00184
\n", + "

46719 rows × 16 columns

\n", + "
" + ], + "text/plain": [ + " STATION DATE HOURLYVISIBILITY \\\n", + "DATE \n", + "2016-08-01 00:15:00 WBAN:00184 2016-08-01 00:15 1000.0 \n", + "2016-08-01 00:35:00 WBAN:00184 2016-08-01 00:35 175.0 \n", + "2016-08-01 00:55:00 WBAN:00184 2016-08-01 00:55 400.0 \n", + "2016-08-01 01:15:00 WBAN:00184 2016-08-01 01:15 100.0 \n", + "2016-08-01 01:35:00 WBAN:00184 2016-08-01 01:35 500.0 \n", + "2016-08-01 01:55:00 WBAN:00184 2016-08-01 01:55 700.0 \n", + "2016-08-01 02:15:00 WBAN:00184 2016-08-01 02:15 700.0 \n", + "2016-08-01 02:35:00 WBAN:00184 2016-08-01 02:35 200.0 \n", + "2016-08-01 02:55:00 WBAN:00184 2016-08-01 02:55 50.0 \n", + "2016-08-01 03:15:00 WBAN:00184 2016-08-01 03:15 150.0 \n", + "2016-08-01 03:35:00 WBAN:00184 2016-08-01 03:35 50.0 \n", + "2016-08-01 03:55:00 WBAN:00184 2016-08-01 03:55 75.0 \n", + "2016-08-01 04:15:00 WBAN:00184 2016-08-01 04:15 700.0 \n", + "2016-08-01 04:35:00 WBAN:00184 2016-08-01 04:35 500.0 \n", + "2016-08-01 04:55:00 WBAN:00184 2016-08-01 04:55 1000.0 \n", + "2016-08-01 05:15:00 WBAN:00184 2016-08-01 05:15 700.0 \n", + "2016-08-01 05:35:00 WBAN:00184 2016-08-01 05:35 500.0 \n", + "2016-08-01 05:55:00 WBAN:00184 2016-08-01 05:55 700.0 \n", + "2016-08-01 06:15:00 WBAN:00184 2016-08-01 06:15 700.0 \n", + "2016-08-01 06:35:00 WBAN:00184 2016-08-01 06:35 1000.0 \n", + "2016-08-01 06:55:00 WBAN:00184 2016-08-01 06:55 1000.0 \n", + "2016-08-01 07:15:00 WBAN:00184 2016-08-01 07:15 1000.0 \n", + "2016-08-01 07:35:00 WBAN:00184 2016-08-01 07:35 1000.0 \n", + "2016-08-01 07:55:00 WBAN:00184 2016-08-01 07:55 1000.0 \n", + "2016-08-01 08:15:00 WBAN:00184 2016-08-01 08:15 1000.0 \n", + "2016-08-01 08:35:00 WBAN:00184 2016-08-01 08:35 1000.0 \n", + "2016-08-01 08:55:00 WBAN:00184 2016-08-01 08:55 1000.0 \n", + "2016-08-01 09:15:00 WBAN:00184 2016-08-01 09:15 1000.0 \n", + "2016-08-01 09:35:00 WBAN:00184 2016-08-01 09:35 1000.0 \n", + "2016-08-01 09:55:00 WBAN:00184 2016-08-01 09:55 NaN \n", + "... ... ... ... \n", + "2018-07-31 14:35:00 WBAN:00184 2018-07-31 14:35 NaN \n", + "2018-07-31 14:55:00 WBAN:00184 2018-07-31 14:55 NaN \n", + "2018-07-31 15:15:00 WBAN:00184 2018-07-31 15:15 NaN \n", + "2018-07-31 15:35:00 WBAN:00184 2018-07-31 15:35 NaN \n", + "2018-07-31 15:55:00 WBAN:00184 2018-07-31 15:55 NaN \n", + "2018-07-31 16:15:00 WBAN:00184 2018-07-31 16:15 NaN \n", + "2018-07-31 16:35:00 WBAN:00184 2018-07-31 16:35 NaN \n", + "2018-07-31 16:55:00 WBAN:00184 2018-07-31 16:55 NaN \n", + "2018-07-31 17:15:00 WBAN:00184 2018-07-31 17:15 NaN \n", + "2018-07-31 17:35:00 WBAN:00184 2018-07-31 17:35 NaN \n", + "2018-07-31 17:55:00 WBAN:00184 2018-07-31 17:55 NaN \n", + "2018-07-31 18:15:00 WBAN:00184 2018-07-31 18:15 NaN \n", + "2018-07-31 18:35:00 WBAN:00184 2018-07-31 18:35 NaN \n", + "2018-07-31 18:55:00 WBAN:00184 2018-07-31 18:55 NaN \n", + "2018-07-31 19:15:00 WBAN:00184 2018-07-31 19:15 NaN \n", + "2018-07-31 19:35:00 WBAN:00184 2018-07-31 19:35 NaN \n", + "2018-07-31 19:55:00 WBAN:00184 2018-07-31 19:55 NaN \n", + "2018-07-31 20:15:00 WBAN:00184 2018-07-31 20:15 NaN \n", + "2018-07-31 20:35:00 WBAN:00184 2018-07-31 20:35 NaN \n", + "2018-07-31 20:55:00 WBAN:00184 2018-07-31 20:55 NaN \n", + "2018-07-31 21:15:00 WBAN:00184 2018-07-31 21:15 NaN \n", + "2018-07-31 21:35:00 WBAN:00184 2018-07-31 21:35 NaN \n", + "2018-07-31 21:55:00 WBAN:00184 2018-07-31 21:55 NaN \n", + "2018-07-31 22:15:00 WBAN:00184 2018-07-31 22:15 NaN \n", + "2018-07-31 22:35:00 WBAN:00184 2018-07-31 22:35 NaN \n", + "2018-07-31 22:55:00 WBAN:00184 2018-07-31 22:55 700.0 \n", + "2018-07-31 23:15:00 WBAN:00184 2018-07-31 23:15 700.0 \n", + "2018-07-31 23:35:00 WBAN:00184 2018-07-31 23:35 1000.0 \n", + "2018-07-31 23:55:00 WBAN:00184 2018-07-31 23:55 700.0 \n", + "2018-07-31 23:59:00 WBAN:00184 2018-07-31 23:59 NaN \n", + "\n", + " HOURLYDRYBULBTEMPC HOURLYWETBULBTEMPC \\\n", + "DATE \n", + "2016-08-01 00:15:00 245.0 24.4 \n", + "2016-08-01 00:35:00 242.0 24.4 \n", + "2016-08-01 00:55:00 242.0 24.4 \n", + "2016-08-01 01:15:00 240.0 23.9 \n", + "2016-08-01 01:35:00 240.0 23.9 \n", + "2016-08-01 01:55:00 241.0 23.9 \n", + "2016-08-01 02:15:00 241.0 23.9 \n", + "2016-08-01 02:35:00 236.0 23.3 \n", + "2016-08-01 02:55:00 235.0 23.3 \n", + "2016-08-01 03:15:00 237.0 23.9 \n", + "2016-08-01 03:35:00 238.0 23.9 \n", + "2016-08-01 03:55:00 237.0 23.9 \n", + "2016-08-01 04:15:00 233.0 23.3 \n", + "2016-08-01 04:35:00 234.0 23.3 \n", + "2016-08-01 04:55:00 240.0 23.9 \n", + "2016-08-01 05:15:00 237.0 23.9 \n", + "2016-08-01 05:35:00 237.0 23.9 \n", + "2016-08-01 05:55:00 239.0 23.9 \n", + "2016-08-01 06:15:00 245.0 24.4 \n", + "2016-08-01 06:35:00 249.0 25.0 \n", + "2016-08-01 06:55:00 253.0 25.6 \n", + "2016-08-01 07:15:00 256.0 25.6 \n", + "2016-08-01 07:35:00 265.0 26.7 \n", + "2016-08-01 07:55:00 271.0 26.8 \n", + "2016-08-01 08:15:00 276.0 27.0 \n", + "2016-08-01 08:35:00 283.0 27.1 \n", + "2016-08-01 08:55:00 290.0 27.3 \n", + "2016-08-01 09:15:00 292.0 27.4 \n", + "2016-08-01 09:35:00 296.0 27.4 \n", + "2016-08-01 09:55:00 302.0 27.2 \n", + "... ... ... \n", + "2018-07-31 14:35:00 278.0 NaN \n", + "2018-07-31 14:55:00 277.0 NaN \n", + "2018-07-31 15:15:00 273.0 NaN \n", + "2018-07-31 15:35:00 273.0 NaN \n", + "2018-07-31 15:55:00 272.0 NaN \n", + "2018-07-31 16:15:00 274.0 NaN \n", + "2018-07-31 16:35:00 275.0 NaN \n", + "2018-07-31 16:55:00 275.0 NaN \n", + "2018-07-31 17:15:00 274.0 NaN \n", + "2018-07-31 17:35:00 272.0 NaN \n", + "2018-07-31 17:55:00 267.0 NaN \n", + "2018-07-31 18:15:00 262.0 NaN \n", + "2018-07-31 18:35:00 259.0 NaN \n", + "2018-07-31 18:55:00 257.0 NaN \n", + "2018-07-31 19:15:00 257.0 NaN \n", + "2018-07-31 19:35:00 254.0 NaN \n", + "2018-07-31 19:55:00 251.0 NaN \n", + "2018-07-31 20:15:00 250.0 NaN \n", + "2018-07-31 20:35:00 248.0 NaN \n", + "2018-07-31 20:55:00 243.0 NaN \n", + "2018-07-31 21:15:00 240.0 NaN \n", + "2018-07-31 21:35:00 239.0 NaN \n", + "2018-07-31 21:55:00 236.0 NaN \n", + "2018-07-31 22:15:00 235.0 NaN \n", + "2018-07-31 22:35:00 234.0 NaN \n", + "2018-07-31 22:55:00 235.0 23.3 \n", + "2018-07-31 23:15:00 233.0 23.3 \n", + "2018-07-31 23:35:00 232.0 23.3 \n", + "2018-07-31 23:55:00 233.0 23.3 \n", + "2018-07-31 23:59:00 NaN NaN \n", + "\n", + " HOURLYDewPointTempC HOURLYRelativeHumidity \\\n", + "DATE \n", + "2016-08-01 00:15:00 245.0 100.0 \n", + "2016-08-01 00:35:00 242.0 100.0 \n", + "2016-08-01 00:55:00 242.0 100.0 \n", + "2016-08-01 01:15:00 240.0 100.0 \n", + "2016-08-01 01:35:00 240.0 100.0 \n", + "2016-08-01 01:55:00 241.0 100.0 \n", + "2016-08-01 02:15:00 241.0 100.0 \n", + "2016-08-01 02:35:00 236.0 100.0 \n", + "2016-08-01 02:55:00 235.0 100.0 \n", + "2016-08-01 03:15:00 237.0 100.0 \n", + "2016-08-01 03:35:00 238.0 100.0 \n", + "2016-08-01 03:55:00 237.0 100.0 \n", + "2016-08-01 04:15:00 233.0 100.0 \n", + "2016-08-01 04:35:00 234.0 100.0 \n", + "2016-08-01 04:55:00 240.0 100.0 \n", + "2016-08-01 05:15:00 237.0 100.0 \n", + "2016-08-01 05:35:00 237.0 100.0 \n", + "2016-08-01 05:55:00 239.0 100.0 \n", + "2016-08-01 06:15:00 245.0 100.0 \n", + "2016-08-01 06:35:00 249.0 100.0 \n", + "2016-08-01 06:55:00 253.0 100.0 \n", + "2016-08-01 07:15:00 256.0 100.0 \n", + "2016-08-01 07:35:00 265.0 100.0 \n", + "2016-08-01 07:55:00 267.0 98.0 \n", + "2016-08-01 08:15:00 269.0 96.0 \n", + "2016-08-01 08:35:00 264.0 89.0 \n", + "2016-08-01 08:55:00 269.0 88.0 \n", + "2016-08-01 09:15:00 268.0 87.0 \n", + "2016-08-01 09:35:00 267.0 84.0 \n", + "2016-08-01 09:55:00 260.0 78.0 \n", + "... ... ... \n", + "2018-07-31 14:35:00 228.0 74.0 \n", + "2018-07-31 14:55:00 231.0 76.0 \n", + "2018-07-31 15:15:00 229.0 77.0 \n", + "2018-07-31 15:35:00 237.0 81.0 \n", + "2018-07-31 15:55:00 236.0 81.0 \n", + "2018-07-31 16:15:00 238.0 81.0 \n", + "2018-07-31 16:35:00 237.0 80.0 \n", + "2018-07-31 16:55:00 236.0 79.0 \n", + "2018-07-31 17:15:00 235.0 79.0 \n", + "2018-07-31 17:35:00 238.0 82.0 \n", + "2018-07-31 17:55:00 240.0 85.0 \n", + "2018-07-31 18:15:00 244.0 90.0 \n", + "2018-07-31 18:35:00 249.0 94.0 \n", + "2018-07-31 18:55:00 257.0 100.0 \n", + "2018-07-31 19:15:00 255.0 99.0 \n", + "2018-07-31 19:35:00 254.0 100.0 \n", + "2018-07-31 19:55:00 251.0 100.0 \n", + "2018-07-31 20:15:00 250.0 100.0 \n", + "2018-07-31 20:35:00 248.0 100.0 \n", + "2018-07-31 20:55:00 243.0 100.0 \n", + "2018-07-31 21:15:00 240.0 100.0 \n", + "2018-07-31 21:35:00 239.0 100.0 \n", + "2018-07-31 21:55:00 236.0 100.0 \n", + "2018-07-31 22:15:00 235.0 100.0 \n", + "2018-07-31 22:35:00 234.0 100.0 \n", + "2018-07-31 22:55:00 235.0 100.0 \n", + "2018-07-31 23:15:00 233.0 100.0 \n", + "2018-07-31 23:35:00 232.0 100.0 \n", + "2018-07-31 23:55:00 233.0 100.0 \n", + "2018-07-31 23:59:00 NaN NaN \n", + "\n", + " HOURLYWindSpeed HOURLYWindGustSpeed \\\n", + "DATE \n", + "2016-08-01 00:15:00 0.0 NaN \n", + "2016-08-01 00:35:00 0.0 NaN \n", + "2016-08-01 00:55:00 0.0 NaN \n", + "2016-08-01 01:15:00 0.0 NaN \n", + "2016-08-01 01:35:00 0.0 NaN \n", + "2016-08-01 01:55:00 0.0 NaN \n", + "2016-08-01 02:15:00 0.0 NaN \n", + "2016-08-01 02:35:00 0.0 NaN \n", + "2016-08-01 02:55:00 0.0 NaN \n", + "2016-08-01 03:15:00 0.0 NaN \n", + "2016-08-01 03:35:00 0.0 NaN \n", + "2016-08-01 03:55:00 0.0 NaN \n", + "2016-08-01 04:15:00 0.0 NaN \n", + "2016-08-01 04:35:00 0.0 NaN \n", + "2016-08-01 04:55:00 0.0 NaN \n", + "2016-08-01 05:15:00 0.0 NaN \n", + "2016-08-01 05:35:00 0.0 NaN \n", + "2016-08-01 05:55:00 0.0 NaN \n", + "2016-08-01 06:15:00 0.0 NaN \n", + "2016-08-01 06:35:00 0.0 NaN \n", + "2016-08-01 06:55:00 0.0 NaN \n", + "2016-08-01 07:15:00 0.0 NaN \n", + "2016-08-01 07:35:00 0.0 NaN \n", + "2016-08-01 07:55:00 0.0 NaN \n", + "2016-08-01 08:15:00 0.0 NaN \n", + "2016-08-01 08:35:00 0.0 NaN \n", + "2016-08-01 08:55:00 5.0 NaN \n", + "2016-08-01 09:15:00 0.0 NaN \n", + "2016-08-01 09:35:00 3.0 NaN \n", + "2016-08-01 09:55:00 0.0 NaN \n", + "... ... ... \n", + "2018-07-31 14:35:00 0.0 NaN \n", + "2018-07-31 14:55:00 6.0 NaN \n", + "2018-07-31 15:15:00 NaN NaN \n", + "2018-07-31 15:35:00 0.0 NaN \n", + "2018-07-31 15:55:00 3.0 NaN \n", + "2018-07-31 16:15:00 3.0 NaN \n", + "2018-07-31 16:35:00 0.0 NaN \n", + "2018-07-31 16:55:00 0.0 NaN \n", + "2018-07-31 17:15:00 0.0 NaN \n", + "2018-07-31 17:35:00 0.0 NaN \n", + "2018-07-31 17:55:00 3.0 NaN \n", + "2018-07-31 18:15:00 0.0 NaN \n", + "2018-07-31 18:35:00 0.0 NaN \n", + "2018-07-31 18:55:00 0.0 NaN \n", + "2018-07-31 19:15:00 0.0 NaN \n", + "2018-07-31 19:35:00 0.0 NaN \n", + "2018-07-31 19:55:00 0.0 NaN \n", + "2018-07-31 20:15:00 0.0 NaN \n", + "2018-07-31 20:35:00 0.0 NaN \n", + "2018-07-31 20:55:00 0.0 NaN \n", + "2018-07-31 21:15:00 0.0 NaN \n", + "2018-07-31 21:35:00 0.0 NaN \n", + "2018-07-31 21:55:00 0.0 NaN \n", + "2018-07-31 22:15:00 0.0 NaN \n", + "2018-07-31 22:35:00 0.0 NaN \n", + "2018-07-31 22:55:00 NaN NaN \n", + "2018-07-31 23:15:00 NaN NaN \n", + "2018-07-31 23:35:00 0.0 NaN \n", + "2018-07-31 23:55:00 0.0 NaN \n", + "2018-07-31 23:59:00 NaN NaN \n", + "\n", + " HOURLYStationPressure HOURLYPressureTendency \\\n", + "DATE \n", + "2016-08-01 00:15:00 2999.0 NaN \n", + "2016-08-01 00:35:00 2999.0 NaN \n", + "2016-08-01 00:55:00 2999.0 NaN \n", + "2016-08-01 01:15:00 2999.0 NaN \n", + "2016-08-01 01:35:00 3000.0 NaN \n", + "2016-08-01 01:55:00 2999.0 NaN \n", + "2016-08-01 02:15:00 2999.0 NaN \n", + "2016-08-01 02:35:00 2998.0 NaN \n", + "2016-08-01 02:55:00 2999.0 NaN \n", + "2016-08-01 03:15:00 2999.0 NaN \n", + "2016-08-01 03:35:00 2998.0 NaN \n", + "2016-08-01 03:55:00 2998.0 NaN \n", + "2016-08-01 04:15:00 2999.0 NaN \n", + "2016-08-01 04:35:00 3000.0 NaN \n", + "2016-08-01 04:55:00 2999.0 NaN \n", + "2016-08-01 05:15:00 3000.0 NaN \n", + "2016-08-01 05:35:00 3001.0 NaN \n", + "2016-08-01 05:55:00 3000.0 NaN \n", + "2016-08-01 06:15:00 3001.0 NaN \n", + "2016-08-01 06:35:00 3002.0 NaN \n", + "2016-08-01 06:55:00 3002.0 NaN \n", + "2016-08-01 07:15:00 3003.0 NaN \n", + "2016-08-01 07:35:00 3004.0 NaN \n", + "2016-08-01 07:55:00 3004.0 NaN \n", + "2016-08-01 08:15:00 3004.0 NaN \n", + "2016-08-01 08:35:00 3004.0 NaN \n", + "2016-08-01 08:55:00 3004.0 NaN \n", + "2016-08-01 09:15:00 3004.0 NaN \n", + "2016-08-01 09:35:00 3004.0 NaN \n", + "2016-08-01 09:55:00 3004.0 NaN \n", + "... ... ... \n", + "2018-07-31 14:35:00 NaN NaN \n", + "2018-07-31 14:55:00 NaN NaN \n", + "2018-07-31 15:15:00 NaN NaN \n", + "2018-07-31 15:35:00 NaN NaN \n", + "2018-07-31 15:55:00 NaN NaN \n", + "2018-07-31 16:15:00 NaN NaN \n", + "2018-07-31 16:35:00 NaN NaN \n", + "2018-07-31 16:55:00 NaN NaN \n", + "2018-07-31 17:15:00 NaN NaN \n", + "2018-07-31 17:35:00 NaN NaN \n", + "2018-07-31 17:55:00 NaN NaN \n", + "2018-07-31 18:15:00 NaN NaN \n", + "2018-07-31 18:35:00 NaN NaN \n", + "2018-07-31 18:55:00 NaN NaN \n", + "2018-07-31 19:15:00 NaN NaN \n", + "2018-07-31 19:35:00 NaN NaN \n", + "2018-07-31 19:55:00 NaN NaN \n", + "2018-07-31 20:15:00 NaN NaN \n", + "2018-07-31 20:35:00 NaN NaN \n", + "2018-07-31 20:55:00 NaN NaN \n", + "2018-07-31 21:15:00 NaN NaN \n", + "2018-07-31 21:35:00 NaN NaN \n", + "2018-07-31 21:55:00 NaN NaN \n", + "2018-07-31 22:15:00 NaN NaN \n", + "2018-07-31 22:35:00 NaN NaN \n", + "2018-07-31 22:55:00 2993.0 NaN \n", + "2018-07-31 23:15:00 2993.0 NaN \n", + "2018-07-31 23:35:00 2993.0 NaN \n", + "2018-07-31 23:55:00 2993.0 NaN \n", + "2018-07-31 23:59:00 NaN NaN \n", + "\n", + " HOURLYPressureChange HOURLYSeaLevelPressure \\\n", + "DATE \n", + "2016-08-01 00:15:00 NaN NaN \n", + "2016-08-01 00:35:00 NaN NaN \n", + "2016-08-01 00:55:00 NaN NaN \n", + "2016-08-01 01:15:00 NaN NaN \n", + "2016-08-01 01:35:00 NaN NaN \n", + "2016-08-01 01:55:00 NaN NaN \n", + "2016-08-01 02:15:00 NaN NaN \n", + "2016-08-01 02:35:00 NaN NaN \n", + "2016-08-01 02:55:00 NaN NaN \n", + "2016-08-01 03:15:00 NaN NaN \n", + "2016-08-01 03:35:00 NaN NaN \n", + "2016-08-01 03:55:00 NaN NaN \n", + "2016-08-01 04:15:00 NaN NaN \n", + "2016-08-01 04:35:00 NaN NaN \n", + "2016-08-01 04:55:00 NaN NaN \n", + "2016-08-01 05:15:00 NaN NaN \n", + "2016-08-01 05:35:00 NaN NaN \n", + "2016-08-01 05:55:00 NaN NaN \n", + "2016-08-01 06:15:00 NaN NaN \n", + "2016-08-01 06:35:00 NaN NaN \n", + "2016-08-01 06:55:00 NaN NaN \n", + "2016-08-01 07:15:00 NaN NaN \n", + "2016-08-01 07:35:00 NaN NaN \n", + "2016-08-01 07:55:00 NaN NaN \n", + "2016-08-01 08:15:00 NaN NaN \n", + "2016-08-01 08:35:00 NaN NaN \n", + "2016-08-01 08:55:00 NaN NaN \n", + "2016-08-01 09:15:00 NaN NaN \n", + "2016-08-01 09:35:00 NaN NaN \n", + "2016-08-01 09:55:00 NaN NaN \n", + "... ... ... \n", + "2018-07-31 14:35:00 NaN NaN \n", + "2018-07-31 14:55:00 NaN NaN \n", + "2018-07-31 15:15:00 NaN NaN \n", + "2018-07-31 15:35:00 NaN NaN \n", + "2018-07-31 15:55:00 NaN NaN \n", + "2018-07-31 16:15:00 NaN NaN \n", + "2018-07-31 16:35:00 NaN NaN \n", + "2018-07-31 16:55:00 NaN NaN \n", + "2018-07-31 17:15:00 NaN NaN \n", + "2018-07-31 17:35:00 NaN NaN \n", + "2018-07-31 17:55:00 NaN NaN \n", + "2018-07-31 18:15:00 NaN NaN \n", + "2018-07-31 18:35:00 NaN NaN \n", + "2018-07-31 18:55:00 NaN NaN \n", + "2018-07-31 19:15:00 NaN NaN \n", + "2018-07-31 19:35:00 NaN NaN \n", + "2018-07-31 19:55:00 NaN NaN \n", + "2018-07-31 20:15:00 NaN NaN \n", + "2018-07-31 20:35:00 NaN NaN \n", + "2018-07-31 20:55:00 NaN NaN \n", + "2018-07-31 21:15:00 NaN NaN \n", + "2018-07-31 21:35:00 NaN NaN \n", + "2018-07-31 21:55:00 NaN NaN \n", + "2018-07-31 22:15:00 NaN NaN \n", + "2018-07-31 22:35:00 NaN NaN \n", + "2018-07-31 22:55:00 NaN NaN \n", + "2018-07-31 23:15:00 NaN NaN \n", + "2018-07-31 23:35:00 NaN NaN \n", + "2018-07-31 23:55:00 NaN NaN \n", + "2018-07-31 23:59:00 NaN NaN \n", + "\n", + " HOURLYPrecip HOURLYAltimeterSetting STATION_ID \n", + "DATE \n", + "2016-08-01 00:15:00 NaN 3004.0 WBAN:00184 \n", + "2016-08-01 00:35:00 NaN 3004.0 WBAN:00184 \n", + "2016-08-01 00:55:00 NaN 3004.0 WBAN:00184 \n", + "2016-08-01 01:15:00 NaN 3004.0 WBAN:00184 \n", + "2016-08-01 01:35:00 NaN 3005.0 WBAN:00184 \n", + "2016-08-01 01:55:00 NaN 3004.0 WBAN:00184 \n", + "2016-08-01 02:15:00 NaN 3004.0 WBAN:00184 \n", + "2016-08-01 02:35:00 NaN 3003.0 WBAN:00184 \n", + "2016-08-01 02:55:00 NaN 3004.0 WBAN:00184 \n", + "2016-08-01 03:15:00 NaN 3004.0 WBAN:00184 \n", + "2016-08-01 03:35:00 NaN 3003.0 WBAN:00184 \n", + "2016-08-01 03:55:00 NaN 3003.0 WBAN:00184 \n", + "2016-08-01 04:15:00 NaN 3004.0 WBAN:00184 \n", + "2016-08-01 04:35:00 NaN 3005.0 WBAN:00184 \n", + "2016-08-01 04:55:00 NaN 3004.0 WBAN:00184 \n", + "2016-08-01 05:15:00 NaN 3005.0 WBAN:00184 \n", + "2016-08-01 05:35:00 NaN 3006.0 WBAN:00184 \n", + "2016-08-01 05:55:00 NaN 3005.0 WBAN:00184 \n", + "2016-08-01 06:15:00 NaN 3006.0 WBAN:00184 \n", + "2016-08-01 06:35:00 NaN 3007.0 WBAN:00184 \n", + "2016-08-01 06:55:00 NaN 3007.0 WBAN:00184 \n", + "2016-08-01 07:15:00 NaN 3008.0 WBAN:00184 \n", + "2016-08-01 07:35:00 NaN 3009.0 WBAN:00184 \n", + "2016-08-01 07:55:00 NaN 3009.0 WBAN:00184 \n", + "2016-08-01 08:15:00 NaN 3009.0 WBAN:00184 \n", + "2016-08-01 08:35:00 NaN 3009.0 WBAN:00184 \n", + "2016-08-01 08:55:00 NaN 3009.0 WBAN:00184 \n", + "2016-08-01 09:15:00 NaN 3009.0 WBAN:00184 \n", + "2016-08-01 09:35:00 NaN 3009.0 WBAN:00184 \n", + "2016-08-01 09:55:00 NaN 3009.0 WBAN:00184 \n", + "... ... ... ... \n", + "2018-07-31 14:35:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 14:55:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 15:15:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 15:35:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 15:55:00 NaN 2996.0 WBAN:00184 \n", + "2018-07-31 16:15:00 NaN 2996.0 WBAN:00184 \n", + "2018-07-31 16:35:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 16:55:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 17:15:00 NaN 2994.0 WBAN:00184 \n", + "2018-07-31 17:35:00 NaN 2994.0 WBAN:00184 \n", + "2018-07-31 17:55:00 NaN 2994.0 WBAN:00184 \n", + "2018-07-31 18:15:00 NaN 2994.0 WBAN:00184 \n", + "2018-07-31 18:35:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 18:55:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 19:15:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 19:35:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 19:55:00 NaN 2996.0 WBAN:00184 \n", + "2018-07-31 20:15:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 20:35:00 NaN 2995.0 WBAN:00184 \n", + "2018-07-31 20:55:00 NaN 2996.0 WBAN:00184 \n", + "2018-07-31 21:15:00 NaN 2997.0 WBAN:00184 \n", + "2018-07-31 21:35:00 NaN 2996.0 WBAN:00184 \n", + "2018-07-31 21:55:00 NaN 2997.0 WBAN:00184 \n", + "2018-07-31 22:15:00 NaN 2996.0 WBAN:00184 \n", + "2018-07-31 22:35:00 NaN 2997.0 WBAN:00184 \n", + "2018-07-31 22:55:00 NaN 2998.0 WBAN:00184 \n", + "2018-07-31 23:15:00 NaN 2998.0 WBAN:00184 \n", + "2018-07-31 23:35:00 NaN 2998.0 WBAN:00184 \n", + "2018-07-31 23:55:00 NaN 2998.0 WBAN:00184 \n", + "2018-07-31 23:59:00 NaN NaN WBAN:00184 \n", + "\n", + "[46719 rows x 16 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "by_station_list[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 406/406 [00:06<00:00, 64.90it/s]\n" + ] + } + ], + "source": [ + "#Some stations take reading multiple times per hour this reduces to one reading per hour by taking the mean of readings\n", + "#in an hour\n", + "for i in tqdm(range(len(by_station_list))):\n", + " by_station_list[i] = by_station_list[i].resample('60T').mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "#making a list of filenames by removing the colon \n", + "wban_filename = []\n", + "for x in wban_list:\n", + " wban_filename.append(x[:4] + x[5:])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'WBAN00184'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wban_filename[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'WBAN:00184'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wban_list[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████████████████████████████| 406/406 [00:00<00:00, 619.85it/s]\n" + ] + } + ], + "source": [ + "#adding back WBAN station since it was absorbed when data was set as the index\n", + "for i in tqdm(range(len(by_station_list))):\n", + " by_station_list[i]['STATION'] = wban_list[i] " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "17520" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(by_station_list[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "rows = 24 * 365 * 2 \n", + "stations_used = []\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 406/406 [02:04<00:00, 3.27it/s]\n" + ] + } + ], + "source": [ + "for i in tqdm(range(len(wban_filename))):\n", + " if(len(by_station_list[i]) >= rows):\n", + " by_station_list[i].to_csv('../Project Final/Transformation/processed_data/{}.csv'.format(wban_filename[i]))\n", + " stations_used.append(stations.loc[stations.STATION_ID == wban_list[i]])" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "stations_used_df = pd.concat(stations_used)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "stations_used_df.to_csv('../Project Final/Transformation/stations_mask.csv')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Current Issues\n", + "\n", + "1) data is not synced across time-zone and all entries start at midnight local time. \n", + "\n", + "2) some stations have multiple entries per hour and need to be reduced.\n", + "\n", + "Solutions\n", + "\n", + "Remove rows from data based on timezone to sync times\n", + "limit only 1 entry per hour for a station" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Project Final/Preprocessing/stations_unique.csv b/Project Final/Preprocessing/stations_unique.csv new file mode 100644 index 0000000..7c940bc --- /dev/null +++ b/Project Final/Preprocessing/stations_unique.csv @@ -0,0 +1,407 @@ +,index,STATION_ID,STATION,BEGIN_DATE,END_DATE,STATE,COUNTRY,LATITUDE,LONGITUDE,ELEVATION,LAT_SCALED,LON_SCALED,TUPLES +0,0,WBAN:00184,"ABBEVILLE CHRIS CRUSTA MEMORIAL AIRPORT, LA US",2013-12-31,2018-08-18,Louisiana,United States,29.976000000000006,-92.084,15.2,16,22,"(22, 16)" +2,3,WBAN:14929,"ABERDEEN REGIONAL AIRPORT, SD US",1964-06-30,2018-08-18,South Dakota,United States,45.4433,-98.413,395.3,3,18,"(18, 3)" +4,5,WBAN:13962,"ABILENE REGIONAL AIRPORT, TX US",1946-07-31,2018-08-18,Texas,United States,32.4105,-99.6822,545.6,14,17,"(17, 14)" +10,11,WBAN:94975,"AINSWORTH MUNICIPAL AIRPORT, NE US",2005-12-31,2018-08-18,Nebraska,United States,42.57694,-100.00056,787.6,5,17,"(17, 5)" +13,16,WBAN:14813,"AKRON FULTON INTERNATIONAL AIRPORT, OH US",1998-12-31,2018-08-18,Ohio,United States,41.0375,-81.46417,318.2,7,30,"(30, 7)" +15,18,WBAN:53864,"ALABASTER SHELBY CO AIRPORT, AL US",2001-12-31,2018-08-18,Alabama,United States,33.178329999999995,-86.78166999999998,172.20000000000005,14,26,"(26, 14)" +17,21,WBAN:23061,"ALAMOSA SAN LUIS VALLEY REGIONAL AIRPORT, CO US",1956-12-31,2018-08-18,Colorado,United States,37.4389,-105.8613,2296.1,10,13,"(13, 10)" +22,26,WBAN:54921,"ALBION MUNICIPAL AIRPORT, NE US",2005-12-31,2018-08-18,Nebraska,United States,41.73,-98.05444,548.3000000000002,6,18,"(18, 6)" +26,30,WBAN:00258,"ALEXANDER MUNICIPAL AIRPORT, NM US",2014-07-30,2018-08-18,New Mexico,United States,34.645,-106.834,1583.1,12,12,"(12, 12)" +33,38,WBAN:24044,"ALLIANCE MUNICIPAL AIRPORT ASOS, NE US",2005-12-31,2018-08-18,Nebraska,United States,42.05730000000001,-102.8017,1197.6,6,15,"(15, 6)" +37,42,WBAN:03049,"ALPINE CASPARIS MUNICIPAL AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,30.38333,-103.68333,1375.6,16,14,"(14, 16)" +40,45,WBAN:94299,"ALTURAS MUNICIPAL AIRPORT, CA US",2005-12-31,2018-08-18,California,United States,41.49139,-120.56444,1333.5,6,2,"(2, 6)" +42,47,WBAN:53933,"ALVA REGIONAL AIRPORT, OK US",2005-12-31,2018-08-18,Oklahoma,United States,36.77306,-98.66972,449.3,10,18,"(18, 10)" +43,49,WBAN:23047,"AMARILLO AIRPORT, TX US",1943-02-28,2018-08-18,Texas,United States,35.2295,-101.7042,1098.5,12,16,"(16, 12)" +50,56,WBAN:63811,"ANDREWS MURPHY AIRPORT, NC US",2005-12-31,2018-08-18,North Carolina,United States,35.195,-83.86528,516.9,12,28,"(28, 12)" +51,57,WBAN:00137,"ANGEL FIRE AIRPORT, NM US",2013-12-31,2018-08-18,New Mexico,United States,36.422,-105.29,2554.2000000000007,11,13,"(13, 11)" +58,64,WBAN:04864,"ANTIGO LANGLADE CO AIRPORT, WI US",2005-12-31,2018-08-18,Wisconsin,United States,45.15417,-89.11055999999998,463.9,3,24,"(24, 3)" +59,65,WBAN:12832,"APALACHICOLA AIRPORT, FL US",1944-12-31,2018-08-18,Florida,United States,29.73333,-85.03332999999998,5.8,17,27,"(27, 17)" +82,91,WBAN:93730,"ATLANTIC CITY INTERNATIONAL AIRPORT, NJ US",1946-12-31,2018-08-18,New Jersey,United States,39.452020000000005,-74.56698999999998,18.3,8,35,"(35, 8)" +84,94,WBAN:53932,"ATOKA MUNICIPAL AIRPORT, OK US",2005-12-31,2018-08-18,Oklahoma,United States,34.39833,-96.14806,179.8,12,19,"(19, 12)" +91,102,WBAN:14605,"AUGUSTA STATE AIRPORT, ME US",1972-12-31,2018-08-18,Maine,United States,44.3155,-69.7972,107.0,4,38,"(38, 4)" +94,105,WBAN:94281,"AURORA STATE AIRPORT, OR US",2005-12-31,2018-08-18,Oregon,United States,45.24861,-122.76861000000001,59.7,3,1,"(1, 3)" +102,114,WBAN:54817,"BAD AXE HURON CO MEMORIAL AIRPORT, MI US",2005-12-31,2018-08-18,Michigan,United States,43.78028,-82.98555999999998,233.5,4,29,"(29, 4)" +104,116,WBAN:53138,"BAKER 5 W, NV US",2004-05-08,2018-08-17,Nevada,United States,39.0118,-114.209,2016.9,8,7,"(7, 8)" +105,117,WBAN:24130,"BAKER CITY AIRPORT, OR US",1956-12-31,2018-08-18,Oregon,United States,44.8428,-117.8086,1024.4,3,4,"(4, 3)" +107,119,WBAN:23155,"BAKERSFIELD AIRPORT, CA US",1941-09-30,2018-08-18,California,United States,35.43440000000001,-119.0542,149.0,12,3,"(3, 12)" +111,124,WBAN:14606,"BANGOR INTERNATIONAL AIRPORT, ME US",1956-12-31,2018-08-18,Maine,United States,44.7978,-68.8185,45.1,3,39,"(39, 3)" +112,125,WBAN:14616,"BAR HARBOR AIRPORT, ME US",2005-12-31,2018-08-18,Maine,United States,44.45,-68.36667,26.8,4,39,"(39, 4)" +113,126,WBAN:54833,"BARABOO WISCONSIN DELLS AIRPORT, WI US",2005-12-31,2018-08-18,Wisconsin,United States,43.52194,-89.77360999999998,297.5,5,24,"(24, 5)" +124,137,WBAN:24119,"BATTTLE MOUNTAIN 4 SE, NV US",1972-12-31,2018-08-18,Nevada,United States,40.6118,-116.8917,1373.1,7,5,"(5, 7)" +129,142,WBAN:00282,"BEACH AIRPORT, ND US",2014-08-18,2018-08-18,North Dakota,United States,46.925,-103.98200000000001,840.0,2,14,"(14, 2)" +131,144,WBAN:94947,"BEATRICE MUNICIPAL AIRPORT, NE US",2005-12-31,2018-08-18,Nebraska,United States,40.301390000000005,-96.75389,403.6,7,19,"(19, 7)" +140,155,WBAN:00127,"BEEVILLE MUNICIPAL AIRPORT, TX US",2013-12-31,2018-08-18,Texas,United States,28.35,-97.71700000000001,82.3,18,18,"(18, 18)" +148,163,WBAN:00224,"BEND MUNICIPAL AIRPORT, OR US",2012-12-31,2018-08-18,Oregon,United States,44.095,-121.2,1055.2,4,2,"(2, 4)" +149,165,WBAN:54781,"BENNINGTON MORSE STATE AIRPORT, VT US",2005-12-31,2018-08-18,Vermont,United States,42.89139,-73.24694000000001,251.8,5,36,"(36, 5)" +163,179,WBAN:03044,"BIG SPRING MCMAHON WRINKLE AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,32.2125,-101.52139,784.3000000000002,14,16,"(16, 14)" +164,180,WBAN:24033,"BILLINGS INTERNATIONAL AIRPORT, MT US",1935-04-30,2018-08-18,Montana,United States,45.8069,-108.5422,1091.5,3,11,"(11, 3)" +166,182,WBAN:04725,"BINGHAMTON GREATER AP, NY US",1956-12-31,2018-08-18,New York,United States,42.2068,-75.98,486.2,6,34,"(34, 6)" +168,185,WBAN:23157,"BISHOP AIRPORT, CA US",1943-01-15,2018-08-18,California,United States,37.3711,-118.35799999999999,1250.3,10,4,"(4, 10)" +169,186,WBAN:24011,"BISMARCK MUNICIPAL AIRPORT, ND US",1936-06-30,2018-08-18,North Dakota,United States,46.7825,-100.7572,503.2,2,16,"(16, 2)" +171,188,WBAN:00286,"BLACK RIVER FALLS AREA AIRPORT, WI US",2013-12-31,2018-08-17,Wisconsin,United States,44.25100000000001,-90.855,255.1,4,23,"(23, 4)" +172,189,WBAN:53881,"BLACKSBURG VIRGINIA TECH AIRPORT, VA US",2005-12-31,2018-08-18,Virginia,United States,37.2075,-80.40778,649.8000000000002,10,31,"(31, 10)" +175,195,WBAN:03036,"BLANDING MUNICIPAL AIRPORT, UT US",2014-07-23,2018-08-18,Utah,United States,37.58278,-109.48306000000001,1787.7,10,10,"(10, 10)" +176,196,WBAN:94793,"BLOCK ISLAND STATE AIRPORT, RI US",1989-12-31,2018-08-18,Rhode Island,United States,41.16806,-71.57777999999998,32.0,7,37,"(37, 7)" +179,199,WBAN:23225,"BLUE CANYON AIRPORT, CA US",1956-12-31,2018-08-18,California,United States,39.2774,-120.7102,1608.1,8,2,"(2, 8)" +181,201,WBAN:03859,"BLUEFIELD MERCER CO AIRPORT, WV US",1999-12-31,2018-08-18,West Virginia,United States,37.2978,-81.20366,870.5,10,30,"(30, 10)" +182,203,WBAN:23158,"BLYTHE ASOS, CA US",1942-06-12,2018-08-18,California,United States,33.6186,-114.7142,120.4,13,6,"(6, 13)" +185,207,WBAN:00263,"BOERNE STAGE FIELD AIRPORT, TX US",2014-07-30,2018-08-18,Texas,United States,29.724,-98.695,422.1,17,18,"(18, 17)" +186,208,WBAN:24131,"BOISE AIR TERMINAL, ID US",1930-12-31,2018-08-18,Idaho,United States,43.5666,-116.2405,857.7,5,5,"(5, 5)" +187,209,WBAN:63871,"BONIFAY TRI CO AIRPORT, FL US",2006-08-31,2018-08-18,Florida,United States,30.84583,-85.60139000000001,25.9,16,27,"(27, 16)" +193,215,WBAN:14739,"BOSTON, MA US",1943-11-20,2018-08-18,Massachusetts,United States,42.36060000000001,-71.00970000000002,3.7,6,37,"(37, 6)" +196,219,WBAN:00310,"BOUNDARY CO AIRPORT, ID US",2013-12-31,2018-08-18,Idaho,United States,48.726000000000006,-116.295,711.1,0,5,"(5, 0)" +198,223,WBAN:93808,"BOWLING GREEN WARREN CO AIRPORT, KY US",1972-12-31,2018-08-18,Kentucky,United States,36.9647,-86.4238,160.9,10,26,"(26, 10)" +199,224,WBAN:00353,"BOYSEN THERMOPOL, WY US",2012-12-31,2018-08-18,Wyoming,United States,43.467,-108.389,2225.0,5,11,"(11, 5)" +200,225,WBAN:24132,"BOZEMAN GALLATIN FIELD AIRPORT, MT US",1972-12-31,2018-08-18,Montana,United States,45.788,-111.1608,1349.3,3,9,"(9, 3)" +205,230,WBAN:00451,"BRANSON WEST MUNICIPAL EMERSON FIELD AIRPORT, MO US",2014-07-30,2018-08-18,Missouri,United States,36.6985,-93.4022,411.2,10,21,"(21, 10)" +207,232,WBAN:00435,BRAZOS 451 OILP,2013-07-16,2018-08-18,,,28.5,-95.716,34.1,18,20,"(20, 18)" +211,237,WBAN:00433,"BRIDGEPORT SONORA JUNCTION, CA US",2013-01-09,2018-08-18,California,United States,38.3557,-119.51899999999999,2057.1,9,3,"(3, 9)" +213,239,WBAN:24180,"BRIGHAM CITY AIRPORT, UT US",2014-07-23,2018-08-18,Utah,United States,41.55222,-112.06222,1288.1,6,8,"(8, 6)" +215,241,WBAN:94946,"BROKEN BOW MUNICIPAL AIRPORT, NE US",2005-12-31,2018-08-18,Nebraska,United States,41.43333,-99.63333,771.1,6,17,"(17, 6)" +218,245,WBAN:94902,"BROOKINGS, SD US",2005-12-31,2018-08-18,South Dakota,United States,44.3,-96.8,502.3,4,19,"(19, 4)" +222,250,WBAN:03721,"BRUNSWICK CO AIRPORT, NC US",2005-12-31,2018-08-18,North Carolina,United States,33.92917,-78.07472,7.6,13,32,"(32, 13)" +225,254,WBAN:23159,"BRYCE CANYON AIRPORT, UT US",1956-12-31,2018-08-18,Utah,United States,37.70639,-112.14556,2312.2000000000007,10,8,"(8, 10)" +228,259,WBAN:94037,"BUFFALO ASOS, SD US",1998-12-31,2018-08-18,South Dakota,United States,45.604440000000004,-103.54639,915.6,3,14,"(14, 3)" +229,260,WBAN:94054,"BUFFALO JOHNSON CO AIRPORT, WY US",2005-12-31,2018-08-18,Wyoming,United States,44.38139,-106.72111000000001,1513.9,4,12,"(12, 4)" +232,263,WBAN:03068,"BULLSEYE AUXILIARY AIRFIELD USAFA, CO US",2006-04-30,2018-08-18,Colorado,United States,38.76667,-104.3,1837.9,9,14,"(14, 9)" +238,269,WBAN:04866,"BURLINGTON MUNICIPAL AIRPORT, WI US",2005-12-31,2018-08-18,Wisconsin,United States,42.69,-88.30360999999998,237.4,5,25,"(25, 5)" +239,270,WBAN:94282,"BURLINGTON SKAGIT REGIONAL BAYVIEW AIRPORT, WA US",2005-12-31,2018-08-18,Washington,United States,48.46667,-122.41667,42.7,0,1,"(1, 0)" +240,271,WBAN:14742,"BURLINGTON WEATHER SERVICE OFFICE AIRPORT, VT US",1947-12-31,2018-08-18,Vermont,United States,44.4683,-73.1499,100.6,4,36,"(36, 4)" +246,277,WBAN:14817,"CADILLAC WEXFORD CO AIRPORT, MI US",1990-07-23,2018-08-18,Michigan,United States,44.28333,-85.41667,397.8,4,27,"(27, 4)" +250,281,WBAN:54743,"CALDWELL ESSEX CO AIRPORT, NJ US",2005-12-31,2018-08-18,New Jersey,United States,40.87639,-74.28305999999998,52.7,7,35,"(35, 7)" +251,282,WBAN:94195,"CALDWELL INDUSTRIAL AIRPORT, ID US",2005-12-31,2018-08-18,Idaho,United States,43.65,-116.63333,740.4,4,5,"(5, 4)" +254,285,WBAN:12986,"CALHOUN CO AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,28.65417,-96.68139000000001,9.1,17,19,"(19, 17)" +255,287,WBAN:23136,"CAMARILLO AIRPORT, CA US",1956-12-31,2018-08-18,California,United States,34.21667,-119.08333,23.5,13,3,"(3, 13)" +265,300,WBAN:54923,"CANBY MYERS FIELD AIRPORT, MN US",2006-10-17,2018-08-18,Minnesota,United States,44.729440000000004,-96.26611,363.6,3,19,"(19, 3)" +266,301,WBAN:00285,"CANDO MUNICIPAL AIRPORT, ND US",2013-12-31,2018-08-18,North Dakota,United States,48.48,-99.236,450.2,0,17,"(17, 0)" +269,305,WBAN:93729,"CAPE HATTERAS BILLY MITCHELL FIELD, NC US",1957-02-28,2018-08-18,North Carolina,United States,35.23260000000001,-75.6219,3.4,12,34,"(34, 12)" +270,306,WBAN:93810,"CARBONDALE SOUTHERN ILLINOIS AIRPORT, IL US",2005-12-31,2018-08-18,Illinois,United States,37.779720000000005,-89.24972,123.7,10,24,"(24, 10)" +273,309,WBAN:03177,"CARLSBAD MCCLELLAN PALOMAR AIRPORT, CA US",2005-12-31,2018-08-18,California,United States,33.12806,-117.27944,100.0,14,4,"(4, 14)" +280,317,WBAN:03914,"CASA GRANDE MUNICIPAL AIRPORT, AZ US",2005-12-31,2018-08-18,Arizona,United States,32.95,-111.76666999999999,445.6,14,8,"(8, 14)" +281,319,WBAN:24089,"CASPER NATRONA CO AIRPORT, WY US",1939-12-31,2018-08-18,Wyoming,United States,42.89779,-106.47371000000001,1620.9,5,12,"(12, 5)" +284,322,WBAN:00465,"CATTARAUGUS CO OLEAN AIRPORT, NY US",2012-12-31,2018-08-18,New York,United States,42.24122,-78.37136,651.1,6,32,"(32, 6)" +285,323,WBAN:00283,"CAVALIER MUNICIPAL AIRPORT, ND US",2013-12-31,2018-08-18,North Dakota,United States,48.784,-97.632,272.2,0,18,"(18, 0)" +290,330,WBAN:53887,"CENTRALIA MUNICIPAL AIRPORT, IL US",2005-12-31,2018-08-18,Illinois,United States,38.514720000000004,-89.09194000000001,162.8,9,24,"(24, 9)" +291,332,WBAN:24017,"CHADRON MUNICIPAL AIRPORT, NE US",1972-12-31,2018-08-18,Nebraska,United States,42.8374,-103.0981,1004.0,5,15,"(15, 5)" +292,333,WBAN:04114,"CHALLIS AIRPORT, ID US",2001-08-31,2018-08-18,Idaho,United States,44.52278,-114.215,1534.1,4,7,"(7, 4)" +293,335,WBAN:94943,"CHAMBERLAIN MUNICIPAL AIRPORT, SD US",2005-12-31,2018-08-18,South Dakota,United States,43.76667,-99.31833,519.1,4,17,"(17, 4)" +300,344,WBAN:13880,"CHARLESTON INTL. AIRPORT, SC US",1944-12-31,2018-08-18,South Carolina,United States,32.899429999999995,-80.04075,12.2,14,31,"(31, 14)" +301,345,WBAN:13866,"CHARLESTON YEAGER AIRPORT, WV US",1956-12-31,2018-08-18,West Virginia,United States,38.3794,-81.59,277.40000000000003,9,30,"(30, 9)" +317,364,WBAN:00143,"CHEYENNE CO MUNICIPAL AIRPORT, KS US",2012-12-31,2018-08-18,Kansas,United States,39.766999999999996,-101.8,1040.3,8,15,"(15, 8)" +327,374,WBAN:93203,"CHICO ARMY FLYING SCHOOL, CA US",2005-12-31,2018-08-18,California,United States,39.8,-121.85,82.9,8,1,"(1, 8)" +330,377,WBAN:13301,"CHILLICOTHE 22 ENE, MO US",2005-06-10,2018-08-16,Missouri,United States,39.86680000000001,-93.147,253.9,8,22,"(22, 8)" +331,378,WBAN:53916,"CHILLICOTHE AGRI SCIENCE CENTER, MO US",2005-12-31,2018-08-18,Missouri,United States,39.82333,-93.57917,234.4,8,21,"(21, 8)" +332,379,WBAN:93104,"CHINA LAKE NAF, CA US",1956-12-31,2018-08-18,California,United States,35.6875,-117.6931,679.7,11,4,"(4, 11)" +345,395,WBAN:94605,"CLAYTON LAKE RAMOS, ME US",2005-12-31,2018-08-18,Maine,United States,46.61667,-69.53332999999999,304.8,2,38,"(38, 2)" +346,396,WBAN:23051,"CLAYTON MUNICIPAL AIR PARK, NM US",1956-12-31,2018-08-18,New Mexico,United States,36.4486,-103.1539,1511.8,11,14,"(14, 11)" +348,398,WBAN:92828,"CLEARWATER AIR PARK, FL US",2018-06-30,2018-08-18,Florida,United States,27.977214,-82.759057,21.6,18,29,"(29, 18)" +354,404,WBAN:14820,"CLEVELAND HOPKINS INTERNATIONAL AIRPORT, OH US",1956-12-31,2018-08-18,Ohio,United States,41.4057,-81.852,238.0,6,30,"(30, 6)" +357,407,WBAN:03027,"CLINES CORNERS, NM US",2005-12-31,2018-08-18,New Mexico,United States,35.00278,-105.66278,2159.8,12,13,"(13, 12)" +358,408,WBAN:00222,"CLINTON MEMORIAL AIRPORT, MO US",2013-12-31,2018-08-18,Missouri,United States,38.35,-93.68299999999999,251.2,9,21,"(21, 9)" +365,417,WBAN:23008,"CLOVIS CANNON AFB, NM US",1943-01-24,2018-08-18,New Mexico,United States,34.38333,-103.31667,1309.1,13,14,"(14, 13)" +368,420,WBAN:12867,"COCOA BEACH PATRICK AFB, FL US",1945-02-28,2018-08-18,Florida,United States,28.23333,-80.60000000000002,2.4,18,30,"(30, 18)" +369,421,WBAN:24045,"CODY MUNICIPAL AIRPORT, WY US",2005-12-31,2018-08-18,Wyoming,United States,44.51667,-109.01666999999999,1552.0,4,10,"(10, 4)" +370,422,WBAN:24136,"COEUR D ALENE AIR TERMINAL, ID US",2005-12-31,2018-08-18,Idaho,United States,47.76667,-116.81667,703.2,1,5,"(5, 1)" +374,426,WBAN:00276,"COLEMAN MUNICIPAL AIRPORT, TX US",2012-12-31,2018-08-18,Texas,United States,31.840999999999998,-99.404,517.2,15,17,"(17, 15)" +377,429,WBAN:53129,"COLORADO CITY MUNICIPAL AIRPORT, AZ US",2014-02-26,2018-08-18,Arizona,United States,36.959720000000004,-113.01388999999999,1485.6,10,7,"(7, 10)" +380,433,WBAN:00206,"COLUMBIA AIRPORT, CA US",2013-12-31,2018-08-18,California,United States,38.033,-120.417,646.2,9,2,"(2, 9)" +383,436,WBAN:03945,"COLUMBIA REGIONAL AIRPORT, MO US",1969-10-31,2018-08-18,Missouri,United States,38.8169,-92.2183,272.2,9,22,"(22, 9)" +385,438,WBAN:13803,"COLUMBUS BAKALAR MUNICIPAL AIRPORT, IN US",1956-12-31,2018-08-18,Indiana,United States,39.26667,-85.9,199.9,8,27,"(27, 8)" +389,442,WBAN:13812,"COLUMBUS RICKENBACKER, OH US",1942-07-31,2018-08-18,Ohio,United States,39.81667,-82.93333,226.8,8,29,"(29, 8)" +395,448,WBAN:13984,"CONCORDIA ASOS, KS US",1962-05-31,2018-08-18,Kansas,United States,39.5514,-97.6508,447.8,8,18,"(18, 8)" +397,451,WBAN:94057,"CONVERSE CO AIRPORT ASOS, WY US",2005-12-31,2018-08-18,Wyoming,United States,42.79611,-105.38028,1504.5,5,13,"(13, 5)" +400,455,WBAN:00327,"COOPERSTOWN MUNICIPAL AIRPORT, ND US",2015-09-25,2018-08-18,North Dakota,United States,47.423,-98.106,434.0,1,18,"(18, 1)" +401,456,WBAN:04141,"COOS BAY 8 SW, OR US",2008-08-18,2018-08-16,Oregon,United States,43.2718,-124.3186,3.7,5,0,"(0, 5)" +403,458,WBAN:00234,"CORNING MUNICIPAL AIRPORT, AR US",2014-07-31,2018-08-18,Arkansas,United States,36.4,-90.65,89.0,11,23,"(23, 11)" +412,468,WBAN:04908,"COUNCIL BLUFFS MUNICIPAL AIRPORT, IA US",2005-12-31,2018-08-18,Iowa,United States,41.259440000000005,-95.75972,381.9,7,20,"(20, 7)" +414,475,WBAN:94977,"CRANE LAKE, MN US",2005-12-31,2018-08-18,Minnesota,United States,48.26667,-92.48333000000001,341.1,0,22,"(22, 0)" +415,476,WBAN:24286,"CRESCENT CITY MCNAMARA AIRPORT, CA US",1972-12-31,2018-08-18,California,United States,41.78028,-124.23666999999999,17.1,6,0,"(0, 6)" +416,477,WBAN:04915,"CRESTON MUNICIPAL AIRPORT, IA US",2005-12-31,2018-08-18,Iowa,United States,41.007220000000004,-94.36306,394.4,7,21,"(21, 7)" +419,480,WBAN:03073,"CROCKETT HOUSTON CO AIRPORT, TX US",2013-12-31,2018-08-18,Texas,United States,31.30694,-95.40389,106.1,15,20,"(20, 15)" +421,482,WBAN:00287,"CROSBY MUNICIPAL AIRPORT, ND US",2012-12-31,2018-08-18,North Dakota,United States,48.928999999999995,-103.297,594.1,0,14,"(14, 0)" +423,485,WBAN:03847,"CROSSVILLE MEMORIAL AIRPORT, TN US",1972-12-31,2018-08-18,Tennessee,United States,35.95090000000001,-85.0813,569.1,11,27,"(27, 11)" +425,489,WBAN:63839,"CULLMAN FOLSOM FIELD AIRPORT, AL US",2005-12-31,2018-08-17,Alabama,United States,34.26889,-86.85833000000001,293.5,13,26,"(26, 13)" +427,491,WBAN:93798,"CULPEPER REGIONAL AIRPORT, VA US",2005-12-31,2018-08-18,Virginia,United States,38.52667,-77.85861,96.3,9,32,"(32, 9)" +428,492,WBAN:00316,"CUMBERLAND MUNICIPAL AIRPORT, WI US",2013-12-31,2018-08-18,Wisconsin,United States,45.506,-91.981,378.3,3,22,"(22, 3)" +432,496,WBAN:94032,"CUSTER CO AIRPORT, SD US",2005-12-31,2018-08-18,South Dakota,United States,43.73306,-103.61139,1690.1,4,14,"(14, 4)" +433,497,WBAN:24137,"CUT BANK AIRPORT, MT US",1942-11-30,2018-08-18,Montana,United States,48.6033,-112.3752,1169.8,0,8,"(8, 0)" +434,498,WBAN:23161,"DAGGETT AIRPORT, CA US",1948-12-31,2018-08-18,California,United States,34.8536,-116.7858,584.3000000000002,12,5,"(5, 12)" +441,506,WBAN:24219,"DALLESPORT AIRPORT, WA US",1956-12-31,2018-08-18,Oregon,United States,45.6194,-121.1661,71.60000000000002,3,2,"(2, 3)" +443,508,WBAN:54734,"DANBURY MUNICIPAL AIRPORT, CT US",2005-12-31,2018-08-18,Connecticut,United States,41.371390000000005,-73.48277999999998,139.3,6,35,"(35, 6)" +444,509,WBAN:94704,"DANSVILLE MUNICIPAL AIRPORT, NY US",1972-12-31,2018-08-18,New York,United States,42.57083,-77.71333,208.8,5,32,"(32, 5)" +449,514,WBAN:04223,"DARRINGTON 21 NNE, WA US",2003-04-02,2018-08-16,Washington,United States,48.5405,-121.446,124.1,0,2,"(2, 0)" +452,517,WBAN:23109,"DAVIS MONTHAN AFB, AZ US",1941-07-16,2018-08-18,Arizona,United States,32.16667,-110.88333,824.2,14,9,"(9, 14)" +459,524,WBAN:04871,"DE KALB TAYLOR MUNICIPAL AIRPORT, IL US",2005-12-31,2018-08-18,Illinois,United States,41.931670000000004,-88.70805999999997,278.90000000000003,6,25,"(25, 6)" +460,525,WBAN:53925,"DE QUEEN SEVIER CO AIRPORT, AR US",2003-12-31,2018-08-18,Arkansas,United States,34.05,-94.40083,108.2,13,21,"(21, 13)" +462,527,WBAN:03976,"DE RIDDER BEAUREGARD PARISH AIRPORT, LA US",2005-12-31,2018-08-18,Louisiana,United States,30.83333,-93.33333,62.2,16,21,"(21, 16)" +464,529,WBAN:53964,"DECATUR MUNICIPAL AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,33.254439999999995,-97.58056,319.1,13,18,"(18, 13)" +466,531,WBAN:04916,"DECORAH MUNICIPAL AIRPORT, IA US",2005-12-31,2018-08-18,Iowa,United States,43.27528,-91.73917,352.7,5,23,"(23, 5)" +470,535,WBAN:22001,"DEL RIO LAUGHLIN AFB, TX US",1943-02-16,2018-08-18,Texas,United States,29.366670000000003,-100.78333,329.8,17,16,"(16, 17)" +472,537,WBAN:00315,"DELAWARE MUNICIPAL JIM MOORE FIELD AIRPORT, OH US",2012-12-31,2018-08-18,Ohio,United States,40.28,-83.11500000000002,288.0,7,29,"(29, 7)" +473,539,WBAN:23162,"DELTA FAA AIRPORT, UT US",2014-08-19,2018-08-18,Utah,United States,39.38333,-112.51666999999999,1450.5,8,8,"(8, 8)" +474,540,WBAN:23078,"DEMING MUNICIPAL AIRPORT, NM US",2005-12-31,2018-08-18,New Mexico,United States,32.26222,-107.72056,1310.9,14,11,"(11, 14)" +475,541,WBAN:00445,"DEMOPOLIS MUNICIPAL AIRPORT, AL US",2014-07-30,2018-08-18,Alabama,United States,32.46383,-87.95405,34.1,14,25,"(25, 14)" +476,542,WBAN:04139,"DENIO 52 WSW, NV US",2008-06-15,2018-08-16,Nevada,United States,41.84840000000001,-119.6357,1981.2,6,3,"(3, 6)" +481,548,WBAN:14933,"DES MOINES INTERNATIONAL AIRPORT, IA US",1956-12-31,2018-08-18,Iowa,United States,41.5338,-93.65299999999999,291.7,6,21,"(21, 6)" +482,549,WBAN:03104,"DESERT RESORTS REGIONAL AIRPORT, CA US",1943-07-11,2018-08-18,California,United States,33.626670000000004,-116.15943999999999,-36.0,13,5,"(5, 13)" +483,550,WBAN:53853,"DESTIN FORT WALTON BEACH AIRPORT, FL US",2005-12-31,2018-08-18,Florida,United States,30.4,-86.47166999999999,6.7,16,26,"(26, 16)" +492,560,WBAN:24138,"DILLON AIRPORT, MT US",1956-12-31,2018-08-18,Montana,United States,45.2575,-112.5544,1585.0,3,8,"(8, 3)" +493,562,WBAN:00444,"DIXON AIRPORT, WY US",2013-12-31,2018-08-18,Wyoming,United States,41.037440000000004,-107.49252,1996.1,7,11,"(11, 7)" +494,563,WBAN:04978,"DODGE CENTER AIRPORT, MN US",2005-12-31,2018-08-18,Minnesota,United States,44.01778,-92.83139,397.8,4,22,"(22, 4)" +495,564,WBAN:13985,"DODGE CITY REGIONAL AIRPORT, KS US",1943-04-18,2018-08-18,Kansas,United States,37.7686,-99.9678,787.0,10,17,"(17, 10)" +497,567,WBAN:93026,"DOUGLAS BISBEE INL AIRPORT, AZ US",1972-12-31,2018-08-18,Arizona,Mexico,31.4583,-109.6061,1251.2,15,10,"(10, 15)" +499,569,WBAN:13707,"DOVER AFB, DE US",1942-11-30,2018-08-18,Delaware,United States,39.13333,-75.46667,8.5,8,34,"(34, 8)" +500,571,WBAN:54786,"DOYLESTOWN AIRPORT, PA US",2005-12-31,2018-08-18,Pennsylvania,United States,40.33,-75.1225,120.1,7,34,"(34, 7)" +502,574,WBAN:54844,"DRUMMOND ISLAND AIRPORT, MI US",2006-08-30,2018-08-18,Michigan,United States,46.007220000000004,-83.74278000000001,202.7,2,28,"(28, 2)" +505,577,WBAN:04787,"DUBOIS JEFFERSON CO AIRPORT, PA US",1972-12-31,2018-08-18,Pennsylvania,United States,41.17833,-78.89889000000001,552.9,7,32,"(32, 7)" +506,578,WBAN:00443,"DUBOIS MUNICIPAL AIRPORT, WY US",2013-05-13,2018-08-18,Wyoming,United States,43.54836,-109.69025,2224.1,5,10,"(10, 5)" +508,580,WBAN:24103,"DUGWAY PROVING GROUNDS, UT US",2006-01-02,2018-08-15,Utah,United States,40.18333,-112.93333,1325.6,7,8,"(8, 7)" +511,584,WBAN:03070,"DUMAS MOORE CO AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,35.858059999999995,-102.01306,1129.3,11,15,"(15, 11)" +512,585,WBAN:14747,"DUNKIRK CHAUTAUQUA CO AIRPORT, NY US",1998-12-31,2018-08-18,New York,United States,42.49333,-79.27221999999998,203.0,5,31,"(31, 5)" +513,586,WBAN:00298,"DUPONT LAPEER AIRPORT, MI US",2012-12-31,2018-08-18,Michigan,United States,43.067,-83.26700000000002,254.2,5,29,"(29, 5)" +517,592,WBAN:03809,"DYERSBURG MUNICIPAL AIRPORT, TN US",1943-04-11,2018-08-18,Tennessee,United States,36.0002,-89.4094,91.4,11,24,"(24, 11)" +518,595,WBAN:23063,"EAGLE CO AIRPORT, CO US",1956-12-31,2018-08-18,Colorado,United States,39.65,-106.91667,1980.3,8,12,"(12, 8)" +519,596,WBAN:00480,"EAGLE RANGE WEATHER SERVICE OFFICE, UT US",2014-07-30,2018-08-16,Utah,United States,41.05,-113.06,1292.0,7,7,"(7, 7)" +522,599,WBAN:00254,EAST CAMERON 278 OIL PLATFORM,2013-12-31,2018-08-18,,,28.433000000000003,-92.883,224.0,18,22,"(22, 18)" +528,606,WBAN:14991,"EAU CLAIRE REGIONAL AIRPORT, WI US",1956-12-31,2018-08-18,Wisconsin,United States,44.8665,-91.4879,269.7,3,23,"(23, 3)" +531,609,WBAN:23114,"EDWARDS AFB, CA US",1941-11-30,2018-08-18,California,United States,34.9,-117.86667,704.4,12,4,"(4, 12)" +532,610,WBAN:93816,"EFFINGHAM CO MEMORIAL AIRPORT, IL US",2005-12-31,2018-08-18,Illinois,United States,39.07028,-88.53332999999998,178.9,8,25,"(25, 8)" +534,612,WBAN:93992,"EL DORADO S AR REGIONAL AIRPORT, AR US",1972-12-31,2018-08-18,Arkansas,United States,33.22083,-92.81417,76.8,14,22,"(22, 14)" +536,614,WBAN:23044,"EL PASO INTERNATIONAL AIRPORT, TX US",1941-03-31,2018-08-18,Texas,United States,31.81111,-106.37583000000001,1194.2,15,12,"(12, 15)" +539,618,WBAN:00182,"ELBOW LAKE MUNICIPAL PRIDE OF THE PRAIRIE AIRPORT, MN US",2014-07-30,2018-08-18,Minnesota,United States,45.986,-95.992,367.3,2,20,"(20, 2)" +541,620,WBAN:13786,"ELIZABETH CITY COAST GUARD AIR STATION, NC US",1948-12-31,2018-08-18,North Carolina,United States,36.26056,-76.175,4.0,11,34,"(34, 11)" +542,621,WBAN:00210,"ELIZABETHTON MUNICIPAL AIRPORT, TN US",2014-07-30,2018-08-18,Tennessee,United States,36.367,-82.167,486.2,11,29,"(29, 11)" +546,625,WBAN:93076,"ELKHART, KS US",2005-12-31,2018-08-18,Kansas,United States,37.0,-101.88333,1105.8,10,15,"(15, 10)" +547,626,WBAN:03733,"ELKINS 21 ENE, WV US",2003-11-16,2018-08-16,West Virginia,United States,39.01300000000001,-79.4743,1033.3,8,31,"(31, 8)" +549,628,WBAN:24121,"ELKO REGIONAL AIRPORT, NV US",1956-12-31,2018-08-18,Nevada,United States,40.8288,-115.7886,1533.1,7,6,"(6, 7)" +550,629,WBAN:24220,"ELLENSBURG BOWERS FIELD, WA US",1988-01-05,2018-08-18,Washington,United States,47.03389,-120.53028,538.3,1,2,"(2, 1)" +551,630,WBAN:24006,"ELLSWORTH AFB, SD US",1939-01-31,2018-08-18,South Dakota,United States,44.15,-103.1,999.1,4,15,"(15, 4)" +552,631,WBAN:14748,"ELMIRA CORNING REGIONAL AIRPORT, NY US",1972-12-31,2018-08-18,New York,United States,42.159440000000004,-76.89193999999998,291.1,6,33,"(33, 6)" +553,632,WBAN:23154,"ELY AIRPORT, NV US",1956-12-31,2018-08-18,Nevada,United States,39.2952,-114.8466,1908.7,8,6,"(6, 8)" +556,635,WBAN:13989,"EMPORIA ASOS, KS US",1972-12-31,2018-08-18,Kansas,United States,38.3291,-96.1946,364.5,9,19,"(19, 9)" +559,638,WBAN:53986,"ENID WOODRING AIRPORT, OK US",2005-12-31,2018-08-18,Oklahoma,United States,36.38333,-97.8,355.7,11,18,"(18, 11)" +560,639,WBAN:24141,"EPHRATA MUNICIPAL AIRPORT, WA US",1941-12-31,2018-08-18,Washington,United States,47.3078,-119.5154,381.6,1,3,"(3, 1)" +564,643,WBAN:94853,"ESCANABA DELTA CO AIRPORT, MI US",2005-12-31,2018-08-18,Michigan,United States,45.73333,-87.08332999999998,181.1,3,26,"(26, 3)" +565,644,WBAN:94971,"ESTHERVILLE MUNICIPAL AIRPORT, IA US",2005-12-31,2018-08-18,Iowa,United States,43.40111,-94.74722,401.4,5,20,"(20, 5)" +567,646,WBAN:00304,EUGENE ISLAND OIL PLATFORM,2012-12-31,2018-08-18,,,28.633000000000006,-91.48299999999999,28.0,18,23,"(23, 18)" +568,647,WBAN:24221,"EUGENE MAHLON SWEET FIELD, OR US",1956-12-31,2018-08-18,Oregon,United States,44.1278,-123.2206,107.6,4,0,"(0, 4)" +570,649,WBAN:03170,"EUREKA AIRPORT, NV US",2005-12-31,2018-08-18,Nevada,United States,39.6013,-116.0055,1809.3,8,5,"(5, 8)" +571,650,WBAN:24213,"EUREKA WEATHER FORECAST OFFICE WOODLEY ISLAND, CA US",2005-12-31,2018-08-17,California,United States,40.8097,-124.1602,6.1000000000000005,7,0,"(0, 7)" +572,651,WBAN:04111,"EVANSTON UINTA CO BURNS FIELD, WY US",1972-12-31,2018-08-18,Wyoming,United States,41.27306,-111.03056000000001,2183.3,7,9,"(9, 7)" +577,656,WBAN:24114,"FAIRCHILD AFB, WA US",1940-03-31,2018-08-18,Washington,United States,47.63333,-117.65,750.1,1,4,"(4, 1)" +578,657,WBAN:00220,"FAIRFIELD CO AIRPORT, SC US",2013-12-31,2018-08-18,South Carolina,United States,34.315000000000005,-81.10900000000002,176.20000000000005,13,30,"(30, 13)" +579,658,WBAN:04925,"FAIRFIELD MUNICIPAL AIRPORT, IA US",2005-12-31,2018-08-18,Iowa,United States,41.05306,-91.97889,243.5,7,22,"(22, 7)" +582,662,WBAN:94056,"FAITH MUNICIPAL AIRPORT, SD US",2005-12-31,2018-08-18,South Dakota,United States,45.031940000000006,-102.01916999999999,786.4,3,15,"(15, 3)" +583,663,WBAN:00270,"FAITH RANCH AIRPORT, TX US",2014-01-06,2018-08-18,Texas,United States,28.209,-100.01899999999999,236.2,18,17,"(17, 18)" +584,665,WBAN:93102,"FALLON NAAS, NV US",1956-12-31,2018-08-18,Nevada,United States,39.41667,-118.71667,1199.1,8,3,"(3, 8)" +585,666,WBAN:94957,"FALLS CITY BRENNER FIELD, NE US",1999-12-31,2018-08-18,Nebraska,United States,40.08028,-95.59194000000001,298.7,8,20,"(20, 8)" +589,670,WBAN:94969,"FARIBAULT MUNICIPAL AIRPORT, MN US",2005-12-31,2018-08-18,Minnesota,United States,44.33333,-93.31667,323.1,4,21,"(21, 4)" +591,672,WBAN:23090,"FARMINGTON FOUR CORNERS REGIONAL AIRPORT, NM US",1956-12-31,2018-08-18,New Mexico,United States,36.74361,-108.22917,1674.9,10,11,"(11, 10)" +592,673,WBAN:93996,"FARMINGTON REGIONAL AIRPORT, MO US",1995-02-09,2018-08-18,Missouri,United States,37.76083,-90.42833,288.6,10,23,"(23, 10)" +593,674,WBAN:03707,"FARMVILLE REGIONAL AIRPORT, VA US",2005-12-31,2018-08-18,Virginia,United States,37.3575,-78.43777999999998,127.1,10,32,"(32, 10)" +598,679,WBAN:53922,"FAYETTEVILLE SPRINGDALE NW AR REGL AIRPORT, AR US",2005-12-31,2018-08-18,Arkansas,United States,36.28333,-94.3,392.3,11,21,"(21, 11)" +599,680,WBAN:13762,"FENTRESS NAVAL AUXILIARY FIELD, VA US",2007-05-31,2018-08-18,Virginia,United States,36.695,-76.13556,4.9,10,34,"(34, 10)" +600,681,WBAN:94966,"FERGUS FALLS AIRPORT, MN US",2005-12-31,2018-08-18,Minnesota,United States,46.28333,-96.15,360.6,2,19,"(19, 2)" +601,682,WBAN:00326,"FERNANDINA BEACH MUNICIPAL AIRPORT, FL US",2013-12-31,2018-08-18,Florida,United States,30.616999999999997,-81.467,5.2,16,30,"(30, 16)" +602,683,WBAN:00237,"FIELD OF DREAMS AIRPORT, MN US",2014-07-30,2018-08-18,Minnesota,United States,46.023,-92.895,311.2,2,22,"(22, 2)" +603,684,WBAN:14825,"FINDLAY AIRPORT, OH US",1972-12-31,2018-08-18,Ohio,United States,41.01361,-83.66861,243.8,7,28,"(28, 7)" +604,685,WBAN:04780,"FITCHBURG MUNICIPAL AIRPORT, MA US",1956-12-31,2018-08-18,Massachusetts,United States,42.55194,-71.75583,106.1,5,37,"(37, 5)" +607,688,WBAN:00485,"FLAGLER CO AIRPORT, FL US",2012-12-31,2018-08-17,Florida,United States,29.46738,-81.20633000000001,10.1,17,30,"(30, 17)" +612,693,WBAN:53889,"FLORA MUNICIPAL AIRPORT, IL US",2005-12-31,2018-08-18,Illinois,United States,38.66472,-88.45277999999998,143.9,9,25,"(25, 9)" +617,698,WBAN:13829,"FORT BENNING LAWSON FIELD, AL US",1939-04-30,2018-08-18,Alabama,United States,32.35,-85.0,70.7,14,27,"(27, 14)" +620,701,WBAN:00449,"FORT BRIDGER AIRPORT, WY US",2013-07-31,2018-08-18,Wyoming,United States,41.39333,-110.40597,2145.5,6,9,"(9, 6)" +621,702,WBAN:13806,"FORT CAMPBELL ARMY AIR FIELD, KY US",1943-07-14,2018-08-18,Kentucky,United States,36.66667,-87.48333000000001,174.70000000000005,11,26,"(26, 11)" +622,703,WBAN:94015,"FORT CARSON BUTTS ARMY AIR FIELD, CO US",1966-09-14,2018-08-18,Colorado,United States,38.67833,-104.75667,1779.4,9,13,"(13, 9)" +624,705,WBAN:94933,"FORT DODGE OZARK AIRLINES, IA US",2005-12-31,2018-08-18,Iowa,United States,42.55,-94.18333,352.3,5,21,"(21, 5)" +628,709,WBAN:03124,"FORT HUACHUCA SIERRA VISTA MUNICIPAL AIRPORT, AZ US",1954-10-10,2018-08-18,Arizona,United States,31.58833,-110.34416999999999,1438.4,15,9,"(9, 15)" +631,712,WBAN:00162,"FORT MORGAN MUNICIPAL AIRPORT, CO US",2013-12-31,2018-08-18,Colorado,United States,40.333,-103.8,1393.2,7,14,"(14, 7)" +632,713,WBAN:63847,"FORT PAYNE ISBELL FIELD, AL US",2005-12-31,2018-08-18,Alabama,United States,34.473890000000004,-85.72139,267.3,12,27,"(27, 12)" +633,714,WBAN:12895,"FORT PIERCE ST LUCIE CO INTERNATIONAL AIRPORT, FL US",2005-12-31,2018-08-17,Florida,United States,27.49806,-80.37666999999998,7.3,19,31,"(31, 19)" +635,716,WBAN:53988,"FORT POLK FULLERTON LANDING STRIP, LA US",2005-12-31,2018-08-18,Louisiana,United States,31.021700000000006,-92.9107,94.5,15,22,"(22, 15)" +636,718,WBAN:13947,"FORT RILEY MARSHALL ARMY AIR FIELD, KS US",1938-08-16,2018-08-18,Kansas,United States,39.05,-96.76667,324.6,8,19,"(19, 8)" +637,720,WBAN:53861,"FORT RUCKER LOWE ARMY HELIPORT, AL US",2008-07-16,2018-08-18,Alabama,United States,31.35583,-85.75111,74.4,15,27,"(27, 15)" +639,722,WBAN:13964,"FORT SMITH REGIONAL AIRPORT, AR US",1946-12-31,2018-08-18,Arkansas,United States,35.333,-94.3625,136.9,12,21,"(21, 12)" +640,723,WBAN:03875,"FORT STEWART WRIGHT, GA US",2006-01-02,2018-08-18,Georgia,United States,31.88333,-81.56667,13.7,15,30,"(30, 15)" +641,724,WBAN:23091,"FORT STOCKTON PECOS CO AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,30.91194,-102.91667,917.4,16,15,"(15, 16)" +642,725,WBAN:14827,"FORT WAYNE INTERNATIONAL AIRPORT, IN US",1941-10-31,2018-08-18,Indiana,United States,40.9705,-85.2063,241.1,7,27,"(27, 7)" +646,729,WBAN:04929,"FOSSTON MUNICIPAL AIRPORT, MN US",2005-12-31,2018-08-18,Minnesota,United States,47.59278,-95.77528000000001,389.2,1,20,"(20, 1)" +647,731,WBAN:53841,"FRANKFORT CAPITAL CITY AIRPORT, KY US",2005-12-31,2018-08-18,Kentucky,United States,38.18472,-84.90333000000001,245.1,9,27,"(27, 9)" +648,732,WBAN:54818,"FRANKFORT DOW MEMORIAL FIELD AIRPORT, MI US",2005-12-31,2018-08-18,Michigan,United States,44.62556,-86.20083000000001,192.6,4,26,"(26, 4)" +649,733,WBAN:00152,"FRANKLIN CO STATE AIRPORT, VT US",2008-03-31,2018-08-18,Vermont,United States,44.933,-73.10000000000002,70.10000000000001,3,36,"(36, 3)" +651,735,WBAN:94868,"FRANKLIN, PA US",1967-12-31,2018-08-18,Pennsylvania,United States,41.38333,-79.86667,469.4,6,31,"(31, 6)" +653,737,WBAN:03981,"FREDERICK MUNICIPAL AIRPORT, OK US",2005-12-31,2018-08-18,Oklahoma,United States,34.344440000000006,-98.98306,382.5,13,17,"(17, 13)" +654,738,WBAN:93947,"FREDERICKSBURG GILLESPIE CO AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,30.24333,-98.90972,516.6,16,17,"(17, 16)" +655,739,WBAN:03706,"FREDERICKSBURG SHANNON AIRPORT, VA US",2005-12-31,2018-08-18,Virginia,United States,38.26667,-77.44917,25.9,9,33,"(33, 9)" +656,740,WBAN:04876,"FREEPORT ALBERTUS AIRPORT, IL US",2005-12-31,2018-08-18,Illinois,United States,42.246109999999994,-89.58221999999998,261.8,6,24,"(24, 6)" +658,742,WBAN:04924,"FREMONT MUNICIPAL AIRPORT, NE US",2005-12-31,2018-08-18,Nebraska,United States,41.448890000000006,-96.52,366.7,6,19,"(19, 6)" +659,743,WBAN:04836,"FRENCHVILLE NORTHERN AROOSTOOK AIRPORT, ME US",2005-12-31,2018-08-18,Maine,United States,47.28556,-68.31333000000001,301.1,1,39,"(39, 1)" +660,744,WBAN:93193,"FRESNO YOSEMITE INTERNATIONAL, CA US",1941-12-03,2018-08-18,California,United States,36.78,-119.7194,101.5,10,3,"(3, 10)" +661,745,WBAN:94276,"FRIDAY HARBOR AIRPORT, WA US",2005-12-31,2018-08-18,Washington,United States,48.522220000000004,-123.02306000000002,33.2,0,0,"(0, 0)" +662,746,WBAN:00450,"FRONT RANGE AIRPORT, CO US",2013-12-31,2018-08-18,Colorado,United States,39.7842,-104.5376,1680.4,8,13,"(13, 8)" +663,747,WBAN:54772,"FRYEBURG EASTERN SLOPES REGL AIRPORT, ME US",2005-12-31,2018-08-18,Maine,United States,43.99056,-70.9475,135.6,4,37,"(37, 4)" +665,749,WBAN:00265,"FULTON CO AIRPORT, IN US",2013-12-31,2018-08-18,Indiana,United States,41.066,-86.182,241.1,7,26,"(26, 7)" +667,752,WBAN:03896,"GADSDEN MUNICIPAL AIRPORT, AL US",2005-12-31,2018-08-18,Alabama,United States,33.96667,-86.08332999999998,173.4,13,27,"(27, 13)" +668,753,WBAN:13975,"GAGE AIRPORT, OK US",1956-12-31,2018-08-18,Oklahoma,United States,36.2967,-99.7689,667.8000000000002,11,17,"(17, 11)" +669,754,WBAN:03056,"GAINES CO AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,32.67528,-102.65444000000001,1010.4,14,15,"(15, 14)" +673,759,WBAN:93764,"GAITHERSBURG MONTGOMERY CO AIR PARK, MD US",2013-12-31,2018-08-18,Maryland,United States,39.16667,-77.16667,164.3,8,33,"(33, 8)" +674,760,WBAN:94959,"GALESBURG MUNICIPAL AIRPORT, IL US",2005-12-31,2018-08-18,Illinois,United States,40.93333,-90.43333,232.9,7,23,"(23, 7)" +675,761,WBAN:12993,"GALLIANO SOUTH LAFOURCHE AIRPORT, LA US",2005-12-31,2018-08-18,Louisiana,United States,29.44472,-90.26111,0.3,17,24,"(24, 17)" +676,762,WBAN:23081,"GALLUP MUNICIPAL AIRPORT, NM US",1972-12-31,2018-08-18,New Mexico,United States,35.5144,-108.794,1972.4,12,10,"(10, 12)" +678,765,WBAN:23064,"GARDEN CITY REGIONAL AIRPORT, KS US",1943-01-31,2018-08-18,Kansas,United States,37.92722,-100.72471999999999,878.4,9,16,"(16, 9)" +680,767,WBAN:94041,"GARRISON, ND US",2005-12-31,2018-08-18,North Dakota,United States,47.64583,-101.43944,582.2,1,16,"(16, 1)" +681,768,WBAN:04807,"GARY, IN US",2005-12-31,2018-08-18,Indiana,United States,41.61667,-87.41667,180.1,6,26,"(26, 6)" +682,769,WBAN:53870,"GASTONIA MUNICIPAL AIRPORT, NC US",2005-12-31,2018-08-18,North Carolina,United States,35.196670000000005,-81.15583000000001,242.9,12,30,"(30, 12)" +684,772,WBAN:04854,"GAYLORD OTSEGO CO AIRPORT, MI US",1999-08-31,2018-08-18,Michigan,United States,45.01333,-84.70138999999998,406.9,3,28,"(28, 3)" +687,776,WBAN:00391,"GEORGETOWN CO AIRPORT, SC US",2013-12-31,2018-08-18,South Carolina,United States,33.317,-79.31700000000002,12.2,13,31,"(31, 13)" +689,778,WBAN:13764,"GEORGETOWN SUSSEX CO AIRPORT, DE US",2005-12-31,2018-08-18,Delaware,United States,38.689170000000004,-75.35916999999998,15.5,9,34,"(34, 9)" +693,784,WBAN:53982,"GILMER MUNICIPAL AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,32.698890000000006,-94.94889,126.5,14,20,"(20, 14)" +694,785,WBAN:94008,"GLASGOW INTERNATIONAL AIRPORT, MT US",1942-12-09,2018-08-18,Montana,United States,48.2138,-106.6214,696.5,0,12,"(12, 0)" +695,786,WBAN:00361,"GLASGOW MUNICIPAL AIRPORT, KY US",2012-12-31,2018-08-18,Kentucky,United States,37.033,-85.95,218.2,10,27,"(27, 10)" +697,788,WBAN:53126,"GLENDALE MUNICIPAL AIRPORT, AZ US",2005-12-31,2018-08-18,Arizona,United States,33.52722,-112.295,324.9000000000001,13,8,"(8, 13)" +698,789,WBAN:24087,"GLENDIVE DAWSON COMMUNITY AIRPORT, MT US",2005-12-31,2018-08-18,Montana,United States,47.13333,-104.8,748.9,1,13,"(13, 1)" +699,790,WBAN:14750,"GLENS FALLS AIRPORT, NY US",1972-12-31,2018-08-18,New York,United States,43.33845,-73.61028,97.8,5,35,"(35, 5)" +701,793,WBAN:00135,"GNOSS FIELD AIRPORT, CA US",2014-07-30,2018-08-18,California,United States,38.15,-122.55,1.2,9,1,"(1, 9)" +702,794,WBAN:53893,"GOLDEN TRIANGLE, MS US",2005-12-31,2018-08-18,Mississippi,United States,33.45,-88.58332999999998,80.5,13,25,"(25, 13)" +704,796,WBAN:03708,"GOLDSBORO WAYNE MUNICIPAL AIRPORT, NC US",2005-12-31,2018-08-18,North Carolina,United States,35.46028,-77.96472,40.8,12,32,"(32, 12)" +705,797,WBAN:23065,"GOODLAND RENNER FIELD, KS US",1956-12-31,2018-08-18,Kansas,United States,39.36722,-101.69333,1114.3,8,16,"(16, 8)" +706,798,WBAN:04994,"GOODRIDGE 12 NNW, MN US",2003-08-19,2018-08-16,Minnesota,United States,48.3055,-95.8744,350.5,0,20,"(20, 0)" +708,800,WBAN:14829,"GOSHEN MUNICIPAL AIRPORT, IN US",1998-12-31,2018-08-18,Indiana,United States,41.5333,-85.78330000000003,253.0,6,27,"(27, 6)" +710,802,WBAN:53977,"GRANBURY MUNICIPAL AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,32.44444,-97.81694,237.1,14,18,"(18, 14)" +711,803,WBAN:03195,"GRAND CANYON NATIONAL PARK AIRPORT, AZ US",2005-12-31,2018-08-18,Arizona,United States,35.94611,-112.15472,2013.5,11,8,"(8, 11)" +713,805,WBAN:14916,"GRAND FORKS INTERNATIONAL AIRPORT, ND US",1956-12-31,2018-08-18,North Dakota,United States,47.94280000000001,-97.1839,256.6,1,19,"(19, 1)" +715,810,WBAN:23066,"GRAND JUNCTION WALKER FIELD, CO US",1956-12-31,2018-08-18,Colorado,United States,39.1342,-108.54,1480.7,8,11,"(11, 8)" +717,812,WBAN:94992,"GRAND MARAIS, MN US",2005-12-31,2018-08-18,Minnesota,United States,47.74722,-90.34444,185.9,1,24,"(24, 1)" +720,815,WBAN:94919,"GRAND RAPIDS ITASCA CO AIRPORT, MN US",2005-12-31,2018-08-18,Minnesota,United States,47.21111,-93.50972,413.0,1,21,"(21, 1)" +721,816,WBAN:04999,"GRANITE FALLS MUNICIPAL AIRPORT LENZEN ROE MEMORIAL FIELD, MN US",2005-12-31,2018-08-18,Minnesota,United States,44.75333,-95.55611,319.1,3,20,"(20, 3)" +722,818,WBAN:00481,"GRANITE PEAK FILLMORE AIRPORT, UT US",2014-07-29,2018-08-17,Utah,United States,38.95813,-112.36313,1519.4,9,8,"(8, 9)" +723,819,WBAN:00387,"GRANT CO REGIONAL AIRPORT OGILVIE FIELD, OR US",2013-12-31,2018-08-18,Oregon,United States,44.4,-118.96700000000001,1127.2,4,3,"(3, 4)" +724,821,WBAN:93057,"GRANTS MILAN MUNICIPAL AIRPORT, NM US",1947-12-31,2018-08-18,New Mexico,United States,35.16528,-107.90222,1987.3,12,11,"(11, 12)" +725,822,WBAN:24201,"GRAY ARMY AIR FIELD, WA US",1960-05-31,2018-08-18,Washington,United States,47.08333,-122.58333,91.4,1,1,"(1, 1)" +727,824,WBAN:53967,"GRAYSON CO AIRPORT SHERMAN DENISON, TX US",2005-12-31,2018-08-18,Texas,United States,33.71417,-96.67361,228.3,13,19,"(19, 13)" +729,826,WBAN:24143,"GREAT FALLS AIRPORT, MT US",1956-12-31,2018-08-18,Montana,United States,47.4733,-111.3822,1116.8,1,9,"(9, 1)" +730,827,WBAN:04880,"GREATER KANKAKEE AIRPORT, IL US",2005-12-31,2018-08-18,Illinois,United States,41.121390000000005,-87.84611,191.7,7,25,"(25, 7)" +731,828,WBAN:24051,"GREELEY WELD CO AIRPORT, CO US",2005-12-31,2018-08-18,Colorado,United States,40.43556,-104.63194,1431.6,7,13,"(13, 7)" +732,829,WBAN:14898,"GREEN BAY A S INTERNATIONAL AIRPORT, WI US",1949-12-31,2018-08-18,Wisconsin,United States,44.47940000000001,-88.1366,209.4,4,25,"(25, 4)" +733,832,WBAN:13723,"GREENSBORO AIRPORT, NC US",1945-10-31,2018-08-18,North Carolina,United States,36.09690000000001,-79.9432,271.3,11,31,"(31, 11)" +735,834,WBAN:13939,"GREENVILLE ASOS, MS US",1942-01-19,2018-08-18,Mississippi,United States,33.4825,-90.98528,39.0,13,23,"(23, 13)" +738,837,WBAN:63874,"GREENVILLE MAC CRENSHAW MEMORIAL AIRPORT, AL US",2006-08-31,2018-08-18,Alabama,United States,31.84556,-86.61082999999998,137.5,15,26,"(26, 15)" +739,838,WBAN:94626,"GREENVILLE MAINE FORESTRY SERVICE, ME US",2005-12-31,2018-08-18,Maine,United States,45.46222,-69.59528,316.1,3,38,"(38, 3)" +740,839,WBAN:13926,"GREENVILLE MUNICIPAL AIRPORT MAJORS FIELD, TX US",2005-12-31,2018-08-18,Texas,United States,33.06778,-96.06528,163.1,14,19,"(19, 14)" +742,841,WBAN:53874,"GREENWOOD CO AIRPORT, SC US",2005-12-31,2018-08-18,South Carolina,United States,34.24861,-82.15916999999999,192.3,13,29,"(29, 13)" +743,842,WBAN:13978,"GREENWOOD LEFLORE AIRPORT, MS US",1943-02-04,2018-08-18,Mississippi,United States,33.496300000000005,-90.0866,40.5,13,24,"(24, 13)" +744,843,WBAN:24048,"GREYBULL SOUTH BIG HORN CO AIRPORT, WY US",2005-12-31,2018-08-18,Wyoming,United States,44.516940000000005,-108.08221999999999,1198.8,4,11,"(11, 4)" +745,844,WBAN:00339,"GRIFFIN SPALDING CO AIRPORT, GA US",2012-12-31,2018-08-18,Georgia,United States,33.227000000000004,-84.275,292.3,14,28,"(28, 14)" +746,845,WBAN:14976,"GRINNELL, IA US",2006-08-30,2018-08-18,Iowa,United States,41.71667,-92.7,307.2,6,22,"(22, 6)" +747,846,WBAN:03870,"GRNVL SPART INTERNATIONAL AIRPORT, SC US",1962-10-14,2018-08-18,South Carolina,United States,34.8842,-82.2209,287.4000000000001,12,29,"(29, 12)" +748,847,WBAN:54819,"GROSSE ILE MUNICIPAL AIRPORT, MI US",2005-12-31,2018-08-18,Michigan,United States,42.09861,-83.16111,178.9,6,29,"(29, 6)" +750,849,WBAN:53941,"GROVE MUNICIPAL AIRPORT, OK US",2005-12-31,2018-08-18,Oklahoma,United States,36.605,-94.73833,253.9,11,20,"(20, 11)" +752,851,WBAN:93874,"GULFPORT BILOXI AIRPORT, MS US",2004-12-31,2018-08-18,Mississippi,United States,30.411900000000006,-89.08080000000002,12.8,16,24,"(24, 16)" +754,854,WBAN:53913,"GUTHRIE MUNICIPAL AIRPORT, OK US",2005-12-31,2018-08-18,Oklahoma,United States,35.8517,-97.4142,325.5,11,19,"(19, 11)" +755,855,WBAN:03030,"GUYMON MUNICIPAL AIRPORT, OK US",2005-12-31,2018-08-18,Oklahoma,United States,36.681670000000004,-101.50528,951.9,11,16,"(16, 11)" +756,856,WBAN:94836,"GWINN K I SAWYER AFB, MI US",2005-12-31,2018-08-18,Michigan,United States,46.35,-87.4,372.2,2,26,"(26, 2)" +757,857,WBAN:00150,"GWINNER ROGER MELROE FIELD AIRPORT, ND US",2014-06-30,2018-08-18,North Dakota,United States,46.217,-97.633,386.2,2,18,"(18, 2)" +758,858,WBAN:00221,"H A CLARK MEMORIAL FIELD AIRPORT, AZ US",2013-12-31,2018-08-18,Arizona,United States,35.30000000000001,-112.2,2035.1,12,8,"(8, 12)" +759,859,WBAN:00186,"H L SONNY CALLAHAN AIRPORT, AL US",2013-12-31,2018-08-18,Alabama,United States,30.46,-87.87700000000002,28.0,16,25,"(25, 16)" +760,861,WBAN:93706,"HAGERSTOWN WASHINGTON CO REGIONAL AIRPORT, MD US",2005-12-31,2018-08-18,Maryland,United States,39.70778,-77.72972,212.8,8,32,"(32, 8)" +761,862,WBAN:94161,"HAILEY FRIEDMAN MEMORIAL AIRPORT, ID US",2005-12-31,2018-08-18,Idaho,United States,43.5,-114.3,1617.3,5,7,"(7, 5)" +763,864,WBAN:00231,"HALIFAX NORTHAMPTON REGIONAL AIRPORT, NC US",2013-12-31,2018-08-18,North Carolina,United States,36.33,-77.635,44.2,11,33,"(33, 11)" +764,865,WBAN:53938,"HALLIBURTON FIELD AIRPORT, OK US",2005-12-31,2018-08-18,Oklahoma,United States,34.47083,-97.95083000000001,339.2,12,18,"(18, 12)" +766,867,WBAN:53855,"HAMILTON BUTLER CO REGIONAL AIRPORT, OH US",2005-12-31,2018-08-18,Ohio,United States,39.36444,-84.52472,193.2,8,28,"(28, 8)" +767,868,WBAN:00357,"HAMILTON MUNICIPAL AIRPORT, TX US",2013-12-31,2018-08-18,Texas,United States,31.666,-98.149,396.2,15,18,"(18, 15)" +768,869,WBAN:03908,"HAMMOND MUNICIPAL AIRPORT, LA US",2005-12-31,2018-08-18,Louisiana,United States,30.52083,-90.4175,13.4,16,23,"(23, 16)" +769,870,WBAN:00154,"HAMPTON ROADS EXECUTIVE AIRPORT, VA US",2012-12-31,2018-08-18,Virginia,United States,36.783,-76.45,7.0,10,33,"(33, 10)" +770,871,WBAN:14858,"HANCOCK HOUGHTON CO AIRPORT, MI US",1956-12-31,2018-08-18,Michigan,United States,47.16861,-88.48889,333.8,1,25,"(25, 1)" +771,872,WBAN:53119,"HANFORD MUNICIPAL AIRPORT, CA US",2005-12-31,2018-08-18,California,United States,36.31889,-119.62888999999998,75.9,11,3,"(3, 11)" +772,874,WBAN:23170,"HANKSVILLE AIRPORT, UT US",1972-12-31,2018-08-18,Utah,United States,38.41667,-110.7,1355.1,9,9,"(9, 9)" +773,875,WBAN:00455,"HANNIBAL REGIONAL AIRPORT, MO US",2013-12-31,2018-08-18,Missouri,United States,39.72516,-91.44386,234.7,8,23,"(23, 8)" +774,876,WBAN:04884,"HARBOR SPRINGS AIRPORT, MI US",2005-12-31,2018-08-18,Michigan,United States,45.42556,-84.91333,206.3,3,27,"(27, 3)" +775,877,WBAN:04936,"HARLAN MUNICIPAL AIRPORT, IA US",2005-12-31,2018-08-18,Iowa,United States,41.58417,-95.33944,375.2,6,20,"(20, 6)" +777,879,WBAN:00159,"HARRIET ALEXANDER FIELD AIRPORT, CO US",2013-12-31,2018-08-18,Colorado,United States,38.533,-106.05,2294.2000000000007,9,12,"(12, 9)" +778,880,WBAN:14751,"HARRISBURG CAPITAL CITY AIRPORT, PA US",1956-12-31,2018-08-18,Pennsylvania,United States,40.217220000000005,-76.85139000000001,103.6,7,33,"(33, 7)" +780,883,WBAN:13971,"HARRISON BOONE CO AIRPORT, AR US",1946-07-31,2018-08-18,Arkansas,United States,36.2668,-93.1566,418.8,11,22,"(22, 11)" +781,884,WBAN:00431,"HARRISON CO AIRPORT, TX US",2012-12-31,2018-08-18,Texas,United States,32.5205,-94.3077,108.8,14,21,"(21, 14)" +783,886,WBAN:14752,"HARTFORD BRAINARD FIELD, CT US",1973-12-31,2018-08-18,Connecticut,United States,41.73611,-72.65056,5.8,6,36,"(36, 6)" +784,887,WBAN:00219,"HARTSVILLE REGIONAL AIRPORT, SC US",2012-12-31,2018-08-18,South Carolina,United States,34.4,-80.117,111.3,12,31,"(31, 12)" +785,888,WBAN:00322,"HARVEY MUNICIPAL AIRPORT, ND US",2014-07-30,2018-08-18,North Dakota,United States,47.783,-99.93299999999999,489.2,1,17,"(17, 1)" +787,890,WBAN:13833,"HATTIESBURG CHAIN MUNICIPAL AIRPORT, MS US",1942-08-19,2018-08-18,Mississippi,United States,31.281940000000002,-89.25305999999998,46.0,15,24,"(24, 15)" +789,892,WBAN:94012,"HAVRE AIRPORT ASOS, MT US",1961-01-31,2018-08-18,Montana,United States,48.5428,-109.7633,787.9,0,10,"(10, 0)" +790,893,WBAN:03167,"HAWTHORNE MUNICIPAL AIRPORT, CA US",2005-12-31,2018-08-18,California,United States,33.92278,-118.33417,19.2,13,4,"(4, 13)" +791,894,WBAN:94025,"HAYDEN YAMPA VALLEY AIRPORT, CO US",2005-12-31,2018-08-18,Colorado,United States,40.48111,-107.2175,2011.7,7,12,"(12, 7)" +792,895,WBAN:03968,"HAYS MUNICIPAL AIRPORT, KS US",2005-12-31,2018-08-18,Kansas,United States,38.85,-99.26667,609.0,9,17,"(17, 9)" +793,896,WBAN:93228,"HAYWARD AIR TERMINAL, CA US",1999-12-31,2018-08-18,California,United States,37.6542,-122.115,13.1,10,1,"(1, 10)" +794,897,WBAN:94973,"HAYWARD MUNICIPAL AIRPORT, WI US",2005-12-31,2018-08-18,Wisconsin,United States,46.02611,-91.44417,367.0,2,23,"(23, 2)" +796,899,WBAN:53973,"HEARNE MUNICIPAL AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,30.871940000000002,-96.62222,86.9,16,19,"(19, 16)" +797,900,WBAN:00337,"HEART OF GEORGIA REGIONAL AIRPORT, GA US",2012-12-31,2018-08-18,Georgia,United States,32.214,-83.12799999999999,93.3,14,29,"(29, 14)" +798,903,WBAN:04998,"HEBRON MUNICIPAL AIRPORT, NE US",2005-12-31,2018-08-18,Nebraska,United States,40.14917,-97.58667,449.0,7,18,"(18, 7)" +799,904,WBAN:24144,"HELENA AIRPORT ASOS, MT US",1956-12-31,2018-08-18,Montana,United States,46.6056,-111.9636,1166.8,2,8,"(8, 2)" +800,905,WBAN:53886,"HENDERSON CITY CO AIRPORT, KY US",2005-12-31,2018-08-18,Kentucky,United States,37.8,-87.68333,118.0,10,25,"(25, 10)" +801,906,WBAN:03711,"HENDERSON OXFORD AIRPORT, NC US",2005-12-31,2018-08-18,North Carolina,United States,36.36139,-78.52888999999998,160.6,11,32,"(32, 11)" +802,907,WBAN:00250,"HENRY TIFT MYERS AIRPORT, GA US",2012-12-31,2018-08-18,Georgia,United States,31.429,-83.48899999999999,108.2,15,28,"(28, 15)" +803,908,WBAN:00129,"HEREFORD MUNICIPAL AIRPORT, TX US",2013-12-31,2018-08-18,Texas,United States,34.85,-102.333,1153.1,12,15,"(15, 12)" +804,909,WBAN:04113,"HERMISTON MUNICIPAL AIRPORT, OR US",2005-12-31,2018-08-18,Oregon,United States,45.82583,-119.26111000000002,195.4,3,3,"(3, 3)" +805,910,WBAN:94038,"HETTINGER MUNICIPAL AIRPORT, ND US",2005-12-31,2018-08-18,North Dakota,United States,46.01389,-102.65472,824.5,2,15,"(15, 2)" +806,911,WBAN:94931,"HIBBING CHISHOLM HIBBING AIRPORT, MN US",1971-12-31,2018-08-18,Minnesota,United States,47.386390000000006,-92.83889,412.1,1,22,"(22, 1)" +807,912,WBAN:03810,"HICKORY FAA AIRPORT, NC US",1972-12-31,2018-08-18,North Carolina,United States,35.74207,-81.38229,358.1,11,30,"(30, 11)" +808,913,WBAN:00306,HIGH ISLAND 179 OIL PLATFORM,2012-12-31,2018-08-18,,,29.183000000000003,-94.517,75.3,17,21,"(21, 17)" +809,914,WBAN:00260,HIGH ISLAND 376,2013-12-31,2018-08-18,,,27.962,-93.671,0.3,18,21,"(21, 18)" +810,916,WBAN:93990,"HILL CITY MUNICIPAL AIRPORT, KS US",1972-12-31,2018-08-18,Kansas,United States,39.37556,-99.82972,666.9,8,17,"(17, 8)" +811,917,WBAN:53972,"HILLSBORO MUNICIPAL AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,32.08361,-97.09722,208.8,15,19,"(19, 15)" +813,919,WBAN:63837,"HILTON HEAD ISLAND AIRPORT, SC US",2005-12-31,2018-08-18,South Carolina,United States,32.21667,-80.7,7.3,14,30,"(30, 14)" +814,920,WBAN:93986,"HOBART MUNICIPAL AIRPORT, OK US",1972-12-31,2018-08-18,Oklahoma,United States,34.9894,-99.0525,474.3,12,17,"(17, 12)" +815,921,WBAN:93034,"HOBBS LEA CO AIRPORT, NM US",1942-10-31,2018-08-18,New Mexico,United States,32.6933,-103.2125,1114.0,14,14,"(14, 14)" +816,923,WBAN:04935,"HOLDREGE BREWSTER FIELD AIRPORT, NE US",2005-12-31,2018-08-18,Nebraska,United States,40.45,-99.33917,702.3000000000002,7,17,"(17, 7)" +818,925,WBAN:00392,"HOLLISTER MUNICIPAL AIRPORT, CA US",1945-02-28,2018-08-18,California,United States,36.9,-121.417,72.2,10,2,"(2, 10)" +819,926,WBAN:23002,"HOLLOMAN AFB, NM US",2006-01-02,2018-08-18,New Mexico,United States,32.85,-106.1,1267.4,14,12,"(12, 14)" +820,927,WBAN:23803,"HOLLY SPRINGS 4 N, MS US",2008-01-31,2018-08-16,Mississippi,United States,34.8223,-89.43480000000002,147.5,12,24,"(24, 12)" +821,928,WBAN:00163,"HOLYOKE AIRPORT, CO US",2013-12-31,2018-08-18,Colorado,United States,40.567,-102.267,1137.2,7,15,"(15, 7)" +822,929,WBAN:00128,"HOMERVILLE AIRPORT, GA US",2012-12-31,2018-08-18,Georgia,United States,31.055999999999997,-82.76700000000002,57.3,15,29,"(29, 15)" +823,930,WBAN:12962,"HONDO MUNICIPAL AIRPORT, TX US",1942-09-14,2018-08-18,Texas,United States,29.360100000000006,-99.1742,280.40000000000003,17,17,"(17, 17)" +824,931,WBAN:00429,"HOPKINS FIELD AIRPORT, CO US",2012-12-31,2018-08-18,Colorado,United States,38.23875,-108.56326999999999,1810.5,9,11,"(11, 9)" +825,932,WBAN:94225,"HOQUIAM BOWERMAN AIRPORT, WA US",1956-12-31,2018-08-18,Washington,United States,46.9727,-123.9302,3.7,2,0,"(0, 2)" +826,933,WBAN:00225,"HORSESHOE BAY RESORT AIRPORT, TX US",2012-12-31,2018-08-18,Texas,United States,30.533,-98.367,333.1,16,18,"(18, 16)" +827,934,WBAN:03962,"HOT SPRINGS ASOS, AR US",2005-12-31,2018-08-18,Arkansas,United States,34.29,-93.06,163.1,13,22,"(22, 13)" +828,935,WBAN:93757,"HOT SPRINGS INGALLS FIELD, VA US",2005-12-31,2018-08-18,Virginia,United States,37.95,-79.81667,1156.1,9,31,"(31, 9)" +830,937,WBAN:14609,"HOULTON AIRPORT, ME US",1999-12-31,2018-08-18,Maine,United States,46.1185,-67.7928,145.1,2,39,"(39, 2)" +831,938,WBAN:12927,"HOUMA TERREBONNE AIRPORT, LA US",2005-12-31,2018-08-18,Louisiana,United States,29.566390000000002,-90.66028,4.0,17,23,"(23, 17)" +840,948,WBAN:12918,"HOUSTON WILLIAM P HOBBY AIRPORT, TX US",1946-07-27,2018-08-18,Texas,United States,29.63806,-95.28194,13.4,17,20,"(20, 17)" +841,949,WBAN:04887,"HOWELL LIVINGSTON CO AIRPORT, MI US",2005-12-31,2018-08-18,Michigan,United States,42.62944,-83.98416999999998,287.7,5,28,"(28, 5)" +842,950,WBAN:00484,"HULETT MUNICIPAL AIRPORT, WY US",2014-07-30,2018-08-18,Wyoming,United States,44.66286,-104.56783,1300.0,4,13,"(13, 4)" +843,951,WBAN:53896,"HUNTINGBURG AIRPORT, IN US",2005-12-31,2018-08-18,Indiana,United States,38.24889,-86.95361,161.20000000000005,9,26,"(26, 9)" +844,952,WBAN:03860,"HUNTINGTON TRI STATE AIRPORT, WV US",1961-11-30,2018-08-18,West Virginia,United States,38.365,-82.555,251.2,9,29,"(29, 9)" +846,954,WBAN:63804,"HUNTSVILLE MADISON CO EXECUTIVE AIRPORT, AL US",2005-12-31,2018-08-18,Alabama,United States,34.86139,-86.55722,230.1,12,26,"(26, 12)" +847,955,WBAN:53903,"HUNTSVILLE MUNICIPAL AIRPORT, TX US",2005-12-31,2018-08-18,Texas,United States,30.743890000000004,-95.58611,111.6,16,20,"(20, 16)" +848,956,WBAN:14936,"HURON REGIONAL AIRPORT, SD US",1956-12-31,2018-08-18,South Dakota,United States,44.3981,-98.2231,390.1,4,18,"(18, 4)" +849,957,WBAN:13986,"HUTCHINSON MUNICIPAL AIRPORT, KS US",1945-01-31,2018-08-18,Kansas,United States,38.06528,-97.86056,470.3,9,18,"(18, 9)" +850,958,WBAN:04933,"HUTCHINSON MUNICIPAL BUTLER FIELD AIRPORT, MN US",2005-12-31,2018-08-18,Minnesota,United States,44.85889,-94.38167,323.1,3,21,"(21, 3)" +851,959,WBAN:00291,"HUTSON FIELD AIRPORT, ND US",2013-12-31,2018-08-18,North Dakota,United States,48.405,-97.371,251.2,0,19,"(19, 0)" +852,960,WBAN:94720,"HYANNIS BARNSTABLE MUNICIPAL AIRPORT, MA US",2005-12-31,2018-08-18,Massachusetts,United States,41.66861,-70.28,16.8,6,38,"(38, 6)" +853,961,WBAN:53990,"IDABEL MCCURTAIN CO REGIONAL AIRPORT, OK US",2005-12-31,2018-08-18,Oklahoma,United States,33.909440000000004,-94.85944,143.9,13,20,"(20, 13)" +854,962,WBAN:00452,"IDAHO CO AIRPORT, ID US",2013-12-31,2018-08-18,Idaho,United States,45.94255,-116.12341,1010.1,2,5,"(5, 2)" +855,963,WBAN:24145,"IDAHO FALLS FANNING FIELD, ID US",1956-12-31,2018-08-18,Idaho,United States,43.51639,-112.06722,1441.4,5,8,"(8, 5)" +857,965,WBAN:93115,"IMPERIAL BEACH REAM FIELD NAS, CA US",1956-12-31,2018-08-18,California,United States,32.56667,-117.11667,7.3,14,5,"(5, 14)" +858,966,WBAN:03144,"IMPERIAL CO AIRPORT, CA US",2005-12-31,2018-08-18,California,United States,32.83417,-115.57861000000001,-17.7,14,6,"(6, 14)" +859,967,WBAN:24091,"IMPERIAL MUNICIPAL AIRPORT, NE US",1973-03-31,2018-08-18,Nebraska,United States,40.51,-101.62,996.1,7,16,"(16, 7)" +861,969,WBAN:00141,"INDEPENDENCE MUNICIPAL AIRPORT, KS US",1944-01-31,2018-08-18,Kansas,United States,37.158,-95.77799999999999,251.2,10,20,"(20, 10)" +862,971,WBAN:23141,"INDIAN SPRINGS, NV US",1963-09-02,2018-08-18,Nevada,United States,36.58333,-115.68333,951.9,11,6,"(6, 11)" +863,972,WBAN:64706,"INDIANA J STEWART, PA US",2005-12-31,2018-08-18,Pennsylvania,United States,40.63333,-79.10000000000002,428.2,7,31,"(31, 7)" +866,975,WBAN:93819,"INDIANAPOLIS INTERNATIONAL AIRPORT, IN US",1942-10-05,2018-08-18,Indiana,United States,39.72517,-86.28168000000001,241.1,8,26,"(26, 8)" +867,977,WBAN:14918,"INTERNATIONAL FALLS INTERNATIONAL AIRPORT, MN US",1956-12-31,2018-08-18,Minnesota,United States,48.5614,-93.3981,360.6,0,21,"(21, 0)" +868,978,WBAN:00377,"INVERNESS AIRPORT, FL US",2012-12-31,2018-08-18,Florida,United States,28.816999999999997,-82.31700000000002,15.2,17,29,"(29, 17)" +869,980,WBAN:00240,"IONIA CO AIRPORT, MI US",2014-07-30,2018-08-18,Michigan,United States,42.938,-85.061,249.0,5,27,"(27, 5)" +870,981,WBAN:14937,"IOWA CITY MUNICIPAL AIRPORT, IA US",1997-01-22,2018-08-18,Iowa,United States,41.63278,-91.54306,198.1,6,23,"(23, 6)" +871,982,WBAN:54941,"IOWA FALLS MUNICIPAL AIRPORT, IA US",2013-06-20,2018-08-18,Iowa,United States,42.47138,-93.20707,346.6,5,22,"(22, 5)" +873,984,WBAN:94926,"IRONWOOD, MI US",2005-12-31,2018-08-18,Michigan,United States,46.53333,-90.13333,374.9,2,24,"(24, 2)" +874,985,WBAN:04997,"ISEDOR IVERSON AIRPORT, MN US",2005-12-31,2018-08-18,Minnesota,United States,46.61889,-93.30972,374.3,2,21,"(21, 2)" +875,986,WBAN:04781,"ISLIP LI MACARTHUR AIRPORT, NY US",1972-12-31,2018-08-18,New York,United States,40.7939,-73.10170000000002,25.6,7,36,"(36, 7)" +876,988,WBAN:94761,"ITHACA TOMPKINS CNTY, NY US",2005-12-31,2018-08-18,New York,United States,42.48333,-76.46667,335.0,5,33,"(33, 5)" +877,989,WBAN:00464,"J DOUGLAS BAKE MEMORIAL AIRPORT, WI US",2014-07-30,2018-08-18,Wisconsin,United States,44.87405,-87.90977,184.4,3,25,"(25, 3)" +878,990,WBAN:00216,"JACK BARSTOW AIRPORT, MI US",2013-12-31,2018-08-18,Michigan,United States,43.663,-84.26100000000002,194.2,4,28,"(28, 4)" +879,991,WBAN:00394,"JACKSON CO AIRPORT, GA US",2013-12-31,2018-08-17,Georgia,United States,34.147,-83.561,290.2,13,28,"(28, 13)" +881,993,WBAN:24166,"JACKSON HOLE AIRPORT, WY US",2005-12-31,2018-08-17,Wyoming,United States,43.6,-110.73333000000001,1956.5,4,9,"(9, 4)" +882,994,WBAN:03940,"JACKSON INTERNATIONAL AIRPORT, MS US",1942-08-31,2018-08-18,Mississippi,United States,32.3205,-90.0777,100.6,14,24,"(24, 14)" +883,995,WBAN:03889,"JACKSON JULIAN CARROLL AIRPORT, KY US",1973-01-01,2018-08-18,Kentucky,United States,37.591390000000004,-83.31443999999998,416.1,10,29,"(29, 10)" +884,996,WBAN:03811,"JACKSON MCKELLAR SIPES AIRPORT, TN US",1972-12-31,2018-08-18,Tennessee,United States,35.593,-88.9167,132.0,11,25,"(25, 11)" +885,997,WBAN:04946,"JACKSON MUNICIPAL AIRPORT, MN US",2005-12-31,2018-08-18,Minnesota,United States,43.65,-94.98639,440.7,4,20,"(20, 4)" +886,998,WBAN:14833,"JACKSON REYNOLDS FIELD, MI US",1972-12-31,2018-08-18,Michigan,United States,42.2667,-84.4667,304.2,6,28,"(28, 6)" +887,999,WBAN:93753,"JACKSONVILLE ALBERT ELLIS AIRPORT, NC US",2005-12-31,2018-08-18,North Carolina,United States,34.83333,-77.61667,29.3,12,33,"(33, 12)" diff --git a/Project Final/Project.ipynb b/Project Final/Project.ipynb deleted file mode 100644 index 3924940..0000000 --- a/Project Final/Project.ipynb +++ /dev/null @@ -1,532 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Project Notebook\n", - "This is the full and complete notebook that takes in the data from NOAA and processes it into frames to be used in the PredNet architecture and produce a resulting prediction." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import os\n", - "from tqdm import tqdm" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#Getting a list of files in raw data folder\n", - "filenames = os.listdir('D:/Nico/Desktop/processed_data')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "header_wanted = [\n", - " 'HOURLYVISIBILITY',\n", - " 'HOURLYDRYBULBTEMPC',\n", - " 'HOURLYWETBULBTEMPC',\n", - " 'HOURLYDewPointTempC',\n", - " 'HOURLYRelativeHumidity',\n", - " 'HOURLYWindSpeed',\n", - " 'HOURLYWindGustSpeed',\n", - " 'HOURLYStationPressure',\n", - " 'HOURLYPressureTendency',\n", - " 'HOURLYPressureChange',\n", - " 'HOURLYSeaLevelPressure',\n", - " 'HOURLYPrecip',\n", - " 'HOURLYAltimeterSetting']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "usecols = ['DATE','STATION'] + header_wanted" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#Loading all files into a pandas Dataframe\n", - "tqdm.pandas()\n", - "df = pd.concat([pd.read_csv('D:/Nico/Desktop/processed_data/{}'.format(x), usecols=usecols, low_memory=False) for x in tqdm(filenames)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At this point all the data has been loaded into a single dataframe and any data changes have been made. The next step is to break the data up by WBAN and place in a 2D array at the appropriate grid cell. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stations = pd.read_csv(\"../Playground/stations_unique.csv\", usecols = ['STATION_ID', 'LON_SCALED', 'LAT_SCALED'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "height = 20\n", - "width = 40" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mask = [([0] * width) for i in range(height)]\n", - "\n", - "wban_loc = dict(zip(stations.STATION_ID,zip(stations.LON_SCALED,stations.LAT_SCALED)))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grid = [([pd.DataFrame()] * width) for i in range(height)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for key, value in tqdm(wban_loc.items()):\n", - " mask[value[1]][value[0]] = 1\n", - " grid[value[1]][value[0]] = df.loc[df.STATION == key]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.imshow(mask)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#TODO Handle different sized data some stacks too short\n", - "def create_frames(data,height, width, depth):\n", - " days = []\n", - " frames = []\n", - " for i in tqdm(range(depth)):\n", - " frame = np.zeros((height,width,12))\n", - " for y in range(height):\n", - " for x in range(width):\n", - " if(not data[y][x].empty):\n", - " frame[y][x] = data[y][x].iloc[[i],1:13].values.flatten()\n", - " if((i+1)%24 != 0):\n", - " frames.append(frame)\n", - " else:\n", - " frames.append(frame)\n", - " days.append(frames)\n", - " frames = []\n", - " return days" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def average_grid_fill(mask,data, height, width):\n", - " \n", - " for i in range(height):\n", - " for j in range(width):\n", - " if(mask[i][j] != 1):\n", - " neighbors = get_neighbors(j,i,data)\n", - " data[i][j] = np.mean(neighbors)\n", - " \n", - " return data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_neighbors(x,y,g):\n", - " neighbors = []\n", - " for i in [y-1,y,y+1]:\n", - " for j in [x-1,x,x+1]:\n", - " if(i >= 0 and j >= 0):\n", - " if(i != y or j != x ):\n", - " try:\n", - " neighbors.append(g[i][j])\n", - " except:\n", - " pass\n", - " return neighbors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def store_sequence(frames):\n", - " import hickle as hkl\n", - " source_list = []\n", - " \n", - " for days in range(len(frames)):\n", - " for day in range(len(frames[days])):\n", - " source_list += '{}'.format(days)\n", - " \n", - " hkl.dump(frames, './data/train/x_train.hkl')\n", - " hkl.dump(source_list, './data/train/x_sources.hkl')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Splits is a dictionary holding train, test, val\n", - "the values for train, test, and val are lists of tuples holding category and folder name\n", - "in the end each image gets a source associated with it\n", - "there is only one data and one source hickle dump for each of train test and val" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "frames = create_frames(grid, height, width,504)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#TODO use loop to average each frame\n", - "for x in tqdm(range(len(frames))):\n", - " for y in range(len(frames[0])):\n", - " frames[x][y] = average_grid_fill(mask, frames[x][y], height, width )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "store_sequence(frames)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np_frames = np.array(frames)\n", - "np_frames.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "store_sequence(np_frames)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At this point I have processed the data and made it into discrete frames of data and it is time to run it through the PredNet architecture for training." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], - "source": [ - "np.random.seed(123)\n", - "from six.moves import cPickle\n", - "\n", - "from keras import backend as K\n", - "from keras.models import Model\n", - "from keras.layers import Input, Dense, Flatten\n", - "from keras.layers import LSTM\n", - "from keras.layers import TimeDistributed\n", - "from keras.callbacks import LearningRateScheduler, ModelCheckpoint\n", - "from keras.optimizers import Adam\n", - "\n", - "from prednet import PredNet\n", - "from data_utils import SequenceGenerator" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "WEIGHTS_DIR = './weights/'\n", - "DATA_DIR = './data/'" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "save_model = True # if weights will be saved\n", - "weights_file = os.path.join(WEIGHTS_DIR, 'prednet_weather_weights.hdf5') # where weights will be saved\n", - "json_file = os.path.join(WEIGHTS_DIR, 'prednet_weather_model.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Data files\n", - "#TODO: Use the files from NOAA and process them into proper frames\n", - "train_file = os.path.join(DATA_DIR,'train/', 'x_train.hkl')\n", - "train_sources = os.path.join(DATA_DIR, 'train/', 'x_sources.hkl')\n", - "#val_file = os.path.join(DATA_DIR, 'X_val.hkl')\n", - "#val_sources = os.path.join(DATA_DIR, 'sources_val.hkl')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Training parameters\n", - "nb_epoch = 1\n", - "batch_size = 4\n", - "samples_per_epoch = 500\n", - "N_seq_val = 100 # number of sequences to use for validation" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Model parameters\n", - "n_channels, im_height, im_width = (12, 20, 40)\n", - "input_shape = (n_channels, im_height, im_width) if K.image_data_format() == 'channels_first' else (im_height, im_width, n_channels)\n", - "stack_sizes = (n_channels, 48, 96)\n", - "R_stack_sizes = stack_sizes\n", - "A_filt_sizes = (3, 3)\n", - "Ahat_filt_sizes = (3, 3, 3)\n", - "R_filt_sizes = (3, 3, 3)\n", - "layer_loss_weights = np.array([1., 0., 0.]) # weighting for each layer in final loss; \"L_0\" model: [1, 0, 0, 0], \"L_all\": [1, 0.1, 0.1, 0.1]\n", - "layer_loss_weights = np.expand_dims(layer_loss_weights, 1)\n", - "nt = 24 # number of timesteps used for sequences in training\n", - "time_loss_weights = 1./ (nt - 1) * np.ones((nt,1)) # equally weight all timesteps except the first\n", - "time_loss_weights[0] = 0" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "prednet = PredNet(stack_sizes, R_stack_sizes,\n", - " A_filt_sizes, Ahat_filt_sizes, R_filt_sizes,\n", - " output_mode='error', return_sequences=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "inputs = Input(shape=(nt,) + input_shape)\n", - "errors = prednet(inputs) # errors will be (batch_size, nt, nb_layers)\n", - "errors_by_time = TimeDistributed(Dense(1, trainable=False), weights=[layer_loss_weights, np.zeros(1)], trainable=False)(errors) # calculate weighted error by layer\n", - "errors_by_time = Flatten()(errors_by_time) # will be (batch_size, nt)\n", - "final_errors = Dense(1, weights=[time_loss_weights, np.zeros(1)], trainable=False)(errors_by_time) # weight errors by time\n", - "model = Model(inputs=inputs, outputs=final_errors)\n", - "model.compile(loss='mean_absolute_error', optimizer='adam')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "input_1 (InputLayer) (None, 24, 20, 40, 12) 0 \n", - "_________________________________________________________________\n", - "pred_net_1 (PredNet) (None, 24, 3) 1645548 \n", - "_________________________________________________________________\n", - "time_distributed_1 (TimeDist (None, 24, 1) 4 \n", - "_________________________________________________________________\n", - "flatten_1 (Flatten) (None, 24) 0 \n", - "_________________________________________________________________\n", - "dense_2 (Dense) (None, 1) 25 \n", - "=================================================================\n", - "Total params: 1,645,577\n", - "Trainable params: 1,645,548\n", - "Non-trainable params: 29\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "model.summary()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "truth = []\n", - "for i in range(20):\n", - " truth.append(np.random.randint(255,size=(1)))\n", - "output = np.array(truth)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "train_generator = SequenceGenerator(train_file, train_sources, nt, batch_size=batch_size, shuffle=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lr_schedule = lambda epoch: 0.001 if epoch < 75 else 0.0001 # start with lr of 0.001 and then drop to 0.0001 after 75 epochs\n", - "callbacks = [LearningRateScheduler(lr_schedule)]\n", - "#history = model.fit(np_frames, output ,batch_size, nb_epoch, callbacks=callbacks)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/1\n" - ] - } - ], - "source": [ - "history = model.fit_generator(train_generator, samples_per_epoch / batch_size, nb_epoch, callbacks=callbacks)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/Project Final/Training/Training.ipynb b/Project Final/Training/Training.ipynb new file mode 100644 index 0000000..59ca17d --- /dev/null +++ b/Project Final/Training/Training.ipynb @@ -0,0 +1,544 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import os\n", + "np.random.seed(123)\n", + "from six.moves import cPickle\n", + "\n", + "from keras import backend as K\n", + "from keras.models import Model\n", + "from keras.layers import Input, Dense, Flatten\n", + "from keras.layers import LSTM\n", + "from keras.layers import TimeDistributed\n", + "from keras.callbacks import LearningRateScheduler, ModelCheckpoint\n", + "from keras.optimizers import Adam\n", + "\n", + "from prednet import PredNet\n", + "from data_utils import SequenceGenerator" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "WEIGHTS_DIR = './weights/'\n", + "DATA_DIR = '../data/'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "save_model = True # if weights will be saved\n", + "weights_file = os.path.join(WEIGHTS_DIR, 'prednet_weather_weights.hdf5') # where weights will be saved\n", + "json_file = os.path.join(WEIGHTS_DIR, 'prednet_weather_model.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Data files\n", + "train_file = os.path.join(DATA_DIR, 'x_train.hkl')\n", + "train_sources = os.path.join(DATA_DIR, 'sources_train.hkl')\n", + "val_file = os.path.join(DATA_DIR, 'x_val.hkl')\n", + "val_sources = os.path.join(DATA_DIR, 'sources_val.hkl')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Training parameters\n", + "nb_epoch = 150\n", + "batch_size = 24\n", + "samples_per_epoch = 500\n", + "N_seq_val = 140 # number of sequences to use for validation" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Model parameters\n", + "n_channels, im_height, im_width = (7, 20, 40)\n", + "input_shape = (n_channels, im_height, im_width) if K.image_data_format() == 'channels_first' else (im_height, im_width, n_channels)\n", + "stack_sizes = (n_channels, 48, 96)\n", + "R_stack_sizes = stack_sizes\n", + "A_filt_sizes = (3, 3)\n", + "Ahat_filt_sizes = (3, 3, 3)\n", + "R_filt_sizes = (3, 3, 3)\n", + "layer_loss_weights = np.array([1., 0., 0.]) # weighting for each layer in final loss; \"L_0\" model: [1, 0, 0, 0], \"L_all\": [1, 0.1, 0.1, 0.1]\n", + "layer_loss_weights = np.expand_dims(layer_loss_weights, 1)\n", + "nt = 24 # number of timesteps used for sequences in training\n", + "time_loss_weights = 1./ (nt - 1) * np.ones((nt,1)) # equally weight all timesteps except the first\n", + "time_loss_weights[0] = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "prednet = PredNet(stack_sizes, R_stack_sizes,\n", + " A_filt_sizes, Ahat_filt_sizes, R_filt_sizes,\n", + " output_mode='error', return_sequences=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "inputs = Input(shape=(nt,) + input_shape)\n", + "errors = prednet(inputs) # errors will be (batch_size, nt, nb_layers)\n", + "errors_by_time = TimeDistributed(Dense(1, trainable=False), weights=[layer_loss_weights, np.zeros(1)], trainable=False)(errors) # calculate weighted error by layer\n", + "errors_by_time = Flatten()(errors_by_time) # will be (batch_size, nt)\n", + "final_errors = Dense(1, weights=[time_loss_weights, np.zeros(1)], trainable=False)(errors_by_time) # weight errors by time\n", + "model = Model(inputs=inputs, outputs=final_errors)\n", + "model.compile(loss='mean_absolute_error', optimizer='adam')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_1 (InputLayer) (None, 24, 20, 40, 7) 0 \n", + "_________________________________________________________________\n", + "pred_net_1 (PredNet) (None, 24, 3) 1621448 \n", + "_________________________________________________________________\n", + "time_distributed_1 (TimeDist (None, 24, 1) 4 \n", + "_________________________________________________________________\n", + "flatten_1 (Flatten) (None, 24) 0 \n", + "_________________________________________________________________\n", + "dense_2 (Dense) (None, 1) 25 \n", + "=================================================================\n", + "Total params: 1,621,477\n", + "Trainable params: 1,621,448\n", + "Non-trainable params: 29\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "train_generator = SequenceGenerator(train_file, train_sources, nt, batch_size=batch_size, shuffle=False)\n", + "val_generator = SequenceGenerator(val_file, val_sources, nt, batch_size=batch_size, N_seq=N_seq_val)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "lr_schedule = lambda epoch: 0.001 if epoch < 75 else 0.0001 # start with lr of 0.001 and then drop to 0.0001 after 75 epochs\n", + "callbacks = [LearningRateScheduler(lr_schedule)]\n", + "if save_model:\n", + " if not os.path.exists(WEIGHTS_DIR): os.mkdir(WEIGHTS_DIR)\n", + " callbacks.append(ModelCheckpoint(filepath=weights_file, monitor='val_loss', save_best_only=True))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/150\n", + " - 21s - loss: 0.9718 - val_loss: 0.9142\n", + "Epoch 2/150\n", + " - 15s - loss: 0.9089 - val_loss: 0.8895\n", + "Epoch 3/150\n", + " - 15s - loss: 0.9057 - val_loss: 0.8826\n", + "Epoch 4/150\n", + " - 15s - loss: 0.8905 - val_loss: 0.8765\n", + "Epoch 5/150\n", + " - 15s - loss: 0.9106 - val_loss: 0.8840\n", + "Epoch 6/150\n", + " - 15s - loss: 0.8812 - val_loss: 0.8749\n", + "Epoch 7/150\n", + " - 15s - loss: 0.9099 - val_loss: 0.8897\n", + "Epoch 8/150\n", + " - 15s - loss: 0.8829 - val_loss: 0.8711\n", + "Epoch 9/150\n", + " - 15s - loss: 0.9039 - val_loss: 0.8843\n", + "Epoch 10/150\n", + " - 15s - loss: 0.8814 - val_loss: 0.8696\n", + "Epoch 11/150\n", + " - 15s - loss: 0.8897 - val_loss: 0.8881\n", + "Epoch 12/150\n", + " - 15s - loss: 0.8803 - val_loss: 0.8696\n", + "Epoch 13/150\n", + " - 15s - loss: 0.8819 - val_loss: 0.8836\n", + "Epoch 14/150\n", + " - 15s - loss: 0.8786 - val_loss: 0.8672\n", + "Epoch 15/150\n", + " - 15s - loss: 0.8732 - val_loss: 0.8671\n", + "Epoch 16/150\n", + " - 15s - loss: 0.8805 - val_loss: 0.8698\n", + "Epoch 17/150\n", + " - 15s - loss: 0.8643 - val_loss: 0.8600\n", + "Epoch 18/150\n", + " - 15s - loss: 0.8845 - val_loss: 0.8574\n", + "Epoch 19/150\n", + " - 16s - loss: 0.8581 - val_loss: 0.8568\n", + "Epoch 20/150\n", + " - 15s - loss: 0.8815 - val_loss: 0.8588\n", + "Epoch 21/150\n", + " - 15s - loss: 0.8622 - val_loss: 0.8575\n", + "Epoch 22/150\n", + " - 15s - loss: 0.8737 - val_loss: 0.8604\n", + "Epoch 23/150\n", + " - 15s - loss: 0.8619 - val_loss: 0.8568\n", + "Epoch 24/150\n", + " - 15s - loss: 0.8694 - val_loss: 0.8606\n", + "Epoch 25/150\n", + " - 15s - loss: 0.8638 - val_loss: 0.8542\n", + "Epoch 26/150\n", + " - 15s - loss: 0.8664 - val_loss: 0.8591\n", + "Epoch 27/150\n", + " - 15s - loss: 0.8700 - val_loss: 0.8551\n", + "Epoch 28/150\n", + " - 15s - loss: 0.8576 - val_loss: 0.8534\n", + "Epoch 29/150\n", + " - 15s - loss: 0.8751 - val_loss: 0.8512\n", + "Epoch 30/150\n", + " - 15s - loss: 0.8532 - val_loss: 0.8520\n", + "Epoch 31/150\n", + " - 15s - loss: 0.8758 - val_loss: 0.8518\n", + "Epoch 32/150\n", + " - 15s - loss: 0.8565 - val_loss: 0.8514\n", + "Epoch 33/150\n", + " - 15s - loss: 0.8688 - val_loss: 0.8500\n", + "Epoch 34/150\n", + " - 15s - loss: 0.8571 - val_loss: 0.8521\n", + "Epoch 35/150\n", + " - 15s - loss: 0.8659 - val_loss: 0.8501\n", + "Epoch 36/150\n", + " - 15s - loss: 0.8595 - val_loss: 0.8508\n", + "Epoch 37/150\n", + " - 15s - loss: 0.8634 - val_loss: 0.8512\n", + "Epoch 38/150\n", + " - 15s - loss: 0.8642 - val_loss: 0.8505\n", + "Epoch 39/150\n", + " - 15s - loss: 0.8562 - val_loss: 0.8490\n", + "Epoch 40/150\n", + " - 15s - loss: 0.8706 - val_loss: 0.8491\n", + "Epoch 41/150\n", + " - 15s - loss: 0.8498 - val_loss: 0.8490\n", + "Epoch 42/150\n", + " - 15s - loss: 0.8727 - val_loss: 0.8479\n", + "Epoch 43/150\n", + " - 15s - loss: 0.8519 - val_loss: 0.8473\n", + "Epoch 44/150\n", + " - 15s - loss: 0.8671 - val_loss: 0.8474\n", + "Epoch 45/150\n", + " - 15s - loss: 0.8534 - val_loss: 0.8485\n", + "Epoch 46/150\n", + " - 15s - loss: 0.8624 - val_loss: 0.8466\n", + "Epoch 47/150\n", + " - 15s - loss: 0.8563 - val_loss: 0.8467\n", + "Epoch 48/150\n", + " - 15s - loss: 0.8607 - val_loss: 0.8468\n", + "Epoch 49/150\n", + " - 15s - loss: 0.8594 - val_loss: 0.8475\n", + "Epoch 50/150\n", + " - 15s - loss: 0.8548 - val_loss: 0.8457\n", + "Epoch 51/150\n", + " - 15s - loss: 0.8671 - val_loss: 0.8456\n", + "Epoch 52/150\n", + " - 15s - loss: 0.8476 - val_loss: 0.8453\n", + "Epoch 53/150\n", + " - 15s - loss: 0.8701 - val_loss: 0.8452\n", + "Epoch 54/150\n", + " - 15s - loss: 0.8470 - val_loss: 0.8455\n", + "Epoch 55/150\n", + " - 15s - loss: 0.8674 - val_loss: 0.8447\n", + "Epoch 56/150\n", + " - 15s - loss: 0.8502 - val_loss: 0.8457\n", + "Epoch 57/150\n", + " - 15s - loss: 0.8614 - val_loss: 0.8443\n", + "Epoch 58/150\n", + " - 15s - loss: 0.8532 - val_loss: 0.8448\n", + "Epoch 59/150\n", + " - 15s - loss: 0.8590 - val_loss: 0.8443\n", + "Epoch 60/150\n", + " - 15s - loss: 0.8561 - val_loss: 0.8439\n", + "Epoch 61/150\n", + " - 15s - loss: 0.8543 - val_loss: 0.8441\n", + "Epoch 62/150\n", + " - 15s - loss: 0.8630 - val_loss: 0.8444\n", + "Epoch 63/150\n", + " - 15s - loss: 0.8472 - val_loss: 0.8437\n", + "Epoch 64/150\n", + " - 15s - loss: 0.8688 - val_loss: 0.8435\n", + "Epoch 65/150\n", + " - 15s - loss: 0.8435 - val_loss: 0.8439\n", + "Epoch 66/150\n", + " - 15s - loss: 0.8675 - val_loss: 0.8439\n", + "Epoch 67/150\n", + " - 15s - loss: 0.8484 - val_loss: 0.8432\n", + "Epoch 68/150\n", + " - 15s - loss: 0.8605 - val_loss: 0.8433\n", + "Epoch 69/150\n", + " - 15s - loss: 0.8508 - val_loss: 0.8438\n", + "Epoch 70/150\n", + " - 15s - loss: 0.8582 - val_loss: 0.8433\n", + "Epoch 71/150\n", + " - 15s - loss: 0.8531 - val_loss: 0.8426\n", + "Epoch 72/150\n", + " - 15s - loss: 0.8553 - val_loss: 0.8435\n", + "Epoch 73/150\n", + " - 15s - loss: 0.8601 - val_loss: 0.8425\n", + "Epoch 74/150\n", + " - 15s - loss: 0.8472 - val_loss: 0.8424\n", + "Epoch 75/150\n", + " - 15s - loss: 0.8659 - val_loss: 0.8425\n", + "Epoch 76/150\n", + " - 15s - loss: 0.8433 - val_loss: 0.8422\n", + "Epoch 77/150\n", + " - 15s - loss: 0.8670 - val_loss: 0.8423\n", + "Epoch 78/150\n", + " - 15s - loss: 0.8471 - val_loss: 0.8426\n", + "Epoch 79/150\n", + " - 15s - loss: 0.8607 - val_loss: 0.8426\n", + "Epoch 80/150\n", + " - 15s - loss: 0.8487 - val_loss: 0.8426\n", + "Epoch 81/150\n", + " - 15s - loss: 0.8582 - val_loss: 0.8426\n", + "Epoch 82/150\n", + " - 15s - loss: 0.8521 - val_loss: 0.8424\n", + "Epoch 83/150\n", + " - 15s - loss: 0.8558 - val_loss: 0.8424\n", + "Epoch 84/150\n", + " - 15s - loss: 0.8576 - val_loss: 0.8421\n", + "Epoch 85/150\n", + " - 15s - loss: 0.8489 - val_loss: 0.8421\n", + "Epoch 86/150\n", + " - 15s - loss: 0.8648 - val_loss: 0.8421\n", + "Epoch 87/150\n", + " - 15s - loss: 0.8431 - val_loss: 0.8421\n", + "Epoch 88/150\n", + " - 15s - loss: 0.8673 - val_loss: 0.8422\n", + "Epoch 89/150\n", + " - 15s - loss: 0.8460 - val_loss: 0.8424\n", + "Epoch 90/150\n", + " - 15s - loss: 0.8621 - val_loss: 0.8425\n", + "Epoch 91/150\n", + " - 15s - loss: 0.8481 - val_loss: 0.8425\n", + "Epoch 92/150\n", + " - 15s - loss: 0.8578 - val_loss: 0.8426\n", + "Epoch 93/150\n", + " - 15s - loss: 0.8518 - val_loss: 0.8424\n", + "Epoch 94/150\n", + " - 15s - loss: 0.8564 - val_loss: 0.8424\n", + "Epoch 95/150\n", + " - 15s - loss: 0.8556 - val_loss: 0.8421\n", + "Epoch 96/150\n", + " - 15s - loss: 0.8506 - val_loss: 0.8421\n", + "Epoch 97/150\n", + " - 15s - loss: 0.8637 - val_loss: 0.8419\n", + "Epoch 98/150\n", + " - 15s - loss: 0.8438 - val_loss: 0.8420\n", + "Epoch 99/150\n", + " - 15s - loss: 0.8672 - val_loss: 0.8421\n", + "Epoch 100/150\n", + " - 15s - loss: 0.8437 - val_loss: 0.8422\n", + "Epoch 101/150\n", + " - 15s - loss: 0.8645 - val_loss: 0.8423\n", + "Epoch 102/150\n", + " - 15s - loss: 0.8472 - val_loss: 0.8424\n", + "Epoch 103/150\n", + " - 15s - loss: 0.8589 - val_loss: 0.8425\n", + "Epoch 104/150\n", + " - 15s - loss: 0.8508 - val_loss: 0.8424\n", + "Epoch 105/150\n", + " - 15s - loss: 0.8567 - val_loss: 0.8425\n", + "Epoch 106/150\n", + " - 15s - loss: 0.8542 - val_loss: 0.8421\n", + "Epoch 107/150\n", + " - 15s - loss: 0.8522 - val_loss: 0.8421\n", + "Epoch 108/150\n", + " - 15s - loss: 0.8613 - val_loss: 0.8419\n", + "Epoch 109/150\n", + " - 15s - loss: 0.8454 - val_loss: 0.8419\n", + "Epoch 110/150\n", + " - 15s - loss: 0.8672 - val_loss: 0.8420\n", + "Epoch 111/150\n", + " - 15s - loss: 0.8420 - val_loss: 0.8420\n", + "Epoch 112/150\n", + " - 15s - loss: 0.8660 - val_loss: 0.8422\n", + "Epoch 113/150\n", + " - 15s - loss: 0.8470 - val_loss: 0.8423\n", + "Epoch 114/150\n", + " - 15s - loss: 0.8593 - val_loss: 0.8424\n", + "Epoch 115/150\n", + " - 15s - loss: 0.8498 - val_loss: 0.8423\n", + "Epoch 116/150\n", + " - 15s - loss: 0.8572 - val_loss: 0.8425\n", + "Epoch 117/150\n", + " - 15s - loss: 0.8522 - val_loss: 0.8421\n", + "Epoch 118/150\n", + " - 15s - loss: 0.8545 - val_loss: 0.8421\n", + "Epoch 119/150\n", + " - 15s - loss: 0.8593 - val_loss: 0.8418\n", + "Epoch 120/150\n", + " - 15s - loss: 0.8466 - val_loss: 0.8418\n", + "Epoch 121/150\n", + " - 15s - loss: 0.8653 - val_loss: 0.8418\n", + "Epoch 122/150\n", + " - 15s - loss: 0.8429 - val_loss: 0.8418\n", + "Epoch 123/150\n", + " - 15s - loss: 0.8667 - val_loss: 0.8420\n", + "Epoch 124/150\n", + " - 15s - loss: 0.8467 - val_loss: 0.8422\n", + "Epoch 125/150\n", + " - 15s - loss: 0.8603 - val_loss: 0.8422\n", + "Epoch 126/150\n", + " - 15s - loss: 0.8483 - val_loss: 0.8422\n", + "Epoch 127/150\n", + " - 15s - loss: 0.8578 - val_loss: 0.8424\n", + "Epoch 128/150\n", + " - 15s - loss: 0.8517 - val_loss: 0.8421\n", + "Epoch 129/150\n", + " - 15s - loss: 0.8554 - val_loss: 0.8422\n", + "Epoch 130/150\n", + " - 15s - loss: 0.8572 - val_loss: 0.8418\n", + "Epoch 131/150\n", + " - 15s - loss: 0.8484 - val_loss: 0.8418\n", + "Epoch 132/150\n", + " - 15s - loss: 0.8645 - val_loss: 0.8417\n", + "Epoch 133/150\n", + " - 15s - loss: 0.8427 - val_loss: 0.8417\n", + "Epoch 134/150\n", + " - 15s - loss: 0.8669 - val_loss: 0.8419\n", + "Epoch 135/150\n", + " - 15s - loss: 0.8456 - val_loss: 0.8420\n", + "Epoch 136/150\n", + " - 15s - loss: 0.8617 - val_loss: 0.8421\n", + "Epoch 137/150\n", + " - 15s - loss: 0.8477 - val_loss: 0.8422\n", + "Epoch 138/150\n", + " - 15s - loss: 0.8574 - val_loss: 0.8423\n", + "Epoch 139/150\n", + " - 15s - loss: 0.8515 - val_loss: 0.8421\n", + "Epoch 140/150\n", + " - 15s - loss: 0.8560 - val_loss: 0.8422\n", + "Epoch 141/150\n", + " - 15s - loss: 0.8553 - val_loss: 0.8419\n", + "Epoch 142/150\n", + " - 15s - loss: 0.8502 - val_loss: 0.8418\n", + "Epoch 143/150\n", + " - 15s - loss: 0.8633 - val_loss: 0.8416\n", + "Epoch 144/150\n", + " - 15s - loss: 0.8434 - val_loss: 0.8416\n", + "Epoch 145/150\n", + " - 15s - loss: 0.8668 - val_loss: 0.8417\n", + "Epoch 146/150\n", + " - 15s - loss: 0.8433 - val_loss: 0.8418\n", + "Epoch 147/150\n", + " - 15s - loss: 0.8642 - val_loss: 0.8419\n", + "Epoch 148/150\n", + " - 15s - loss: 0.8468 - val_loss: 0.8421\n", + "Epoch 149/150\n", + " - 15s - loss: 0.8585 - val_loss: 0.8421\n", + "Epoch 150/150\n", + " - 15s - loss: 0.8504 - val_loss: 0.8420\n" + ] + } + ], + "source": [ + "history = model.fit_generator(train_generator, steps_per_epoch=(samples_per_epoch / batch_size), \n", + " epochs=nb_epoch, callbacks=callbacks,\n", + " validation_data=val_generator, validation_steps=N_seq_val / batch_size,\n", + " verbose=2, workers=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "if save_model:\n", + " json_string = model.to_json()\n", + " with open(json_file, \"w\") as f:\n", + " f.write(json_string)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Project Final/Training/data_utils.py b/Project Final/Training/data_utils.py new file mode 100644 index 0000000..c192e6f --- /dev/null +++ b/Project Final/Training/data_utils.py @@ -0,0 +1,68 @@ +import hickle as hkl +import numpy as np +from keras import backend as K +from keras.preprocessing.image import Iterator + +# Data generator that creates sequences for input into PredNet. +class SequenceGenerator(Iterator): + def __init__(self, data_file, source_file, nt, + batch_size=8, shuffle=False, seed=None, + output_mode='error', sequence_start_mode='all', N_seq=None, + data_format=K.image_data_format()): + self.X = hkl.load(data_file) # X will be like (n_images, nb_cols, nb_rows, nb_channels) + self.sources = hkl.load(source_file) # source for each image so when creating sequences can assure that consecutive frames are from same video + self.nt = nt + self.batch_size = batch_size + self.data_format = data_format + assert sequence_start_mode in {'all', 'unique'}, 'sequence_start_mode must be in {all, unique}' + self.sequence_start_mode = sequence_start_mode + assert output_mode in {'error', 'prediction'}, 'output_mode must be in {error, prediction}' + self.output_mode = output_mode + + if self.data_format == 'channels_first': + self.X = np.transpose(self.X, (0, 3, 1, 2)) + self.im_shape = self.X[0].shape + + if self.sequence_start_mode == 'all': # allow for any possible sequence, starting from any frame + self.possible_starts = np.array([i for i in range(self.X.shape[0] - self.nt) if self.sources[i] == self.sources[i + self.nt - 1]]) + elif self.sequence_start_mode == 'unique': #create sequences where each unique frame is in at most one sequence + curr_location = 0 + possible_starts = [] + while curr_location < self.X.shape[0] - self.nt + 1: + if self.sources[curr_location] == self.sources[curr_location + self.nt - 1]: + possible_starts.append(curr_location) + curr_location += self.nt + else: + curr_location += 1 + self.possible_starts = possible_starts + + if shuffle: + self.possible_starts = np.random.permutation(self.possible_starts) + if N_seq is not None and len(self.possible_starts) > N_seq: # select a subset of sequences if want to + self.possible_starts = self.possible_starts[:N_seq] + self.N_sequences = len(self.possible_starts) + super(SequenceGenerator, self).__init__(len(self.possible_starts), batch_size, shuffle, seed) + + def next(self): + with self.lock: + index_array = next(self.index_generator) + current_index = index_array[0] + current_batch_size = len(index_array) + batch_x = np.zeros((current_batch_size, self.nt) + self.im_shape, np.float32) + for i, idx in enumerate(index_array): + idx = self.possible_starts[idx] + batch_x[i] = self.preprocess(self.X[idx:idx+self.nt]) + if self.output_mode == 'error': # model outputs errors, so y should be zeros + batch_y = np.zeros(current_batch_size, np.float32) + elif self.output_mode == 'prediction': # output actual pixels + batch_y = batch_x + return batch_x, batch_y + + def preprocess(self, X): + return X.astype(np.float32) / 255 + + def create_all(self): + X_all = np.zeros((self.N_sequences, self.nt) + self.im_shape, np.float32) + for i, idx in enumerate(self.possible_starts): + X_all[i] = self.preprocess(self.X[idx:idx+self.nt]) + return X_all diff --git a/Project Final/Training/keras_utils.py b/Project Final/Training/keras_utils.py new file mode 100644 index 0000000..ededcc7 --- /dev/null +++ b/Project Final/Training/keras_utils.py @@ -0,0 +1,58 @@ +import os +import numpy as np + +from keras import backend as K +from keras.legacy.interfaces import generate_legacy_interface, recurrent_args_preprocessor +from keras.models import model_from_json + +legacy_prednet_support = generate_legacy_interface( + allowed_positional_args=['stack_sizes', 'R_stack_sizes', + 'A_filt_sizes', 'Ahat_filt_sizes', 'R_filt_sizes'], + conversions=[('dim_ordering', 'data_format'), + ('consume_less', 'implementation')], + value_conversions={'dim_ordering': {'tf': 'channels_last', + 'th': 'channels_first', + 'default': None}, + 'consume_less': {'cpu': 0, + 'mem': 1, + 'gpu': 2}}, + preprocessor=recurrent_args_preprocessor) + +# Convert old Keras (1.2) json models and weights to Keras 2.0 +def convert_model_to_keras2(old_json_file, old_weights_file, new_json_file, new_weights_file): + from prednet import PredNet + # If using tensorflow, it doesn't allow you to load the old weights. + if K.backend() != 'theano': + os.environ['KERAS_BACKEND'] = backend + reload(K) + + f = open(old_json_file, 'r') + json_string = f.read() + f.close() + model = model_from_json(json_string, custom_objects = {'PredNet': PredNet}) + model.load_weights(old_weights_file) + + weights = model.layers[1].get_weights() + if weights[0].shape[0] == model.layers[1].stack_sizes[1]: + for i, w in enumerate(weights): + if w.ndim == 4: + weights[i] = np.transpose(w, (2, 3, 1, 0)) + model.set_weights(weights) + + model.save_weights(new_weights_file) + json_string = model.to_json() + with open(new_json_file, "w") as f: + f.write(json_string) + + +if __name__ == '__main__': + old_dir = './model_data/' + new_dir = './model_data_keras2/' + if not os.path.exists(new_dir): + os.mkdir(new_dir) + for w_tag in ['', '-Lall', '-extrapfinetuned']: + m_tag = '' if w_tag == '-Lall' else w_tag + convert_model_to_keras2(old_dir + 'prednet_kitti_model' + m_tag + '.json', + old_dir + 'prednet_kitti_weights' + w_tag + '.hdf5', + new_dir + 'prednet_kitti_model' + m_tag + '.json', + new_dir + 'prednet_kitti_weights' + w_tag + '.hdf5') diff --git a/Project Final/Training/prednet.py b/Project Final/Training/prednet.py new file mode 100644 index 0000000..cc7b012 --- /dev/null +++ b/Project Final/Training/prednet.py @@ -0,0 +1,311 @@ +import numpy as np + +from keras import backend as K +from keras import activations +from keras.layers import Recurrent +from keras.layers import Conv2D, UpSampling2D, MaxPooling2D +from keras.engine import InputSpec +from keras_utils import legacy_prednet_support + +class PredNet(Recurrent): + '''PredNet architecture - Lotter 2016. + Stacked convolutional LSTM inspired by predictive coding principles. + + # Arguments + stack_sizes: number of channels in targets (A) and predictions (Ahat) in each layer of the architecture. + Length is the number of layers in the architecture. + First element is the number of channels in the input. + Ex. (3, 16, 32) would correspond to a 3 layer architecture that takes in RGB images and has 16 and 32 + channels in the second and third layers, respectively. + R_stack_sizes: number of channels in the representation (R) modules. + Length must equal length of stack_sizes, but the number of channels per layer can be different. + A_filt_sizes: filter sizes for the target (A) modules. + Has length of 1 - len(stack_sizes). + Ex. (3, 3) would mean that targets for layers 2 and 3 are computed by a 3x3 convolution of the errors (E) + from the layer below (followed by max-pooling) + Ahat_filt_sizes: filter sizes for the prediction (Ahat) modules. + Has length equal to length of stack_sizes. + Ex. (3, 3, 3) would mean that the predictions for each layer are computed by a 3x3 convolution of the + representation (R) modules at each layer. + R_filt_sizes: filter sizes for the representation (R) modules. + Has length equal to length of stack_sizes. + Corresponds to the filter sizes for all convolutions in the LSTM. + pixel_max: the maximum pixel value. + Used to clip the pixel-layer prediction. + error_activation: activation function for the error (E) units. + A_activation: activation function for the target (A) and prediction (A_hat) units. + LSTM_activation: activation function for the cell and hidden states of the LSTM. + LSTM_inner_activation: activation function for the gates in the LSTM. + output_mode: either 'error', 'prediction', 'all' or layer specification (ex. R2, see below). + Controls what is outputted by the PredNet. + If 'error', the mean response of the error (E) units of each layer will be outputted. + That is, the output shape will be (batch_size, nb_layers). + If 'prediction', the frame prediction will be outputted. + If 'all', the output will be the frame prediction concatenated with the mean layer errors. + The frame prediction is flattened before concatenation. + Nomenclature of 'all' is kept for backwards compatibility, but should not be confused with returning all of the layers of the model + For returning the features of a particular layer, output_mode should be of the form unit_type + layer_number. + For instance, to return the features of the LSTM "representational" units in the lowest layer, output_mode should be specificied as 'R0'. + The possible unit types are 'R', 'Ahat', 'A', and 'E' corresponding to the 'representation', 'prediction', 'target', and 'error' units respectively. + extrap_start_time: time step for which model will start extrapolating. + Starting at this time step, the prediction from the previous time step will be treated as the "actual" + data_format: 'channels_first' or 'channels_last'. + It defaults to the `image_data_format` value found in your + Keras config file at `~/.keras/keras.json`. + + # References + - [Deep predictive coding networks for video prediction and unsupervised learning](https://arxiv.org/abs/1605.08104) + - [Long short-term memory](http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf) + - [Convolutional LSTM network: a machine learning approach for precipitation nowcasting](http://arxiv.org/abs/1506.04214) + - [Predictive coding in the visual cortex: a functional interpretation of some extra-classical receptive-field effects](http://www.nature.com/neuro/journal/v2/n1/pdf/nn0199_79.pdf) + ''' + @legacy_prednet_support + def __init__(self, stack_sizes, R_stack_sizes, + A_filt_sizes, Ahat_filt_sizes, R_filt_sizes, + pixel_max=1., error_activation='relu', A_activation='relu', + LSTM_activation='tanh', LSTM_inner_activation='hard_sigmoid', + output_mode='error', extrap_start_time=None, + data_format=K.image_data_format(), **kwargs): + self.stack_sizes = stack_sizes + self.nb_layers = len(stack_sizes) + assert len(R_stack_sizes) == self.nb_layers, 'len(R_stack_sizes) must equal len(stack_sizes)' + self.R_stack_sizes = R_stack_sizes + assert len(A_filt_sizes) == (self.nb_layers - 1), 'len(A_filt_sizes) must equal len(stack_sizes) - 1' + self.A_filt_sizes = A_filt_sizes + assert len(Ahat_filt_sizes) == self.nb_layers, 'len(Ahat_filt_sizes) must equal len(stack_sizes)' + self.Ahat_filt_sizes = Ahat_filt_sizes + assert len(R_filt_sizes) == (self.nb_layers), 'len(R_filt_sizes) must equal len(stack_sizes)' + self.R_filt_sizes = R_filt_sizes + + self.pixel_max = pixel_max + self.error_activation = activations.get(error_activation) + self.A_activation = activations.get(A_activation) + self.LSTM_activation = activations.get(LSTM_activation) + self.LSTM_inner_activation = activations.get(LSTM_inner_activation) + + default_output_modes = ['prediction', 'error', 'all'] + layer_output_modes = [layer + str(n) for n in range(self.nb_layers) for layer in ['R', 'E', 'A', 'Ahat']] + assert output_mode in default_output_modes + layer_output_modes, 'Invalid output_mode: ' + str(output_mode) + self.output_mode = output_mode + if self.output_mode in layer_output_modes: + self.output_layer_type = self.output_mode[:-1] + self.output_layer_num = int(self.output_mode[-1]) + else: + self.output_layer_type = None + self.output_layer_num = None + self.extrap_start_time = extrap_start_time + + assert data_format in {'channels_last', 'channels_first'}, 'data_format must be in {channels_last, channels_first}' + self.data_format = data_format + self.channel_axis = -3 if data_format == 'channels_first' else -1 + self.row_axis = -2 if data_format == 'channels_first' else -3 + self.column_axis = -1 if data_format == 'channels_first' else -2 + super(PredNet, self).__init__(**kwargs) + self.input_spec = [InputSpec(ndim=5)] + + def compute_output_shape(self, input_shape): + if self.output_mode == 'prediction': + out_shape = input_shape[2:] + elif self.output_mode == 'error': + out_shape = (self.nb_layers,) + elif self.output_mode == 'all': + out_shape = (np.prod(input_shape[2:]) + self.nb_layers,) + else: + stack_str = 'R_stack_sizes' if self.output_layer_type == 'R' else 'stack_sizes' + stack_mult = 2 if self.output_layer_type == 'E' else 1 + out_stack_size = stack_mult * getattr(self, stack_str)[self.output_layer_num] + out_nb_row = input_shape[self.row_axis] / 2**self.output_layer_num + out_nb_col = input_shape[self.column_axis] / 2**self.output_layer_num + if self.data_format == 'channels_first': + out_shape = (out_stack_size, out_nb_row, out_nb_col) + else: + out_shape = (out_nb_row, out_nb_col, out_stack_size) + + if self.return_sequences: + return (input_shape[0], input_shape[1]) + out_shape + else: + return (input_shape[0],) + out_shape + + def get_initial_state(self, x): + input_shape = self.input_spec[0].shape + init_nb_row = input_shape[self.row_axis] + init_nb_col = input_shape[self.column_axis] + + base_initial_state = K.zeros_like(x) # (samples, timesteps) + image_shape + non_channel_axis = -1 if self.data_format == 'channels_first' else -2 + for _ in range(2): + base_initial_state = K.sum(base_initial_state, axis=non_channel_axis) + base_initial_state = K.sum(base_initial_state, axis=1) # (samples, nb_channels) + + initial_states = [] + states_to_pass = ['r', 'c', 'e'] + nlayers_to_pass = {u: self.nb_layers for u in states_to_pass} + if self.extrap_start_time is not None: + states_to_pass.append('ahat') # pass prediction in states so can use as actual for t+1 when extrapolating + nlayers_to_pass['ahat'] = 1 + for u in states_to_pass: + for l in range(nlayers_to_pass[u]): + ds_factor = 2 ** l + nb_row = init_nb_row // ds_factor + nb_col = init_nb_col // ds_factor + if u in ['r', 'c']: + stack_size = self.R_stack_sizes[l] + elif u == 'e': + stack_size = 2 * self.stack_sizes[l] + elif u == 'ahat': + stack_size = self.stack_sizes[l] + output_size = stack_size * nb_row * nb_col # flattened size + + reducer = K.zeros((input_shape[self.channel_axis], output_size)) # (nb_channels, output_size) + initial_state = K.dot(base_initial_state, reducer) # (samples, output_size) + if self.data_format == 'channels_first': + output_shp = (-1, stack_size, nb_row, nb_col) + else: + output_shp = (-1, nb_row, nb_col, stack_size) + initial_state = K.reshape(initial_state, output_shp) + initial_states += [initial_state] + + if K._BACKEND == 'theano': + from theano import tensor as T + # There is a known issue in the Theano scan op when dealing with inputs whose shape is 1 along a dimension. + # In our case, this is a problem when training on grayscale images, and the below line fixes it. + initial_states = [T.unbroadcast(init_state, 0, 1) for init_state in initial_states] + + if self.extrap_start_time is not None: + initial_states += [K.variable(0, int if K.backend() != 'tensorflow' else 'int32')] # the last state will correspond to the current timestep + return initial_states + + def build(self, input_shape): + self.input_spec = [InputSpec(shape=input_shape)] + self.conv_layers = {c: [] for c in ['i', 'f', 'c', 'o', 'a', 'ahat']} + + for l in range(self.nb_layers): + for c in ['i', 'f', 'c', 'o']: + act = self.LSTM_activation if c == 'c' else self.LSTM_inner_activation + self.conv_layers[c].append(Conv2D(self.R_stack_sizes[l], self.R_filt_sizes[l], padding='same', activation=act, data_format=self.data_format)) + + act = 'relu' if l == 0 else self.A_activation + self.conv_layers['ahat'].append(Conv2D(self.stack_sizes[l], self.Ahat_filt_sizes[l], padding='same', activation=act, data_format=self.data_format)) + + if l < self.nb_layers - 1: + self.conv_layers['a'].append(Conv2D(self.stack_sizes[l+1], self.A_filt_sizes[l], padding='same', activation=self.A_activation, data_format=self.data_format)) + + self.upsample = UpSampling2D(data_format=self.data_format) + self.pool = MaxPooling2D(data_format=self.data_format) + + self.trainable_weights = [] + nb_row, nb_col = (input_shape[-2], input_shape[-1]) if self.data_format == 'channels_first' else (input_shape[-3], input_shape[-2]) + for c in sorted(self.conv_layers.keys()): + for l in range(len(self.conv_layers[c])): + ds_factor = 2 ** l + if c == 'ahat': + nb_channels = self.R_stack_sizes[l] + elif c == 'a': + nb_channels = 2 * self.R_stack_sizes[l] + else: + nb_channels = self.stack_sizes[l] * 2 + self.R_stack_sizes[l] + if l < self.nb_layers - 1: + nb_channels += self.R_stack_sizes[l+1] + in_shape = (input_shape[0], nb_channels, nb_row // ds_factor, nb_col // ds_factor) + if self.data_format == 'channels_last': in_shape = (in_shape[0], in_shape[2], in_shape[3], in_shape[1]) + with K.name_scope('layer_' + c + '_' + str(l)): + self.conv_layers[c][l].build(in_shape) + self.trainable_weights += self.conv_layers[c][l].trainable_weights + + self.states = [None] * self.nb_layers*3 + + if self.extrap_start_time is not None: + self.t_extrap = K.variable(self.extrap_start_time, int if K.backend() != 'tensorflow' else 'int32') + self.states += [None] * 2 # [previous frame prediction, timestep] + + def step(self, a, states): + r_tm1 = states[:self.nb_layers] + c_tm1 = states[self.nb_layers:2*self.nb_layers] + e_tm1 = states[2*self.nb_layers:3*self.nb_layers] + + if self.extrap_start_time is not None: + t = states[-1] + a = K.switch(t >= self.t_extrap, states[-2], a) # if past self.extrap_start_time, the previous prediction will be treated as the actual + + c = [] + r = [] + e = [] + + # Update R units starting from the top + for l in reversed(range(self.nb_layers)): + inputs = [r_tm1[l], e_tm1[l]] + if l < self.nb_layers - 1: + inputs.append(r_up) + + inputs = K.concatenate(inputs, axis=self.channel_axis) + i = self.conv_layers['i'][l].call(inputs) + f = self.conv_layers['f'][l].call(inputs) + o = self.conv_layers['o'][l].call(inputs) + _c = f * c_tm1[l] + i * self.conv_layers['c'][l].call(inputs) + _r = o * self.LSTM_activation(_c) + c.insert(0, _c) + r.insert(0, _r) + + if l > 0: + r_up = self.upsample.call(_r) + + # Update feedforward path starting from the bottom + for l in range(self.nb_layers): + ahat = self.conv_layers['ahat'][l].call(r[l]) + if l == 0: + ahat = K.minimum(ahat, self.pixel_max) + frame_prediction = ahat + + # compute errors + e_up = self.error_activation(ahat - a) + e_down = self.error_activation(a - ahat) + + e.append(K.concatenate((e_up, e_down), axis=self.channel_axis)) + + if self.output_layer_num == l: + if self.output_layer_type == 'A': + output = a + elif self.output_layer_type == 'Ahat': + output = ahat + elif self.output_layer_type == 'R': + output = r[l] + elif self.output_layer_type == 'E': + output = e[l] + + if l < self.nb_layers - 1: + a = self.conv_layers['a'][l].call(e[l]) + a = self.pool.call(a) # target for next layer + + if self.output_layer_type is None: + if self.output_mode == 'prediction': + output = frame_prediction + else: + for l in range(self.nb_layers): + layer_error = K.mean(K.batch_flatten(e[l]), axis=-1, keepdims=True) + all_error = layer_error if l == 0 else K.concatenate((all_error, layer_error), axis=-1) + if self.output_mode == 'error': + output = all_error + else: + output = K.concatenate((K.batch_flatten(frame_prediction), all_error), axis=-1) + + states = r + c + e + if self.extrap_start_time is not None: + states += [frame_prediction, t + 1] + return output, states + + def get_config(self): + config = {'stack_sizes': self.stack_sizes, + 'R_stack_sizes': self.R_stack_sizes, + 'A_filt_sizes': self.A_filt_sizes, + 'Ahat_filt_sizes': self.Ahat_filt_sizes, + 'R_filt_sizes': self.R_filt_sizes, + 'pixel_max': self.pixel_max, + 'error_activation': self.error_activation.__name__, + 'A_activation': self.A_activation.__name__, + 'LSTM_activation': self.LSTM_activation.__name__, + 'LSTM_inner_activation': self.LSTM_inner_activation.__name__, + 'data_format': self.data_format, + 'extrap_start_time': self.extrap_start_time, + 'output_mode': self.output_mode} + base_config = super(PredNet, self).get_config() + return dict(list(base_config.items()) + list(config.items())) diff --git a/Project Final/Training/weights/old/prednet_weather_model.json b/Project Final/Training/weights/old/prednet_weather_model.json new file mode 100644 index 0000000..4268ad3 --- /dev/null +++ b/Project Final/Training/weights/old/prednet_weather_model.json @@ -0,0 +1 @@ +{"class_name": "Model", "config": {"name": "model_1", "layers": [{"name": "input_1", "class_name": "InputLayer", "config": {"batch_input_shape": [null, 24, 20, 40, 12], "dtype": "float32", "sparse": false, "name": "input_1"}, "inbound_nodes": []}, {"name": "pred_net_1", "class_name": "PredNet", "config": {"name": "pred_net_1", "trainable": true, "return_sequences": true, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "implementation": 0, "stack_sizes": [12, 48, 96], "R_stack_sizes": [12, 48, 96], "A_filt_sizes": [3, 3], "Ahat_filt_sizes": [3, 3, 3], "R_filt_sizes": [3, 3, 3], "pixel_max": 1.0, "error_activation": "relu", "A_activation": "relu", "LSTM_activation": "tanh", "LSTM_inner_activation": "hard_sigmoid", "data_format": "channels_last", "extrap_start_time": null, "output_mode": "error"}, "inbound_nodes": [[["input_1", 0, 0, {}]]]}, {"name": "time_distributed_1", "class_name": "TimeDistributed", "config": {"name": "time_distributed_1", "trainable": false, "layer": {"class_name": "Dense", "config": {"name": "dense_1", "trainable": false, "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}}, "inbound_nodes": [[["pred_net_1", 0, 0, {}]]]}, {"name": "flatten_1", "class_name": "Flatten", "config": {"name": "flatten_1", "trainable": true, "data_format": "channels_last"}, "inbound_nodes": [[["time_distributed_1", 0, 0, {}]]]}, {"name": "dense_2", "class_name": "Dense", "config": {"name": "dense_2", "trainable": false, "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["flatten_1", 0, 0, {}]]]}], "input_layers": [["input_1", 0, 0]], "output_layers": [["dense_2", 0, 0]]}, "keras_version": "2.2.0", "backend": "tensorflow"} \ No newline at end of file diff --git a/Project Final/Training/weights/old/prednet_weather_weights.hdf5 b/Project Final/Training/weights/old/prednet_weather_weights.hdf5 new file mode 100644 index 0000000..8b1ae3b Binary files /dev/null and b/Project Final/Training/weights/old/prednet_weather_weights.hdf5 differ diff --git a/Project Final/Training/weights/prednet_weather_model.json b/Project Final/Training/weights/prednet_weather_model.json new file mode 100644 index 0000000..17580c8 --- /dev/null +++ b/Project Final/Training/weights/prednet_weather_model.json @@ -0,0 +1 @@ +{"class_name": "Model", "config": {"name": "model_1", "layers": [{"name": "input_1", "class_name": "InputLayer", "config": {"batch_input_shape": [null, 24, 20, 40, 7], "dtype": "float32", "sparse": false, "name": "input_1"}, "inbound_nodes": []}, {"name": "pred_net_1", "class_name": "PredNet", "config": {"name": "pred_net_1", "trainable": true, "return_sequences": true, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "implementation": 0, "stack_sizes": [7, 48, 96], "R_stack_sizes": [7, 48, 96], "A_filt_sizes": [3, 3], "Ahat_filt_sizes": [3, 3, 3], "R_filt_sizes": [3, 3, 3], "pixel_max": 1.0, "error_activation": "relu", "A_activation": "relu", "LSTM_activation": "tanh", "LSTM_inner_activation": "hard_sigmoid", "data_format": "channels_last", "extrap_start_time": null, "output_mode": "error"}, "inbound_nodes": [[["input_1", 0, 0, {}]]]}, {"name": "time_distributed_1", "class_name": "TimeDistributed", "config": {"name": "time_distributed_1", "trainable": false, "layer": {"class_name": "Dense", "config": {"name": "dense_1", "trainable": false, "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}}, "inbound_nodes": [[["pred_net_1", 0, 0, {}]]]}, {"name": "flatten_1", "class_name": "Flatten", "config": {"name": "flatten_1", "trainable": true, "data_format": "channels_last"}, "inbound_nodes": [[["time_distributed_1", 0, 0, {}]]]}, {"name": "dense_2", "class_name": "Dense", "config": {"name": "dense_2", "trainable": false, "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["flatten_1", 0, 0, {}]]]}], "input_layers": [["input_1", 0, 0]], "output_layers": [["dense_2", 0, 0]]}, "keras_version": "2.2.0", "backend": "tensorflow"} \ No newline at end of file diff --git a/Project Final/Training/weights/prednet_weather_weights.hdf5 b/Project Final/Training/weights/prednet_weather_weights.hdf5 new file mode 100644 index 0000000..666e376 Binary files /dev/null and b/Project Final/Training/weights/prednet_weather_weights.hdf5 differ diff --git a/Project Final/Training/weights/scaled/prednet_weather_model.json b/Project Final/Training/weights/scaled/prednet_weather_model.json new file mode 100644 index 0000000..4268ad3 --- /dev/null +++ b/Project Final/Training/weights/scaled/prednet_weather_model.json @@ -0,0 +1 @@ +{"class_name": "Model", "config": {"name": "model_1", "layers": [{"name": "input_1", "class_name": "InputLayer", "config": {"batch_input_shape": [null, 24, 20, 40, 12], "dtype": "float32", "sparse": false, "name": "input_1"}, "inbound_nodes": []}, {"name": "pred_net_1", "class_name": "PredNet", "config": {"name": "pred_net_1", "trainable": true, "return_sequences": true, "return_state": false, "go_backwards": false, "stateful": false, "unroll": false, "implementation": 0, "stack_sizes": [12, 48, 96], "R_stack_sizes": [12, 48, 96], "A_filt_sizes": [3, 3], "Ahat_filt_sizes": [3, 3, 3], "R_filt_sizes": [3, 3, 3], "pixel_max": 1.0, "error_activation": "relu", "A_activation": "relu", "LSTM_activation": "tanh", "LSTM_inner_activation": "hard_sigmoid", "data_format": "channels_last", "extrap_start_time": null, "output_mode": "error"}, "inbound_nodes": [[["input_1", 0, 0, {}]]]}, {"name": "time_distributed_1", "class_name": "TimeDistributed", "config": {"name": "time_distributed_1", "trainable": false, "layer": {"class_name": "Dense", "config": {"name": "dense_1", "trainable": false, "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}}, "inbound_nodes": [[["pred_net_1", 0, 0, {}]]]}, {"name": "flatten_1", "class_name": "Flatten", "config": {"name": "flatten_1", "trainable": true, "data_format": "channels_last"}, "inbound_nodes": [[["time_distributed_1", 0, 0, {}]]]}, {"name": "dense_2", "class_name": "Dense", "config": {"name": "dense_2", "trainable": false, "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"scale": 1.0, "mode": "fan_avg", "distribution": "uniform", "seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["flatten_1", 0, 0, {}]]]}], "input_layers": [["input_1", 0, 0]], "output_layers": [["dense_2", 0, 0]]}, "keras_version": "2.2.0", "backend": "tensorflow"} \ No newline at end of file diff --git a/Project Final/Training/weights/scaled/prednet_weather_weights.hdf5 b/Project Final/Training/weights/scaled/prednet_weather_weights.hdf5 new file mode 100644 index 0000000..0116278 Binary files /dev/null and b/Project Final/Training/weights/scaled/prednet_weather_weights.hdf5 differ diff --git a/Project Final/Transformation/Data_Transformation.ipynb b/Project Final/Transformation/Data_Transformation.ipynb new file mode 100644 index 0000000..b59d65c --- /dev/null +++ b/Project Final/Transformation/Data_Transformation.ipynb @@ -0,0 +1,434 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import os\n", + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "#Getting a list of files in raw data folder\n", + "filenames = os.listdir('./processed_data/')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "header_wanted = [\n", + " 'HOURLYVISIBILITY',\n", + " 'HOURLYDRYBULBTEMPC',\n", + " 'HOURLYWETBULBTEMPC',\n", + " 'HOURLYDewPointTempC',\n", + " 'HOURLYRelativeHumidity',\n", + " 'HOURLYWindSpeed',\n", + " #'HOURLYWindGustSpeed',\n", + " 'HOURLYStationPressure',\n", + " #'HOURLYPressureTendency',\n", + " #'HOURLYPressureChange',\n", + " #'HOURLYSeaLevelPressure',\n", + " #'HOURLYPrecip',\n", + " #'HOURLYAltimeterSetting'\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "usecols = ['DATE','STATION'] + header_wanted" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 372/372 [00:22<00:00, 16.79it/s]\n" + ] + } + ], + "source": [ + "#Loading all files into a pandas Dataframe\n", + "tqdm.pandas()\n", + "df = pd.concat([pd.read_csv('./processed_data/{}'.format(x), usecols=usecols, low_memory=False) for x in tqdm(filenames)])\n", + "#df[header_wanted] = (df[header_wanted] - df[header_wanted].mean()) / (df[header_wanted].max() - df[header_wanted].min())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At this point all the data has been loaded into a single dataframe and any data changes have been made. The next step is to break the data up by WBAN and place in a 2D array at the appropriate grid cell. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "stations = pd.read_csv(\"./stations_mask.csv\", usecols = ['STATION_ID', 'LON_SCALED', 'LAT_SCALED'])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "height = 20\n", + "width = 40\n", + "depth = 24 * 365 * 2" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "mask = [([0] * width) for i in range(height)]\n", + "\n", + "wban_loc = dict(zip(stations.STATION_ID,zip(stations.LON_SCALED,stations.LAT_SCALED)))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "grid = [([pd.DataFrame()] * width) for i in range(height)]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████| 372/372 [03:55<00:00, 1.58it/s]\n" + ] + } + ], + "source": [ + "for key, value in tqdm(wban_loc.items()):\n", + " mask[value[1]][value[0]] = 1\n", + " grid[value[1]][value[0]] = df.loc[df.STATION == key]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAADKCAYAAACi9isrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAEpRJREFUeJzt3X+MHOV9x/H3p8bgmkDBGAg/HCCpQ4sQdpKrnYi0MnECBqE4qSCx1R9ORWqIggRqIyWhElAqJPqDkLSOoE5wgZbwo+FH3MSKsRwqQEoMh2sbiAkQx4kvZ9kEA8YlQAzf/rFzZbmb3Vt25mZn7/m8JOtmZ56d+d7c7nfHzz7PfBURmJlZOn6r1wGYmVm1nPjNzBLjxG9mlhgnfjOzxDjxm5klxonfzCwxTvxmZolx4jczS4wTv5lZYg7odQB5Zs6YEifOmjqhx3hqy/TC+3jvaS/3xTGK7mO851e1j/F0cox+UcZrx9LyCv/La/GqOmmrIrdskLQI+BowBfhmRFwzavtBwC3AB4DngE9HxPbx9jswZ1o8vHZW13F14qxj5xbex9rhTX1xjKL7GO/5Ve1jPJ0co1+U8dqxtGyI9eyNPR0l/q67eiRNAb4OnA2cAiyVdMqoZhcAz0fE7wLXAX/f7fHMzKwcRfr45wHPRMS2iHgNuB1YPKrNYuDmbPnbwEJJHX0imZnZxCiS+I8DdjQ9HsrW5baJiP3Ai8ARBY5pZmYFFUn8eVfuo78w6KRNo6G0XNKgpMFnn3u9QFhmZtZOkcQ/BDR/A3s8MNyqjaQDgN8B9uTtLCJWRsRARAwcecSUAmGZmVk7RRL/I8BsSSdJOhBYAqwe1WY1sCxbPg/4Qbjyi5lZTxUdznkO8FUawzlXRcTVkq4CBiNitaRpwL8D76Nxpb8kIraNt99DNSPma2HL7f0ybK+KIXlVDJMsI44qhrZ2ooxhp1WoIk4PGe0/7f7u887aweDmVzoaPFNoAldErAHWjFp3edPyK8D5RY5hZmbl8i0bzMwS48RvZpYYJ34zs8Q48ZuZJcaJ38wsMU78ZmaJceI3M0tMLQuxvPe0l1m7tvVEhbpMPKlisk8VE6PKUIeJUWXUJqiLonH2S50Ge1OVr01f8ZuZJcaJ38wsMU78ZmaJceI3M0tMkZq7syTdL2mrpCckXZLTZoGkFyVtyv5dnrcvMzOrTpFRPfuBv46IjZIOAR6VtC4ifjyq3YMRcW6B45iZWYm6vuKPiJ0RsTFbfgnYytiau2ZmVjOljOOXdCKNYisbcjZ/SNJmGmUZvxART4y3v6e2TG87/rcuY7HrMEa5jLHUk2WugL2pjPdIXd5n/aDf5jQUTvyS3gHcBVwaEXtHbd4InBAR+7JqXfcCs1vsZzmwHGAa04uGZWZmLRQa1SNpKo2kf2tE3D16e0TsjYh92fIaYKqkmXn7ai62PpWDioRlZmZtFBnVI+BGYGtEfKVFm3dm7ZA0Lzvec90e08zMiivS1XM68GfAY5JGOrguA94FEBE3AOcBn5O0H/g1jWLr3Vd3NzOzwrpO/BHxENC2ontErABWdHsMMzMrn2fumpklxonfzCwxTvxmZolRHb9rHZgzLR5eO6vl9ioKblQ12aKKYhiThc/FmybLuajTpKYi6nC+5521g8HNr7T93nWEr/jNzBLjxG9mlhgnfjOzxDjxm5klxonfzCwxTvxmZolx4jczS0wphVjqqIrxwVUUMCnjGHUYY1yXOIv+TepwLqGcOPplLkAdXhd1iGE8T0XnNz4ufMUvabukx7Ji6oM52yXpnyU9I2mLpPcXPaaZmXWvrCv+MyLiVy22nU2j6tZsYD5wffbTzMx6oIo+/sXALdHwI+AwScdUcFwzM8tRRuIP4D5Jj2Z1c0c7DtjR9HgoW/cWkpZLGpQ0+Oxzr5cQlpmZ5Smjq+f0iBiWdBSwTtKTEfFA0/a8mwaNuTNcRKwEVkLjJm0lxGVmZjkKX/FHxHD2czdwDzBvVJMhoPlWm8cDw0WPa2Zm3SmU+CUdLOmQkWXgTODxUc1WA3+eje75IPBiROwsclwzM+teofvxS3o3jat8aHQbfSsirpZ0ETQKrksSjbq7i4CXgb+IiDHDPpuldD/+8VQxXrsuXJvArL1274ENsZ69saej+/EX6uOPiG3AnJz1NzQtB/D5IscxM7Py+JYNZmaJceI3M0uME7+ZWWKc+M3MEuPEb2aWGCd+M7PEOPGbmSWm0ASuiXKoZsR8Lex1GH2hk0lLqUx8qkuxlyqk8jdNSdGJlm9nApev+M3MEuPEb2aWGCd+M7PEOPGbmSWm68Qv6eSswPrIv72SLh3VZoGkF5vaXF48ZDMzK6Lru3NGxE+AuQCSpgC/5M1bNDd7MCLO7fY4ZmZWrrK6ehYCP42In5e0PzMzmyBl1NwFWALc1mLbhyRtplFu8QsR8UReo6xQ+3KAaUxve7DJVJykHwrGVHWuip4Lj10vVxVzBSbL3Iu65JNOFb7il3Qg8HHgP3M2bwROiIg5wL8A97baT0SsjIiBiBiYykFFwzIzsxbK6Oo5G9gYEbtGb4iIvRGxL1teA0yVNLOEY5qZWZfKSPxLadHNI+mdWc1dJM3LjvdcCcc0M7MuFerjlzQd+BhwYdO6/y+0DpwHfE7SfuDXwJKo482BzMwSUrTY+svAEaPWNRdaXwGsKHIMMzMrl2fumpklxonfzCwxTvxmZokpawJX7RSdfFLVhIx+KKhRVbGXKv5mVUyYq2JiUxWviyrOdx1e353otwla4/EVv5lZYpz4zcwS48RvZpYYJ34zs8Q48ZuZJcaJ38wsMU78ZmaJmbTj+Kso6lHG2N46jMceTxnjtavYR7+Mn58sxUesf3V0xS9plaTdkh5vWjdD0jpJT2c/D2/x3GVZm6clLSsrcDMz606nXT03AYtGrfsSsD4iZgPrs8dvIWkGcAUwH5gHXNHqA8LMzKrRUeKPiAeAPaNWLwZuzpZvBj6R89SzgHURsScingfWMfYDxMzMKlTky92jI2InQPbzqJw2xwE7mh4PZevGkLRc0qCkwd/waoGwzMysnYke1aOcdbkVuFxs3cysGkUS/y5JxwBkP3fntBkCZjU9Ph4YLnBMMzMrqEjiXw2MjNJZBnwnp81a4ExJh2df6p6ZrTMzsx7paBy/pNuABcBMSUM0RupcA9wp6QLgF8D5WdsB4KKI+GxE7JH0d8Aj2a6uiojRXxK/bf0yfr4TdRk3PtHK+D36Yc5DXY5h1k5HiT8ilrbYtDCn7SDw2abHq4BVXUVnZmal8y0bzMwS48RvZpYYJ34zs8Q48ZuZJcaJ38wsMU78ZmaJceI3M0vMpC3EUoUyio9UoQ4ThibLpLuqitJUoYpiRVZPvuI3M0uME7+ZWWKc+M3MEuPEb2aWmHETf4tC6/8o6UlJWyTdI+mwFs/dLukxSZskDZYZuJmZdaeTK/6bGFsndx1wakScBjwFfLnN88+IiLkRMdBdiGZmVqZxE39eofWIuC8i9mcPf0SjspaZmfUBReSWwH1rI+lE4LsRcWrOtv8C7oiI/8jZ9jPgeRp1dv81Ila2OcZyYDnANKZ/4MM6p8NfoTt1GYNclzHdE62T8130XNTlb1qFMgr4FN1HGXMaqpDKe2xDrGdv7Mmrcz5GoQlckv4G2A/c2qLJ6RExLOkoYJ2kJ7P/QYyRfSisBDhUM8b/NDIzs650PapH0jLgXOBPosV/GyJiOPu5G7gHmNft8czMrBxdJX5Ji4AvAh+PiJdbtDlY0iEjyzQKrT+e19bMzKrTyXDO24AfAidLGsqKq68ADqHRfbNJ0g1Z22MlrcmeejTwkKTNwMPA9yLi+xPyW5iZWcfG7eNvUWj9xhZth4FzsuVtwJxC0ZmZWek8c9fMLDFO/GZmiXHiNzNLTLKFWMqYADNZlPG7TpZCK3VRxaSjyXK+U5mgVSZf8ZuZJcaJ38wsMU78ZmaJceI3M0uME7+ZWWKc+M3MEuPEb2aWmHHH8UtaReP2y7tHCrFIuhL4S+DZrNllEbEm57mLgK8BU4BvRsQ1JcU94SbT2OCiBTXqMs5/PHUZl16HOSJVFEmp6nxPpvdiXXRbcxfguqyW7twWSX8K8HXgbOAUYKmkU4oEa2ZmxXVVc7dD84BnImJbRLwG3A4s7mI/ZmZWoiJ9/BdL2iJplaTDc7YfB+xoejyUrTMzsx7qNvFfD7wHmAvsBK7NaZNX9LdlLV1JyyUNShr8Da92GZaZmY2nq8QfEbsi4vWIeAP4Bvm1dIeAWU2PjweG2+xzZUQMRMTAVA7qJiwzM+tAtzV3j2l6+Enya+k+AsyWdJKkA4ElwOpujmdmZuXpZDjnbcACYKakIeAKYIGkuTS6brYDF2Ztj6UxbPOciNgv6WJgLY3hnKsi4okJ+S3MzKxjimjZ7d4zh2pGzNfCXodhJapiLkBdxvFXoQ7noqoaDB7H35kNsZ69sSfvu9UxPHPXzCwxTvxmZolx4jczS4wTv5lZYpz4zcwS48RvZpYYJ34zs8Q48ZuZJWbcmbtmZahqsk8/KKNIStHiOp0o43xXEae9fb7iNzNLjBO/mVlinPjNzBLTbbH1O4CTsyaHAS9ExJjOOknbgZeA14H9ETFQUtxmZtalTr7cvQlYAdwysiIiPj2yLOla4MU2zz8jIn7VbYBmZlaucRN/RDwg6cS8bZIEfAr4SLlhmZnZRCnax/+HwK6IeLrF9gDuk/SopOUFj2VmZiUoOo5/KXBbm+2nR8SwpKOAdZKejIgH8hpmHwzLAaYxvWBYNhlVUXykimNUEWcZyjhGGefTY/3L1/UVv6QDgD8G7mjVJiKGs5+7gXvIL8o+0tbF1s3MKlCkq+ejwJMRMZS3UdLBkg4ZWQbOJL8ou5mZVWjcxJ8VW/8hcLKkIUkXZJuWMKqbR9KxktZkD48GHpK0GXgY+F5EfL+80M3MrBudjOpZ2mL9Z3LWDQPnZMvbgDkF4zMzs5J55q6ZWWKc+M3MEuPEb2aWGCd+M7PEKCJ6HcMYh2pGzNfCXodhZjXgYi6d2RDr2Rt71ElbX/GbmSXGid/MLDFO/GZmiXHiNzNLjBO/mVlinPjNzBLjxG9mlphajuOX9Czw86ZVM4F+qNvbD3H2Q4zgOMvmOMtVxzhPiIgjO2lYy8Q/mqTBiBjodRzj6Yc4+yFGcJxlc5zl6pc4W3FXj5lZYpz4zcwS0y+Jf2WvA+hQP8TZDzGC4yyb4yxXv8SZqy/6+M3MrDz9csVvZmYlqXXil7RI0k8kPSPpS72OpxVJ2yU9JmmTpMFexzNC0ipJuyU93rRuhqR1kp7Ofh7eyxizmPLivFLSL7NzuknSOb2MMYtplqT7JW2V9ISkS7L1tTmnbWKs1fmUNE3Sw5I2Z3H+bbb+JEkbsnN5h6QDaxrnTZJ+1nQ+++re0LXt6pE0BXgK+BgwBDwCLI2IH/c0sByStgMDEVGrcb2S/gjYB9wSEadm6/4B2BMR12QfpodHxBdrGOeVwL6I+KdextZM0jHAMRGxUdIhwKPAJ4DPUJNz2ibGT1Gj8ylJwMERsU/SVOAh4BLgr4C7I+J2STcAmyPi+hrGeRHw3Yj4dq9iK6LOV/zzgGciYltEvAbcDizucUx9JSIeAPaMWr0YuDlbvplGUuipFnHWTkTsjIiN2fJLwFbgOGp0TtvEWCvRsC97ODX7F8BHgJFk2vPXZ5s4+1qdE/9xwI6mx0PU8AWcCeA+SY9KWt7rYMZxdETshEaSAI7qcTztXCxpS9YV1PMuqWaSTgTeB2ygpud0VIxQs/MpaYqkTcBuYB3wU+CFiNifNanFe350nBExcj6vzs7ndZIO6mGIb1udE39eCbG6ftKeHhHvB84GPp91XVgx1wPvAeYCO4FrexvOmyS9A7gLuDQi9vY6njw5MdbufEbE6xExFziexv/wfz+vWbVR5QQwKk5JpwJfBn4P+ANgBtDT7tK3q86JfwiY1fT4eGC4R7G0FRHD2c/dwD00XsR1tSvrBx7pD97d43hyRcSu7A33BvANanJOs37eu4BbI+LubHWtzmlejHU9nwAR8QLw38AHgcMkHZBtqtV7vinORVmXWkTEq8C/UaPz2Yk6J/5HgNnZt/wHAkuA1T2OaQxJB2dfoiHpYOBM4PH2z+qp1cCybHkZ8J0extLSSCLNfJIanNPsi74bga0R8ZWmTbU5p61irNv5lHSkpMOy5d8GPkrj+4j7gfOyZj1/fbaI88mmD3rR+B6i56/Pt6O2o3oAsiFnXwWmAKsi4uoehzSGpHfTuMoHOAD4Vl3ilHQbsIDGnQR3AVcA9wJ3Au8CfgGcHxE9/WK1RZwLaHRLBLAduHCkH71XJH0YeBB4DHgjW30ZjT70WpzTNjEupUbnU9JpNL68nULjAvTOiLgqez/dTqP75H+AP82uqusW5w+AI2l0SW8CLmr6Erj2ap34zcysfHXu6jEzswngxG9mlhgnfjOzxDjxm5klxonfzCwxTvxmZolx4jczS4wTv5lZYv4PkSb1hQw8Pa4AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(mask)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def create_frames(data,height, width, depth):\n", + " days = []\n", + " frames = []\n", + " for i in tqdm(range(depth)):\n", + " frame = np.zeros((height,width,7))\n", + " frame[:,:,:] = np.nan\n", + " for y in range(height):\n", + " for x in range(width):\n", + " if(not data[y][x].empty):\n", + " frame[y][x] = data[y][x].iloc[[i],1:8].values.flatten()\n", + " if((i+1)%24 != 0):\n", + " frames.append(frame)\n", + " else:\n", + " frames.append(frame)\n", + " days.append(frames)\n", + " frames = []\n", + " return np.array(days)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def average_grid(mask,data, height, width):\n", + " for i in range(height):\n", + " for j in range(width):\n", + " if(mask[i][j] != 1):\n", + " neighbors = get_neighbors(j,i,data)\n", + " data[i][j] = np.nanmean(neighbors, axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def get_neighbors(x,y,g):\n", + " neighbors = []\n", + " for i in [y-1,y,y+1]:\n", + " for j in [x-1,x,x+1]:\n", + " if(i >= 0 and j >= 0):\n", + " if(i != y or j != x ):\n", + " try:\n", + " neighbors.append(g[i][j])\n", + " except:\n", + " pass\n", + " return np.array(neighbors)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def store_sequence(frames):\n", + " import hickle as hkl\n", + " train_frames = []\n", + " train_sources = []\n", + " validation_frames = []\n", + " validation_sources = []\n", + " test_frames = []\n", + " test_sources = []\n", + " \n", + " for day in range(len(frames)):\n", + " for hour in range(len(frames[day])):\n", + " if(day/len(frames) < .6):\n", + " train_sources += \"{}\".format(day)\n", + " train_frames.append(frames[day][hour])\n", + " elif(day/len(frames) >= .6 and day/len(frames) < .8):\n", + " validation_sources += \"{}\".format(day)\n", + " validation_frames.append(frames[day][hour])\n", + " else:\n", + " test_sources += \"{}\".format(day)\n", + " test_frames.append(frames[day][hour])\n", + " \n", + " hkl.dump(np.array(train_frames), '../data/x_train.hkl')\n", + " hkl.dump(train_sources, '../data/sources_train.hkl')\n", + " hkl.dump(np.array(validation_frames), '../data/x_val.hkl')\n", + " hkl.dump(validation_sources, '../data/sources_val.hkl')\n", + " hkl.dump(np.array(test_frames), '../data/x_test.hkl')\n", + " hkl.dump(test_sources, '../data/sources_test.hkl')\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Splits is a dictionary holding train, test, val\n", + "the values for train, test, and val are lists of tuples holding category and folder name\n", + "in the end each image gets a source associated with it\n", + "there is only one data and one source hickle dump for each of train, test, and val" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████| 17520/17520 [1:19:50<00:00, 3.66it/s]\n" + ] + } + ], + "source": [ + "frames = create_frames(grid, height, width,depth)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig=plt.figure(figsize=(15,10))\n", + "columns = 3\n", + "rows = 4\n", + "for i in range(1,columns+rows +1):\n", + " fig.add_subplot(rows,columns,i)\n", + " plt.imshow(frames[0,0,:,:,i-1])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 3%|██▋ | 24/730 [00:29<14:19, 1.22s/it]c:\\users\\dasputer\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:6: RuntimeWarning: Mean of empty slice\n", + " \n", + "100%|████████████████████████████████████████████████████████████████████████████████| 730/730 [14:17<00:00, 1.17s/it]\n" + ] + } + ], + "source": [ + "#TODO use loop to average each frame\n", + "for x in tqdm(range(len(frames))):\n", + " for y in range(len(frames[0])):\n", + " average_grid(mask, frames[x][y], height, width )" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig=plt.figure(figsize=(15,10))\n", + "columns = 3\n", + "rows = 4\n", + "for i in range(1,columns+rows +1):\n", + " fig.add_subplot(rows,columns,i)\n", + " plt.imshow(frames[0,0,:,:,i-1])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(730, 24, 20, 40, 7)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "frames.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "store_sequence(frames)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At this point the data has been processed and made into discrete frames and it is time to run it through the PredNet architecture for training." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Project Final/Transformation/stations_mask.csv b/Project Final/Transformation/stations_mask.csv new file mode 100644 index 0000000..0323a44 --- /dev/null +++ b/Project Final/Transformation/stations_mask.csv @@ -0,0 +1,373 @@ +,STATION_ID,LAT_SCALED,LON_SCALED +0,WBAN:00184,16,22 +1,WBAN:14929,3,18 +2,WBAN:13962,14,17 +3,WBAN:94975,5,17 +4,WBAN:14813,7,30 +5,WBAN:53864,14,26 +6,WBAN:23061,10,13 +7,WBAN:54921,6,18 +8,WBAN:00258,12,12 +9,WBAN:24044,6,15 +10,WBAN:03049,16,14 +11,WBAN:94299,6,2 +12,WBAN:53933,10,18 +13,WBAN:23047,12,16 +14,WBAN:63811,12,28 +15,WBAN:00137,11,13 +16,WBAN:04864,3,24 +17,WBAN:12832,17,27 +18,WBAN:93730,8,35 +19,WBAN:53932,12,19 +20,WBAN:14605,4,38 +21,WBAN:94281,3,1 +22,WBAN:54817,4,29 +23,WBAN:53138,8,7 +24,WBAN:24130,3,4 +25,WBAN:23155,12,3 +26,WBAN:14606,3,39 +27,WBAN:14616,4,39 +28,WBAN:54833,5,24 +30,WBAN:00282,2,14 +31,WBAN:94947,7,19 +32,WBAN:00127,18,18 +33,WBAN:00224,4,2 +34,WBAN:54781,5,36 +35,WBAN:03044,14,16 +36,WBAN:24033,3,11 +37,WBAN:04725,6,34 +38,WBAN:23157,10,4 +39,WBAN:24011,2,16 +40,WBAN:00286,4,23 +41,WBAN:53881,10,31 +42,WBAN:03036,10,10 +43,WBAN:94793,7,37 +44,WBAN:23225,8,2 +45,WBAN:03859,10,30 +46,WBAN:23158,13,6 +47,WBAN:00263,17,18 +48,WBAN:24131,5,5 +49,WBAN:63871,16,27 +50,WBAN:14739,6,37 +51,WBAN:00310,0,5 +52,WBAN:93808,10,26 +53,WBAN:00353,5,11 +54,WBAN:24132,3,9 +55,WBAN:00451,10,21 +56,WBAN:00435,18,20 +57,WBAN:00433,9,3 +58,WBAN:24180,6,8 +59,WBAN:94946,6,17 +60,WBAN:94902,4,19 +61,WBAN:03721,13,32 +62,WBAN:23159,10,8 +63,WBAN:94037,3,14 +64,WBAN:94054,4,12 +65,WBAN:03068,9,14 +66,WBAN:04866,5,25 +67,WBAN:94282,0,1 +68,WBAN:14742,4,36 +69,WBAN:14817,4,27 +70,WBAN:54743,7,35 +72,WBAN:12986,17,19 +73,WBAN:23136,13,3 +74,WBAN:54923,3,19 +75,WBAN:00285,0,17 +76,WBAN:93729,12,34 +77,WBAN:93810,10,24 +78,WBAN:03177,14,4 +80,WBAN:24089,5,12 +81,WBAN:00465,6,32 +82,WBAN:00283,0,18 +83,WBAN:53887,9,24 +84,WBAN:24017,5,15 +85,WBAN:04114,4,7 +86,WBAN:94943,4,17 +87,WBAN:13880,14,31 +88,WBAN:13866,9,30 +89,WBAN:00143,8,15 +90,WBAN:93203,8,1 +91,WBAN:13301,8,22 +92,WBAN:53916,8,21 +93,WBAN:93104,11,4 +94,WBAN:94605,2,38 +95,WBAN:23051,11,14 +97,WBAN:14820,6,30 +98,WBAN:03027,12,13 +99,WBAN:00222,9,21 +100,WBAN:23008,13,14 +101,WBAN:12867,18,30 +102,WBAN:24045,4,10 +103,WBAN:24136,1,5 +104,WBAN:00276,15,17 +105,WBAN:53129,10,7 +107,WBAN:03945,9,22 +109,WBAN:13812,8,29 +110,WBAN:13984,8,18 +111,WBAN:94057,5,13 +113,WBAN:04141,5,0 +114,WBAN:00234,11,23 +115,WBAN:04908,7,20 +116,WBAN:94977,0,22 +117,WBAN:24286,6,0 +118,WBAN:04915,7,21 +119,WBAN:03073,15,20 +120,WBAN:00287,0,14 +121,WBAN:03847,11,27 +123,WBAN:93798,9,32 +124,WBAN:00316,3,22 +125,WBAN:94032,4,14 +126,WBAN:24137,0,8 +127,WBAN:23161,12,5 +128,WBAN:24219,3,2 +129,WBAN:54734,6,35 +130,WBAN:94704,5,32 +131,WBAN:04223,0,2 +133,WBAN:04871,6,25 +134,WBAN:53925,13,21 +135,WBAN:03976,16,21 +136,WBAN:53964,13,18 +137,WBAN:04916,5,23 +138,WBAN:22001,17,16 +139,WBAN:00315,7,29 +140,WBAN:23162,8,8 +141,WBAN:23078,14,11 +142,WBAN:00445,14,25 +143,WBAN:04139,6,3 +144,WBAN:14933,6,21 +145,WBAN:03104,13,5 +146,WBAN:53853,16,26 +147,WBAN:24138,3,8 +148,WBAN:00444,7,11 +149,WBAN:04978,4,22 +150,WBAN:13985,10,17 +151,WBAN:93026,15,10 +152,WBAN:13707,8,34 +153,WBAN:54786,7,34 +154,WBAN:54844,2,28 +155,WBAN:04787,7,32 +156,WBAN:00443,5,10 +158,WBAN:03070,11,15 +159,WBAN:14747,5,31 +160,WBAN:00298,5,29 +161,WBAN:03809,11,24 +164,WBAN:00254,18,22 +165,WBAN:14991,3,23 +166,WBAN:23114,12,4 +167,WBAN:93816,8,25 +168,WBAN:93992,14,22 +169,WBAN:23044,15,12 +170,WBAN:00182,2,20 +171,WBAN:13786,11,34 +172,WBAN:00210,11,29 +173,WBAN:93076,10,15 +174,WBAN:03733,8,31 +176,WBAN:24220,1,2 +177,WBAN:24006,4,15 +178,WBAN:14748,6,33 +180,WBAN:13989,9,19 +181,WBAN:53986,11,18 +182,WBAN:24141,1,3 +183,WBAN:94853,3,26 +184,WBAN:94971,5,20 +185,WBAN:00304,18,23 +186,WBAN:24221,4,0 +189,WBAN:04111,7,9 +190,WBAN:24114,1,4 +191,WBAN:00220,13,30 +192,WBAN:04925,7,22 +193,WBAN:94056,3,15 +194,WBAN:00270,18,17 +196,WBAN:94957,8,20 +197,WBAN:94969,4,21 +198,WBAN:23090,10,11 +199,WBAN:93996,10,23 +200,WBAN:03707,10,32 +201,WBAN:53922,11,21 +202,WBAN:13762,10,34 +203,WBAN:94966,2,19 +204,WBAN:00326,16,30 +205,WBAN:00237,2,22 +206,WBAN:14825,7,28 +207,WBAN:04780,5,37 +209,WBAN:53889,9,25 +210,WBAN:13829,14,27 +211,WBAN:00449,6,9 +212,WBAN:13806,11,26 +214,WBAN:94933,5,21 +216,WBAN:00162,7,14 +217,WBAN:63847,12,27 +218,WBAN:12895,19,31 +219,WBAN:53988,15,22 +220,WBAN:13947,8,19 +221,WBAN:53861,15,27 +222,WBAN:13964,12,21 +223,WBAN:03875,15,30 +224,WBAN:23091,16,15 +225,WBAN:14827,7,27 +226,WBAN:04929,1,20 +227,WBAN:53841,9,27 +228,WBAN:54818,4,26 +229,WBAN:00152,3,36 +230,WBAN:94868,6,31 +231,WBAN:03981,13,17 +232,WBAN:93947,16,17 +233,WBAN:03706,9,33 +234,WBAN:04876,6,24 +235,WBAN:04924,6,19 +236,WBAN:04836,1,39 +237,WBAN:93193,10,3 +238,WBAN:94276,0,0 +240,WBAN:54772,4,37 +241,WBAN:00265,7,26 +242,WBAN:03896,13,27 +243,WBAN:13975,11,17 +244,WBAN:03056,14,15 +245,WBAN:93764,8,33 +246,WBAN:94959,7,23 +247,WBAN:12993,17,24 +248,WBAN:23081,12,10 +249,WBAN:23064,9,16 +250,WBAN:94041,1,16 +251,WBAN:04807,6,26 +252,WBAN:53870,12,30 +253,WBAN:04854,3,28 +254,WBAN:00391,13,31 +255,WBAN:13764,9,34 +256,WBAN:53982,14,20 +257,WBAN:94008,0,12 +258,WBAN:00361,10,27 +260,WBAN:24087,1,13 +261,WBAN:14750,5,35 +262,WBAN:00135,9,1 +263,WBAN:53893,13,25 +264,WBAN:03708,12,32 +265,WBAN:23065,8,16 +266,WBAN:04994,0,20 +267,WBAN:14829,6,27 +268,WBAN:53977,14,18 +269,WBAN:03195,11,8 +270,WBAN:14916,1,19 +271,WBAN:23066,8,11 +272,WBAN:94992,1,24 +273,WBAN:94919,1,21 +274,WBAN:04999,3,20 +275,WBAN:00481,9,8 +276,WBAN:00387,4,3 +277,WBAN:93057,12,11 +278,WBAN:24201,1,1 +279,WBAN:53967,13,19 +280,WBAN:24143,1,9 +281,WBAN:04880,7,25 +282,WBAN:24051,7,13 +283,WBAN:14898,4,25 +284,WBAN:13723,11,31 +285,WBAN:13939,13,23 +286,WBAN:63874,15,26 +287,WBAN:94626,3,38 +288,WBAN:13926,14,19 +289,WBAN:53874,13,29 +291,WBAN:24048,4,11 +293,WBAN:14976,6,22 +294,WBAN:03870,12,29 +295,WBAN:54819,6,29 +296,WBAN:53941,11,20 +298,WBAN:53913,11,19 +299,WBAN:03030,11,16 +300,WBAN:94836,2,26 +301,WBAN:00150,2,18 +302,WBAN:00221,12,8 +303,WBAN:00186,16,25 +304,WBAN:93706,8,32 +305,WBAN:94161,5,7 +306,WBAN:00231,11,33 +307,WBAN:53938,12,18 +308,WBAN:53855,8,28 +309,WBAN:00357,15,18 +310,WBAN:03908,16,23 +311,WBAN:00154,10,33 +312,WBAN:14858,1,25 +313,WBAN:53119,11,3 +315,WBAN:00455,8,23 +316,WBAN:04884,3,27 +317,WBAN:04936,6,20 +318,WBAN:00159,9,12 +319,WBAN:14751,7,33 +320,WBAN:13971,11,22 +321,WBAN:00431,14,21 +322,WBAN:14752,6,36 +323,WBAN:00219,12,31 +324,WBAN:00322,1,17 +326,WBAN:94012,0,10 +327,WBAN:03167,13,4 +328,WBAN:94025,7,12 +330,WBAN:93228,10,1 +331,WBAN:94973,2,23 +332,WBAN:53973,16,19 +333,WBAN:00337,14,29 +334,WBAN:04998,7,18 +335,WBAN:24144,2,8 +336,WBAN:53886,10,25 +337,WBAN:03711,11,32 +338,WBAN:00250,15,28 +340,WBAN:04113,3,3 +341,WBAN:94038,2,15 +342,WBAN:94931,1,22 +343,WBAN:03810,11,30 +344,WBAN:00306,17,21 +345,WBAN:00260,18,21 +346,WBAN:93990,8,17 +347,WBAN:53972,15,19 +348,WBAN:63837,14,30 +349,WBAN:93986,12,17 +350,WBAN:93034,14,14 +352,WBAN:00392,10,2 +353,WBAN:23002,14,12 +355,WBAN:00163,7,15 +356,WBAN:00128,15,29 +357,WBAN:12962,17,17 +358,WBAN:00429,9,11 +359,WBAN:94225,2,0 +360,WBAN:00225,16,18 +361,WBAN:03962,13,22 +362,WBAN:93757,9,31 +363,WBAN:14609,2,39 +364,WBAN:12927,17,23 +365,WBAN:12918,17,20 +366,WBAN:04887,5,28 +367,WBAN:00484,4,13 +368,WBAN:53896,9,26 +369,WBAN:03860,9,29 +370,WBAN:63804,12,26 +371,WBAN:53903,16,20 +372,WBAN:14936,4,18 +373,WBAN:13986,9,18 +374,WBAN:04933,3,21 +375,WBAN:00291,0,19 +376,WBAN:94720,6,38 +377,WBAN:53990,13,20 +378,WBAN:00452,2,5 +379,WBAN:24145,5,8 +380,WBAN:93115,14,5 +381,WBAN:03144,14,6 +382,WBAN:24091,7,16 +383,WBAN:00141,10,20 +385,WBAN:64706,7,31 +386,WBAN:93819,8,26 +387,WBAN:14918,0,21 +388,WBAN:00377,17,29 +389,WBAN:00240,5,27 +390,WBAN:14937,6,23 +391,WBAN:54941,5,22 +392,WBAN:94926,2,24 +393,WBAN:04997,2,21 +394,WBAN:04781,7,36 +395,WBAN:94761,5,33 +396,WBAN:00464,3,25 +397,WBAN:00216,4,28 +399,WBAN:24166,4,9 +401,WBAN:03889,10,29 +402,WBAN:03811,11,25 +403,WBAN:04946,4,20 +404,WBAN:14833,6,28 +405,WBAN:93753,12,33 diff --git a/Project Final/__pycache__/data_utils.cpython-36.pyc b/Project Final/__pycache__/data_utils.cpython-36.pyc deleted file mode 100644 index a4084dd..0000000 Binary files a/Project Final/__pycache__/data_utils.cpython-36.pyc and /dev/null differ diff --git a/Project Final/__pycache__/keras_utils.cpython-36.pyc b/Project Final/__pycache__/keras_utils.cpython-36.pyc deleted file mode 100644 index 3cc921a..0000000 Binary files a/Project Final/__pycache__/keras_utils.cpython-36.pyc and /dev/null differ diff --git a/Project Final/__pycache__/prednet.cpython-36.pyc b/Project Final/__pycache__/prednet.cpython-36.pyc deleted file mode 100644 index 40e185f..0000000 Binary files a/Project Final/__pycache__/prednet.cpython-36.pyc and /dev/null differ diff --git a/Project Final/data/train/x_sources.hkl b/Project Final/data/train/x_sources.hkl deleted file mode 100644 index f0be695..0000000 Binary files a/Project Final/data/train/x_sources.hkl and /dev/null differ diff --git a/Project Final/data/train/x_train.hkl b/Project Final/data/train/x_train.hkl deleted file mode 100644 index 2806410..0000000 Binary files a/Project Final/data/train/x_train.hkl and /dev/null differ diff --git a/preprocessing/.ipynb_checkpoints/preprocess_data-checkpoint.ipynb b/preprocessing/.ipynb_checkpoints/preprocess_data-checkpoint.ipynb deleted file mode 100644 index 239840f..0000000 --- a/preprocessing/.ipynb_checkpoints/preprocess_data-checkpoint.ipynb +++ /dev/null @@ -1,1788 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Preprocess the raw data from NOAA\n", - "This notebook is setup to take in the CSV from NOAA and remove the unneccasary data. This will also seperate out each station for later positioning." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import os\n", - "from tqdm import tqdm" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "#Getting a list of files in raw data folder\n", - "filenames = os.listdir('D:/Nico/Desktop/full_grid')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "header_wanted = [\n", - " 'HOURLYVISIBILITY',\n", - " 'HOURLYDRYBULBTEMPC',\n", - " 'HOURLYWETBULBTEMPC',\n", - " 'HOURLYDewPointTempC',\n", - " 'HOURLYRelativeHumidity',\n", - " 'HOURLYWindSpeed',\n", - " 'HOURLYWindGustSpeed',\n", - " 'HOURLYStationPressure',\n", - " 'HOURLYPressureTendency',\n", - " 'HOURLYPressureChange',\n", - " 'HOURLYSeaLevelPressure',\n", - " 'HOURLYPrecip',\n", - " 'HOURLYAltimeterSetting']" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "usecols = ['DATE','STATION'] + header_wanted" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████████████████████████████████████████████████████████████████████████████| 82/82 [03:04<00:00, 2.25s/it]\n" - ] - } - ], - "source": [ - "#Loading all files into a pandas Dataframe\n", - "tqdm.pandas()\n", - "df = pd.concat([pd.read_csv('D:/Nico/Desktop/full_grid/{}'.format(x), usecols=usecols, low_memory=False) for x in tqdm(filenames)])" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "#Getting the station names\n", - "wban = df['STATION'].unique()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def remove_letters(headers,dataframes):\n", - " for i in tqdm(headers):\n", - " dataframes[i].replace(regex=True,inplace=True,to_replace=r'\\D',value=r'')\n", - " dataframes[i] = dataframes[i].apply(pd.to_numeric)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████████████████████████████████████████████| 13/13 [1:16:01<00:00, 350.87s/it]\n" - ] - } - ], - "source": [ - "remove_letters(header_wanted,df)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████| 394/394 [10:28<00:00, 1.60s/it]\n" - ] - } - ], - "source": [ - "by_station_list = []\n", - "\n", - "for i in tqdm(wban):\n", - " by_station_list.append(df.loc[df.STATION == i])\n", - "del df" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Int64Index: 50881 entries, 0 to 50880\n", - "Data columns (total 15 columns):\n", - "STATION 50881 non-null object\n", - "DATE 50881 non-null object\n", - "HOURLYVISIBILITY 50315 non-null float64\n", - "HOURLYDRYBULBTEMPC 43475 non-null float64\n", - "HOURLYWETBULBTEMPC 41842 non-null float64\n", - "HOURLYDewPointTempC 43475 non-null float64\n", - "HOURLYRelativeHumidity 43475 non-null float64\n", - "HOURLYWindSpeed 50380 non-null float64\n", - "HOURLYWindGustSpeed 3039 non-null float64\n", - "HOURLYStationPressure 48624 non-null float64\n", - "HOURLYPressureTendency 0 non-null float64\n", - "HOURLYPressureChange 0 non-null float64\n", - "HOURLYSeaLevelPressure 0 non-null float64\n", - "HOURLYPrecip 0 non-null float64\n", - "HOURLYAltimeterSetting 48624 non-null float64\n", - "dtypes: float64(13), object(2)\n", - "memory usage: 6.2+ MB\n" - ] - } - ], - "source": [ - "by_station_list[0].info()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████| 394/394 [00:05<00:00, 68.16it/s]\n" - ] - } - ], - "source": [ - "for i in tqdm(range(len(by_station_list))):\n", - " by_station_list[i] = by_station_list[i].set_index(pd.DatetimeIndex(by_station_list[i]['DATE']))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "DatetimeIndex: 50881 entries, 2016-08-01 00:15:00 to 2018-07-31 23:59:00\n", - "Data columns (total 15 columns):\n", - "STATION 50881 non-null object\n", - "DATE 50881 non-null object\n", - "HOURLYVISIBILITY 50315 non-null float64\n", - "HOURLYDRYBULBTEMPC 43475 non-null float64\n", - "HOURLYWETBULBTEMPC 41842 non-null float64\n", - "HOURLYDewPointTempC 43475 non-null float64\n", - "HOURLYRelativeHumidity 43475 non-null float64\n", - "HOURLYWindSpeed 50380 non-null float64\n", - "HOURLYWindGustSpeed 3039 non-null float64\n", - "HOURLYStationPressure 48624 non-null float64\n", - "HOURLYPressureTendency 0 non-null float64\n", - "HOURLYPressureChange 0 non-null float64\n", - "HOURLYSeaLevelPressure 0 non-null float64\n", - "HOURLYPrecip 0 non-null float64\n", - "HOURLYAltimeterSetting 48624 non-null float64\n", - "dtypes: float64(13), object(2)\n", - "memory usage: 6.2+ MB\n" - ] - } - ], - "source": [ - "by_station_list[0].info()" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████| 394/394 [00:04<00:00, 80.90it/s]\n" - ] - } - ], - "source": [ - "for i in tqdm(range(len(by_station_list))):\n", - " by_station_list[i] = by_station_list[i].resample('60T').mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "wban_list = []\n", - "for x in wban:\n", - " wban_list.append(x[:4] + x[5:])" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'WBAN00445'" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wban_list[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
HOURLYVISIBILITYHOURLYDRYBULBTEMPCHOURLYWETBULBTEMPCHOURLYDewPointTempCHOURLYRelativeHumidityHOURLYWindSpeedHOURLYWindGustSpeedHOURLYStationPressureHOURLYPressureTendencyHOURLYPressureChangeHOURLYSeaLevelPressureHOURLYPrecipHOURLYAltimeterSetting
DATE
2016-08-01 00:00:001000.000000254.00000025.600000254.000000100.0000003.000000NaN2992.000000NaNNaNNaNNaN3004.000000
2016-08-01 01:00:001000.000000246.33333324.600000246.333333100.0000001.000000NaN2991.333333NaNNaNNaNNaN3003.333333
2016-08-01 02:00:001000.000000NaNNaNNaNNaN2.000000NaN2992.000000NaNNaNNaNNaN3004.000000
2016-08-01 03:00:001000.000000NaNNaNNaNNaN0.000000NaN2992.333333NaNNaNNaNNaN3004.333333
2016-08-01 04:00:001000.000000NaNNaNNaNNaN0.000000NaN2994.000000NaNNaNNaNNaN3006.000000
2016-08-01 05:00:001000.000000NaNNaNNaNNaN0.000000NaN2995.666667NaNNaNNaNNaN3007.666667
2016-08-01 06:00:001000.000000NaNNaNNaNNaN2.000000NaN2997.333333NaNNaNNaNNaN3009.333333
2016-08-01 07:00:001000.000000253.00000024.600000242.66666794.3333333.666667NaN2998.000000NaNNaNNaNNaN3010.000000
2016-08-01 08:00:001000.000000274.00000024.933333238.33333381.0000001.666667NaN2998.000000NaNNaNNaNNaN3010.000000
2016-08-01 09:00:001000.000000296.33333325.066667231.33333368.0000002.000000NaN2998.000000NaNNaNNaNNaN3010.000000
2016-08-01 10:00:001000.000000310.00000025.366667229.66666762.3333331.000000NaN2997.666667NaNNaNNaNNaN3009.666667
2016-08-01 11:00:001000.000000327.33333325.233333221.33333354.0000002.666667NaN2995.333333NaNNaNNaNNaN3007.333333
2016-08-01 12:00:001000.000000333.00000025.000000214.00000050.0000003.666667NaN2993.333333NaNNaNNaNNaN3005.333333
2016-08-01 13:00:001000.000000338.66666725.033333213.33333348.0000003.666667NaN2992.333333NaNNaNNaNNaN3004.333333
2016-08-01 14:00:001000.000000336.33333325.333333219.00000050.3333335.666667NaN2991.000000NaNNaNNaNNaN3003.000000
2016-08-01 15:00:001000.000000329.66666725.066667215.33333351.33333310.000000NaN2990.000000NaNNaNNaNNaN3002.000000
2016-08-01 16:00:001000.000000307.00000024.566667218.66666759.3333337.000000NaN2990.666667NaNNaNNaNNaN3002.666667
2016-08-01 17:00:001000.000000290.66666724.200000219.66666765.6666673.666667NaN2991.000000NaNNaNNaNNaN3003.000000
2016-08-01 18:00:001000.000000278.00000023.966667222.00000071.6666673.000000NaN2993.333333NaNNaNNaNNaN3005.333333
2016-08-01 19:00:001000.000000264.33333323.633333223.66666778.6666670.000000NaN2992.666667NaNNaNNaNNaN3004.666667
2016-08-01 20:00:001000.000000256.33333323.933333232.33333386.6666671.000000NaN2994.666667NaNNaNNaNNaN3006.666667
2016-08-01 21:00:001000.000000247.33333324.600000247.333333100.0000002.000000NaN2996.000000NaNNaNNaNNaN3008.000000
2016-08-01 22:00:001000.000000244.00000024.400000244.000000100.0000000.000000NaN2995.000000NaNNaNNaNNaN3007.000000
2016-08-01 23:00:001000.000000NaNNaNNaNNaN0.000000NaN2995.000000NaNNaNNaNNaN3007.000000
2016-08-02 00:00:001000.000000NaNNaNNaNNaN0.000000NaN2994.000000NaNNaNNaNNaN3006.000000
2016-08-02 01:00:001000.000000NaNNaNNaNNaN0.000000NaN2994.666667NaNNaNNaNNaN3006.666667
2016-08-02 02:00:001000.000000NaNNaNNaNNaN1.000000NaN2995.000000NaNNaNNaNNaN3007.000000
2016-08-02 03:00:001000.000000NaNNaNNaNNaN0.000000NaN2995.000000NaNNaNNaNNaN3007.000000
2016-08-02 04:00:00800.000000NaNNaNNaNNaN0.000000NaN2995.000000NaNNaNNaNNaN3007.000000
2016-08-02 05:00:00700.000000NaNNaNNaNNaN0.000000NaN2996.000000NaNNaNNaNNaN3008.000000
..........................................
2018-07-30 18:00:001000.000000266.00000022.000000196.00000065.3333336.33333324.02980.666667NaNNaNNaNNaN2992.666667
2018-07-30 19:00:001000.000000245.00000021.400000198.66666775.3333333.000000NaN2982.666667NaNNaNNaNNaN2994.666667
2018-07-30 20:00:001000.000000245.00000021.900000205.66666778.3333331.666667NaN2984.000000NaNNaNNaNNaN2996.000000
2018-07-30 21:00:001000.000000247.33333322.266667210.33333379.6666671.000000NaN2984.333333NaNNaNNaNNaN2996.333333
2018-07-30 22:00:001000.000000246.66666722.266667209.66666779.6666673.666667NaN2985.666667NaNNaNNaNNaN2997.666667
2018-07-30 23:00:001000.000000242.33333322.133333210.33333382.3333332.000000NaN2984.666667NaNNaNNaNNaN2996.666667
2018-07-31 00:00:001000.000000236.66666721.933333211.66666785.6666670.000000NaN2984.000000NaNNaNNaNNaN2996.000000
2018-07-31 01:00:001000.000000231.33333321.833333211.33333388.3333330.000000NaN2982.666667NaNNaNNaNNaN2994.666667
2018-07-31 02:00:00900.000000227.00000021.700000211.66666791.0000003.333333NaN2982.000000NaNNaNNaNNaN2994.000000
2018-07-31 03:00:00700.000000225.66666721.566667211.00000091.6666672.000000NaN2982.666667NaNNaNNaNNaN2994.666667
2018-07-31 04:00:00900.000000224.66666721.500000210.66666792.0000001.000000NaN2984.666667NaNNaNNaNNaN2996.666667
2018-07-31 05:00:00633.333333221.00000021.233333208.33333392.6666670.000000NaN2986.333333NaNNaNNaNNaN2998.333333
2018-07-31 06:00:00800.000000229.33333321.900000214.00000091.0000001.666667NaN2986.666667NaNNaNNaNNaN2998.666667
2018-07-31 07:00:001000.000000248.33333322.700000217.66666783.0000003.666667NaN2987.000000NaNNaNNaNNaN2999.000000
2018-07-31 08:00:001000.000000272.66666723.800000223.66666774.6666674.000000NaN2987.000000NaNNaNNaNNaN2999.000000
2018-07-31 09:00:001000.000000297.66666724.300000219.00000062.6666675.666667NaN2986.333333NaNNaNNaNNaN2998.333333
2018-07-31 10:00:00900.000000306.00000024.233333212.66666757.6666676.333333NaN2985.333333NaNNaNNaNNaN2997.333333
2018-07-31 11:00:001000.000000315.66666724.100000206.00000052.3333335.000000NaN2984.000000NaNNaNNaNNaN2996.000000
2018-07-31 12:00:00800.000000313.66666724.366667211.66666755.0000005.000000NaN2980.666667NaNNaNNaNNaN2992.666667
2018-07-31 13:00:00900.000000285.33333324.100000221.66666768.6666675.000000NaN2978.333333NaNNaNNaNNaN2990.333333
2018-07-31 14:00:00NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2018-07-31 15:00:00NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2018-07-31 16:00:00NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2018-07-31 17:00:00NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2018-07-31 18:00:00NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2018-07-31 19:00:00NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2018-07-31 20:00:00NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2018-07-31 21:00:00NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2018-07-31 22:00:00NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2018-07-31 23:00:001000.000000NaNNaNNaNNaN0.000000NaN2987.666667NaNNaNNaNNaN2999.666667
\n", - "

17520 rows × 13 columns

\n", - "
" - ], - "text/plain": [ - " HOURLYVISIBILITY HOURLYDRYBULBTEMPC HOURLYWETBULBTEMPC \\\n", - "DATE \n", - "2016-08-01 00:00:00 1000.000000 254.000000 25.600000 \n", - "2016-08-01 01:00:00 1000.000000 246.333333 24.600000 \n", - "2016-08-01 02:00:00 1000.000000 NaN NaN \n", - "2016-08-01 03:00:00 1000.000000 NaN NaN \n", - "2016-08-01 04:00:00 1000.000000 NaN NaN \n", - "2016-08-01 05:00:00 1000.000000 NaN NaN \n", - "2016-08-01 06:00:00 1000.000000 NaN NaN \n", - "2016-08-01 07:00:00 1000.000000 253.000000 24.600000 \n", - "2016-08-01 08:00:00 1000.000000 274.000000 24.933333 \n", - "2016-08-01 09:00:00 1000.000000 296.333333 25.066667 \n", - "2016-08-01 10:00:00 1000.000000 310.000000 25.366667 \n", - "2016-08-01 11:00:00 1000.000000 327.333333 25.233333 \n", - "2016-08-01 12:00:00 1000.000000 333.000000 25.000000 \n", - "2016-08-01 13:00:00 1000.000000 338.666667 25.033333 \n", - "2016-08-01 14:00:00 1000.000000 336.333333 25.333333 \n", - "2016-08-01 15:00:00 1000.000000 329.666667 25.066667 \n", - "2016-08-01 16:00:00 1000.000000 307.000000 24.566667 \n", - "2016-08-01 17:00:00 1000.000000 290.666667 24.200000 \n", - "2016-08-01 18:00:00 1000.000000 278.000000 23.966667 \n", - "2016-08-01 19:00:00 1000.000000 264.333333 23.633333 \n", - "2016-08-01 20:00:00 1000.000000 256.333333 23.933333 \n", - "2016-08-01 21:00:00 1000.000000 247.333333 24.600000 \n", - "2016-08-01 22:00:00 1000.000000 244.000000 24.400000 \n", - "2016-08-01 23:00:00 1000.000000 NaN NaN \n", - "2016-08-02 00:00:00 1000.000000 NaN NaN \n", - "2016-08-02 01:00:00 1000.000000 NaN NaN \n", - "2016-08-02 02:00:00 1000.000000 NaN NaN \n", - "2016-08-02 03:00:00 1000.000000 NaN NaN \n", - "2016-08-02 04:00:00 800.000000 NaN NaN \n", - "2016-08-02 05:00:00 700.000000 NaN NaN \n", - "... ... ... ... \n", - "2018-07-30 18:00:00 1000.000000 266.000000 22.000000 \n", - "2018-07-30 19:00:00 1000.000000 245.000000 21.400000 \n", - "2018-07-30 20:00:00 1000.000000 245.000000 21.900000 \n", - "2018-07-30 21:00:00 1000.000000 247.333333 22.266667 \n", - "2018-07-30 22:00:00 1000.000000 246.666667 22.266667 \n", - "2018-07-30 23:00:00 1000.000000 242.333333 22.133333 \n", - "2018-07-31 00:00:00 1000.000000 236.666667 21.933333 \n", - "2018-07-31 01:00:00 1000.000000 231.333333 21.833333 \n", - "2018-07-31 02:00:00 900.000000 227.000000 21.700000 \n", - "2018-07-31 03:00:00 700.000000 225.666667 21.566667 \n", - "2018-07-31 04:00:00 900.000000 224.666667 21.500000 \n", - "2018-07-31 05:00:00 633.333333 221.000000 21.233333 \n", - "2018-07-31 06:00:00 800.000000 229.333333 21.900000 \n", - "2018-07-31 07:00:00 1000.000000 248.333333 22.700000 \n", - "2018-07-31 08:00:00 1000.000000 272.666667 23.800000 \n", - "2018-07-31 09:00:00 1000.000000 297.666667 24.300000 \n", - "2018-07-31 10:00:00 900.000000 306.000000 24.233333 \n", - "2018-07-31 11:00:00 1000.000000 315.666667 24.100000 \n", - "2018-07-31 12:00:00 800.000000 313.666667 24.366667 \n", - "2018-07-31 13:00:00 900.000000 285.333333 24.100000 \n", - "2018-07-31 14:00:00 NaN NaN NaN \n", - "2018-07-31 15:00:00 NaN NaN NaN \n", - "2018-07-31 16:00:00 NaN NaN NaN \n", - "2018-07-31 17:00:00 NaN NaN NaN \n", - "2018-07-31 18:00:00 NaN NaN NaN \n", - "2018-07-31 19:00:00 NaN NaN NaN \n", - "2018-07-31 20:00:00 NaN NaN NaN \n", - "2018-07-31 21:00:00 NaN NaN NaN \n", - "2018-07-31 22:00:00 NaN NaN NaN \n", - "2018-07-31 23:00:00 1000.000000 NaN NaN \n", - "\n", - " HOURLYDewPointTempC HOURLYRelativeHumidity \\\n", - "DATE \n", - "2016-08-01 00:00:00 254.000000 100.000000 \n", - "2016-08-01 01:00:00 246.333333 100.000000 \n", - "2016-08-01 02:00:00 NaN NaN \n", - "2016-08-01 03:00:00 NaN NaN \n", - "2016-08-01 04:00:00 NaN NaN \n", - "2016-08-01 05:00:00 NaN NaN \n", - "2016-08-01 06:00:00 NaN NaN \n", - "2016-08-01 07:00:00 242.666667 94.333333 \n", - "2016-08-01 08:00:00 238.333333 81.000000 \n", - "2016-08-01 09:00:00 231.333333 68.000000 \n", - "2016-08-01 10:00:00 229.666667 62.333333 \n", - "2016-08-01 11:00:00 221.333333 54.000000 \n", - "2016-08-01 12:00:00 214.000000 50.000000 \n", - "2016-08-01 13:00:00 213.333333 48.000000 \n", - "2016-08-01 14:00:00 219.000000 50.333333 \n", - "2016-08-01 15:00:00 215.333333 51.333333 \n", - "2016-08-01 16:00:00 218.666667 59.333333 \n", - "2016-08-01 17:00:00 219.666667 65.666667 \n", - "2016-08-01 18:00:00 222.000000 71.666667 \n", - "2016-08-01 19:00:00 223.666667 78.666667 \n", - "2016-08-01 20:00:00 232.333333 86.666667 \n", - "2016-08-01 21:00:00 247.333333 100.000000 \n", - "2016-08-01 22:00:00 244.000000 100.000000 \n", - "2016-08-01 23:00:00 NaN NaN \n", - "2016-08-02 00:00:00 NaN NaN \n", - "2016-08-02 01:00:00 NaN NaN \n", - "2016-08-02 02:00:00 NaN NaN \n", - "2016-08-02 03:00:00 NaN NaN \n", - "2016-08-02 04:00:00 NaN NaN \n", - "2016-08-02 05:00:00 NaN NaN \n", - "... ... ... \n", - "2018-07-30 18:00:00 196.000000 65.333333 \n", - "2018-07-30 19:00:00 198.666667 75.333333 \n", - "2018-07-30 20:00:00 205.666667 78.333333 \n", - "2018-07-30 21:00:00 210.333333 79.666667 \n", - "2018-07-30 22:00:00 209.666667 79.666667 \n", - "2018-07-30 23:00:00 210.333333 82.333333 \n", - "2018-07-31 00:00:00 211.666667 85.666667 \n", - "2018-07-31 01:00:00 211.333333 88.333333 \n", - "2018-07-31 02:00:00 211.666667 91.000000 \n", - "2018-07-31 03:00:00 211.000000 91.666667 \n", - "2018-07-31 04:00:00 210.666667 92.000000 \n", - "2018-07-31 05:00:00 208.333333 92.666667 \n", - "2018-07-31 06:00:00 214.000000 91.000000 \n", - "2018-07-31 07:00:00 217.666667 83.000000 \n", - "2018-07-31 08:00:00 223.666667 74.666667 \n", - "2018-07-31 09:00:00 219.000000 62.666667 \n", - "2018-07-31 10:00:00 212.666667 57.666667 \n", - "2018-07-31 11:00:00 206.000000 52.333333 \n", - "2018-07-31 12:00:00 211.666667 55.000000 \n", - "2018-07-31 13:00:00 221.666667 68.666667 \n", - "2018-07-31 14:00:00 NaN NaN \n", - "2018-07-31 15:00:00 NaN NaN \n", - "2018-07-31 16:00:00 NaN NaN \n", - "2018-07-31 17:00:00 NaN NaN \n", - "2018-07-31 18:00:00 NaN NaN \n", - "2018-07-31 19:00:00 NaN NaN \n", - "2018-07-31 20:00:00 NaN NaN \n", - "2018-07-31 21:00:00 NaN NaN \n", - "2018-07-31 22:00:00 NaN NaN \n", - "2018-07-31 23:00:00 NaN NaN \n", - "\n", - " HOURLYWindSpeed HOURLYWindGustSpeed \\\n", - "DATE \n", - "2016-08-01 00:00:00 3.000000 NaN \n", - "2016-08-01 01:00:00 1.000000 NaN \n", - "2016-08-01 02:00:00 2.000000 NaN \n", - "2016-08-01 03:00:00 0.000000 NaN \n", - "2016-08-01 04:00:00 0.000000 NaN \n", - "2016-08-01 05:00:00 0.000000 NaN \n", - "2016-08-01 06:00:00 2.000000 NaN \n", - "2016-08-01 07:00:00 3.666667 NaN \n", - "2016-08-01 08:00:00 1.666667 NaN \n", - "2016-08-01 09:00:00 2.000000 NaN \n", - "2016-08-01 10:00:00 1.000000 NaN \n", - "2016-08-01 11:00:00 2.666667 NaN \n", - "2016-08-01 12:00:00 3.666667 NaN \n", - "2016-08-01 13:00:00 3.666667 NaN \n", - "2016-08-01 14:00:00 5.666667 NaN \n", - "2016-08-01 15:00:00 10.000000 NaN \n", - "2016-08-01 16:00:00 7.000000 NaN \n", - "2016-08-01 17:00:00 3.666667 NaN \n", - "2016-08-01 18:00:00 3.000000 NaN \n", - "2016-08-01 19:00:00 0.000000 NaN \n", - "2016-08-01 20:00:00 1.000000 NaN \n", - "2016-08-01 21:00:00 2.000000 NaN \n", - "2016-08-01 22:00:00 0.000000 NaN \n", - "2016-08-01 23:00:00 0.000000 NaN \n", - "2016-08-02 00:00:00 0.000000 NaN \n", - "2016-08-02 01:00:00 0.000000 NaN \n", - "2016-08-02 02:00:00 1.000000 NaN \n", - "2016-08-02 03:00:00 0.000000 NaN \n", - "2016-08-02 04:00:00 0.000000 NaN \n", - "2016-08-02 05:00:00 0.000000 NaN \n", - "... ... ... \n", - "2018-07-30 18:00:00 6.333333 24.0 \n", - "2018-07-30 19:00:00 3.000000 NaN \n", - "2018-07-30 20:00:00 1.666667 NaN \n", - "2018-07-30 21:00:00 1.000000 NaN \n", - "2018-07-30 22:00:00 3.666667 NaN \n", - "2018-07-30 23:00:00 2.000000 NaN \n", - "2018-07-31 00:00:00 0.000000 NaN \n", - "2018-07-31 01:00:00 0.000000 NaN \n", - "2018-07-31 02:00:00 3.333333 NaN \n", - "2018-07-31 03:00:00 2.000000 NaN \n", - "2018-07-31 04:00:00 1.000000 NaN \n", - "2018-07-31 05:00:00 0.000000 NaN \n", - "2018-07-31 06:00:00 1.666667 NaN \n", - "2018-07-31 07:00:00 3.666667 NaN \n", - "2018-07-31 08:00:00 4.000000 NaN \n", - "2018-07-31 09:00:00 5.666667 NaN \n", - "2018-07-31 10:00:00 6.333333 NaN \n", - "2018-07-31 11:00:00 5.000000 NaN \n", - "2018-07-31 12:00:00 5.000000 NaN \n", - "2018-07-31 13:00:00 5.000000 NaN \n", - "2018-07-31 14:00:00 NaN NaN \n", - "2018-07-31 15:00:00 NaN NaN \n", - "2018-07-31 16:00:00 NaN NaN \n", - "2018-07-31 17:00:00 NaN NaN \n", - "2018-07-31 18:00:00 NaN NaN \n", - "2018-07-31 19:00:00 NaN NaN \n", - "2018-07-31 20:00:00 NaN NaN \n", - "2018-07-31 21:00:00 NaN NaN \n", - "2018-07-31 22:00:00 NaN NaN \n", - "2018-07-31 23:00:00 0.000000 NaN \n", - "\n", - " HOURLYStationPressure HOURLYPressureTendency \\\n", - "DATE \n", - "2016-08-01 00:00:00 2992.000000 NaN \n", - "2016-08-01 01:00:00 2991.333333 NaN \n", - "2016-08-01 02:00:00 2992.000000 NaN \n", - "2016-08-01 03:00:00 2992.333333 NaN \n", - "2016-08-01 04:00:00 2994.000000 NaN \n", - "2016-08-01 05:00:00 2995.666667 NaN \n", - "2016-08-01 06:00:00 2997.333333 NaN \n", - "2016-08-01 07:00:00 2998.000000 NaN \n", - "2016-08-01 08:00:00 2998.000000 NaN \n", - "2016-08-01 09:00:00 2998.000000 NaN \n", - "2016-08-01 10:00:00 2997.666667 NaN \n", - "2016-08-01 11:00:00 2995.333333 NaN \n", - "2016-08-01 12:00:00 2993.333333 NaN \n", - "2016-08-01 13:00:00 2992.333333 NaN \n", - "2016-08-01 14:00:00 2991.000000 NaN \n", - "2016-08-01 15:00:00 2990.000000 NaN \n", - "2016-08-01 16:00:00 2990.666667 NaN \n", - "2016-08-01 17:00:00 2991.000000 NaN \n", - "2016-08-01 18:00:00 2993.333333 NaN \n", - "2016-08-01 19:00:00 2992.666667 NaN \n", - "2016-08-01 20:00:00 2994.666667 NaN \n", - "2016-08-01 21:00:00 2996.000000 NaN \n", - "2016-08-01 22:00:00 2995.000000 NaN \n", - "2016-08-01 23:00:00 2995.000000 NaN \n", - "2016-08-02 00:00:00 2994.000000 NaN \n", - "2016-08-02 01:00:00 2994.666667 NaN \n", - "2016-08-02 02:00:00 2995.000000 NaN \n", - "2016-08-02 03:00:00 2995.000000 NaN \n", - "2016-08-02 04:00:00 2995.000000 NaN \n", - "2016-08-02 05:00:00 2996.000000 NaN \n", - "... ... ... \n", - "2018-07-30 18:00:00 2980.666667 NaN \n", - "2018-07-30 19:00:00 2982.666667 NaN \n", - "2018-07-30 20:00:00 2984.000000 NaN \n", - "2018-07-30 21:00:00 2984.333333 NaN \n", - "2018-07-30 22:00:00 2985.666667 NaN \n", - "2018-07-30 23:00:00 2984.666667 NaN \n", - "2018-07-31 00:00:00 2984.000000 NaN \n", - "2018-07-31 01:00:00 2982.666667 NaN \n", - "2018-07-31 02:00:00 2982.000000 NaN \n", - "2018-07-31 03:00:00 2982.666667 NaN \n", - "2018-07-31 04:00:00 2984.666667 NaN \n", - "2018-07-31 05:00:00 2986.333333 NaN \n", - "2018-07-31 06:00:00 2986.666667 NaN \n", - "2018-07-31 07:00:00 2987.000000 NaN \n", - "2018-07-31 08:00:00 2987.000000 NaN \n", - "2018-07-31 09:00:00 2986.333333 NaN \n", - "2018-07-31 10:00:00 2985.333333 NaN \n", - "2018-07-31 11:00:00 2984.000000 NaN \n", - "2018-07-31 12:00:00 2980.666667 NaN \n", - "2018-07-31 13:00:00 2978.333333 NaN \n", - "2018-07-31 14:00:00 NaN NaN \n", - "2018-07-31 15:00:00 NaN NaN \n", - "2018-07-31 16:00:00 NaN NaN \n", - "2018-07-31 17:00:00 NaN NaN \n", - "2018-07-31 18:00:00 NaN NaN \n", - "2018-07-31 19:00:00 NaN NaN \n", - "2018-07-31 20:00:00 NaN NaN \n", - "2018-07-31 21:00:00 NaN NaN \n", - "2018-07-31 22:00:00 NaN NaN \n", - "2018-07-31 23:00:00 2987.666667 NaN \n", - "\n", - " HOURLYPressureChange HOURLYSeaLevelPressure \\\n", - "DATE \n", - "2016-08-01 00:00:00 NaN NaN \n", - "2016-08-01 01:00:00 NaN NaN \n", - "2016-08-01 02:00:00 NaN NaN \n", - "2016-08-01 03:00:00 NaN NaN \n", - "2016-08-01 04:00:00 NaN NaN \n", - "2016-08-01 05:00:00 NaN NaN \n", - "2016-08-01 06:00:00 NaN NaN \n", - "2016-08-01 07:00:00 NaN NaN \n", - "2016-08-01 08:00:00 NaN NaN \n", - "2016-08-01 09:00:00 NaN NaN \n", - "2016-08-01 10:00:00 NaN NaN \n", - "2016-08-01 11:00:00 NaN NaN \n", - "2016-08-01 12:00:00 NaN NaN \n", - "2016-08-01 13:00:00 NaN NaN \n", - "2016-08-01 14:00:00 NaN NaN \n", - "2016-08-01 15:00:00 NaN NaN \n", - "2016-08-01 16:00:00 NaN NaN \n", - "2016-08-01 17:00:00 NaN NaN \n", - "2016-08-01 18:00:00 NaN NaN \n", - "2016-08-01 19:00:00 NaN NaN \n", - "2016-08-01 20:00:00 NaN NaN \n", - "2016-08-01 21:00:00 NaN NaN \n", - "2016-08-01 22:00:00 NaN NaN \n", - "2016-08-01 23:00:00 NaN NaN \n", - "2016-08-02 00:00:00 NaN NaN \n", - "2016-08-02 01:00:00 NaN NaN \n", - "2016-08-02 02:00:00 NaN NaN \n", - "2016-08-02 03:00:00 NaN NaN \n", - "2016-08-02 04:00:00 NaN NaN \n", - "2016-08-02 05:00:00 NaN NaN \n", - "... ... ... \n", - "2018-07-30 18:00:00 NaN NaN \n", - "2018-07-30 19:00:00 NaN NaN \n", - "2018-07-30 20:00:00 NaN NaN \n", - "2018-07-30 21:00:00 NaN NaN \n", - "2018-07-30 22:00:00 NaN NaN \n", - "2018-07-30 23:00:00 NaN NaN \n", - "2018-07-31 00:00:00 NaN NaN \n", - "2018-07-31 01:00:00 NaN NaN \n", - "2018-07-31 02:00:00 NaN NaN \n", - "2018-07-31 03:00:00 NaN NaN \n", - "2018-07-31 04:00:00 NaN NaN \n", - "2018-07-31 05:00:00 NaN NaN \n", - "2018-07-31 06:00:00 NaN NaN \n", - "2018-07-31 07:00:00 NaN NaN \n", - "2018-07-31 08:00:00 NaN NaN \n", - "2018-07-31 09:00:00 NaN NaN \n", - "2018-07-31 10:00:00 NaN NaN \n", - "2018-07-31 11:00:00 NaN NaN \n", - "2018-07-31 12:00:00 NaN NaN \n", - "2018-07-31 13:00:00 NaN NaN \n", - "2018-07-31 14:00:00 NaN NaN \n", - "2018-07-31 15:00:00 NaN NaN \n", - "2018-07-31 16:00:00 NaN NaN \n", - "2018-07-31 17:00:00 NaN NaN \n", - "2018-07-31 18:00:00 NaN NaN \n", - "2018-07-31 19:00:00 NaN NaN \n", - "2018-07-31 20:00:00 NaN NaN \n", - "2018-07-31 21:00:00 NaN NaN \n", - "2018-07-31 22:00:00 NaN NaN \n", - "2018-07-31 23:00:00 NaN NaN \n", - "\n", - " HOURLYPrecip HOURLYAltimeterSetting \n", - "DATE \n", - "2016-08-01 00:00:00 NaN 3004.000000 \n", - "2016-08-01 01:00:00 NaN 3003.333333 \n", - "2016-08-01 02:00:00 NaN 3004.000000 \n", - "2016-08-01 03:00:00 NaN 3004.333333 \n", - "2016-08-01 04:00:00 NaN 3006.000000 \n", - "2016-08-01 05:00:00 NaN 3007.666667 \n", - "2016-08-01 06:00:00 NaN 3009.333333 \n", - "2016-08-01 07:00:00 NaN 3010.000000 \n", - "2016-08-01 08:00:00 NaN 3010.000000 \n", - "2016-08-01 09:00:00 NaN 3010.000000 \n", - "2016-08-01 10:00:00 NaN 3009.666667 \n", - "2016-08-01 11:00:00 NaN 3007.333333 \n", - "2016-08-01 12:00:00 NaN 3005.333333 \n", - "2016-08-01 13:00:00 NaN 3004.333333 \n", - "2016-08-01 14:00:00 NaN 3003.000000 \n", - "2016-08-01 15:00:00 NaN 3002.000000 \n", - "2016-08-01 16:00:00 NaN 3002.666667 \n", - "2016-08-01 17:00:00 NaN 3003.000000 \n", - "2016-08-01 18:00:00 NaN 3005.333333 \n", - "2016-08-01 19:00:00 NaN 3004.666667 \n", - "2016-08-01 20:00:00 NaN 3006.666667 \n", - "2016-08-01 21:00:00 NaN 3008.000000 \n", - "2016-08-01 22:00:00 NaN 3007.000000 \n", - "2016-08-01 23:00:00 NaN 3007.000000 \n", - "2016-08-02 00:00:00 NaN 3006.000000 \n", - "2016-08-02 01:00:00 NaN 3006.666667 \n", - "2016-08-02 02:00:00 NaN 3007.000000 \n", - "2016-08-02 03:00:00 NaN 3007.000000 \n", - "2016-08-02 04:00:00 NaN 3007.000000 \n", - "2016-08-02 05:00:00 NaN 3008.000000 \n", - "... ... ... \n", - "2018-07-30 18:00:00 NaN 2992.666667 \n", - "2018-07-30 19:00:00 NaN 2994.666667 \n", - "2018-07-30 20:00:00 NaN 2996.000000 \n", - "2018-07-30 21:00:00 NaN 2996.333333 \n", - "2018-07-30 22:00:00 NaN 2997.666667 \n", - "2018-07-30 23:00:00 NaN 2996.666667 \n", - "2018-07-31 00:00:00 NaN 2996.000000 \n", - "2018-07-31 01:00:00 NaN 2994.666667 \n", - "2018-07-31 02:00:00 NaN 2994.000000 \n", - "2018-07-31 03:00:00 NaN 2994.666667 \n", - "2018-07-31 04:00:00 NaN 2996.666667 \n", - "2018-07-31 05:00:00 NaN 2998.333333 \n", - "2018-07-31 06:00:00 NaN 2998.666667 \n", - "2018-07-31 07:00:00 NaN 2999.000000 \n", - "2018-07-31 08:00:00 NaN 2999.000000 \n", - "2018-07-31 09:00:00 NaN 2998.333333 \n", - "2018-07-31 10:00:00 NaN 2997.333333 \n", - "2018-07-31 11:00:00 NaN 2996.000000 \n", - "2018-07-31 12:00:00 NaN 2992.666667 \n", - "2018-07-31 13:00:00 NaN 2990.333333 \n", - "2018-07-31 14:00:00 NaN NaN \n", - "2018-07-31 15:00:00 NaN NaN \n", - "2018-07-31 16:00:00 NaN NaN \n", - "2018-07-31 17:00:00 NaN NaN \n", - "2018-07-31 18:00:00 NaN NaN \n", - "2018-07-31 19:00:00 NaN NaN \n", - "2018-07-31 20:00:00 NaN NaN \n", - "2018-07-31 21:00:00 NaN NaN \n", - "2018-07-31 22:00:00 NaN NaN \n", - "2018-07-31 23:00:00 NaN 2999.666667 \n", - "\n", - "[17520 rows x 13 columns]" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "by_station_list[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████| 394/394 [02:04<00:00, 3.17it/s]\n" - ] - } - ], - "source": [ - "for i in tqdm(range(len(wban))):\n", - " by_station_list[i].to_csv('D:/Nico/Desktop/processed_data/{}.csv'.format(wban_list[i]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Current Issues\n", - "\n", - "1) data is not synced across time-zone and all entries start at midnight local time. \n", - "\n", - "2) some stations have multiple entries per hour and need to be reduced.\n", - "\n", - "Solutions\n", - "\n", - "Remove rows from data based on timezone to sync times\n", - "limit only 1 entry per hour for a station" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/preprocessing/preprocess_data.ipynb b/preprocessing/preprocess_data.ipynb deleted file mode 100644 index 0304a5a..0000000 --- a/preprocessing/preprocess_data.ipynb +++ /dev/null @@ -1,1898 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Preprocess the raw data from NOAA\n", - "This notebook is setup to take in the CSV from NOAA and remove the unneccasary data. This will also seperate out each station for later positioning." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import os\n", - "from tqdm import tqdm" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "#Getting a list of files in raw data folder\n", - "filenames = os.listdir('D:/Nico/Desktop/full_grid')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "header_wanted = [\n", - " 'HOURLYVISIBILITY',\n", - " 'HOURLYDRYBULBTEMPC',\n", - " 'HOURLYWETBULBTEMPC',\n", - " 'HOURLYDewPointTempC',\n", - " 'HOURLYRelativeHumidity',\n", - " 'HOURLYWindSpeed',\n", - " 'HOURLYWindGustSpeed',\n", - " 'HOURLYStationPressure',\n", - " 'HOURLYPressureTendency',\n", - " 'HOURLYPressureChange',\n", - " 'HOURLYSeaLevelPressure',\n", - " 'HOURLYPrecip',\n", - " 'HOURLYAltimeterSetting']" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "usecols = ['DATE','STATION'] + header_wanted" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████████████████████████████████████████████████████████████████████████████| 82/82 [03:05<00:00, 2.26s/it]\n" - ] - } - ], - "source": [ - "#Loading all files into a pandas Dataframe\n", - "tqdm.pandas()\n", - "df = pd.concat([pd.read_csv('D:/Nico/Desktop/full_grid/{}'.format(x), usecols=usecols, low_memory=False) for x in tqdm(filenames)])" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "406" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Getting the station names\n", - "#wban = df['STATION'].unique()\n", - "stations = pd.read_csv(\"../Playground/stations_unique.csv\", usecols = ['STATION_ID'])\n", - "wban_list = stations['STATION_ID'].tolist()\n", - "len(wban_list)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def remove_letters(headers,dataframes):\n", - " for i in tqdm(headers):\n", - " dataframes[i].replace(regex=True,inplace=True,to_replace=r'\\D',value=r'')\n", - " dataframes[i] = dataframes[i].apply(pd.to_numeric)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████████████████████████████████████████████| 13/13 [1:11:23<00:00, 329.48s/it]\n" - ] - } - ], - "source": [ - "remove_letters(header_wanted,df)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████| 406/406 [10:47<00:00, 1.59s/it]\n" - ] - } - ], - "source": [ - "by_station_list = []\n", - "\n", - "for i in tqdm(wban_list):\n", - " by_station_list.append(df.loc[df.STATION == i])\n", - "del df" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Int64Index: 46719 entries, 109127 to 155845\n", - "Data columns (total 15 columns):\n", - "STATION 46719 non-null object\n", - "DATE 46719 non-null object\n", - "HOURLYVISIBILITY 43438 non-null float64\n", - "HOURLYDRYBULBTEMPC 46196 non-null float64\n", - "HOURLYWETBULBTEMPC 44790 non-null float64\n", - "HOURLYDewPointTempC 46195 non-null float64\n", - "HOURLYRelativeHumidity 46195 non-null float64\n", - "HOURLYWindSpeed 44852 non-null float64\n", - "HOURLYWindGustSpeed 6657 non-null float64\n", - "HOURLYStationPressure 44796 non-null float64\n", - "HOURLYPressureTendency 0 non-null float64\n", - "HOURLYPressureChange 0 non-null float64\n", - "HOURLYSeaLevelPressure 0 non-null float64\n", - "HOURLYPrecip 2096 non-null float64\n", - "HOURLYAltimeterSetting 46197 non-null float64\n", - "dtypes: float64(13), object(2)\n", - "memory usage: 5.7+ MB\n" - ] - } - ], - "source": [ - "by_station_list[0].info()" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████| 406/406 [00:07<00:00, 54.83it/s]\n" - ] - } - ], - "source": [ - "for i in tqdm(range(len(by_station_list))):\n", - " by_station_list[i]['STATION_ID'] = by_station_list[i]['STATION']\n", - " by_station_list[i] = by_station_list[i].set_index(pd.DatetimeIndex(by_station_list[i]['DATE']))" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "DatetimeIndex: 46719 entries, 2016-08-01 00:15:00 to 2018-07-31 23:59:00\n", - "Data columns (total 16 columns):\n", - "STATION 46719 non-null object\n", - "DATE 46719 non-null object\n", - "HOURLYVISIBILITY 43438 non-null float64\n", - "HOURLYDRYBULBTEMPC 46196 non-null float64\n", - "HOURLYWETBULBTEMPC 44790 non-null float64\n", - "HOURLYDewPointTempC 46195 non-null float64\n", - "HOURLYRelativeHumidity 46195 non-null float64\n", - "HOURLYWindSpeed 44852 non-null float64\n", - "HOURLYWindGustSpeed 6657 non-null float64\n", - "HOURLYStationPressure 44796 non-null float64\n", - "HOURLYPressureTendency 0 non-null float64\n", - "HOURLYPressureChange 0 non-null float64\n", - "HOURLYSeaLevelPressure 0 non-null float64\n", - "HOURLYPrecip 2096 non-null float64\n", - "HOURLYAltimeterSetting 46197 non-null float64\n", - "STATION_ID 46719 non-null object\n", - "dtypes: float64(13), object(3)\n", - "memory usage: 6.1+ MB\n" - ] - } - ], - "source": [ - "by_station_list[0].info()" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████| 406/406 [00:05<00:00, 73.63it/s]\n" - ] - } - ], - "source": [ - "for i in tqdm(range(len(by_station_list))):\n", - " by_station_list[i] = by_station_list[i].resample('60T').mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "wban_name = []\n", - "for x in wban_list:\n", - " wban_name.append(x[:4] + x[5:])" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'WBAN00184'" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wban_name[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'WBAN:00184'" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wban_list[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████████████████████████████████████████████| 406/406 [00:00<00:00, 675.55it/s]\n" - ] - } - ], - "source": [ - "for i in tqdm(range(len(by_station_list))):\n", - " by_station_list[i]['STATION'] = wban_list[i] " - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
HOURLYVISIBILITYHOURLYDRYBULBTEMPCHOURLYWETBULBTEMPCHOURLYDewPointTempCHOURLYRelativeHumidityHOURLYWindSpeedHOURLYWindGustSpeedHOURLYStationPressureHOURLYPressureTendencyHOURLYPressureChangeHOURLYSeaLevelPressureHOURLYPrecipHOURLYAltimeterSettingSTATION
DATE
2016-08-01 00:00:00525.000000243.00000024.400000243.000000100.0000000.000000NaN2999.000000NaNNaNNaNNaN3004.000000WBAN:00184
2016-08-01 01:00:00433.333333240.33333323.900000240.333333100.0000000.000000NaN2999.333333NaNNaNNaNNaN3004.333333WBAN:00184
2016-08-01 02:00:00316.666667237.33333323.500000237.333333100.0000000.000000NaN2998.666667NaNNaNNaNNaN3003.666667WBAN:00184
2016-08-01 03:00:0091.666667237.33333323.900000237.333333100.0000000.000000NaN2998.333333NaNNaNNaNNaN3003.333333WBAN:00184
2016-08-01 04:00:00733.333333235.66666723.500000235.666667100.0000000.000000NaN2999.333333NaNNaNNaNNaN3004.333333WBAN:00184
2016-08-01 05:00:00633.333333237.66666723.900000237.666667100.0000000.000000NaN3000.333333NaNNaNNaNNaN3005.333333WBAN:00184
2016-08-01 06:00:00900.000000249.00000025.000000249.000000100.0000000.000000NaN3001.666667NaNNaNNaNNaN3006.666667WBAN:00184
2016-08-01 07:00:001000.000000264.00000026.366667262.66666799.3333330.000000NaN3003.666667NaNNaNNaNNaN3008.666667WBAN:00184
2016-08-01 08:00:001000.000000283.00000027.133333267.33333391.0000001.666667NaN3004.000000NaNNaNNaNNaN3009.000000WBAN:00184
2016-08-01 09:00:001000.000000296.66666727.333333265.00000083.0000001.000000NaN3004.000000NaNNaNNaNNaN3009.000000WBAN:00184
2016-08-01 10:00:001000.000000301.66666726.833333255.66666776.3333330.000000NaN3005.666667NaNNaNNaNNaN3010.666667WBAN:00184
2016-08-01 11:00:001000.000000285.33333326.033333251.66666782.3333337.00000020.03005.666667NaNNaNNaNNaN3010.666667WBAN:00184
2016-08-01 12:00:001000.000000271.33333325.300000243.33333384.6666673.333333NaN3004.000000NaNNaNNaNNaN3009.000000WBAN:00184
2016-08-01 13:00:001000.000000281.66666726.133333253.33333384.6666670.000000NaN3002.666667NaNNaNNaNNaN3007.666667WBAN:00184
2016-08-01 14:00:00NaN305.33333326.466667248.66666771.6666671.000000NaN3000.333333NaNNaNNaNNaN3005.333333WBAN:00184
2016-08-01 15:00:00NaN314.66666726.933333250.66666769.0000000.000000NaN2999.000000NaNNaNNaNNaN3004.000000WBAN:00184
2016-08-01 16:00:00NaN309.00000026.433333246.66666769.3333330.000000NaN2998.000000NaNNaNNaNNaN3003.000000WBAN:00184
2016-08-01 17:00:001000.000000302.66666726.700000254.66666775.6666671.000000NaN2997.000000NaNNaNNaNNaN3002.000000WBAN:00184
2016-08-01 18:00:001000.000000290.00000026.933333260.00000084.0000000.000000NaN2998.333333NaNNaNNaNNaN3003.333333WBAN:00184
2016-08-01 19:00:001000.000000271.33333326.500000261.33333394.3333332.666667NaN2999.000000NaNNaNNaNNaN3004.000000WBAN:00184
2016-08-01 20:00:001000.000000265.33333326.000000258.33333396.0000000.000000NaN3000.333333NaNNaNNaNNaN3005.333333WBAN:00184
2016-08-01 21:00:001000.000000256.66666725.766667256.00000099.6666670.000000NaN3002.666667NaNNaNNaNNaN3007.666667WBAN:00184
2016-08-01 22:00:001000.000000253.66666725.400000253.666667100.0000000.000000NaN3003.333333NaNNaNNaNNaN3008.333333WBAN:00184
2016-08-01 23:00:001000.000000251.66666725.200000251.666667100.0000000.000000NaN3002.666667NaNNaNNaNNaN3007.666667WBAN:00184
2016-08-02 00:00:001000.000000248.00000024.600000248.000000100.0000000.000000NaN3001.333333NaNNaNNaNNaN3006.333333WBAN:00184
2016-08-02 01:00:001000.000000246.66666724.400000246.666667100.0000000.000000NaN3001.333333NaNNaNNaNNaN3006.333333WBAN:00184
2016-08-02 02:00:00483.333333242.33333324.233333242.333333100.0000000.000000NaN3002.000000NaNNaNNaNNaN3007.000000WBAN:00184
2016-08-02 03:00:00208.333333242.00000024.233333242.000000100.0000000.000000NaN3002.000000NaNNaNNaNNaN3007.000000WBAN:00184
2016-08-02 04:00:00800.000000241.66666724.233333241.666667100.0000000.000000NaN3002.000000NaNNaNNaNNaN3007.000000WBAN:00184
2016-08-02 05:00:00633.333333240.66666723.900000240.666667100.0000000.000000NaN3003.666667NaNNaNNaNNaN3008.666667WBAN:00184
.............................................
2018-07-30 18:00:001000.000000241.33333324.066667241.333333100.0000001.500000NaN2990.000000NaNNaNNaNNaN2995.000000WBAN:00184
2018-07-30 19:00:001000.000000238.00000023.900000238.000000100.0000000.000000NaN2989.666667NaNNaNNaNNaN2994.666667WBAN:00184
2018-07-30 20:00:001000.000000235.33333323.300000235.333333100.0000001.000000NaN2992.333333NaNNaNNaNNaN2997.333333WBAN:00184
2018-07-30 21:00:001000.000000236.00000023.500000236.000000100.0000001.000000NaN2994.000000NaNNaNNaN1.02999.000000WBAN:00184
2018-07-30 22:00:001000.000000241.66666724.066667241.666667100.0000001.666667NaN2994.333333NaNNaNNaNNaN2999.333333WBAN:00184
2018-07-30 23:00:001000.000000238.33333323.700000238.333333100.0000000.000000NaN2993.666667NaNNaNNaNNaN2998.666667WBAN:00184
2018-07-31 00:00:001000.000000236.00000023.500000236.000000100.0000000.000000NaN2992.666667NaNNaNNaNNaN2997.666667WBAN:00184
2018-07-31 01:00:001000.000000235.33333323.500000235.333333100.0000001.500000NaN2992.000000NaNNaNNaNNaN2997.000000WBAN:00184
2018-07-31 02:00:001000.000000239.33333324.066667239.333333100.000000NaNNaN2991.666667NaNNaNNaNNaN2996.666667WBAN:00184
2018-07-31 03:00:00700.000000234.00000023.300000234.000000100.0000000.000000NaN2991.333333NaNNaNNaNNaN2996.333333WBAN:00184
2018-07-31 04:00:00700.000000233.33333323.300000233.333333100.0000002.000000NaN2992.000000NaNNaNNaNNaN2997.000000WBAN:00184
2018-07-31 05:00:00800.000000235.00000023.500000235.000000100.0000000.000000NaN2993.333333NaNNaNNaNNaN2998.333333WBAN:00184
2018-07-31 06:00:00900.000000245.33333324.600000245.333333100.0000000.000000NaN2993.666667NaNNaNNaNNaN2998.666667WBAN:00184
2018-07-31 07:00:001000.000000263.00000026.500000263.000000100.0000000.000000NaN2994.000000NaNNaNNaNNaN2999.000000WBAN:00184
2018-07-31 08:00:00725.000000250.33333324.866667248.00000098.6666676.00000016.02995.666667NaNNaNNaNNaN3000.666667WBAN:00184
2018-07-31 09:00:001000.000000263.66666724.733333242.66666788.3333336.500000NaN2994.333333NaNNaNNaNNaN2999.333333WBAN:00184
2018-07-31 10:00:001000.000000265.33333325.366667247.33333390.0000004.666667NaN2994.666667NaNNaNNaNNaN2999.666667WBAN:00184
2018-07-31 11:00:001000.000000286.00000025.666667245.33333378.6666675.000000NaN2994.666667NaNNaNNaNNaN2999.666667WBAN:00184
2018-07-31 12:00:001000.000000293.33333325.900000245.33333375.3333338.33333331.52992.666667NaNNaNNaNNaN2997.666667WBAN:00184
2018-07-31 13:00:001000.000000283.00000025.050000235.33333375.33333311.50000023.52992.500000NaNNaNNaNNaN2997.333333WBAN:00184
2018-07-31 14:00:00NaN277.333333NaN229.66666775.3333333.000000NaNNaNNaNNaNNaNNaN2995.333333WBAN:00184
2018-07-31 15:00:00NaN272.666667NaN234.00000079.6666671.500000NaNNaNNaNNaNNaNNaN2995.333333WBAN:00184
2018-07-31 16:00:00NaN274.666667NaN237.00000080.0000001.000000NaNNaNNaNNaNNaNNaN2995.333333WBAN:00184
2018-07-31 17:00:00NaN271.000000NaN237.66666782.0000001.000000NaNNaNNaNNaNNaNNaN2994.000000WBAN:00184
2018-07-31 18:00:00NaN259.333333NaN250.00000094.6666670.000000NaNNaNNaNNaNNaNNaN2994.666667WBAN:00184
2018-07-31 19:00:00NaN254.000000NaN253.33333399.6666670.000000NaNNaNNaNNaNNaNNaN2995.333333WBAN:00184
2018-07-31 20:00:00NaN247.000000NaN247.000000100.0000000.000000NaNNaNNaNNaNNaNNaN2995.333333WBAN:00184
2018-07-31 21:00:00NaN238.333333NaN238.333333100.0000000.000000NaNNaNNaNNaNNaNNaN2996.666667WBAN:00184
2018-07-31 22:00:00700.000000234.66666723.300000234.666667100.0000000.000000NaN2993.000000NaNNaNNaNNaN2997.000000WBAN:00184
2018-07-31 23:00:00800.000000232.66666723.300000232.666667100.0000000.000000NaN2993.000000NaNNaNNaNNaN2998.000000WBAN:00184
\n", - "

17520 rows × 14 columns

\n", - "
" - ], - "text/plain": [ - " HOURLYVISIBILITY HOURLYDRYBULBTEMPC HOURLYWETBULBTEMPC \\\n", - "DATE \n", - "2016-08-01 00:00:00 525.000000 243.000000 24.400000 \n", - "2016-08-01 01:00:00 433.333333 240.333333 23.900000 \n", - "2016-08-01 02:00:00 316.666667 237.333333 23.500000 \n", - "2016-08-01 03:00:00 91.666667 237.333333 23.900000 \n", - "2016-08-01 04:00:00 733.333333 235.666667 23.500000 \n", - "2016-08-01 05:00:00 633.333333 237.666667 23.900000 \n", - "2016-08-01 06:00:00 900.000000 249.000000 25.000000 \n", - "2016-08-01 07:00:00 1000.000000 264.000000 26.366667 \n", - "2016-08-01 08:00:00 1000.000000 283.000000 27.133333 \n", - "2016-08-01 09:00:00 1000.000000 296.666667 27.333333 \n", - "2016-08-01 10:00:00 1000.000000 301.666667 26.833333 \n", - "2016-08-01 11:00:00 1000.000000 285.333333 26.033333 \n", - "2016-08-01 12:00:00 1000.000000 271.333333 25.300000 \n", - "2016-08-01 13:00:00 1000.000000 281.666667 26.133333 \n", - "2016-08-01 14:00:00 NaN 305.333333 26.466667 \n", - "2016-08-01 15:00:00 NaN 314.666667 26.933333 \n", - "2016-08-01 16:00:00 NaN 309.000000 26.433333 \n", - "2016-08-01 17:00:00 1000.000000 302.666667 26.700000 \n", - "2016-08-01 18:00:00 1000.000000 290.000000 26.933333 \n", - "2016-08-01 19:00:00 1000.000000 271.333333 26.500000 \n", - "2016-08-01 20:00:00 1000.000000 265.333333 26.000000 \n", - "2016-08-01 21:00:00 1000.000000 256.666667 25.766667 \n", - "2016-08-01 22:00:00 1000.000000 253.666667 25.400000 \n", - "2016-08-01 23:00:00 1000.000000 251.666667 25.200000 \n", - "2016-08-02 00:00:00 1000.000000 248.000000 24.600000 \n", - "2016-08-02 01:00:00 1000.000000 246.666667 24.400000 \n", - "2016-08-02 02:00:00 483.333333 242.333333 24.233333 \n", - "2016-08-02 03:00:00 208.333333 242.000000 24.233333 \n", - "2016-08-02 04:00:00 800.000000 241.666667 24.233333 \n", - "2016-08-02 05:00:00 633.333333 240.666667 23.900000 \n", - "... ... ... ... \n", - "2018-07-30 18:00:00 1000.000000 241.333333 24.066667 \n", - "2018-07-30 19:00:00 1000.000000 238.000000 23.900000 \n", - "2018-07-30 20:00:00 1000.000000 235.333333 23.300000 \n", - "2018-07-30 21:00:00 1000.000000 236.000000 23.500000 \n", - "2018-07-30 22:00:00 1000.000000 241.666667 24.066667 \n", - "2018-07-30 23:00:00 1000.000000 238.333333 23.700000 \n", - "2018-07-31 00:00:00 1000.000000 236.000000 23.500000 \n", - "2018-07-31 01:00:00 1000.000000 235.333333 23.500000 \n", - "2018-07-31 02:00:00 1000.000000 239.333333 24.066667 \n", - "2018-07-31 03:00:00 700.000000 234.000000 23.300000 \n", - "2018-07-31 04:00:00 700.000000 233.333333 23.300000 \n", - "2018-07-31 05:00:00 800.000000 235.000000 23.500000 \n", - "2018-07-31 06:00:00 900.000000 245.333333 24.600000 \n", - "2018-07-31 07:00:00 1000.000000 263.000000 26.500000 \n", - "2018-07-31 08:00:00 725.000000 250.333333 24.866667 \n", - "2018-07-31 09:00:00 1000.000000 263.666667 24.733333 \n", - "2018-07-31 10:00:00 1000.000000 265.333333 25.366667 \n", - "2018-07-31 11:00:00 1000.000000 286.000000 25.666667 \n", - "2018-07-31 12:00:00 1000.000000 293.333333 25.900000 \n", - "2018-07-31 13:00:00 1000.000000 283.000000 25.050000 \n", - "2018-07-31 14:00:00 NaN 277.333333 NaN \n", - "2018-07-31 15:00:00 NaN 272.666667 NaN \n", - "2018-07-31 16:00:00 NaN 274.666667 NaN \n", - "2018-07-31 17:00:00 NaN 271.000000 NaN \n", - "2018-07-31 18:00:00 NaN 259.333333 NaN \n", - "2018-07-31 19:00:00 NaN 254.000000 NaN \n", - "2018-07-31 20:00:00 NaN 247.000000 NaN \n", - "2018-07-31 21:00:00 NaN 238.333333 NaN \n", - "2018-07-31 22:00:00 700.000000 234.666667 23.300000 \n", - "2018-07-31 23:00:00 800.000000 232.666667 23.300000 \n", - "\n", - " HOURLYDewPointTempC HOURLYRelativeHumidity \\\n", - "DATE \n", - "2016-08-01 00:00:00 243.000000 100.000000 \n", - "2016-08-01 01:00:00 240.333333 100.000000 \n", - "2016-08-01 02:00:00 237.333333 100.000000 \n", - "2016-08-01 03:00:00 237.333333 100.000000 \n", - "2016-08-01 04:00:00 235.666667 100.000000 \n", - "2016-08-01 05:00:00 237.666667 100.000000 \n", - "2016-08-01 06:00:00 249.000000 100.000000 \n", - "2016-08-01 07:00:00 262.666667 99.333333 \n", - "2016-08-01 08:00:00 267.333333 91.000000 \n", - "2016-08-01 09:00:00 265.000000 83.000000 \n", - "2016-08-01 10:00:00 255.666667 76.333333 \n", - "2016-08-01 11:00:00 251.666667 82.333333 \n", - "2016-08-01 12:00:00 243.333333 84.666667 \n", - "2016-08-01 13:00:00 253.333333 84.666667 \n", - "2016-08-01 14:00:00 248.666667 71.666667 \n", - "2016-08-01 15:00:00 250.666667 69.000000 \n", - "2016-08-01 16:00:00 246.666667 69.333333 \n", - "2016-08-01 17:00:00 254.666667 75.666667 \n", - "2016-08-01 18:00:00 260.000000 84.000000 \n", - "2016-08-01 19:00:00 261.333333 94.333333 \n", - "2016-08-01 20:00:00 258.333333 96.000000 \n", - "2016-08-01 21:00:00 256.000000 99.666667 \n", - "2016-08-01 22:00:00 253.666667 100.000000 \n", - "2016-08-01 23:00:00 251.666667 100.000000 \n", - "2016-08-02 00:00:00 248.000000 100.000000 \n", - "2016-08-02 01:00:00 246.666667 100.000000 \n", - "2016-08-02 02:00:00 242.333333 100.000000 \n", - "2016-08-02 03:00:00 242.000000 100.000000 \n", - "2016-08-02 04:00:00 241.666667 100.000000 \n", - "2016-08-02 05:00:00 240.666667 100.000000 \n", - "... ... ... \n", - "2018-07-30 18:00:00 241.333333 100.000000 \n", - "2018-07-30 19:00:00 238.000000 100.000000 \n", - "2018-07-30 20:00:00 235.333333 100.000000 \n", - "2018-07-30 21:00:00 236.000000 100.000000 \n", - "2018-07-30 22:00:00 241.666667 100.000000 \n", - "2018-07-30 23:00:00 238.333333 100.000000 \n", - "2018-07-31 00:00:00 236.000000 100.000000 \n", - "2018-07-31 01:00:00 235.333333 100.000000 \n", - "2018-07-31 02:00:00 239.333333 100.000000 \n", - "2018-07-31 03:00:00 234.000000 100.000000 \n", - "2018-07-31 04:00:00 233.333333 100.000000 \n", - "2018-07-31 05:00:00 235.000000 100.000000 \n", - "2018-07-31 06:00:00 245.333333 100.000000 \n", - "2018-07-31 07:00:00 263.000000 100.000000 \n", - "2018-07-31 08:00:00 248.000000 98.666667 \n", - "2018-07-31 09:00:00 242.666667 88.333333 \n", - "2018-07-31 10:00:00 247.333333 90.000000 \n", - "2018-07-31 11:00:00 245.333333 78.666667 \n", - "2018-07-31 12:00:00 245.333333 75.333333 \n", - "2018-07-31 13:00:00 235.333333 75.333333 \n", - "2018-07-31 14:00:00 229.666667 75.333333 \n", - "2018-07-31 15:00:00 234.000000 79.666667 \n", - "2018-07-31 16:00:00 237.000000 80.000000 \n", - "2018-07-31 17:00:00 237.666667 82.000000 \n", - "2018-07-31 18:00:00 250.000000 94.666667 \n", - "2018-07-31 19:00:00 253.333333 99.666667 \n", - "2018-07-31 20:00:00 247.000000 100.000000 \n", - "2018-07-31 21:00:00 238.333333 100.000000 \n", - "2018-07-31 22:00:00 234.666667 100.000000 \n", - "2018-07-31 23:00:00 232.666667 100.000000 \n", - "\n", - " HOURLYWindSpeed HOURLYWindGustSpeed \\\n", - "DATE \n", - "2016-08-01 00:00:00 0.000000 NaN \n", - "2016-08-01 01:00:00 0.000000 NaN \n", - "2016-08-01 02:00:00 0.000000 NaN \n", - "2016-08-01 03:00:00 0.000000 NaN \n", - "2016-08-01 04:00:00 0.000000 NaN \n", - "2016-08-01 05:00:00 0.000000 NaN \n", - "2016-08-01 06:00:00 0.000000 NaN \n", - "2016-08-01 07:00:00 0.000000 NaN \n", - "2016-08-01 08:00:00 1.666667 NaN \n", - "2016-08-01 09:00:00 1.000000 NaN \n", - "2016-08-01 10:00:00 0.000000 NaN \n", - "2016-08-01 11:00:00 7.000000 20.0 \n", - "2016-08-01 12:00:00 3.333333 NaN \n", - "2016-08-01 13:00:00 0.000000 NaN \n", - "2016-08-01 14:00:00 1.000000 NaN \n", - "2016-08-01 15:00:00 0.000000 NaN \n", - "2016-08-01 16:00:00 0.000000 NaN \n", - "2016-08-01 17:00:00 1.000000 NaN \n", - "2016-08-01 18:00:00 0.000000 NaN \n", - "2016-08-01 19:00:00 2.666667 NaN \n", - "2016-08-01 20:00:00 0.000000 NaN \n", - "2016-08-01 21:00:00 0.000000 NaN \n", - "2016-08-01 22:00:00 0.000000 NaN \n", - "2016-08-01 23:00:00 0.000000 NaN \n", - "2016-08-02 00:00:00 0.000000 NaN \n", - "2016-08-02 01:00:00 0.000000 NaN \n", - "2016-08-02 02:00:00 0.000000 NaN \n", - "2016-08-02 03:00:00 0.000000 NaN \n", - "2016-08-02 04:00:00 0.000000 NaN \n", - "2016-08-02 05:00:00 0.000000 NaN \n", - "... ... ... \n", - "2018-07-30 18:00:00 1.500000 NaN \n", - "2018-07-30 19:00:00 0.000000 NaN \n", - "2018-07-30 20:00:00 1.000000 NaN \n", - "2018-07-30 21:00:00 1.000000 NaN \n", - "2018-07-30 22:00:00 1.666667 NaN \n", - "2018-07-30 23:00:00 0.000000 NaN \n", - "2018-07-31 00:00:00 0.000000 NaN \n", - "2018-07-31 01:00:00 1.500000 NaN \n", - "2018-07-31 02:00:00 NaN NaN \n", - "2018-07-31 03:00:00 0.000000 NaN \n", - "2018-07-31 04:00:00 2.000000 NaN \n", - "2018-07-31 05:00:00 0.000000 NaN \n", - "2018-07-31 06:00:00 0.000000 NaN \n", - "2018-07-31 07:00:00 0.000000 NaN \n", - "2018-07-31 08:00:00 6.000000 16.0 \n", - "2018-07-31 09:00:00 6.500000 NaN \n", - "2018-07-31 10:00:00 4.666667 NaN \n", - "2018-07-31 11:00:00 5.000000 NaN \n", - "2018-07-31 12:00:00 8.333333 31.5 \n", - "2018-07-31 13:00:00 11.500000 23.5 \n", - "2018-07-31 14:00:00 3.000000 NaN \n", - "2018-07-31 15:00:00 1.500000 NaN \n", - "2018-07-31 16:00:00 1.000000 NaN \n", - "2018-07-31 17:00:00 1.000000 NaN \n", - "2018-07-31 18:00:00 0.000000 NaN \n", - "2018-07-31 19:00:00 0.000000 NaN \n", - "2018-07-31 20:00:00 0.000000 NaN \n", - "2018-07-31 21:00:00 0.000000 NaN \n", - "2018-07-31 22:00:00 0.000000 NaN \n", - "2018-07-31 23:00:00 0.000000 NaN \n", - "\n", - " HOURLYStationPressure HOURLYPressureTendency \\\n", - "DATE \n", - "2016-08-01 00:00:00 2999.000000 NaN \n", - "2016-08-01 01:00:00 2999.333333 NaN \n", - "2016-08-01 02:00:00 2998.666667 NaN \n", - "2016-08-01 03:00:00 2998.333333 NaN \n", - "2016-08-01 04:00:00 2999.333333 NaN \n", - "2016-08-01 05:00:00 3000.333333 NaN \n", - "2016-08-01 06:00:00 3001.666667 NaN \n", - "2016-08-01 07:00:00 3003.666667 NaN \n", - "2016-08-01 08:00:00 3004.000000 NaN \n", - "2016-08-01 09:00:00 3004.000000 NaN \n", - "2016-08-01 10:00:00 3005.666667 NaN \n", - "2016-08-01 11:00:00 3005.666667 NaN \n", - "2016-08-01 12:00:00 3004.000000 NaN \n", - "2016-08-01 13:00:00 3002.666667 NaN \n", - "2016-08-01 14:00:00 3000.333333 NaN \n", - "2016-08-01 15:00:00 2999.000000 NaN \n", - "2016-08-01 16:00:00 2998.000000 NaN \n", - "2016-08-01 17:00:00 2997.000000 NaN \n", - "2016-08-01 18:00:00 2998.333333 NaN \n", - "2016-08-01 19:00:00 2999.000000 NaN \n", - "2016-08-01 20:00:00 3000.333333 NaN \n", - "2016-08-01 21:00:00 3002.666667 NaN \n", - "2016-08-01 22:00:00 3003.333333 NaN \n", - "2016-08-01 23:00:00 3002.666667 NaN \n", - "2016-08-02 00:00:00 3001.333333 NaN \n", - "2016-08-02 01:00:00 3001.333333 NaN \n", - "2016-08-02 02:00:00 3002.000000 NaN \n", - "2016-08-02 03:00:00 3002.000000 NaN \n", - "2016-08-02 04:00:00 3002.000000 NaN \n", - "2016-08-02 05:00:00 3003.666667 NaN \n", - "... ... ... \n", - "2018-07-30 18:00:00 2990.000000 NaN \n", - "2018-07-30 19:00:00 2989.666667 NaN \n", - "2018-07-30 20:00:00 2992.333333 NaN \n", - "2018-07-30 21:00:00 2994.000000 NaN \n", - "2018-07-30 22:00:00 2994.333333 NaN \n", - "2018-07-30 23:00:00 2993.666667 NaN \n", - "2018-07-31 00:00:00 2992.666667 NaN \n", - "2018-07-31 01:00:00 2992.000000 NaN \n", - "2018-07-31 02:00:00 2991.666667 NaN \n", - "2018-07-31 03:00:00 2991.333333 NaN \n", - "2018-07-31 04:00:00 2992.000000 NaN \n", - "2018-07-31 05:00:00 2993.333333 NaN \n", - "2018-07-31 06:00:00 2993.666667 NaN \n", - "2018-07-31 07:00:00 2994.000000 NaN \n", - "2018-07-31 08:00:00 2995.666667 NaN \n", - "2018-07-31 09:00:00 2994.333333 NaN \n", - "2018-07-31 10:00:00 2994.666667 NaN \n", - "2018-07-31 11:00:00 2994.666667 NaN \n", - "2018-07-31 12:00:00 2992.666667 NaN \n", - "2018-07-31 13:00:00 2992.500000 NaN \n", - "2018-07-31 14:00:00 NaN NaN \n", - "2018-07-31 15:00:00 NaN NaN \n", - "2018-07-31 16:00:00 NaN NaN \n", - "2018-07-31 17:00:00 NaN NaN \n", - "2018-07-31 18:00:00 NaN NaN \n", - "2018-07-31 19:00:00 NaN NaN \n", - "2018-07-31 20:00:00 NaN NaN \n", - "2018-07-31 21:00:00 NaN NaN \n", - "2018-07-31 22:00:00 2993.000000 NaN \n", - "2018-07-31 23:00:00 2993.000000 NaN \n", - "\n", - " HOURLYPressureChange HOURLYSeaLevelPressure \\\n", - "DATE \n", - "2016-08-01 00:00:00 NaN NaN \n", - "2016-08-01 01:00:00 NaN NaN \n", - "2016-08-01 02:00:00 NaN NaN \n", - "2016-08-01 03:00:00 NaN NaN \n", - "2016-08-01 04:00:00 NaN NaN \n", - "2016-08-01 05:00:00 NaN NaN \n", - "2016-08-01 06:00:00 NaN NaN \n", - "2016-08-01 07:00:00 NaN NaN \n", - "2016-08-01 08:00:00 NaN NaN \n", - "2016-08-01 09:00:00 NaN NaN \n", - "2016-08-01 10:00:00 NaN NaN \n", - "2016-08-01 11:00:00 NaN NaN \n", - "2016-08-01 12:00:00 NaN NaN \n", - "2016-08-01 13:00:00 NaN NaN \n", - "2016-08-01 14:00:00 NaN NaN \n", - "2016-08-01 15:00:00 NaN NaN \n", - "2016-08-01 16:00:00 NaN NaN \n", - "2016-08-01 17:00:00 NaN NaN \n", - "2016-08-01 18:00:00 NaN NaN \n", - "2016-08-01 19:00:00 NaN NaN \n", - "2016-08-01 20:00:00 NaN NaN \n", - "2016-08-01 21:00:00 NaN NaN \n", - "2016-08-01 22:00:00 NaN NaN \n", - "2016-08-01 23:00:00 NaN NaN \n", - "2016-08-02 00:00:00 NaN NaN \n", - "2016-08-02 01:00:00 NaN NaN \n", - "2016-08-02 02:00:00 NaN NaN \n", - "2016-08-02 03:00:00 NaN NaN \n", - "2016-08-02 04:00:00 NaN NaN \n", - "2016-08-02 05:00:00 NaN NaN \n", - "... ... ... \n", - "2018-07-30 18:00:00 NaN NaN \n", - "2018-07-30 19:00:00 NaN NaN \n", - "2018-07-30 20:00:00 NaN NaN \n", - "2018-07-30 21:00:00 NaN NaN \n", - "2018-07-30 22:00:00 NaN NaN \n", - "2018-07-30 23:00:00 NaN NaN \n", - "2018-07-31 00:00:00 NaN NaN \n", - "2018-07-31 01:00:00 NaN NaN \n", - "2018-07-31 02:00:00 NaN NaN \n", - "2018-07-31 03:00:00 NaN NaN \n", - "2018-07-31 04:00:00 NaN NaN \n", - "2018-07-31 05:00:00 NaN NaN \n", - "2018-07-31 06:00:00 NaN NaN \n", - "2018-07-31 07:00:00 NaN NaN \n", - "2018-07-31 08:00:00 NaN NaN \n", - "2018-07-31 09:00:00 NaN NaN \n", - "2018-07-31 10:00:00 NaN NaN \n", - "2018-07-31 11:00:00 NaN NaN \n", - "2018-07-31 12:00:00 NaN NaN \n", - "2018-07-31 13:00:00 NaN NaN \n", - "2018-07-31 14:00:00 NaN NaN \n", - "2018-07-31 15:00:00 NaN NaN \n", - "2018-07-31 16:00:00 NaN NaN \n", - "2018-07-31 17:00:00 NaN NaN \n", - "2018-07-31 18:00:00 NaN NaN \n", - "2018-07-31 19:00:00 NaN NaN \n", - "2018-07-31 20:00:00 NaN NaN \n", - "2018-07-31 21:00:00 NaN NaN \n", - "2018-07-31 22:00:00 NaN NaN \n", - "2018-07-31 23:00:00 NaN NaN \n", - "\n", - " HOURLYPrecip HOURLYAltimeterSetting STATION \n", - "DATE \n", - "2016-08-01 00:00:00 NaN 3004.000000 WBAN:00184 \n", - "2016-08-01 01:00:00 NaN 3004.333333 WBAN:00184 \n", - "2016-08-01 02:00:00 NaN 3003.666667 WBAN:00184 \n", - "2016-08-01 03:00:00 NaN 3003.333333 WBAN:00184 \n", - "2016-08-01 04:00:00 NaN 3004.333333 WBAN:00184 \n", - "2016-08-01 05:00:00 NaN 3005.333333 WBAN:00184 \n", - "2016-08-01 06:00:00 NaN 3006.666667 WBAN:00184 \n", - "2016-08-01 07:00:00 NaN 3008.666667 WBAN:00184 \n", - "2016-08-01 08:00:00 NaN 3009.000000 WBAN:00184 \n", - "2016-08-01 09:00:00 NaN 3009.000000 WBAN:00184 \n", - "2016-08-01 10:00:00 NaN 3010.666667 WBAN:00184 \n", - "2016-08-01 11:00:00 NaN 3010.666667 WBAN:00184 \n", - "2016-08-01 12:00:00 NaN 3009.000000 WBAN:00184 \n", - "2016-08-01 13:00:00 NaN 3007.666667 WBAN:00184 \n", - "2016-08-01 14:00:00 NaN 3005.333333 WBAN:00184 \n", - "2016-08-01 15:00:00 NaN 3004.000000 WBAN:00184 \n", - "2016-08-01 16:00:00 NaN 3003.000000 WBAN:00184 \n", - "2016-08-01 17:00:00 NaN 3002.000000 WBAN:00184 \n", - "2016-08-01 18:00:00 NaN 3003.333333 WBAN:00184 \n", - "2016-08-01 19:00:00 NaN 3004.000000 WBAN:00184 \n", - "2016-08-01 20:00:00 NaN 3005.333333 WBAN:00184 \n", - "2016-08-01 21:00:00 NaN 3007.666667 WBAN:00184 \n", - "2016-08-01 22:00:00 NaN 3008.333333 WBAN:00184 \n", - "2016-08-01 23:00:00 NaN 3007.666667 WBAN:00184 \n", - "2016-08-02 00:00:00 NaN 3006.333333 WBAN:00184 \n", - "2016-08-02 01:00:00 NaN 3006.333333 WBAN:00184 \n", - "2016-08-02 02:00:00 NaN 3007.000000 WBAN:00184 \n", - "2016-08-02 03:00:00 NaN 3007.000000 WBAN:00184 \n", - "2016-08-02 04:00:00 NaN 3007.000000 WBAN:00184 \n", - "2016-08-02 05:00:00 NaN 3008.666667 WBAN:00184 \n", - "... ... ... ... \n", - "2018-07-30 18:00:00 NaN 2995.000000 WBAN:00184 \n", - "2018-07-30 19:00:00 NaN 2994.666667 WBAN:00184 \n", - "2018-07-30 20:00:00 NaN 2997.333333 WBAN:00184 \n", - "2018-07-30 21:00:00 1.0 2999.000000 WBAN:00184 \n", - "2018-07-30 22:00:00 NaN 2999.333333 WBAN:00184 \n", - "2018-07-30 23:00:00 NaN 2998.666667 WBAN:00184 \n", - "2018-07-31 00:00:00 NaN 2997.666667 WBAN:00184 \n", - "2018-07-31 01:00:00 NaN 2997.000000 WBAN:00184 \n", - "2018-07-31 02:00:00 NaN 2996.666667 WBAN:00184 \n", - "2018-07-31 03:00:00 NaN 2996.333333 WBAN:00184 \n", - "2018-07-31 04:00:00 NaN 2997.000000 WBAN:00184 \n", - "2018-07-31 05:00:00 NaN 2998.333333 WBAN:00184 \n", - "2018-07-31 06:00:00 NaN 2998.666667 WBAN:00184 \n", - "2018-07-31 07:00:00 NaN 2999.000000 WBAN:00184 \n", - "2018-07-31 08:00:00 NaN 3000.666667 WBAN:00184 \n", - "2018-07-31 09:00:00 NaN 2999.333333 WBAN:00184 \n", - "2018-07-31 10:00:00 NaN 2999.666667 WBAN:00184 \n", - "2018-07-31 11:00:00 NaN 2999.666667 WBAN:00184 \n", - "2018-07-31 12:00:00 NaN 2997.666667 WBAN:00184 \n", - "2018-07-31 13:00:00 NaN 2997.333333 WBAN:00184 \n", - "2018-07-31 14:00:00 NaN 2995.333333 WBAN:00184 \n", - "2018-07-31 15:00:00 NaN 2995.333333 WBAN:00184 \n", - "2018-07-31 16:00:00 NaN 2995.333333 WBAN:00184 \n", - "2018-07-31 17:00:00 NaN 2994.000000 WBAN:00184 \n", - "2018-07-31 18:00:00 NaN 2994.666667 WBAN:00184 \n", - "2018-07-31 19:00:00 NaN 2995.333333 WBAN:00184 \n", - "2018-07-31 20:00:00 NaN 2995.333333 WBAN:00184 \n", - "2018-07-31 21:00:00 NaN 2996.666667 WBAN:00184 \n", - "2018-07-31 22:00:00 NaN 2997.000000 WBAN:00184 \n", - "2018-07-31 23:00:00 NaN 2998.000000 WBAN:00184 \n", - "\n", - "[17520 rows x 14 columns]" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "by_station_list[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████████████████████| 406/406 [02:11<00:00, 3.10it/s]\n" - ] - } - ], - "source": [ - "for i in tqdm(range(len(wban_name))):\n", - " by_station_list[i].to_csv('D:/Nico/Desktop/processed_data/{}.csv'.format(wban_name[i]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Current Issues\n", - "\n", - "1) data is not synced across time-zone and all entries start at midnight local time. \n", - "\n", - "2) some stations have multiple entries per hour and need to be reduced.\n", - "\n", - "Solutions\n", - "\n", - "Remove rows from data based on timezone to sync times\n", - "limit only 1 entry per hour for a station" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -}