• 【Python】国内生产总值分析预测


    ✨博文作者 wangzirui32
    💖 喜欢的可以 点赞 收藏 关注哦~~
    👏 我的第162篇原创作品
    👉本文首发于CSDN,未经许可禁止转载


    hello,大家好,我是wangzirui32,今天我们来学习如何对国内生产总值进行分析预测,开始学习吧!

    1. 数据来源

    数据涵盖范围为2010-2021的国内生产总值csv文件,来自国家统计局官方数据:

    依次选择时间(2010-2021),下载CSV文件,分别命名为2010.csv2011.csv(年份+.csv),结果如下:

    2. 清洗数据文件

    2010年的数据文件内容如下:

    可以看到,真正的数据是在文件的第3行开始到倒数第6行,我们需要对其数据进行提取,并且进行gbk编码转换(源文件是gbk编码,需求是UTF8编码),将数据文件放入datafiles文件夹中,再在这个目录的上层目录创建Python文件collate_data.py,写入代码:

    import os
    import codecs
    
    for i in os.listdir("datafiles"):
        path = "datafiles/{}".format(i)
    
        try:
    	    # 把数据文件的gbk编码转换为utf-8
            with codecs.open(path, "rb", "gbk") as f:
                content = f.read()
            with codecs.open(path, "wb", "utf-8") as f:
                f.write(content)
        except: pass
        # 数据文件的介绍信息去除
        with codecs.open(path, "wb", "utf-8") as f:
            f.writelines(new_content)
        with codecs.open(path, "rb", "utf-8") as f:
            new_content = f.readlines()[2:-5]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    执行这段代码,数据就清洗完毕了。

    3. 分析

    这里借助pandas读取数据,matplotlib绘制统计图进行分析,安装库命令:

    pip install pandas matplotlib
    
    • 1

    3.1 折线统计图

    代码如下:

    import pandas
    import matplotlib
    import matplotlib.pyplot as plt
    import os
    
    # 提取数据
    gdp_Q1 = []        # 第一季度gdp
    gdp_Q2 = []        # 第二季度gdp
    gdp_Q3 = []        # 第三季度gdp
    gdp_Q4 = []        # 第四季度gdp
    gdp_all_year = []  # 全年gdp
    years = []         # 所有年份
    
    # 解决中文乱码
    matplotlib.rcParams['font.family'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False
    
    # 读取每个文件中的数据
    for filename in os.listdir("datafiles"):
        year = filename.split(".")[0]
        path = "datafiles/{}".format(filename)
        df = pandas.read_csv(path)
        df.columns = ['指标','第四季度', '第三季度', '第二季度', '第一季度']
      
        gdp_Q1.append(df['第一季度'][0])
        gdp_Q2.append(df['第二季度'][0])
        gdp_Q3.append(df['第三季度'][0])
        gdp_Q4.append(df['第四季度'][0])
        gdp_all_year.append(df['第四季度'][1])
    
        years.append(year)
    # 绘制统计图
    
    Q1_line, = plt.plot(years, gdp_Q1, color="blue")
    Q2_line, = plt.plot(years, gdp_Q2, color="pink")
    Q3_line, = plt.plot(years, gdp_Q3, color="green")
    Q4_line, = plt.plot(years, gdp_Q4, color="orange")
    all_year_line, = plt.plot(years, gdp_all_year, color="red")
    
    plt.title("2010-2021国内生产总值分析预测")
    plt.xlabel("年份")
    plt.ylabel("国内生产总值(亿元)")
    plt.xticks(years)
    
    plt.legend([Q1_line, Q2_line, Q3_line, Q4_line, all_year_line],
                ['第一季度','第二季度', '第三季度', '第四季度', '全年总值'],
                loc='upper right')
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    效果如下:

    3.2 柱形统计图

    代码如下:

    import pandas
    import matplotlib
    import matplotlib.pyplot as plt
    import os
    
    # 提取数据
    gdp_all_year = []  # 全年gdp
    years = []         # 所有年份
    
    # 解决中文乱码
    matplotlib.rcParams['font.family'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False
    
    # 读取每个文件中的数据
    for filename in os.listdir("datafiles"):
        year = filename.split(".")[0]
        path = "datafiles/{}".format(filename)
        df = pandas.read_csv(path)
        df.columns = ['指标','第四季度', '第三季度', '第二季度', '第一季度']
    
        gdp_all_year.append(df['第四季度'][1])
        years.append(year)
    
      
    
    # 绘制统计图
    plt.bar(years, gdp_all_year, width=0.5, label="numbers")
    all_year_line, = plt.plot(years, gdp_all_year, color="red")
    plt.title("2010-2021国内生产总值分析", loc="center")
    plt.xlabel("年份", fontsize=14)
    plt.ylabel("国内生产总值(亿元)", fontsize=14)
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    效果如下:

    可以看到,2020年因为疫情原因,生产总值有所下降,但近年来总体情况还是呈上涨态势的。

    4. 拟合线性回归方程

    下面我们将使用sklearn机器学习库来拟合线性回归方程,它的安装命令如下:

    pip install scikit-learn
    
    • 1

    4.1 以第1季度作为参数

    思路如下,我们使用sklearn库拟合线性回归方程,以第1季度作为参数,生成预测的方程,代码如下:

    import pandas
    import matplotlib
    import matplotlib.pyplot as plt
    import os
    from sklearn import linear_model
    
    # 提取数据
    gdp_Q1 = []        # 第一季度gdp
    gdp_Q2 = []        # 第二季度gdp
    gdp_all_year = []  # 全年gdp
    years = []         # 所有年份
    
    # 解决中文乱码
    matplotlib.rcParams['font.family'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False
    
    # 读取每个文件中的数据
    for filename in os.listdir("datafiles"):
        year = filename.split(".")[0]
        path = "datafiles/{}".format(filename)
        df = pandas.read_csv(path)
        df.columns = ['指标','第四季度', '第三季度', '第二季度', '第一季度']
      
        gdp_Q1.append(df['第一季度'][0])
        gdp_Q2.append(df['第二季度'][0])
        gdp_all_year.append(df['第四季度'][1])
        years.append(year)
    # 绘制统计图
    Q1_line, = plt.plot(years, gdp_Q1, color="blue")
    Q2_line, = plt.plot(years, gdp_Q2, color="pink")
    all_year_line, = plt.plot(years, gdp_all_year, color="red")
    
    plt.title("2010-2021国内生产总值分析预测")
    plt.xlabel("年份")
    plt.ylabel("国内生产总值(亿元)")
    plt.xticks(years)
    
    # 拟定方程
    # 创建线性回归模型
    model = linear_model.LinearRegression()
    
    model.fit(list(zip(gdp_Q1)), gdp_all_year)
    # 获取系数
    coef = model.coef_
    # 获取截距
    intercept = model.intercept_
    # 方程
    equation = "y = x*{} + {}".format(coef[0], intercept)
    print("线性回归方程:", equation)
    # 计算方程数据
    forecast_value = [i*coef[0]+intercept for i in gdp_Q1]
    # 绘制方程折线
    forecast_line, = plt.plot(years, forecast_value, color="green")
    
    plt.legend([Q1_line, Q2_line, all_year_line, forecast_line],
                ['第一季度','第二季度', '全年总值', '方程模拟'],
                loc='upper right')
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    效果如下:
    模拟

    可以看到,方程基本拟合曲线,但因为2020年疫情第一季度生产总值下滑,进而预测的全年数据也产生了较大落差,这怎么办呢?

    4.2 以第1,2季度作为参数

    我们可以以第1,2季度作为参数,代码如下:

    import pandas
    import matplotlib
    import matplotlib.pyplot as plt
    import os
    from sklearn import linear_model
    
    # 提取数据
    gdp_Q1 = []        # 第一季度gdp
    gdp_Q2 = []        # 第二季度gdp
    gdp_all_year = []  # 全年gdp
    years = []         # 所有年份
    
    # 解决中文乱码
    matplotlib.rcParams['font.family'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False
    
    # 读取每个文件中的数据
    for filename in os.listdir("datafiles"):
        year = filename.split(".")[0]
        path = "datafiles/{}".format(filename)
        df = pandas.read_csv(path)
        df.columns = ['指标','第四季度', '第三季度', '第二季度', '第一季度']
    
        gdp_Q1.append(df['第一季度'][0])
        gdp_Q2.append(df['第二季度'][0])
        gdp_all_year.append(df['第四季度'][1])
        years.append(year)
    
    # 绘制统计图
    Q1_line, = plt.plot(years, gdp_Q1, color="blue")
    Q2_line, = plt.plot(years, gdp_Q2, color="pink")
    all_year_line, = plt.plot(years, gdp_all_year, color="red")
    
    plt.title("2010-2021国内生产总值分析预测")
    plt.xlabel("年份")
    plt.ylabel("国内生产总值(亿元)")
    plt.xticks(years)
    
    # 拟定方程
    model = linear_model.LinearRegression()
    model.fit(list(zip(gdp_Q1, gdp_Q2)), gdp_all_year)
    coef = model.coef_
    intercept = model.intercept_
    equation = "y = x1*{} + x2*{} + {}".format(coef[0], coef[1], intercept)
    
    print("线性回归方程:", equation)
    
    # 计算预测结果
    forecast_value = [i[0]*coef[0]+i[1]*coef[1]+intercept for i in list(zip(gdp_Q1, gdp_Q2))]
    forecast_line, = plt.plot(years, forecast_value, color="green")
    
    plt.legend([Q1_line, Q2_line, all_year_line, forecast_line],
                ['第一季度','第二季度', '全年总值', '方程模拟'],
                loc='upper right')
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    效果如下:
    模拟预测

    可以看到,这个方程的拟合结果十分不错,可以将它作为预测的方程。
    线性回归方程为:

    y = x1*0.20405068090604006 + x2*3.8656156020304238 + 9671.424027125235
    
    • 1

    等价于:

    国内生产总值 = 第一季度生产总值*0.20405068090604006 + 第二季度生产总值*3.8656156020304238 + 9671.424027125235
    
    • 1

    这就完成了整个分析预测的流程。


    🎉🎉🎉 好了,今天的课程就到这里,我是wangzirui32,喜欢的可以点个收藏和关注,我们下次再见!

  • 相关阅读:
    在构建 Web3 前,需先知道什么是区块链,毕竟 Web3 是基于区块链
    我用ChatGPT写2023高考语文作文(二):全国乙卷
    Linux笔记——Ubuntu子系统从系统盘迁移到非系统盘
    虹科小课堂 | 在各种恶劣环境下,光纤传感器毫不畏惧、C位出道!
    Ubuntu20.04+RTX3090ti+cuda11.6+cudnn8.4.1+pytorch安装过程记录
    Golang | Web开发之Gin框架快速入门基础实践
    【STM32】标准库的引入
    Mybatis-plus使用update()/updateById()将字段更新为null或者空值时候不起作用
    文心一言 VS 讯飞星火 VS chatgpt (119)-- 算法导论10.3 4题
    883. 三维形体投影面积
  • 原文地址:https://blog.csdn.net/wangzirui32/article/details/125464048