【前言】

每年夏季,台风就如期而至。今年八月份,“风王”利奇马真的如脱缰野马,让大家见识到台风的可怕之处。

这次收集到1945~2015年在中国登陆的所有台风数据,并通过Python对这些数据进行可视化分析,希望能得到一些有意思的结论。


【数据来源】

该数据集来自于上海追风团队,在其官网台风数据中心下载。


网站提到某些数据年代久远,会有缺失和误差,请甄别使用。所以这里无法对数据的精确性和完整性做保证,主要是想运用python对数据做分析展示,看看台风在等级、地点、时间上的分布。杠精勿扰~

部分数据展示


【分析工具】

本文使用python及其第三方库做分析展示,分析平台是Jupyter notebook,用到爬虫、词云、可视化、地理空间分析等技术。

主要工具:Python 3.6、pandas、numpy、matplotlib、seaborn、urllib、geopandas、wordcloud


【分析流程】

1、导入相关库

# 导入相关库import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport geopandas import seaborn as snsfrom urllib import requestimport refrom shapely.geometry import LineString,Pointfrom urllib import parsefrom urllib.request import urlopenimport hashlibimport jsonfrom wordcloud import WordCloudimport warningswarnings.filterwarnings('ignore')# 显示中文标签plt.rc('font', family='SimHei', size=18)sns.set()%matplotlib inline

2、加载数据集

# 加载台风数据data = pd.read_excel(r'case\taifeng.xlsx')# 数据规格data.shape# 输出:(715, 7)

3、查看数据集

# 查看后10行data.tail(10)


4、数据整理

我们可以看到数据集里只有登陆地址,没有确切的经纬度信息 。
这里需要通过地理编码的方式获取经纬度,使用的是百度地图API。

# 地理编码,通过登陆地址信息得到经、纬度def get_coor(address):    # 需填入自己申请应用后生成的ak    ak = 'mcH6sBNaAfsbkSndFI5zO90j9wUpRMFy1'    url = 'http://api.map.baidu.com/geocoder/v2/?address='    output = 'json'    add = parse.quote(address)  # 本文城市变量为中文,为防止乱码,先用quote进行编码    url2 = url + add + '&output=' + output + "&ak=" + ak    req = urlopen(url2)    response = req.read().decode()    #将返回的数据转化成json格式    responseJson = json.loads(response)    # 获取经纬度    lon = responseJson.get('result')['location']['lng']    lat = responseJson.get('result')['location']['lat']    return (lat,lon)
# 添加经、纬度字段data['coor'] = data['登陆地点'].apply(lambda x:get_coor(x))data['lat'] = data['coor'].apply(lambda x: list(x)[0])data['lon'] = data['coor'].apply(lambda x: list(x)[1])
获取到登陆经纬度信息后,再通过地理逆编码的方式获取省、市、区县三级信息 。
有人可能会觉得“登陆地点”字段已经有地址信息,为什么不直接截取字段?往往地址信息比较复杂,没有办法用简单的正则表达式去截取,而地理逆编码的方式却能很好的捕捉省、市、区县三级信息
# 地理逆编码,通过经纬度获取省、市、县区三级单位def get_address(lon,lat):    # 输入你的秘钥,获取地址http://lbsyun.baidu.com/apiconsole/key/create    your_ak = 'mcH6sBNaAfsbkSndFI5zO90j9wUpRMFy1'    url = 'http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&extensions_town=true&location={},{}&output=json&pois=1&latest_admin=1&ak={}'.format(lat,lon,your_ak)    rp = request.urlopen(url).read().decode('utf-8')    rp = re.findall(r"\((.*)\)",rp)[0]    rpjson= json.loads(rp)    # 省份    province = rpjson['result']['addressComponent']['province']    # 城市    city = rpjson['result']['addressComponent']['city']    # 区县    district = rpjson['result']['addressComponent']['district']    data = (province, city, district)    return data
# 添加省、市、区县字段data['area'] = data['coor'].apply(lambda x:get_address(x[1],x[0]))data['省'] = data['area'].apply(lambda x:x[0])data['市'] = data['area'].apply(lambda x:x[1])data['区县'] = data['area'].apply(lambda x:x[2])

5、台风登陆地点分布

使用geopandas将台风登陆点放到地图上,这里会用到经、纬度数据。

# 使用shapely库的Point方法,将经、纬度数据转换地理几何点xy = [Point(xy) for xy in zip(data.lon,data.lat)]# 将data数据读取为GeoDataFrame格式,这是geopandas库用于地理空间可视化的专有数据格式geo_data = geopandas.GeoDataFrame(data,geometry=xy)# 读取已经下载好的中国地图shapefile格式底图gdf = geopandas.read_file(r"case\exportedBoundaries_shp_single_land_20190911_031017\Taiwan_AL2-AL4.shp")# 展示中国地图ax = gdf.plot(figsize=(20, 20), alpha=0.5, edgecolor='white',color='g',linewidth=1)# 在中国地图底图上展示台风登陆点geo_data.plot(ax=ax,color='red',markersize=7)plt.rc('font', family='SimHei', size=18)plt.title('1945-2015 全国沿海省份台风登陆地点分布图',size=30)plt.show()



6、台风登陆地点词云展示

词云字体越大代表登陆该地点的台风数量越多。

  • 登录省份分布

# 词云展示 台风登陆的省份分布words = ','.join(data['省'].values.tolist())wc = WordCloud(    background_color="white", #背景颜色    max_words=300, #显示最大词数    font_path='./fonts/simhei.ttf',#显示中文    min_font_size=5,    max_font_size=100,    width=500  #图幅宽度    )x = wc.generate(words)image = x.to_image()image



  • 登陆城市分布

# 词云展示 台风登陆的城市分布words = ','.join(data['市'].values.tolist())wc = WordCloud(    background_color="white", #背景颜色    max_words=300, #显示最大词数    font_path='./fonts/simhei.ttf',#显示中文    min_font_size=5,    max_font_size=100,    width=500  #图幅宽度    )x = wc.generate(words)image = x.to_image()image



  • 登陆区县分布

# 词云展示 台风登陆的区县分布words = ','.join(data['区县'].values.tolist())wc = WordCloud(    background_color="white", #背景颜色    max_words=300, #显示最大词数    font_path='./fonts/simhei.ttf',#显示中文    min_font_size=5,    max_font_size=100,    width=500  #图幅宽度    )x = wc.generate(words)image = x.to_image()image



7、数据可视化分析

# 新建data_1data_1 = data[['登陆时间','登陆强度','巅峰强度','省']].dropna()data_1['登陆等级'] = data_1['登陆强度'].apply(lambda x:int(re.match('\d+',str(x).split(',')[0]).group()))data_1['巅峰等级'] = data_1['巅峰强度'].apply(lambda x:int(re.match('\d+',str(x).split(',')[0]).group()))data_1['登陆年份'] = data_1['登陆时间'].apply(lambda x:x.year)data_1['登陆月份'] = data_1['登陆时间'].apply(lambda x:x.month)
  • 看看在各省登陆的台风等级是怎样的

# 各省台风等级分类散点图plt.figure(figsize=(18,6))sns.swarmplot(x='省',y='登陆等级',data=data_1,palette='Set1')plt.title("1945-2015 各省台风登陆等级分类散点图(点数多少代表台风数量)",size=20)plt.show()



  • 1945~2015每年登陆台风数量变化

# 每年台风数量year_counts = data['登陆时间'].apply(lambda x:x.year).value_counts().sort_index()plt.figure(figsize=(15,6))plt.plot(year_counts,lw=2)plt.plot(year_counts,'ro',color='b')x = year_counts.index.tolist()y_mean = [year_counts.mean()]*year_counts.shape[0]plt.plot(x,y_mean,'--')plt.xlabel('年份')plt.ylabel('次数')plt.rc('font', family='SimHei', size=18) plt.title('1945-2015 全国每年台风登陆数量',size=20)plt.show()



  • 台风登陆次数热力图,横坐标代表登陆月份,纵坐标代表登陆等级,颜色代表登录次数

# 不同月份台风登陆时的强度等级data_3 = data_1.groupby(['登陆月份','登陆等级'],as_index=False)['登陆时间'].count()data_3 = data_3.rename(columns={'登陆时间':'登录次数'})# data_2.sort_values(['登陆等级','登陆月份'])data_3_pivot = data_3.pivot('登陆等级','登陆月份','登录次数')# data_2_pivotplt.figure(figsize=(8,6))sns.heatmap(data_3_pivot)plt.title('1945-2015 全国台风登陆次数热力图(按月份-登陆等级)',size=20)plt.show()


  • 台风登陆等级箱图,看看每个月的台风强度变化

plt.figure(figsize=(8,6))sns.boxplot(x='登陆月份',y='登陆等级',data=data_3)plt.title('1945-2015 全国台风登陆等级分布箱图',size=20)plt.show()


  • 台风登陆次数热力图,横坐标代表登陆月份,纵坐标代表巅峰等级,颜色代表登录次数

# 不同月份台风登陆时的强度等级data_2 = data_1.groupby(['登陆月份','巅峰等级'],as_index=False)['登陆时间'].count()data_2 = data_2.rename(columns={'登陆时间':'登录次数'})data_2_pivot = data_2.pivot('巅峰等级','登陆月份','登录次数')plt.figure(figsize=(8,6))sns.heatmap(data_2_pivot)plt.title('1945-2015 全国台风登陆次数热力图(按月份-巅峰等级)',size=20)plt.show()



  • 台风巅峰等级箱图,看看每个月的台风强度变化

plt.figure(figsize=(8,6))sns.boxplot(x='登陆月份',y='巅峰等级',data=data_2)plt.title('1945-2015 全国台风巅峰等级箱图',size=20)plt.show()



【结论】

从地理位置上看,1945-2015 台风主要登陆地点集中在广东省、海南省、台湾省,在台湾省登陆的台风等级较高,广东省数量最多。湛江市和台东县是台风最喜欢登陆的市、县。


从时间上看,年平均登陆台风数量9次左右,主要集中在8、9月份,8月份的台风等级中位数较高,并且强台风主要出现在9月份前后。


©著作权归作者所有:来自51CTO博客作者mb5fe18fab305a5的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. ArcGIS JS API For JavaScript实现类台风运动路径与影响范围的显

随机推荐

  1. Android(安卓)自己总结的工具类 BitmapUt
  2. android 获取字体宽高
  3. 移植 android, touch screen 不能正常工
  4. Android加载图片的工具类
  5. Android—— 4.2 Vold挂载管理_VolumeMan
  6. 头条Android 屏幕适配
  7. Android(安卓)Studio 使用平台特性的jar
  8. Android - AndroidManifest.xml 相关
  9. 教你用电脑从 Google Play 下载 Android
  10. Android用户界面