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

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

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

以国家财政收支的公开数据为例,这里展示如何利用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

猜你喜欢

转载自blog.csdn.net/weixin_47008635/article/details/114296592