{"cells":[{"metadata":{"id":"x0b46VULTw3T","colab_type":"text"},"cell_type":"markdown","source":"# DS4G : Environmental Insights Explorer\n# Exploring Alternatives for Emission Factor Calculations\n# (Domain - Environment) (Analytics Prediction)"},{"metadata":{"id":"rbePaaeoZVuf","colab_type":"text"},"cell_type":"markdown","source":"## The entire solution is divided into following notebooks\n\n####1.   [DS4G Environmental Insights Explorer - introduction.(Part 1)](https://www.kaggle.com/meenakshiramaswamy/ds4g-eie-no2emission-earthenginereading)\n\n\n####2.   [Exploration on data points, detailed analysis and correlation.(Part 2)](https://www.kaggle.com/meenakshiramaswamy/ds4g-eie-no2emission-eda/)\n\n####3.   [Emission factor calculation and predictive model building.(Part 3)](https://www.kaggle.com/meenakshiramaswamy/ds4g-eie-no2emission-calcef-buildmodel/) \n\n"},{"metadata":{"id":"_HcMVBq8bKtg","colab_type":"text"},"cell_type":"markdown","source":"#### [Part 2 - Exploration of Data points and analysis] is subdivided into following topics\n\n\n*   Loading the necessary libraries \n*   Utility Functions\n*   Reading the global power plant data\n*   Calculate the input energy required for the powerplants\n*   Convert the longitude, latitude into geometry points\n*   Organize the image data into datasets\n*   Find the co-relation between S5P, GFS and GLDAS images, influencing parameters on no2 density  \n\n\n"},{"metadata":{"id":"Hg1PknTz5Sb8","colab_type":"text"},"cell_type":"markdown","source":" pr = ee.Geometry.Polygon(\n        [[[-67.32297404549217, 18.563112930177304],\n          [-67.32297404549217, 17.903121359128956],\n          [-65.19437297127342, 17.903121359128956],\n          [-65.19437297127342, 18.563112930177304]]], null, false);"},{"metadata":{"id":"yLzp0IdL5Sch","colab_type":"text"},"cell_type":"markdown","source":"### Import all packages and dataset"},{"metadata":{"id":"qR479WV5MLrJ","colab_type":"text"},"cell_type":"markdown","source":"#### Tifffile:  used to read the GeoTIFF files of satellite imagery and convert to python numpy arrays for further calculations"},{"metadata":{"id":"iCGB1RW1N-Ua","colab_type":"text"},"cell_type":"markdown","source":"#### geopandas: The goal of GeoPandas is to make working with geospatial data in python easier. It combines the capabilities of pandas and shapely, providing geospatial operations in pandas and a high-level interface to multiple geometries to shapely"},{"metadata":{"id":"kt6hOHBvOIjK","colab_type":"text"},"cell_type":"markdown","source":"#### rasterstats : Python module for summarizing geospatial raster datasets based on vector geometries. "},{"metadata":{"trusted":true,"id":"EUzPzb76gNEy","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"### Folium is a Python Library that can allow us to visualize spatial data  Manipulate your data in Python, then visualize it in a Leaflet map via Folium ...\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport math as m\n\nfrom datetime import datetime\n\nimport os\nimport glob\n\nimport rasterio as rio\nimport folium \n\nimport geopandas\nimport tifffile as tiff\nfrom folium import plugins\nfrom shapely.geometry import Point\nimport rasterstats\nfrom rasterstats import zonal_stats, point_query","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"HJU3uTye5SdE","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"pd.set_option('max_columns', 500)\npd.set_option('max_rows', 500)\nimport warnings\nwarnings.filterwarnings('ignore')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"#Required only for Colab and Jypter NB\ndef configure_plotly_browser_state():\n  import IPython\n  display(IPython.core.display.HTML('''\n        <script src=\"/static/components/requirejs/require.js\"></script>\n        <script>\n          requirejs.config({\n            paths: {\n              base: '/static/base',\n              plotly: 'https://cdn.plot.ly/plotly-latest.min.js?noext',\n            },\n          });\n        </script>\n        '''))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"LIDs4Md05SdL","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"from IPython.display import display\nfrom IPython.core.interactiveshell import InteractiveShell\nInteractiveShell.ast_node_interactivity = \"all\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"from plotly import tools, subplots\nimport plotly.offline as py\npy.init_notebook_mode(connected = True)\nimport plotly.graph_objs as go\nimport plotly.express as px\nconfigure_plotly_browser_state()","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"text","id":"6DZldYs2608k"},"cell_type":"markdown","source":"## Utility functions"},{"metadata":{"trusted":true,"id":"cAtUYfnu5Sdc","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"def plot_points_on_map(dataframe,latitude_value,longitude_value,zoom):\n    #df = dataframe[begin_index:end_index]\n    location = [latitude_value,longitude_value]\n    fuelColor = {'Coal': 'darkred',\n                 'Oil': 'black',\n                 'Gas': 'lightgray',\n                 'Hydro': 'lightblue',\n                 'Solar': 'orange',\n                 'Wind': 'green'\n                }\n    Map = folium.Map(location=location,zoom_start=zoom)\n    for i in range(0,dataframe.shape[0]):\n        fuel = dataframe['primary_fuel'][i]\n        lat = dataframe['latitude'][i]\n        lon = dataframe['longitude'][i]\n        name = dataframe['name'][i]\n        #data = dataframe[i]\n        popup = \"{}, geolocation : [{},{}], {} \".format(fuel,lat, lon, name)\n        #popup = pd.DataFrame(data).to_html()\n        color = fuelColor[fuel]\n        folium.Marker([lat,lon],\n                      popup=popup,\n                      icon=folium.Icon(color=color, icon_color='white', icon='bolt', prefix='fa')\n                     ).add_to(Map)  \n    \n\n    return Map\n\n    ","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"colab_type":"code","id":"weDvKvFh608l","trusted":true,"colab":{}},"cell_type":"code","source":"def overlay_image_on_puerto_rico(file_name,band_layer,lat,lon,zoom):\n    band = rio.open(file_name).read(band_layer)\n    m = folium.Map([lat, lon], zoom_start=zoom)\n    folium.raster_layers.ImageOverlay(\n        image=band,\n        bounds = [[18.6,-67.3,],[17.9,-65.2]],\n        colormap=lambda x: (1, 0, 0, x),\n    ).add_to(m)\n    return m\n\ndef plot_scaled(file_name):\n    vmin, vmax = np.nanpercentile(file_name, (5,95))  # 5-95% stretch\n    img_plt = plt.imshow(file_name, cmap='gray', vmin=vmin, vmax=vmax)\n    plt.show()\n\ndef split_column_into_new_columns(dataframe,column_to_split,new_column_one,begin_column_one,end_column_one):\n    for i in range(0, len(dataframe)):\n        dataframe.loc[i, new_column_one] = dataframe.loc[i, column_to_split][begin_column_one:end_column_one]\n    return dataframe","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"qRGt3YQD5SeW","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"import json\n\ndef string_to_dict(dict_string):\n    # Convert to proper json format (from here: https://stackoverflow.com/questions/39169718/convert-string-to-dict-then-access-keyvalues-how-to-access-data-in-a-class)\n    dict_string = dict_string.replace(\"'\", '\"').replace('u\"', '\"')\n    return json.loads(dict_string)['coordinates']\n\n","execution_count":null,"outputs":[]},{"metadata":{"id":"EBCE3eJ98WDt","colab_type":"text"},"cell_type":"markdown","source":"### We have been provided with the geographic boundary of Puerto Rico to calculate the emission factor from power plants"},{"metadata":{"id":"O19u1TkN5Sef","colab_type":"text"},"cell_type":"markdown","source":"## Read the power plant data"},{"metadata":{"trusted":true,"id":"djPHyfR4gNFy","colab_type":"code","outputId":"6f365468-687f-4a02-82c8-d7d4464722fd","executionInfo":{"status":"ok","timestamp":1584775205168,"user_tz":-330,"elapsed":26291,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"colab":{"base_uri":"https://localhost:8080/","height":313},"_kg_hide-input":true},"cell_type":"code","source":"#for kaggle\npower_plants = pd.read_csv('/kaggle/input/ds4g-environmental-insights-explorer/eie_data/gppd/gppd_120_pr.csv')\ndata_path = '/kaggle/input/ds4g-environmental-insights-explorer'\n# For colab\n#data_path = '/content/drive/My Drive/Kaggle-DS4G'\n#power_plants = pd.read_csv(data_path+'/eie_data/gppd/gppd_120_pr.csv')\n\npower_plants.head(5)\n","execution_count":null,"outputs":[]},{"metadata":{"id":"merlAWZler6I","colab_type":"text"},"cell_type":"markdown","source":"### Descriptive satistics on the datafram shows the NaN and missing values in categorical and numerical columns"},{"metadata":{"id":"wZhfplVh-YEF","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":432},"outputId":"8c1071d8-d35d-4b78-fad0-6b992ad2b74d","executionInfo":{"status":"ok","timestamp":1584775205169,"user_tz":-330,"elapsed":26254,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"power_plants.describe (include = 'all')","execution_count":null,"outputs":[]},{"metadata":{"id":"Bbn5YF8v5Ser","colab_type":"text"},"cell_type":"markdown","source":"Arrangement of Coordinates"},{"metadata":{"_kg_hide-input":true,"colab_type":"code","id":"K1DlwAqB608o","trusted":true,"colab":{}},"cell_type":"code","source":"power_plants = split_column_into_new_columns(power_plants,'.geo','latitude',50,66)\npower_plants = split_column_into_new_columns(power_plants,'.geo','longitude',31,48)\npower_plants['latitude'] = power_plants['latitude'].astype(float)\na = np.array(power_plants['latitude'].values.tolist()) # 18 instead of 8\npower_plants['latitude'] = np.where(a < 10, a+10, a).tolist() \npower_plants['longitude'] = power_plants['longitude'].astype(float)\npower_plants['coord'] = power_plants['.geo'].apply(string_to_dict)\n#power_plants.head()","execution_count":null,"outputs":[]},{"metadata":{"id":"k0GygtEK5Se7","colab_type":"text"},"cell_type":"markdown","source":"**The dataset gppd_120_pr.csv contains 24 columns, we include only those are required as of now**"},{"metadata":{"trusted":true,"id":"Z3pX0CDBgNGF","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"power_plants_df = power_plants[['capacity_mw', \n                               'commissioning_year', \n                               'country', \n                               'estimated_generation_gwh', \n                               'source', 'name', \n                               'owner', 'primary_fuel','latitude','longitude','wepp_id','coord']]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(15,17))\npower_plants_df.groupby(['estimated_generation_gwh','primary_fuel']).sum()['capacity_mw'].plot(kind='bar')\nplt.ylabel('capacity_mw');\nplt.title('Fossil power plants grouped by power generation , fuel type');","execution_count":null,"outputs":[]},{"metadata":{"id":"UOMaDabK3bwb","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":893},"outputId":"2a82db95-fdf3-45e4-9861-d4a3882e0bfc","executionInfo":{"status":"ok","timestamp":1584775206114,"user_tz":-330,"elapsed":27133,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"plt.figure(figsize=(15,15))\nsns.barplot(x='capacity_mw', y='estimated_generation_gwh', hue='primary_fuel', data=  power_plants_df[power_plants_df['primary_fuel'].isin(['Coal','Oil','Gas'])])\n#plt.set_xticklabels(a.get_xticklabels(), rotation=45)\nplt.ylabel('Estimated Generation')\nplt.title('Capacity Vs Estimated Generation of fossil power plants');","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"\npower_plants_df_fueltype = power_plants.groupby(['primary_fuel']).agg({'capacity_mw':'sum',\n                                                                      'estimated_generation_gwh':'sum'}).reset_index()\npower_plants_df_fueltype\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**** Some power plants are in same location but fueled by either fuel oil or gas, Like Aguirre has both Gas and Oil plants"},{"metadata":{"id":"1pqaWHuY3dH-","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":608},"outputId":"9e40a367-f76a-40b4-dbf3-e7e3f094318a","executionInfo":{"status":"ok","timestamp":1584775207203,"user_tz":-330,"elapsed":28099,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"plt.figure(figsize=(15,10))\nplt.title(\"Fuel Generation % from various type of power plants\")\ncolors = ['g', 'orange', 'pink', 'c', 'm', 'y']\npower_plants_df['primary_fuel'].value_counts().plot(kind='pie', colors=colors, \n autopct='%1.1f%%',\ncounterclock=False, shadow=True)","execution_count":null,"outputs":[]},{"metadata":{"id":"VM-kUG8_4G96","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":421},"outputId":"c57905b2-934a-4455-dbec-a1f09d483101","executionInfo":{"status":"ok","timestamp":1584775207204,"user_tz":-330,"elapsed":28062,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"%matplotlib inline \n\nfig, ax = plt.subplots(figsize=[8,6])\nplt.title ('Various Power Plants Capacity (in MW)')\nplt.xlabel('Fuel Type')\nplt.ylabel('Capacity mw');\nax.bar(power_plants_df_fueltype['primary_fuel'], power_plants_df_fueltype['capacity_mw'], color='YGR')","execution_count":null,"outputs":[]},{"metadata":{"id":"gXNUG-2a4UW8","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":138},"outputId":"172f180e-1d51-4d33-a715-d5c2420fe806","executionInfo":{"status":"ok","timestamp":1584775207205,"user_tz":-330,"elapsed":28024,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"power_plants['primary_fuel'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"id":"xmdOL0DpOaQ6","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"### Using Geopandas we convert the coordinates into geometry and plot them in the map\n'''\npp_gdf = geopandas.GeoDataFrame(\n    power_plants_df, geometry=geopandas.points_from_xy(power_plants_df.longitude, power_plants_df.latitude))\n\nworld = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))\n\n# We restrict to Puerto Rica.\nax = world[world.continent == 'Puerto Rica'].plot(\n    color='white', edgecolor='black')\n\n# We can now plot our ``GeoDataFrame``.\npp_gdf.plot(ax=ax, color='magenta')\n\nplt.show()\npp_gdf['name'] = pp_gdf['name'] + ':' + pp_gdf['primary_fuel']\n'''\npower_plants_fossil_df  = power_plants_df[power_plants_df['primary_fuel'].isin(['Coal','Oil','Gas'])]","execution_count":null,"outputs":[]},{"metadata":{"id":"nju1Z3gGgOFS","colab_type":"text"},"cell_type":"markdown","source":"#### The dataset contains both fossil and renewable powerplants. We split them into two datasets fossil and green plants"},{"metadata":{"id":"x2e9hbNlZkKF","colab_type":"text"},"cell_type":"markdown","source":"#### Source : Google \n#### Typical thermal efficiency for utility-scale electrical generators is around 37% for coal and oil-fired plants, and 56 – 60% (LEV) for combined-cycle gas-fired plants. Plants designed to achieve peak efficiency while operating at capacity will be less efficient when operating off-design (i.e. temperatures too low.)"},{"metadata":{"id":"Es43BoHKXLib","colab_type":"text"},"cell_type":"markdown","source":"#### Our PP dataset has only one Coal plant , A E S Corp located at the southern part of the country. The conventional steam coal is used (as per eie.gov), we define the efficiency of the different fuel type PP as per (https://www.eia.gov/electricity/annualhtml/epa_08_01.html\n#### the average heating rate of coal for year 2018 is 10481, so efficiency would be 3412/10481 = 32%\n#### petroleum, natural gas are 11095 and 7821, hence effiency would be 30%, 43%  respectively"},{"metadata":{"id":"LJUXLZQ-7Ev2","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"def pp_efficiency(x,y):\n    if x == 'Coal':\n        y = 32\n    elif x  == 'Oil':\n        y = 30\n    elif x == 'Gas' :\n        y = 43\n    else : #nuclear\n        y = 32   \n    return y","execution_count":null,"outputs":[]},{"metadata":{"id":"Xq6KrDht17mZ","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"power_plants_fossil_df['Efficiency_percent'] = \"\"\npower_plants_fossil_df['Efficiency_percent'] = power_plants_fossil_df.apply(lambda x: pp_efficiency(x.primary_fuel, x.Efficiency_percent), axis=1)","execution_count":null,"outputs":[]},{"metadata":{"id":"YEBZ4UY85SfX","colab_type":"text"},"cell_type":"markdown","source":"\n#### We measure the input energy in terms of thermal units , Btu. In order to get the (output) , how much input energy is needed for the powerplant? We multiply estimated generated gwh by 1000000 to convert to kwh,\n#### 1 kwh = 3412 Btu"},{"metadata":{"id":"-x-ahVhciS-2","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"def input_Btu(x,y):\n    if x == 'Coal':\n        y = y * 1000000 * 10481 \n    elif x  == 'Oil':\n        y = y * 1000000 * 11095 \n    elif x == 'Gas' :\n        y = y * 1000000 * 7821 \n    else : #nuclear\n        y = y * 1000000 * 10455   \n    return y","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"uZSnWQ-K5Sfb","colab_type":"code","colab":{}},"cell_type":"code","source":"# Reference https://www.eia.gov/tools/faqs/faq.php?id=107&t=3\n#power_plants_fossil_df['input_energy_gwh'] = (power_plants_fossil_df['estimated_generation_gwh'] / (power_plants_fossil_df['Efficiency_percent']*100))\n#power_plants_fossil_df['input_energy_Btu'] = power_plants_fossil_df['input_energy_gwh'] * 3412 * 1000000\n","execution_count":null,"outputs":[]},{"metadata":{"id":"2EfUtUkxgTe0","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"power_plants_fossil_df['input_energy_Btu'] = \"\"\npower_plants_fossil_df['input_energy_Btu'] = power_plants_fossil_df.apply(lambda x: input_Btu(x.primary_fuel, x.estimated_generation_gwh), axis=1)","execution_count":null,"outputs":[]},{"metadata":{"id":"aN2uV2hUpIp-","colab_type":"text"},"cell_type":"markdown","source":"\n\n####  capacity utilization of a powerplant/day is nothing but (estimated_generation_gwh * 1000 (mwh) /(365 multiplied by 24))\n\n*   Assuming on stream days as 365 days"},{"metadata":{"id":"QkcJ70x2pGav","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# Convert gwh into mwh, find the capacity utilization per day\npower_plants_fossil_df['capacity_utilization'] = (power_plants_fossil_df ['estimated_generation_gwh']/ power_plants_fossil_df['capacity_mw']  * 1000 ) / (365*24)","execution_count":null,"outputs":[]},{"metadata":{"id":"EF-Us0tLivDM","colab_type":"text"},"cell_type":"markdown","source":"\n1.   Organic nitrogen compounds are found in coal and oil in concentrations of \na few tenths to a few percent by weight\n\n2.   Bituminous coal contains 1–2 percent nitrogen, and United States crude oil approximately 0.05–0.5 percent nitrogen (Demski et al. 1973).\n\n3.   Natural gas, while containing up to 4 percent nitrogen gas, does not contain any significant organic nitrogen (Perry et al. 1963). Because organic nitrogen compounds have relatively high molecular weights, they tend to be concentrated in the residual and heavy oil fractions during distillation.\n\n4.   Nitrogen oxides are produced during combustion by the oxidation of organic nitrogen compounds in fossil fuels and by the thermal fixation of atmospheric nitrogen gas, N2.\n\nRefer : https://www.nap.edu/read/10840/chapter/18#716"},{"metadata":{"id":"8kK3lC0h2dKr","colab_type":"text"},"cell_type":"markdown","source":"#### The emission factor of fossil fuels are measured in gms per mmBtu, So the conversion would be dividing the input energy in mmBtu by 1000000 and multiplying the emissions per mmBtu according to each fuel type\n\nRefer : https://www.epa.gov/sites/production/files/2015-07/documents/emission-factors_2014.pdf"},{"metadata":{"id":"T2H3bQFnWRFG","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# no2 emission in gms per input energy in Btu for powerplant , convert into mmBtu, then apply the emission / gm value\ndef nox_emission_gms(x,y):\n    if x == 'Coal':\n        y = ( y / 1000000 ) * 1.6\n    elif x  == 'Oil':\n        y = ( y / 1000000 ) * 0.6\n    elif x == 'Gas':\n        y = ( y / 1000000 ) * 0.1\n    return y\n","execution_count":null,"outputs":[]},{"metadata":{"id":"WjiEsvVdXtRD","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"power_plants_fossil_df['no2_Emission_for_input_Btu_in_gms'] = \"\"\npower_plants_fossil_df['no2_Emission_for_input_Btu_in_gms'] = power_plants_fossil_df.apply(lambda x: nox_emission_gms(x.primary_fuel, x.input_energy_Btu), axis=1)","execution_count":null,"outputs":[]},{"metadata":{"id":"pbo9SVgOtLxc","colab_type":"text"},"cell_type":"markdown","source":"![image.png](data:image/png;base64,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)"},{"metadata":{"id":"3b8lsjfcXlt3","colab_type":"text"},"cell_type":"markdown","source":"### No2 / mols is 46.0055 during conversion from grams to moles"},{"metadata":{"id":"kPL2b_BVomgZ","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"power_plants_fossil_df['no2_emission_in_tons'] = power_plants_fossil_df['no2_Emission_for_input_Btu_in_gms'] / 1000000\npower_plants_fossil_df['no2_emission_in_mols'] = power_plants_fossil_df['no2_Emission_for_input_Btu_in_gms'] / 46.0055","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"Upwwr7795Sfl","colab_type":"code","outputId":"3e4228b4-2100-4d34-f8c6-3460378b2a7b","executionInfo":{"status":"ok","timestamp":1584775207220,"user_tz":-330,"elapsed":27822,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"colab":{"base_uri":"https://localhost:8080/","height":550},"_kg_hide-input":true},"cell_type":"code","source":"power_plants_fossil_df[['capacity_mw','estimated_generation_gwh','name','primary_fuel','input_energy_Btu',#'capacity_utilization',\n                        'no2_Emission_for_input_Btu_in_gms','no2_emission_in_tons', 'no2_emission_in_mols']]","execution_count":null,"outputs":[]},{"metadata":{"id":"aTHa1JfHsWW-","colab_type":"code","outputId":"5821bed2-3812-40c2-da51-73a916076ba3","executionInfo":{"status":"ok","timestamp":1584775207220,"user_tz":-330,"elapsed":27788,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"colab":{"base_uri":"https://localhost:8080/","height":433},"trusted":true,"_kg_hide-input":true,"_kg_hide-output":true},"cell_type":"code","source":"power_plants_fossil_df.info()","execution_count":null,"outputs":[]},{"metadata":{"id":"VNgakA_avj1A","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":893},"outputId":"c48d06a6-7d87-4f74-958c-94009ba3ee36","executionInfo":{"status":"ok","timestamp":1584775208388,"user_tz":-330,"elapsed":28921,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true,"_kg_hide-output":true},"cell_type":"code","source":"'''\nplt.figure(figsize=(25,15))\nsns.barplot(x='no2_in_mols', y='no2_Emission_for_input_Btu_in_gms', hue='primary_fuel', data=power_plants_fossil_df[power_plants_fossil_df['primary_fuel'].isin(['Coal','Oil','Gas'])])\n#plt.set_xticklabels(a.get_xticklabels(), rotation=45)\nplt.ylabel('Estimated Generation')\nplt.title('no2_in_mols Vs no2_Emission_for_input_Btu_in_gms of fossil power plants');\n'''","execution_count":null,"outputs":[]},{"metadata":{"id":"JeH08wxdzbKK","colab_type":"text"},"cell_type":"markdown","source":"#### Gas power plants are less pollutants compared to oil and Coal plants"},{"metadata":{"trusted":true,"id":"W6OSGirj5Sfv","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"power_plants_renew_df  = power_plants_df[power_plants_df['primary_fuel'].isin(['Wind','Hydro','Solar'])]\npower_plants_renew_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"4I1oxKc35SgG","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"power_plants_df.to_csv('power_plants.csv')\npower_plants_fossil_df.to_csv('fossil.csv')\npower_plants_renew_df.to_csv('renew.csv')\n#pp_gdf.to_csv('pp_gdf.csv')","execution_count":null,"outputs":[]},{"metadata":{"id":"Drttgbm75SgP","colab_type":"text"},"cell_type":"markdown","source":"https://www.kaggle.com/vpatricio/ds4g-where-does-the-no2-come-from"},{"metadata":{"id":"BfRvahaC5SgQ","colab_type":"text"},"cell_type":"markdown","source":"### For fiscal year 2019, \n### petroleum fueled 40% of Puerto Rico’s total electricity generation \n### natural gas accounted for 39%. \n### Coal continued to fuel 18% of generation, \n### while renewables supplied 2.3%."},{"metadata":{"id":"jGMu-Q0g5SgY","colab_type":"text"},"cell_type":"markdown","source":"## 329 Kwh /kg of coal. 1MWH = 1000 Kwh, =1000 ÷0.329 =3039.5kgs or 3040kgs of coal is required for 1MWH generation of electrical power."},{"metadata":{"trusted":true,"id":"3XgcJXov5Sga","colab_type":"code","outputId":"15f76e89-76f5-4741-b049-613373bfa605","executionInfo":{"status":"ok","timestamp":1584775208392,"user_tz":-330,"elapsed":28839,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"colab":{"base_uri":"https://localhost:8080/","height":136},"_kg_hide-input":true},"cell_type":"code","source":"power_plants_fossil_df[power_plants_fossil_df['primary_fuel'] == ('Coal')]","execution_count":null,"outputs":[]},{"metadata":{"id":"L2fwqoG5ojWc","colab_type":"text"},"cell_type":"markdown","source":"### Total Capacity of fossil power plants\n#### Oil, Gas, Coal "},{"metadata":{"trusted":true,"id":"Ng8NktKR5Sgd","colab_type":"code","outputId":"d28d1498-84ed-4322-8886-0a21c81fe5dc","executionInfo":{"status":"ok","timestamp":1584775208394,"user_tz":-330,"elapsed":28808,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"colab":{"base_uri":"https://localhost:8080/","height":104},"_kg_hide-input":true},"cell_type":"code","source":"\nprint ('Oil: ', power_plants_fossil_df.loc[power_plants_fossil_df.primary_fuel=='Oil','capacity_mw'].sum() )\nprint ('Gas :',power_plants_fossil_df.loc[power_plants_fossil_df.primary_fuel=='Gas','capacity_mw'].sum() )\nprint ('Coal:',power_plants_fossil_df.loc[power_plants_fossil_df.primary_fuel=='Coal','capacity_mw'].sum() )","execution_count":null,"outputs":[]},{"metadata":{"id":"MxfUfMcD5ShE","colab_type":"text"},"cell_type":"markdown","source":"###  Organize the data from the image files"},{"metadata":{"id":"gcXJUF9R5ShF","colab_type":"text"},"cell_type":"markdown","source":"#### Need to extract the date details from the file names, GFS , GLDAS contains single date with time, whereas s5p contains both starting and ending datetime"},{"metadata":{"trusted":true,"id":"d8K0jYJh5ShI","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"def convert_df( dff, j):\n    name, ext = dff['filename'][j].split('.')\n    #print (name, ext)\n    df_name = name[0:3]\n    split_str = name.split('_')\n    \n    if df_name in 'gld' :\n        dff['dataset'][j] = split_str[0]\n        dff['date_from'][j] = split_str[1]\n        dff['time_f'][j] = split_str[2]\n    elif df_name in 'gfs':\n        dff['dataset'][j] = split_str[0]\n        dff['date_from'][j] = split_str[1][:-2]\n        dff['time_f'][j] = split_str[1][8:]+'00'\n    elif df_name in 's5p':\n        dff['dataset'][j] = split_str[0]+'_'+split_str[1]\n        dff['date_from'][j] = split_str[2][:8]\n        dff['date_to'][j] = split_str[3][:8]\n        dff['time_f'][j] = split_str[2][9:]\n        dff['time_t'][j] = split_str[3][9:]\n        #dff['no2_mean'] = np.mean(tiff.imread(image)[:, :, 0 : 4])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"mYSkl7SF5ShM","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"gldas_files = os.listdir(data_path + '/eie_data/gldas')\ndf_gldas = pd.DataFrame(gldas_files)\ndf_gldas.rename(columns={0:'filename'}, inplace=True)\ndf_gldas['dataset'] = \"\"\ndf_gldas['date_from']=\"\"\ndf_gldas['time_f']=\"\"\n\nfor i in range(df_gldas.shape[0]):\n    convert_df(df_gldas, i)\ndf_gldas.head()   ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"ZTHLqhFU5ShO","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"gfs_files = os.listdir(data_path + '/eie_data/gfs')\ndf_gfs = pd.DataFrame(gfs_files)\ndf_gfs.rename(columns={0:'filename'}, inplace=True)\ndf_gfs['dataset'] = \"\"\ndf_gfs['date_from']=\"\"\ndf_gfs['time_f']=\"\"\n\nfor i in range(df_gfs.shape[0]):\n    convert_df(df_gfs, i)\ndf_gfs.head(5)  ","execution_count":null,"outputs":[]},{"metadata":{"id":"FqwUxkVJ5ShV","colab_type":"text"},"cell_type":"markdown","source":"### Sentinel-5P OFFL NO2: Offline Nitrogen Dioxide"},{"metadata":{"trusted":true,"id":"OtvSNpQF5ShW","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"image = data_path + '/eie_data/s5p_no2/s5p_no2_20180701T161259_20180707T175356.tif'\nim = rio.open(image)\nim.descriptions\nim.dataset_mask()\nim.units","execution_count":null,"outputs":[]},{"metadata":{"id":"HYdt9yWuz2hC","colab_type":"text"},"cell_type":"markdown","source":"### We can find the coordinates for individual positions within each image by running the following code snippet:"},{"metadata":{"id":"-9NantxDyWvY","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"def preview_meta_data(file_name):\n    with rio.open(file_name) as img_filename:\n        print('Bounding Box:',img_filename.bounds)\n        print('\\nCoordinates of Top Left Corner: ',img_filename.transform * (0,0))\n        print('\\nCoordinates of Bottom Right Corner: ',img_filename.transform * (img_filename.width,img_filename.height))","execution_count":null,"outputs":[]},{"metadata":{"id":"XKTSsSYd2on-","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"preview_meta_data(image)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"7jvd_pO95Shj","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"s5p_files = os.listdir(data_path + '/eie_data/s5p_no2')\ndf_s5p_no2 = pd.DataFrame(s5p_files)\ndf_s5p_no2.rename(columns={0:'filename'}, inplace=True)\ndf_s5p_no2['dataset'] = \"\"\ndf_s5p_no2['date_from']=\"\"\ndf_s5p_no2['date_to']=\"\"\ndf_s5p_no2['time_f']=\"\"\ndf_s5p_no2['time_t']=\"\"\n\nfor i in range(df_s5p_no2.shape[0]):\n    convert_df(df_s5p_no2, i)\n    #print (df_s5p_no2)\ndf_s5p_no2.head(5)  \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true,"id":"wm6f9xU45Shl","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"#print (os.listdir(data_path + '/eie_data/s5p_no2'))\n\ndf_s5p_mean_no2 = pd.DataFrame(s5p_files)\ndf_s5p_mean_no2.rename(columns={0:'filename'}, inplace=True)\ndf_s5p_mean_no2['no2_mean'] = \"\"\ndf_s5p_mean_no2['NO2_col_density'] = \"\"\ndf_s5p_mean_no2['tropospheric_NO2'] = \"\"\ndf_s5p_mean_no2['stratospheric_NO2'] = \"\"\ndf_s5p_mean_no2['NO2_slant_col_density'] = \"\"\ndf_s5p_mean_no2['tropopause_pressure_mean'] = \"\"\ndf_s5p_mean_no2['aai_mean'] = \"\"\ndf_s5p_mean_no2['cloud_fraction_mean'] = \"\"\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"yYCCrs6D5Sho","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"s5p_no2_path = glob.glob(data_path+'/eie_data/s5p_no2/*')\nfor (i, image) in enumerate(s5p_no2_path):\n    #df_s5p_mean_no2['img_no2_data'][i] = tiff.imread(image)[:, :, 0 : 4] # first 4 bands\n    #df_s5p_mean_no2['img_data'][i] = tiff.imread(image)[:, :, 5 : 8] # all bands\n    img = tiff.imread(image)\n    #print (img)\n    df_s5p_mean_no2['no2_mean'][i] = np.nanmean(img[:, :, 0 : 4])\n    df_s5p_mean_no2['NO2_col_density'][i] = img[:, :, 0 ]\n    df_s5p_mean_no2['tropospheric_NO2'][i] = np.nanmean(img[:, :, 1 ])\n    df_s5p_mean_no2['stratospheric_NO2'][i] = img[:, :, 2 ]\n    df_s5p_mean_no2['NO2_slant_col_density'][i] = img[:, :, 3 ]\n    df_s5p_mean_no2['tropopause_pressure_mean'] [i] = np.nanmean(img[:, : , 4])\n    df_s5p_mean_no2['aai_mean'][i] = np.nanmean(img[:, :, 5 ])    \n    df_s5p_mean_no2['cloud_fraction_mean'][i] = np.nanmean(img[:,:,6])\n    #print (\"{:.8f}\".format(x))\n","execution_count":null,"outputs":[]},{"metadata":{"id":"Oei45YLZ9qtV","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true,"_kg_hide-output":true},"cell_type":"code","source":"print (df_s5p_mean_no2['NO2_col_density'][0])\nprint (np.flip(df_s5p_mean_no2['NO2_col_density'][0]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"0gEE07eW5Shz","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"df_s5p_no2 = pd.merge(df_s5p_no2, df_s5p_mean_no2, left_on='filename', right_on='filename')\n\ndf_s5p_no2['filename']= df_s5p_no2['filename'].astype(str)\ndf_s5p_no2['dataset'] = df_s5p_no2['dataset'].astype(str)\ndf_s5p_no2['date_from'] = pd.to_datetime(df_s5p_no2['date_from'])\ndf_s5p_no2['date_to'] = pd.to_datetime(df_s5p_no2['date_to'])\n\ndf_s5p_no2['tropopause_pressure_mean'] = df_s5p_no2['tropopause_pressure_mean'].fillna(\"\")\ndf_s5p_no2['aai_mean'] = df_s5p_no2['aai_mean'].fillna(\"\")\ndf_s5p_no2['cloud_fraction_mean'] = df_s5p_no2['cloud_fraction_mean'].fillna(\"\")\ndf_s5p_no2['no2_mean'] = df_s5p_no2['no2_mean'].fillna(\"\")\n#df_s5p_no2['tropospheric_NO2'] = df_s5p_no2['tropospheric_NO2'].fillna(\"\")\n\ndf_s5p_no2.sort_values('date_from', inplace = True)\ndf_s5p_no2.reset_index(drop = True, inplace = True)","execution_count":null,"outputs":[]},{"metadata":{"id":"StGXi5Zu5Sh1","colab_type":"text"},"cell_type":"markdown","source":"**Check for Not Null values**"},{"metadata":{"trusted":true,"id":"frCoAkbH5Sh7","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"\ns5p_no2_df = df_s5p_no2[['filename','dataset','date_from','date_to','no2_mean','tropospheric_NO2','tropopause_pressure_mean','aai_mean','cloud_fraction_mean']].copy()\n\nsentinel_no_nan_df = s5p_no2_df[s5p_no2_df['no2_mean'] != \"\"]\n\nsentinel_nan_df = s5p_no2_df[s5p_no2_df['no2_mean'] == \"\"]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"r1CnGwN45SiW","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"def line_plot(df, x, y, title, width, height, col):\n    trace = go.Scatter(\n        x = df[x],\n        y = df[y],\n        mode='lines+markers',\n        name=title,\n        marker = dict(\n            color = col, \n        ), \n    )\n    \n    \n    layout = go.Layout(\n        title = go.layout.Title(\n            text = title,\n            x = 0.05\n        ),\n        font = dict(size = 10),\n        width = width,\n        height = height,\n    )\n    \n    data = [trace]\n    fig = go.Figure(data = data, layout = layout)\n    py.iplot(fig, filename = 'line_plot')\n    ","execution_count":null,"outputs":[]},{"metadata":{"id":"rDCIbw2q4QfJ","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"configure_plotly_browser_state() # To be used in the cell when using Colab or Jypter NB\nline_plot(sentinel_no_nan_df, 'date_from', 'tropospheric_NO2', 'NO2 emission - tropospheric_NO2 ', 1000, 600, 'lightblue')\n\nline_plot(sentinel_no_nan_df, 'date_from', 'no2_mean', 'NO2 emission - all NO2 ', 1000, 600, 'purple')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"1qIyp9z45SiZ","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"configure_plotly_browser_state() # To be used in the cell when using Colab or Jypter NB\n\n#line_plot(df_s5p_test, 'start_date', 'no2_mean', 'NO2 emission - mean excluding NaN', 1000, 500)\n    \nline_plot(sentinel_no_nan_df, 'date_from', 'aai_mean', 'NO2 emission - AAI ', 1000, 600, 'orange')\n\n#line_plot(sentinel_no_nan_df, 'date_from', 'cloud_fraction_mean', 'NO2 emission - Cloud fraction excluding NaN', 1000, 600, 'maroon')\n\nline_plot(sentinel_no_nan_df, 'date_from', 'tropopause_pressure_mean', 'NO2 emission - tropopause pressure ', 1000, 600, 'green')\n\n","execution_count":null,"outputs":[]},{"metadata":{"id":"9MeyotYEFskU","colab_type":"text"},"cell_type":"markdown","source":"### More Q&A pls refer the below link \nhttps://www.kaggle.com/c/ds4g-environmental-insights-explorer/discussion/129991"},{"metadata":{"id":"rcFr-G2_5Sif","colab_type":"text"},"cell_type":"markdown","source":"### GFS: Global Forecast System 384-Hour Predicted Atmosphere Data"},{"metadata":{"trusted":true,"id":"oL0i_hAh5Sif","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"image = data_path+'/eie_data/gfs/gfs_2018070306.tif'\nim = rio.open(image)\nim.descriptions\nim.dataset_mask()\nim.units\nim.bounds","execution_count":null,"outputs":[]},{"metadata":{"id":"M4IFk1lQ2H9h","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"preview_meta_data(data_path+'/eie_data/gfs/gfs_2018070306.tif')","execution_count":null,"outputs":[]},{"metadata":{"id":"n5_SnfTHVTlL","colab_type":"text"},"cell_type":"markdown","source":"### Lets explore the gfs image band details"},{"metadata":{"trusted":true,"id":"6q8ilDpk5Sih","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"df_gfs_data = pd.DataFrame(gfs_files)\ndf_gfs_data.rename(columns={0:'filename'}, inplace=True)\n\ndf_gfs_data['temp_2m_above_ground_mean']      = \"\"\ndf_gfs_data['sp_humidity_2m_above_ground_mean'] = \"\"\ndf_gfs_data['rh_2m_above_ground_mean']       = \"\"\ndf_gfs_data['u_wind_10m_above_ground_mean']     = \"\"\ndf_gfs_data['v_wind_10m_above_ground_mean']   = \"\"\ndf_gfs_data['wind_velocity'] = \"\"\ndf_gfs_data['tot_percip_surface_mean']         = \"\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"UZA0FR-35Sik","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"gfs_path = glob.glob(data_path+'/eie_data/gfs/*')\n#gfs_path\nfor i, image in enumerate(gfs_path):\n    img = tiff.imread(image)\n    #df_gfs_data['temperature_2m_above_ground'][i]          = img[:, :, 0 ]\n    #df_gfs_data['specific_humidity_2m_above_ground'][i]    = img[:, :, 1 ]\n    #df_gfs_data['relative_humidity_2m_above_ground'][i]    = img[:, :, 2 ]\n    #df_gfs_data['u_component_of_wind_10m_above_ground'][i] = img[:, :, 3 ]\n    #df_gfs_data['v_component_of_wind_10m_above_ground'][i] = img[:, :, 4]  \n    #df_gfs_data['total_precipitation_surface'][i]          = img[:, :, 5] \n    df_gfs_data['temp_2m_above_ground_mean'][i]        = np.nanmean(img[:, :, 0 ])\n    df_gfs_data['sp_humidity_2m_above_ground_mean'][i] = np.nanmean(img[:, :, 1 ])\n    df_gfs_data['rh_2m_above_ground_mean'][i]          = np.nanmean(img[:, :, 2 ])\n    u_val = np.nanmean(img[:, :, 3 ])\n    v_val = np.nanmean(img[:, :, 4 ])\n    df_gfs_data['u_wind_10m_above_ground_mean'][i]     = u_val\n    df_gfs_data['v_wind_10m_above_ground_mean'][i]     = v_val \n    df_gfs_data['wind_velocity'][i] = m.sqrt ( m.pow(u_val,2 ) + m.pow(v_val, 2) ) \n    df_gfs_data['tot_percip_surface_mean'][i]          = np.nanmean(img[:, :, 5] )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"xKFTSVf35SjA","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"gfs_df = pd.merge(df_gfs, df_gfs_data, left_on='filename', right_on='filename')\n\ngfs_df_copy = gfs_df[['filename','dataset','date_from','time_f','temp_2m_above_ground_mean','sp_humidity_2m_above_ground_mean',\n                     'rh_2m_above_ground_mean','u_wind_10m_above_ground_mean','v_wind_10m_above_ground_mean', 'wind_velocity',\n                     'tot_percip_surface_mean']].copy()\n\ngfs_df_copy['filename']= gfs_df_copy['filename'].astype(str)\ngfs_df_copy['dataset'] = gfs_df_copy['dataset'].astype(str)\ngfs_df_copy['date_from'] = pd.to_datetime(gfs_df_copy['date_from'])\ngfs_df_copy['time_f'] = gfs_df_copy['time_f'].astype(str)\ngfs_df_copy['temp_2m_above_ground_mean'] = gfs_df_copy['temp_2m_above_ground_mean'].astype(float)\ngfs_df_copy['sp_humidity_2m_above_ground_mean'] = gfs_df_copy['sp_humidity_2m_above_ground_mean'].astype(float)\ngfs_df_copy['rh_2m_above_ground_mean'] = gfs_df_copy['rh_2m_above_ground_mean'].astype(float)\ngfs_df_copy['u_wind_10m_above_ground_mean'] = gfs_df_copy['u_wind_10m_above_ground_mean'].astype(float)\n\ngfs_df_copy['v_wind_10m_above_ground_mean'] = gfs_df_copy['v_wind_10m_above_ground_mean'].astype(float)\ngfs_df_copy['wind_velocity'] = gfs_df_copy['wind_velocity'].astype(float)\n\ngfs_df_copy.sort_values('date_from', inplace = True)\ngfs_df_copy.reset_index(drop = True, inplace = True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"k6YwZPIU5SjK","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"configure_plotly_browser_state() # To be used in the cell when using Colab or Jypter NB\n\nline_plot(gfs_df_copy, 'date_from', 'temp_2m_above_ground_mean', 'GFS-temp_2m_above_ground_mean', 1200, 600, 'indigo')\n\n#line_plot(gfs_df_copy, 'date_from', 'sp_humidity_2m_above_ground_mean', 'GFS-sp_humidity_2m_above_ground_mean', 1200, 600, 'pink')\n\nline_plot(gfs_df_copy, 'date_from', 'rh_2m_above_ground_mean', 'GFS-rh_2m_above_ground_mean', 1200, 600, 'aquamarine')\n\n\nline_plot(gfs_df_copy, 'date_from', 'wind_velocity', 'GFS-wind-velocity', 1200, 600, 'orange')\n\nline_plot(gfs_df_copy, 'date_from', 'tot_percip_surface_mean', 'GFS-tot_percip_surface_mean', 1200, 600, 'lightblue')","execution_count":null,"outputs":[]},{"metadata":{"id":"CYcUmoavCoAs","colab_type":"text"},"cell_type":"markdown","source":"### gfs has no missing data. So we merge the sentinel df without nan values to gfs df to find the correlation between these two datasets"},{"metadata":{"trusted":true,"id":"dI7EkmOI5SjT","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_merge_df = pd.DataFrame()\nno2_dfs_merge_df = pd.merge(gfs_df_copy, sentinel_no_nan_df, left_on='date_from', right_on='date_from')\n\nno2_dfs_weather_df = no2_dfs_merge_df[['date_from','time_f','temp_2m_above_ground_mean','sp_humidity_2m_above_ground_mean',\n                     'rh_2m_above_ground_mean','u_wind_10m_above_ground_mean','v_wind_10m_above_ground_mean','wind_velocity',\n                     'tot_percip_surface_mean', 'tropospheric_NO2','aai_mean','tropopause_pressure_mean','cloud_fraction_mean', 'no2_mean']].copy()","execution_count":null,"outputs":[]},{"metadata":{"id":"d4yAwAad6W6H","colab_type":"text"},"cell_type":"markdown","source":"#### GFS provides 4 readings i.e every 6 hours data"},{"metadata":{"id":"63AVj9MBDMXS","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_weather_df['temp_2m_above_ground_mean'] = no2_dfs_weather_df['temp_2m_above_ground_mean'].astype(float)\nno2_dfs_weather_df['sp_humidity_2m_above_ground_mean'] = no2_dfs_weather_df['sp_humidity_2m_above_ground_mean'].astype(float)\nno2_dfs_weather_df['rh_2m_above_ground_mean'] = no2_dfs_weather_df['rh_2m_above_ground_mean'].astype(float)\nno2_dfs_weather_df['u_wind_10m_above_ground_mean'] = no2_dfs_weather_df['u_wind_10m_above_ground_mean'].astype(float)\n\nno2_dfs_weather_df['v_wind_10m_above_ground_mean'] = no2_dfs_weather_df['v_wind_10m_above_ground_mean'].astype(float)\nno2_dfs_weather_df['wind_velocity'] = no2_dfs_weather_df['wind_velocity'].astype(float)\nno2_dfs_weather_df['tot_percip_surface_mean'] = no2_dfs_weather_df['tot_percip_surface_mean'].astype(float)\nno2_dfs_weather_df['tropospheric_NO2'] = no2_dfs_weather_df['tropospheric_NO2'].astype(float)\n","execution_count":null,"outputs":[]},{"metadata":{"id":"C9yAJ16XJZ-A","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_weather_df['time_f'] = no2_dfs_weather_df['time_f'].astype(float)\nno2_dfs_weather_df['temp_2m_above_ground_mean'] = no2_dfs_weather_df['temp_2m_above_ground_mean'].astype(float)\nno2_dfs_weather_df['sp_humidity_2m_above_ground_mean'] = no2_dfs_weather_df['sp_humidity_2m_above_ground_mean'].astype(float)\n\nno2_dfs_weather_df['rh_2m_above_ground_mean'] = no2_dfs_weather_df['rh_2m_above_ground_mean'].astype(float)\nno2_dfs_weather_df['u_wind_10m_above_ground_mean'] = no2_dfs_weather_df['u_wind_10m_above_ground_mean'].astype(float)\n\nno2_dfs_weather_df['v_wind_10m_above_ground_mean'] = no2_dfs_weather_df['v_wind_10m_above_ground_mean'].astype(float)\nno2_dfs_weather_df['wind_velocity'] = no2_dfs_weather_df['wind_velocity'] .astype(float)\nno2_dfs_weather_df['tot_percip_surface_mean'] = no2_dfs_weather_df['tot_percip_surface_mean'].astype(float)\n\n\nno2_dfs_weather_df['aai_mean'] = no2_dfs_weather_df['aai_mean'].astype(float)\nno2_dfs_weather_df['tropopause_pressure_mean'] = no2_dfs_weather_df['tropopause_pressure_mean'].astype(float)\nno2_dfs_weather_df['cloud_fraction_mean'] = no2_dfs_weather_df['cloud_fraction_mean'].astype(float)\nno2_dfs_weather_df['no2_mean'] = no2_dfs_weather_df['no2_mean'].astype(float)\nno2_dfs_weather_df['tropospheric_NO2'] = no2_dfs_weather_df['tropospheric_NO2'].astype(float)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### **However, the reaction of NO with tropospheric ambient concentrations of O3 (ozone) to form NO2 is rapid**."},{"metadata":{"id":"tVH_AGeNI-YP","colab_type":"text"},"cell_type":"markdown","source":"#### To check the wind speed and direction in the noon and correlate with no2\n\n"},{"metadata":{"id":"juUTNj5EFfzP","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_weather_df[(no2_dfs_weather_df.time_f == 1200.0) & (no2_dfs_weather_df.date_from >= '2019-05-01') & (no2_dfs_weather_df.date_from <= '2019-05-10')]","execution_count":null,"outputs":[]},{"metadata":{"id":"99V_vHwYAPEq","colab_type":"text"},"cell_type":"markdown","source":"### To check the wind speed and direction at midnight and correlate with no2"},{"metadata":{"id":"G2ARHwpSAH1o","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_weather_df[(no2_dfs_weather_df.time_f == 0000.0) & (no2_dfs_weather_df.date_from >= '2019-05-01') & (no2_dfs_weather_df.date_from <= '2019-05-02')]","execution_count":null,"outputs":[]},{"metadata":{"id":"QIEjcKNQiale","colab_type":"text"},"cell_type":"markdown","source":"#### To check all the parameters affecting NO2 for couple of days"},{"metadata":{"id":"FEKSxzE8iimI","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_weather_df[ (no2_dfs_weather_df.date_from >= '2019-05-01') & (no2_dfs_weather_df.date_from <= '2019-05-02')]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"Yrj8PTAj5Sjm","colab_type":"code","colab":{},"_kg_hide-input":true},"cell_type":"code","source":"corr_weather_and_no2 = no2_dfs_weather_df.corr()\n\nplt.figure(figsize=(20,13))\na = sns.heatmap(corr_weather_and_no2, annot = True, cmap = 'inferno')\na.Title = 'NO2 - Weather Data Correlation';\nrotx = a.set_xticklabels(a.get_xticklabels(), rotation=90)\nroty = a.set_yticklabels(a.get_yticklabels(), rotation=45)\nplt.show()\n","execution_count":null,"outputs":[]},{"metadata":{"id":"-K0Lirc15Sjo","colab_type":"text"},"cell_type":"markdown","source":"#### NO2 is positively correlated with temparature 2m above ground, aerosol index , tropopause pressure and specific humidity, wind velocity"},{"metadata":{"id":"i5MCzmUWv9gU","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"sns.jointplot(x=\"tropospheric_NO2\", y=\"sp_humidity_2m_above_ground_mean\", data=no2_dfs_weather_df,kind = 'kde', color=\"purple\")","execution_count":null,"outputs":[]},{"metadata":{"id":"a3KPBaXF92Fb","colab_type":"text"},"cell_type":"markdown","source":"### GLDAS-2.1: Global Land Data Assimilation System"},{"metadata":{"id":"7tGGiIho93c3","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image = data_path + '/eie_data/gldas/gldas_20190528_0000.tif'\nim = rio.open(image)\nim.descriptions\nim.count\nim.tags(ns='IMAGE_STRUCTURE')","execution_count":null,"outputs":[]},{"metadata":{"id":"m1ykcx-RVpnK","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"preview_meta_data(image)","execution_count":null,"outputs":[]},{"metadata":{"id":"lw7j8tmp99fo","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"df_gldas_data = pd.DataFrame(gldas_files)\ndf_gldas_data.rename(columns={0:'filename'}, inplace=True)\n\ndf_gldas_data['Qair_f_inst_mean'] = \"\" #Specific humidity\ndf_gldas_data['Rainf_f_tavg_mean']= \"\" #Rain\ndf_gldas_data['Tair_f_inst_mean'] = \"\" #Air temperature\ndf_gldas_data['Wind_f_inst_mean'] = \"\" #Wind Speed","execution_count":null,"outputs":[]},{"metadata":{"id":"OOp3F5kU987e","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"gldas_path = glob.glob(data_path+'/eie_data/gldas/*')\nfor i, image in enumerate(gldas_path):\n    #df_gfs_data['no2_mean'][i] = np.average(tiff.imread(image)[:, :, 0 : 4])\n    img = tiff.imread(image)\n    #df_gldas_data['Qair_f_inst'][i] = img[:, :, 3 ]\n    #df_gldas_data['Rainf_f_tavg'][i] = img[:, : , 7]\n    #df_gldas_data['Tair_f_inst'][i] = img[:, :, 10 ]\n    #df_gldas_data['Wind_f_inst'][i] = img[:, :, 11 ]\n    df_gldas_data['Qair_f_inst_mean'][i] = np.nanmean(img[:, :, 3])  \n    df_gldas_data['Rainf_f_tavg_mean'][i] = np.nanmean(img[:,:,7])\n    df_gldas_data['Tair_f_inst_mean'][i] = np.nanmean(img[:, :, 10 ])\n    df_gldas_data['Wind_f_inst_mean'][i] = np.nanmean(img[:, :, 11 ])","execution_count":null,"outputs":[]},{"metadata":{"id":"BQi06yrM-O22","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"df_gldas = pd.merge(df_gldas, df_gldas_data, left_on='filename', right_on='filename')\n\ndf_gldas['filename']= df_gldas['filename'].astype(str)\ndf_gldas['dataset'] = df_gldas['dataset'].astype(str)\ndf_gldas['date_from'] = pd.to_datetime(df_gldas['date_from'])\ndf_gldas['time_f'] = df_gldas['time_f'].astype(float)\n\ndf_gldas.sort_values('date_from', inplace = True)\ndf_gldas.reset_index(drop = True, inplace = True)\n\nno2_gldas_merge_df = pd.DataFrame()\n\nno2_gldas_merge_df = pd.merge(df_gldas, no2_dfs_weather_df, left_on= 'date_from', right_on = 'date_from', how = \"inner\")\n\nno2_gldas_merge_df.set_index('date_from','time_f')","execution_count":null,"outputs":[]},{"metadata":{"id":"Q-sCGgwkTTK0","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_gldas_df = no2_gldas_merge_df[['date_from','time_f_x',#gldas time\n                                       'time_f_y',#gfs time\n                                       'temp_2m_above_ground_mean',\n                                       'sp_humidity_2m_above_ground_mean',\n                                         'rh_2m_above_ground_mean',\n                                      # 'u_wind_10m_above_ground_mean','v_wind_10m_above_ground_mean',\n                                       'wind_velocity',\n                                         'tot_percip_surface_mean', \n                                       'aai_mean',\n                                       'tropopause_pressure_mean',\n                                       'cloud_fraction_mean', \n                                       'tropospheric_NO2',\n                                       'no2_mean',\n                                         'Rainf_f_tavg_mean',\n                                       'Qair_f_inst_mean',\n                                         'Tair_f_inst_mean',\n                                       'Wind_f_inst_mean']].copy()\n\n\nno2_dfs_gldas_df['Qair_f_inst_mean'] = no2_dfs_gldas_df['Qair_f_inst_mean'].astype(float)\nno2_dfs_gldas_df['Rainf_f_tavg_mean'] = no2_dfs_gldas_df['Rainf_f_tavg_mean'].astype(float)\nno2_dfs_gldas_df['Tair_f_inst_mean'] = no2_dfs_gldas_df['Tair_f_inst_mean'].astype(float)\nno2_dfs_gldas_df['Wind_f_inst_mean'] = no2_dfs_gldas_df['Wind_f_inst_mean'].astype(float)\nno2_dfs_gldas_df['time_f_x'] = no2_dfs_gldas_df['time_f_x'].astype(float)\nno2_dfs_gldas_df['time_f_y'] = no2_dfs_gldas_df['time_f_y'].astype(float)","execution_count":null,"outputs":[]},{"metadata":{"id":"oowgCZj4I8lK","colab_type":"code","colab":{},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"#no2_dfs_gldas_df.info()\nno2_dfs_gldas_df.to_csv('no2_dfs_gldas_df.csv')","execution_count":null,"outputs":[]},{"metadata":{"id":"KrMud4Vf_xtK","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"4fdc7fe4-a0b9-4627-e299-a02ead15af09","executionInfo":{"status":"ok","timestamp":1584773550893,"user_tz":-330,"elapsed":339711,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"all_df_corr = no2_dfs_gldas_df.corr()\n\nplt.figure(figsize=(20,16))\na = sns.heatmap(all_df_corr, annot = True, cmap = 'gist_earth')\na.Title = 'NO2 # Weather # Land Data Correlation';\nrotx = a.set_xticklabels(a.get_xticklabels(), rotation=90)\nroty = a.set_yticklabels(a.get_yticklabels(), rotation=45)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"id":"RuWOV_uQjm_2","colab_type":"text"},"cell_type":"markdown","source":"#### There is a positive corelation between tropospheric no2 and 'Tair_f_inst_mean','Wind_f_inst_mean', 'sp_humidity_2m_above_ground_mean', wind velocity, temp_2m_above_ground_mean and tropopause pressure"},{"metadata":{"id":"iOMc3fi57M7T","colab_type":"text"},"cell_type":"markdown","source":"#### GLDAS records data every 3 hours, so we have  8 image readings per day"},{"metadata":{},"cell_type":"markdown","source":"#### Lets choose some randam date, take the data at midnight and 12 noon (30-May-2019)"},{"metadata":{"id":"EqpG1EtI1Pua","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"ee8c347f-56b8-4b4f-d901-48388b89ff04","executionInfo":{"status":"ok","timestamp":1584773550894,"user_tz":-330,"elapsed":339680,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_gldas_df[(no2_dfs_gldas_df.date_from == '2019-05-30') & (no2_dfs_gldas_df.time_f_x == 0.0) & (no2_dfs_gldas_df.time_f_y == 0.0)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_gldas_df[(no2_dfs_gldas_df.date_from == '2019-05-30') & (no2_dfs_gldas_df.time_f_x == 1200.0) & (no2_dfs_gldas_df.time_f_y == 1200.0)]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### There is no significant impact in the tropospheric no2 density, lets have a look at 6 am data"},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_gldas_df[(no2_dfs_gldas_df.date_from == '2019-05-30') & (no2_dfs_gldas_df.time_f_x == 600.0) & (no2_dfs_gldas_df.time_f_y == 600.0)]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"tropospheric_NO2 value 0.00001"},{"metadata":{},"cell_type":"markdown","source":"Lets analyse another data for the month of december 2018 (28-Dec-2018)"},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_gldas_df[(no2_dfs_gldas_df.date_from == '2018-12-28') & (no2_dfs_gldas_df.time_f_x == 0.0) & (no2_dfs_gldas_df.time_f_y == 0.0)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_gldas_df[(no2_dfs_gldas_df.date_from == '2018-12-28') & (no2_dfs_gldas_df.time_f_x == 1200.0) & (no2_dfs_gldas_df.time_f_y == 1200.0)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"no2_dfs_gldas_df[(no2_dfs_gldas_df.date_from == '2018-12-28') & (no2_dfs_gldas_df.time_f_x == 600.0) & (no2_dfs_gldas_df.time_f_y == 600.0)]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**There is decrease on trophospheric no2 and all-no2-mean value due to wind ( 28-Dec-2018), so this confirms that no2 density is positively correlated to wind speed.\ntropospheric_NO2 value 0.000009"},{"metadata":{"id":"fsGKDKkAv9R2","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":622},"outputId":"4050c031-82d2-4395-d87b-873e37683e02","executionInfo":{"status":"ok","timestamp":1584773550894,"user_tz":-330,"elapsed":339648,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(15, 10))\nsns.distplot(no2_dfs_gldas_df.tropospheric_NO2)","execution_count":null,"outputs":[]},{"metadata":{"id":"JHJVki-vwPZn","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":622},"outputId":"eaf9fde4-6354-473f-cdf2-5137cc9ba2bb","executionInfo":{"status":"ok","timestamp":1584773550895,"user_tz":-330,"elapsed":339617,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(20, 10))\nsns.scatterplot(x=\"tropospheric_NO2\", y=\"wind_velocity\",data=no2_dfs_gldas_df, hue=\"tropospheric_NO2\"  )","execution_count":null,"outputs":[]},{"metadata":{"id":"FSqiSVaWr6Pc","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":622},"outputId":"7e21839c-7342-4f94-b8a8-ba22f3b62d24","executionInfo":{"status":"ok","timestamp":1584773551957,"user_tz":-330,"elapsed":340648,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(20, 10))\nsns.scatterplot(x=\"tropospheric_NO2\", y=\"tot_percip_surface_mean\",data=no2_dfs_gldas_df, hue=\"tropospheric_NO2\" ,color = 'orange' )","execution_count":null,"outputs":[]},{"metadata":{"id":"aZxD3FPfhSKJ","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":476},"outputId":"4c413901-844f-491e-b3f8-ce3fd9813895","executionInfo":{"status":"ok","timestamp":1584773553309,"user_tz":-330,"elapsed":341968,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"#plt.figure(figsize=(20, 10))\n#sns.jointplot(x=\"tropospheric_NO2\", y=\"v_wind_10m_above_ground_mean\", data=no2_dfs_gldas_df,  kind=\"reg\", color = 'green')","execution_count":null,"outputs":[]},{"metadata":{"id":"GDi_vbPltUhs","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":476},"outputId":"50a27d8c-b29b-48f3-e93b-43a6dc1df963","executionInfo":{"status":"ok","timestamp":1584773559462,"user_tz":-330,"elapsed":348090,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"plt.figure(figsize=(20, 10))\nsns.jointplot(x=\"tropospheric_NO2\", y=\"Wind_f_inst_mean\", data=no2_dfs_gldas_df,kind = 'kde', color=\"maroon\")","execution_count":null,"outputs":[]},{"metadata":{"id":"YMcnkDeYt6i5","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":476},"outputId":"8fe71c36-8bcd-4119-afec-758c4df8de24","executionInfo":{"status":"ok","timestamp":1584773560327,"user_tz":-330,"elapsed":348925,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"plt.figure(figsize=(20, 10))\nsns.jointplot(x=\"tropospheric_NO2\", y=\"temp_2m_above_ground_mean\", data=no2_dfs_gldas_df ,kind=\"hex\")\n","execution_count":null,"outputs":[]},{"metadata":{"id":"eLPMI8VPre3p","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":476},"outputId":"afc2f055-f8d9-4ec7-cd28-9aa69e4d1dba","executionInfo":{"status":"ok","timestamp":1584773567269,"user_tz":-330,"elapsed":355837,"user":{"displayName":"Meenakshi Ramaswamy","photoUrl":"https://lh4.googleusercontent.com/-3sXdlOXrEr8/AAAAAAAAAAI/AAAAAAAACC8/ngMx9EiU3T4/s64/photo.jpg","userId":"09422112087559126593"}},"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"plt.figure(figsize=(20, 10))\nsns.jointplot(x=\"tropospheric_NO2\", y=\"Rainf_f_tavg_mean\", data=no2_dfs_gldas_df,kind = 'kde', color=\"lightgreen\")","execution_count":null,"outputs":[]},{"metadata":{"id":"AdekdG1i5SlV","colab_type":"text"},"cell_type":"markdown","source":"#### Next kernel discusses the emission factor calculation and model building , Follow [Part 3](https://www.kaggle.com/meenakshiramaswamy/ds4g-eie-no2emission-calcef-buildmodel/)"}],"metadata":{"colab":{"name":"DS4G-Part-2.ipynb","provenance":[{"file_id":"12cEi4Uz6rS50GvqiAVC3q-9X6A3QE-Dz","timestamp":1584632451131},{"file_id":"1e_y8GV4f_i2cdBmHrln2LdJRucSccTfR","timestamp":1584533637402},{"file_id":"1uSRpNrAyduJ8RuWYd9o0RDVfsfLvBS19","timestamp":1584279176959}],"collapsed_sections":[],"machine_shape":"hm"},"kernelspec":{"name":"python3","display_name":"Python 3"},"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.6"},"accelerator":"GPU"},"nbformat":4,"nbformat_minor":4}