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

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

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

这是预算效果图

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

准备Excel表格

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

有几点注意:

  • 保持首行不变。也就是说,还是按照预算、支出项目、1-12月这个排序。如果你不喜欢把==预算==放在最前面,你想放到最后面,那你需要改代码
  • 支出的类别,你可以随意删减或者增加,代码会自动统计行数,然后依次提取
  • 注意,最后一行,请留给==总计==。如果你不想要总计,那也需要改代码,因为我代码里,用到了最后一行的数据

编写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
我要少花一点钱……
我发现,我有点超预算了……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354