pythonPython

Python数据可视化:用Pygal统计家庭支出情况

2019-05-31  本文已影响145人  洋阳酱

代码链接:https://github.com/yangyang0126/

先上成果图,最终会生成这些文件

这是预算效果图

主要分为以下几步:
1、你需要自己记账,有一个Excel表格
2、用Python读取表格,根据需求绘图(包括支出总计、预算等)
3、将图片汇总到网页(你也可以不汇总)

准备Excel表格

首先我们需要一个Excel表格,里面有每个月的账单情况
大家可以根据自己的需求调整,没有支出的地方,空着,写0 ,都可以
(里面的数字瞎写的,大家填写自己的实际情况就可以了)

有几点注意:

编写Python代码

安装相关库

程序开始之前,你需要安装几个库
还是通过附件命里提示符

pip install pandas     # 取读Excel数据
pip install pygal      # 所有的图都靠它
pip install lxml       # 提高图像渲染速度
pip install cairosvg   # 这三个是渲染的库,一次性装好
pip install tinycss    # 这三个是渲染的库,一次性装好
pip install cssselect  # 这三个是渲染的库,一次性装好

开始写代码

pygal:画图要用
pandas:Excel表格要用
math:用于Excel表格中的空值

import pygal  
import pandas as pd
import math

取读表格数据

pandas超好用,取读Excel,一句话搞定

df = pd.read_excel('家庭支出清单.xlsx')  #默认读取到Excel的第一个表单

替换表格中的空数据

记账的时候,这个月没花这个钱,我就会直接空着
在导入表格的时候,就会出现nan(空值)
用math函数替换成0

if math.isnan(data[j]):    
     data[j] = 0

isnan就是判断,判断是不是nan值

根据自己的想法作图

每个人想统计的数据都不同,主要明确2个事情:
1、你想统计什么?比如我就想统计一下支出和预算
2、你喜欢什么样的图?

关于这个,你可以看Python数据可视化:pygal
这里面汇总了所有Pygal的图表以及基本操作(也是本宝宝汇总的)

当然Pygal不是唯一的选择,Bokeha啊,Plotly啊,都超好看


(沉迷于Python可视化,无法自拔……扯远了……)

回到Pygal,根据上面给的链接,你挑选自己喜欢的图的样子,画就行了
当你想感受不同的图表时,你只需要改变第一行的图表类型(比如柱状图和折线图),后面一般不用改,特别方便

# 输出各项支出统计
def PlotItems(df):
    dot_chart = pygal.Dot(x_label_rotation=30)
    #line_chart.title = '每月支出'
    for i in range(0,4):         
        data=df.ix[i].values
        for j in range(2,14):                 
            if math.isnan(data[j]):    
                data[j] = 0          
        dot_chart.add(df.ix[i,1], data[2:len(data)])
    dot_chart.x_labels = map(str, range(1, 13))
    dot_chart.render_to_file("部分支出情况.svg")

# 统计各项支出汇总
def SumItems(df,n):
    data=df.ix[n].values
    items = 0
    for i in range(2,14):   
        #  判断Excel表格中的空值nan
        if math.isnan(data[i]):    
            data[i] = 0
        items += float(data[i])    
    return items

# 统计预算进度
def CalBudget(df):
    gauge = pygal.SolidGauge(half_pie=True, inner_radius=0.70, style=pygal.style.styles['default'](value_font_size=10))
    percent_formatter = lambda x: '{:.10g}%'.format(x)    
    gauge.value_formatter = percent_formatter
    #gauge.title = '各项预算进度(%)'
    for i in range(0,len(df)-1): 
        data=df.ix[i].values
        items = SumItems(df,i)        
        items = round(items/data[0]*100,2)    
        gauge.add(df.ix[i,1], items)
    gauge.render_to_file("各项预算进度.svg")

# 统计预算总进度
def CalBudgetTotel(df):
    gauge = pygal.SolidGauge(inner_radius=0.70)
    percent_formatter = lambda x: '{:.10g}%'.format(x)    
    gauge.value_formatter = percent_formatter
    #gauge.title = '年度预算进度(%)'
    i = len(df)-1
    data=df.ix[i].values
    items = SumItems(df,i)        
    items = round(items/data[0]*100,2)    
    gauge.add(df.ix[i,1],items)
    gauge.value_formatter = lambda x: '%.2f%%' % x if x is not None else '∅'
    gauge.render_to_file("年度预算进度.svg")

# 统计支出分类
def CalPie(df):    
    pie_chart = pygal.Pie(inner_radius=.4)
    #pie_chart.title = '支出分类'
    for i in range(0,len(df)-1):         
        items = SumItems(df,i)           
        pie_chart.add(df.ix[i,1], items)
    pie_chart.render_to_file("支出分类.svg")

# 统计所有支出
def CalTotal(df):
    line_chart = pygal.StackedBar()
    #line_chart.title = '每月支出'
    for i in range(0,len(df)-1):         
        data=df.ix[i].values
        for j in range(2,14):                 
            if math.isnan(data[j]):    
                data[j] = 0          
        line_chart.add(df.ix[i,1], data[2:len(data)])
    line_chart.x_labels = map(str, range(1, 13))
    line_chart.render_to_file("年度支出柱状图.svg")

保存为svg格式

所有的代码,最后都会有一行

***.render_to_file("***.svg")

其实这里,我们可以直接保存成png图片格式的
那为什么要保持成svg?因为它会动啊!超可爱的
svg格式,双击之后,是直接在浏览器的

你可以点每一部分,让它给你看结果

你还可以在最左侧,勾选你要的项目,部分显示

总之,超棒的。图片格式就做不到这点

运行代码

请右击打开代码,Run运行。不要直接双击.py文件。
看看代码再运行,感觉更好哟
也欢迎大家改代码

保存到网页

其实到上面一步,我们已经得到所有的图了,为什么还要保存到网页呢?

其实我就是想把结果汇总到一起

在网页上,还可以打字(如下图),虽然以我目前的水平,搞得比较丑

操作也很简单,直接打开一个记事本
把图片写进去,width和height大小随意调整

保存的时候,把后缀也改掉,改成html就可以了
如果你的图改动了,只要文件名不改,就不需要改这个文件
会自动更新哒~

最后

可视化真好看,要慢慢学习呀~
and
我要少花一点钱……
我发现,我有点超预算了……

上一篇下一篇

猜你喜欢

热点阅读