ClickHouse 细胞因子 反射 lambda cmd combobox stream wso2 vb6 angular视频 electron教程 bootstrap图表 mac上传文件到linux webapp打包 matlab中如何定义函数 判断bigdecimal是否为空 pythonsocket编程 python数据 python中assert python注释 python抛出异常 配置python环境 python自学入门 python模块下载 python数字类型 java正则 java中的正则表达式 java文件写入 javalist java接口实例 java类方法 局域网助手 脚本下载 零基础学python js格式化时间 js延迟加载 音乐剪辑器下载 流程图工具 爱奇艺无法投屏 ps蒙版抠图详细教程
当前位置: 首页 > 学习教程  > 编程语言

Python项目实践:国家财政数据趋势演算

2021/3/4 0:01:25 文章标签:

国家统计局每年会公开许多数据,国家统计局公布的大部分数据都以二维表格形式展现,然而,藏在这些数据背后的价值要比表格所展现的更多。 如何挖掘数据背后的潜力呢?要有眼光,跟要会程序 以国家财政收支的公开数据为例…

国家统计局每年会公开许多数据,国家统计局公布的大部分数据都以二维表格形式展现,然而,藏在这些数据背后的价值要比表格所展现的更多。

  • 如何挖掘数据背后的潜力呢?
  • 要有眼光,跟要会程序

以国家财政收支的公开数据为例,这里展示如何利用Python挖掘数据变化的规律。

1、将从网上获取的公开信息存为finance.csv文件
在这里插入图片描述
在这里插入图片描述
2、分析问题

可以看到,公开的数据只有2020年、2015年、2016年三个年份,如何根据这些个别数据分析整体财政趋势呢?简单地说,是否可以根据这些数据,估算出所缺少年份的大致收支情况甚至预测未来呢?

由个别数据预测规律属于数值分析的内容,因此可以通过线性回归方程建立简单模型。线性回归方程的公式为:y=bx + a
在这里插入图片描述
x代表年份,y代表各年份对应的数值。
Python实现的国家财政数据趋势演算,根据上述三个数值计算出更多年份的可能数据。

3、程序

zip(x,y)函数用来获取两个组合数据类型x和y,并将它们的元素交织返回。如x=[1,2,3], y=[4,5,6], zip(x,y)的返回值是[(1,4),(2,5),(3,6)]。

# FianancePredict.py
def parseCSV(filename):
    dataNames, data = [], []
    f = open(filename, "r")
    for line in f:
        splitedLine = line.strip("\n").split(",")
        if "指标" in splitedLine[0]:
            years = [int(x[:-1]) for x in splitedLine[1:]]
        else:
            dataNames.append("{:10}".format(splitedLine[0]))
            data.append([float(x) for x in splitedLine[1:]])
    f.close()
    return years, dataNames, data
# line1 = "指标,2020年,2015年,2016年" 字符串
# line2 = "全部收入,13395.2,152269.2,159605“
# splitedLine1 = ["指标","2020年","2015年","2016年"] 一维列表,元素是字符串
# splitedLine2 = ["全部收入","13395.2","152269.2","159605“]
# years = [2000, 2015, 2016] 一维列表
# dataNames = ['全部收入      ', '中央收入      ', '地方收入      ', '全部支出      ', '中央支出      ', '地方支出      ']
# [[13395.2, 152269.2, 159605.0], [6989.2, 69267.2, 72365.6], [6406.1, 83002.0, 87239.4],……] 二维列表
def means(data):
    return sum(data)/len(data)

def linearRegression(xlist, ylist):
    xmeans, ymeans = means(xlist), means(ylist)
    bNumerator = - len(xlist) * xmeans * ymeans
    bDenominator = - len(xlist) * xmeans ** 2
    for x, y in zip(xlist, ylist):
        bNumerator += x * y
        bDenominator += x ** 2
    b = bNumerator / bDenominator
    a = ymeans - b * xmeans
    return a, b

def calNewData(newyears, a, b):
    return [a + b * x for x in newyears]

def showResults(newyears, dataNames, newDatas):
    print("{:^60}".format("国家财政收支线性估计"))
    header = "指标       "
    for year in newyears:
        header += "{:10}".format(year)
    print(header)
    for name, lineData in zip(dataNames,newDatas):
        line = name
        for data in lineData:
            line += "{:>10.1f}".format(data)
        print(line)
def main():
    newyears = [x + 2010 for x in range(7)]  # newyears = [2010,2011,2012,2013,2014,2015,2016]
    newDatas = []
    years, dataNames, datas = parseCSV("C:\\Users\\520\\Desktop\\finance.csv")
    for data in datas:
        a, b = linearRegression(years, data)
        newDatas.append(calNewData(newyears, a, b))
    showResults(newyears, dataNames, newDatas)

main()

输出:
                         国家财政收支线性估计                         
指标             2010      2011      2012      2013      2014      2015      2016
全部收入        105359.6  114550.1  123740.6  132931.0  142121.5  151312.0  160502.4
中央收入         48169.1   52283.8   56398.5   60513.2   64627.9   68742.7   72857.4
地方收入         57190.6   62266.3   67342.1   72417.8   77493.6   82569.3   87645.1
全部支出        122936.9  133645.7  144354.5  155063.3  165772.1  176480.9  187189.8
中央支出         19037.5   20390.9   21744.3   23097.7   24451.1   25804.5   27157.9
地方支出        103899.4  113254.8  122610.2  131965.6  141321.0  150676.4  160031.9

Process finished with exit code 0

4、分析
该程序设计了6个函数,分别是parseCSV(), means(), linearRegression(), calNewData(), showResults(), main()。
parseCSV()用来解析CSV文件,从中读取数据,并把数据表示为列表类型。其中需要关注的代码如下:

years = [int(x[:-1]) for x in splitedLine[1:]]

这是for循环的一种紧凑形式,它指的是从splitedLine[1:]中逐一取出元素x,并对元素执行表达式int(x[:-1]),这种紧凑形式对简化代码整体逻辑十分有益。
means()用来计算所有数据的均值
linearRegression()用来根据xlist和ylist列表计算线性回归值。其中需要关注的是zip()函数的使用。zip()可以同时对xlist和ylist进行同步遍历,每次取出各自一个元素x和y,并进行关联操作。

for x, y in zip(xlist, ylist):
	bNumerator += x * y
	bDenominator += x ** 2

calNewData()用来计算新的数值
showResults()用来集中展示运行结果,重点在于格式化输出
main()代表该程序的主逻辑部分,包括预分配列表变量、调用各步骤或流程函数等。

PS:source NCRE python tier 2


本文链接: http://www.dtmao.cc/news_show_763149.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?