锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

python 教学

时间:2023-02-12 09:00:00 5w15kr电阻

第四章 项目练习

第一节 台风分析

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日。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章