Analyzing United States tornadoes

Tornadoes occur in many parts of the world, including Australia, Europe, Africa, Asia, and South America, but they are found most frequently in the United States. Outside the United States, two of the highest concentrations of tornadoes are found in Argentina and Bangladesh.

Tornadoes are the most violent of all atmospheric storms and in the United States alone have caused an average of more than 80 deaths and 1,400 injuries each year (based on 1950–2011 data). A tornado is a narrow, violently rotating column of air that extends from the base of a thunderstorm to the ground. Tornado formation is complex, and no two tornadoes are the same; however, they need certain conditions to form, including intense or unseasonable heat. Wind speed within a tornado can vary from just above 0 mph up to 70 mph, with an average of 30 mph (NOAA). The Fujita damage scale is used to quantify the intensity of a tornado.

Explore the map of tornadoes across the United States: Twister! United States tornadoes from 1950 to 2012. Which states have had the most tornadoes? Using tornado location data from the United States severe weather report database, provided by the National Oceanic and Atmospheric Administration (NOAA)/National Weather Service Storm Prediction Center (http://www.spc.noaa.gov/gis/svrgis/), you can find the total number of tornadoes by state.

Connect your GIS

from arcgis.gis import GIS

To create the GIS object, we pass in the url and our login credentials as shown below

gis = GIS('home')

Search for the title: tornado_lyr layer.You can search the GIS for feature layer collections by specifying the item type as 'Feature Layer Collection' or 'Feature Layer'. You can also mention the owner name of the layer to get better search results.

data = gis.content.search('Tornadoes_and_Tracks owner: api_data_owner',
                          'Feature layer', outside_org=True)

Display the list of results.

from IPython.display import display

for item in data:
    display(item)
Tornadoes_and_Tracks
Feature Layer Collection by api_data_owner
Last Modified: April 13, 2020
0 comments, 2 views

Get the first item from the results.

item = data[0] #tornado_lyr 

The code below cycles through the layers and print their names.

for lyr in item.layers:
    print(lyr.properties.name)
Tornadoes_5011
Kansas_tracks
MeanTrack_Merge
Kansas_counties10
StatePop_5011

Since the item is a Feature Layer Collection, accessing the layers property gives us a list of FeatureLayer objects. The StatePop_5011 layer is the first layer in this item.

#StatePop_5011
boundary = item.layers[4]
#Tornadoes_5011
tornado_lyr = item.layers[0]

Aggregate_points tool summarizes data from spot measurements by area. To learn more about this tool and the formula it uses, refer to the documentation here.

from arcgis.features.summarize_data import aggregate_points
from datetime import datetime as dt

Please change the output_name if this is not the first you run the cell below.

agg_points = aggregate_points(point_layer=tornado_lyr, 
                              polygon_layer=boundary, 
                              keep_boundaries_with_no_points=True,
                              output_name="agg_tornado_points" + str(dt.now().microsecond))
agg_points
agg_tornado_points334948
Feature Layer Collection by arcgis_python
Last Modified: September 07, 2020
0 comments, 0 views
agg_lyr = agg_points.layers[0]

The GIS object includes a map widget for displaying geographic locations, visualizing GIS content, as well as the results of your analysis. To use the map widget, call gis.map() and assign it to a variable.

m1 = gis.map('US')
m1
m1.add_layer(agg_lyr)

Who has suffered the most?

There can be many devastating effects from a tornado, including loss of life, injuries, property damage, and financial losses. To identify populations that have been affected by tornadoes, you can aggregate the number of tornadoes to the state level and normalize by population.

m2 = gis.map('US', zoomlevel=4)
m2

m2.add_layer(agg_lyr, {
               "renderer":"ClassedColorRenderer",
               "field_name":"AvgPop",
               "opacity":0.7
              })
m2.legend = True

Feature layers hosted can be easily read into a Spatially Enabled DataFrame using the from_layer method. Once you read it into a SEDF object, you can create reports, manipulate the data, or convert it to a form that is comfortable and makes sense for its intended purpose.

import pandas as pd
sdf = pd.DataFrame.spatial.from_layer(agg_lyr)
sdf.head()
OBJECTIDPoint_CountSTATENAMEAverageAvgPopShape__AreaShape__LengthAnalysisAreaSHAPE
01211District of Columbia6.739205e+056739212.926874e+088.181751e+0468.337318{"rings": [[[-8575619.3133, 4720462.3076], [-8...
125610Delaware6.099492e+056099498.695500e+095.644359e+052025.151926{"rings": [[[-8402132.4511, 4824614.7585], [-8...
23944Rhode Island9.550124e+059550125.129735e+096.600487e+051104.035392{"rings": [[[-7946174.496, 5146505.0916], [-79...
348909Connecticut3.027383e+0630273802.312863e+107.524141e+054986.287282{"rings": [[[-8132251.0361, 5166952.3], [-8127...
4513734New Jersey7.269192e+0672691903.456939e+101.097677e+067780.021177{"rings": [[[-8263743.7337, 5033439.7722], [-8...
sdf.shape
(51, 10)

Visualize which states have had the most tornadoes.

sdf.sort_values(by='Point_Count', ascending=False, axis=0, inplace=True)
df = sdf[0:10]
import matplotlib.pyplot as plt
plt.figure(figsize=(10,7))
plt.bar(df.NAME, df.Point_Count)
plt.xlabel('NAME', fontsize=7)
plt.ylabel('point_count', fontsize=7)
plt.xticks(fontsize=8, rotation=45)
plt.title('The ten states with the highest number of tornadoes')
plt.show()
<Figure size 720x504 with 1 Axes>

Number of tornadoes by state, 1950–2011

Some states are subject to many more tornadoes than others. Over a 62-year period (1950–2011), Texas had by far the most tornadoes (with 7,935), followed by Kansas (with 3,713), while others such as Vermont, Rhode Island, and the District of Columbia had fewer than 50. The ten states shown in the graph below had 20 percent of the total number of tornadoes.

Conclusion

In this notebook, we demonstrate how to use aggregation analysis to summarize the number of data points within each polygon. Thus, using aggregate_points() method, we arrive at the number of tornadoes that hit each state. and published the aggregation results as an online service. Mapping results often show new insights that lead to deeper understanding and more clearly defined analysis.

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.