python 教学
时间:2023-02-12 09:00:00
第四章 项目练习
第一节 台风分析
1. 用pip安装requests库。
python2这样安装:
pip install requests
python3这样安装:
pip3 install requests
2. 写excel。
把excel命名为21世纪台风分析,存到下载里。
在excel内容如下:
年份 8级 9级 10级 11级 12级 13级 14级 15级 16级 17级 17级 合计: 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 合计:
3. 导入库,写变量和列表,读入库excel文件。
import requests import json import time import pandas as pd import matplotlib.pyplot as plt df = pd.read_excel("/Users/cat/Library/Containers/com.microsoft.Excel/Data/Downloads/21世纪台风分析.xlsx") ls = [22,24、26、21、30、23、23、23、24、22、22、22、22、22、22、22、22、22、22、22、22、22、22、22、22、22、22、22、22、22、22、22、23、22、22、22、22、22、22、22、22、222、26、26、26、26、26、26、21、22、22、22、22、22、22、22、22、24、24、24、26、26、21、21、21、21、21、21、21、21、21、23、23、23、23、23、23、23、23、2222、2222、222、222、222、222、22、22、22、22、22、22、2、2、23、23、23、23、23、23、23、23、23、23、23、23、23、2、2、23、23、2、23、2、2、23、23、2、23、23、2、2、23、2、2、23、2、23、2、2、22、2、2、2、2、2、2、2、2、2、22、2、2、2、2、2、2、2、22、2、2、2、2、2、2、22、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、22、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2 w8 = 0 w9 = 0 w10 = 0 w11 = 0 w12 = 0 w13 = 0 w14 = 0 w15 = 0 w16 = 0 w17 = 0 w18 = 0
4. 主函数-设置字体和年份。
def main(): plt.rcParams['font.family']='sans-serif' plt.rcParams['font.sans-serif'] = ['Heiti TC'] year = 2000
5. 主函数——for循环统计每年台风数量并绘图显示。
def main(): plt.rcParams['font.family']='sans-serif' plt.rcParams['font.sans-serif'] = ['Heiti TC'] year = 2000 for i in range(22): fig = plt.figure(figsize = (16,4)) ax = plt.subplot(1,1,1) number = typhoon(year,ls[i]) ji = ('8级', 11级、11级、12级、13级、14级、16级、17级'17级 ') plt.bar(ji, number) string = str(year) "年台风等级分布" plt.title(string) plt.plot() plt.plot(0,0,0,0,0,0,0,0,00,0,0,0,0 plt.plot(number) year = 1
6. 主函数-统计21世纪台风数并绘图显示。
def main(): plt.rcParams['font.family']='sans-serif' plt.rcParams['font.sans-serif'] = ['Heiti TC'] year = 2000 for i in range(22): fig = plt.figure(figsize = (16,4)) ax = plt.subplot(1,1,1) number = typhoon(year,ls[i]) ji = ('8级', 11级、11级、12级、13级、14级、16级、17级'17级 ') plt.bar(ji, number) string = str(year) "年台风等级分布" plt.title(string) plt.plot() plt.plot(0,0,0,0,0,0,0,0,00,0,0,0,0]) plt.plot(number) year = 1 df["合计:"][22] = sum(ls) df["8级"][22] = w8 df["9级"][22] = w9 df["10级"][22] = w10 df["11级"][22] = w11 df["12级"][22] = w12 df["13级"][22] = w13 df["14级"][22] = w14 df["15级"][22] = w15 df["16级"][22] = w16 df["17级"][22] = w17 df["17级 "][22] = w18 fig = plt.figure(figsize = (16,4)) ax = plt.subplot(1,1,1) ji = ('8级', 11级、11级、12级、13级、14级、16级、17级 ') number = [w8, w9, w10, w11, w12, w13, w14, w15, w16, w17, w18] plt.bar(ji, number) plt.title('2000~2021年台风等级分布 plt.plot() plt.plot(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00]) plt.plot(number) df.to_excel("/Users/cat/Library/Containers/com.microsoft.Excel/Data/Downloads/21世纪台风分析.xlsx")
7. 函数turn_code(年份)。
输入:10 2020
输出:20(年后两个数)10(编号)
也就是说,将年份切片添加到编号中。
def turn(number,year): year = str(year) if len(str(number)) == 1: return year[2:4] "0" str(number) else: return year[2:4] str(number)
8. 函数typhoon(年份,台风数)。
统计一年内不同级别台风的数量并返回。
def typhoon(year,number): global w8 global w9 global w10 global w11 global w12 global w13 global w14 global w15 global w16 global w17 global w18 global df s8 = 0 s9 = 0 s10 = 0 s11 = 0 s12 = 0 s13 = 0 s14 = 0 s15 = 0 s16 = 0 s17 = 0 s18 = 0 for n in range(1,number 1): url = "http://d1.weather.com.cn/typhoon/typhoon_data/" str(year) "/" turn(n,year) ".json?callback=getData&_=" str(int(round((time.time()*1000)))) headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", "Referer": "http://typhoon.weather.com.cn/gis/typhoon_p.shtml", } r = requests.get(url,headers=headers) try: a = json.loads(r.text[8:-1]json文件 #台风轨迹点 start_time = [] #台风到达时间 lon = [ #台风到达地经度
lat = [] #台风到达地纬度
central_pressure = [] #台风中心气压
wind = [] #台风风速风力(米/秒)
for i in range(len(a["typhoon"][8])):
start_time.append(a["typhoon"][8][i][1])
lon.append(a["typhoon"][8][i][4])
lat.append(a["typhoon"][8][i][5])
central_pressure.append(a["typhoon"][8][i][6])
wind.append(a["typhoon"][8][i][7])
if len(a["typhoon"][8][i]) > 13:
print(a["typhoon"][8][i][13])
for i in range(len(wind)):
if wind[i] != None:
wind[i] = int(wind[i])
else:
wind[i] = 0
lon[i] = float(lon[i])
lat[i] = float(lat[i])
m = max(wind)
if m >= 17.2 and m <= 20.7:
w8 += 1
s8 += 1
elif m >= 20.8 and m <= 24.4:
w9 += 1
s9 += 1
elif m >= 24.5 and m <= 28.4:
w10 += 1
s10 += 1
elif m >= 28.5 and m <= 32.6:
w11 += 1
s11 += 1
elif m >= 32.7 and m <= 36.9:
w12 += 1
s12 += 1
elif m >= 37.0 and m <= 41.4:
w13 += 1
s13 += 1
elif m >= 41.5 and m <= 46.1:
w14 += 1
s14 += 1
elif m >= 46.2 and m <= 50.9:
w15 += 1
s15 += 1
elif m >= 51.0 and m <= 56.0:
w16 += 1
s16 += 1
elif m >= 56.1 and m <= 61.2:
w17 += 1
s17 += 1
elif m >= 61.3:
w18 += 1
s18 += 1
except:
continue
m = str(year)
m = m[-2] + m[-1]
m = int(m)
df["8级"][m] = s8
df["9级"][m] = s9
df["10级"][m] = s10
df["11级"][m] = s11
df["12级"][m] = s12
df["13级"][m] = s13
df["14级"][m] = s14
df["15级"][m] = s15
df["16级"][m] = s16
df["17级"][m] = s17
df["17级+"][m] = s18
df["合计:"][m] = int(number)
return [s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18]
总体代码如下:
# 统计每级台风各有几个
# 5级 6级 7级 8级 9级 10级 11级 12级 13级 14级 15级 16级 17级 17级以上
import requests
import json
import time
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel("/Users/cat/Library/Containers/com.microsoft.Excel/Data/Downloads/21世纪台风分析.xlsx")
ls = [22,24,26,21,30,23,24,25,22,22,14,21,25,31,23,27,26,27,29,29,23,22]
def turn(number,year):
year = str(year)
if len(str(number)) == 1:
return year[2:4] + "0" + str(number)
else:
return year[2:4] + str(number)
w8 = 0
w9 = 0
w10 = 0
w11 = 0
w12 = 0
w13 = 0
w14 = 0
w15 = 0
w16 = 0
w17 = 0
w18 = 0
def typhoon(year,number):
global w8
global w9
global w10
global w11
global w12
global w13
global w14
global w15
global w16
global w17
global w18
global df
s8 = 0
s9 = 0
s10 = 0
s11 = 0
s12 = 0
s13 = 0
s14 = 0
s15 = 0
s16 = 0
s17 = 0
s18 = 0
for n in range(1,number + 1):
url = "http://d1.weather.com.cn/typhoon/typhoon_data/" + str(year) + "/" + turn(n,year) + ".json?callback=getData&_=" + str(int(round((time.time()*1000))))
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
"Referer": "http://typhoon.weather.com.cn/gis/typhoon_p.shtml",
}
r = requests.get(url,headers=headers)
try:
a = json.loads(r.text[8:-1])#解析json文件
#台风轨迹点
start_time = [] #台风到达时间
lon = [] #台风到达地经度
lat = [] #台风到达地纬度
central_pressure = [] #台风中心气压
wind = [] #台风风速风力(米/秒)
for i in range(len(a["typhoon"][8])):
start_time.append(a["typhoon"][8][i][1])
lon.append(a["typhoon"][8][i][4])
lat.append(a["typhoon"][8][i][5])
central_pressure.append(a["typhoon"][8][i][6])
wind.append(a["typhoon"][8][i][7])
if len(a["typhoon"][8][i]) > 13:
print(a["typhoon"][8][i][13])
for i in range(len(wind)):
if wind[i] != None:
wind[i] = int(wind[i])
else:
wind[i] = 0
lon[i] = float(lon[i])
lat[i] = float(lat[i])
m = max(wind)
if m >= 17.2 and m <= 20.7:
w8 += 1
s8 += 1
elif m >= 20.8 and m <= 24.4:
w9 += 1
s9 += 1
elif m >= 24.5 and m <= 28.4:
w10 += 1
s10 += 1
elif m >= 28.5 and m <= 32.6:
w11 += 1
s11 += 1
elif m >= 32.7 and m <= 36.9:
w12 += 1
s12 += 1
elif m >= 37.0 and m <= 41.4:
w13 += 1
s13 += 1
elif m >= 41.5 and m <= 46.1:
w14 += 1
s14 += 1
elif m >= 46.2 and m <= 50.9:
w15 += 1
s15 += 1
elif m >= 51.0 and m <= 56.0:
w16 += 1
s16 += 1
elif m >= 56.1 and m <= 61.2:
w17 += 1
s17 += 1
elif m >= 61.3:
w18 += 1
s18 += 1
except:
continue
m = str(year)
m = m[-2] + m[-1]
m = int(m)
df["8级"][m] = s8
df["9级"][m] = s9
df["10级"][m] = s10
df["11级"][m] = s11
df["12级"][m] = s12
df["13级"][m] = s13
df["14级"][m] = s14
df["15级"][m] = s15
df["16级"][m] = s16
df["17级"][m] = s17
df["17级+"][m] = s18
df["合计:"][m] = int(number)
return [s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18]
def main():
plt.rcParams['font.family']='sans-serif'
plt.rcParams['font.sans-serif'] = ['Heiti TC']
year = 2000
for i in range(22):
fig = plt.figure(figsize = (16,4))
ax = plt.subplot(1,1,1)
number = typhoon(year,ls[i])
ji = ('8级', '9级','10级','11级','12级','13级','14级','15级','16级','17级','17级+')
plt.bar(ji, number)
string = str(year) + "年台风等级分布"
plt.title(string)
plt.plot()
plt.plot([0,0,0,0,0,0,0,0,0,0,0])
plt.plot(number)
year += 1
df["合计:"][22] = sum(ls)
df["8级"][22] = w8
df["9级"][22] = w9
df["10级"][22] = w10
df["11级"][22] = w11
df["12级"][22] = w12
df["13级"][22] = w13
df["14级"][22] = w14
df["15级"][22] = w15
df["16级"][22] = w16
df["17级"][22] = w17
df["17级+"][22] = w18
fig = plt.figure(figsize = (16,4))
ax = plt.subplot(1,1,1)
ji = ('8级', '9级','10级','11级','12级','13级','14级','15级','16级','17级','17级+')
number = [w8, w9, w10, w11, w12, w13, w14, w15, w16, w17, w18]
plt.bar(ji, number)
plt.title('2000~2021年台风等级分布')
plt.plot()
plt.plot([0,0,0,0,0,0,0,0,0,0,0])
plt.plot(number)
df.to_excel("/Users/cat/Library/Containers/com.microsoft.Excel/Data/Downloads/21世纪台风分析.xlsx")
if __name__ == "__main__":
main()
这节课我们就讲到这里,下节课让我们一起来做一个裁员程序吧!
下次更新时间为6月7日或6月8日。