原标题:Python之区块链简单记账本实现

欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习、问答、求职,一站式搞定!

对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。

在上一篇《Python之区块链入门》中讲述了区块链的基础知识,并用Python实现了区块和区块链的结构。在本篇中,将基于上面的内容实现一个简单的记账本功能。

记账本的功能如下:

实现基本的收支记录;

计算当前余额;

对收支情况做简单统计分析。

账单记录的格式如下: 日期|描述|金额

下面开始一步步实现上述功能。 一、定义收支记录

在上一篇中区块的内容是简单的文本,这里实现将基于Block实现一个支持收支记录格式的类,代码如下:

In [36]:

from

datetime

import

datetime

class

AccountBill

(

Block

):

def

__init__

(

self

,

content

,

amount

):

t

=

datetime

.

now

()

.

strftime

(

'%Y-%m-

%d

%H:%M:%S'

)

data

=

"

{}

|

{}

|

{}

"

.

format

(

t

,

content

,

amount

)

return

super

(

AccountBill

,

self

)

.

__init__

(

data

)

'''

获取金额数量

'''

def

get_amount

(

self

):

amount

=

0

if

self

.

data

:

amount

=

int

(

self

.

data

.

split

(

'|'

)[

2

])

return

amount

def

get_content

(

self

):

content

=

''

if

self

.

data

:

content

=

self

.

data

.

split

(

'|'

)[

1

]

return

content

def

__repr__

(

self

):

return

'Bill:

{}

>'

.

format

(

self

.

data

)

In [37]:

# 创建记录

AccountBill

(

'测试'

,

100

)

Out[37]: Bill: 2017-07-3010:46:23|测试|100> 二、计算当前余额

上面已经定义了收支记录,接下来在BlockChain基础上定义一个方法用来计算当前余额。代码如下:

In [91]:

from

collections

import

OrderedDict

class

AccountBook

(

BlockChain

):

def

__init__

(

self

):

self

.

head

=

None

# 指向最新的一个区块

self

.

blocks

=

OrderedDict

()

# 包含所有区块的一个字典

'''

添加记录

'''

def

add_block

(

self

,

new_bill

):

new_bill

.

mine

()

super

(

AccountBook

,

self

)

.

add_block

(

new_bill

)

'''

计算当前余额

'''

def

balance

(

self

):

balance

=

0

if

self

.

blocks

:

for

k

,

v

in

self

.

blocks

.

items

():

balance

+=

v

[

'block'

]

.

get_amount

()

return

balance

def

__repr__

(

self

):

num_existing_blocks

=

len

(

self

.

blocks

)

return

'AccountBook<

{}

Bills, Head:

{}

>'

.

format

(

num_existing_blocks

,

self

.

head

.

identifier

if

self

.

head

else

None

)

In [92]:

# 创建几笔记录

book

=

AccountBook

()

b1

=

AccountBill

(

'工资'

,

10000

)

book

.

add_block

(

b1

)

b2

=

AccountBill

(

'房租'

,

-

2500

)

book

.

add_block

(

b2

)

b3

=

AccountBill

(

'衣服'

,

-

1500

)

book

.

add_block

(

b3

)

b4

=

AccountBill

(

'吃饭'

,

-

1000

)

book

.

add_block

(

b4

)

b5

=

AccountBill

(

'股票收入'

,

200

)

book

.

add_block

(

b5

)

b6

=

AccountBill

(

'看电影'

,

-

200

)

book

.

add_block

(

b6

)

b7

=

AccountBill

(

'购物'

,

-

1000

)

book

.

add_block

(

b7

)

b8

=

AccountBill

(

'水电费等'

,

-

100

)

book

.

add_block

(

b8

)

In [93]:

# 计算当前余额

book

.

balance

()

Out[93]: 3900 三、简单分析收支记录

In [76]:

# 打印收支记录

for

k

,

v

in

book

.

blocks

.

items

():

print

(

v

[

'block'

]

.

data

)

2017-

07-

30

19:

57:

57|工资|

10000

2017-

07-

30

19:

57:

57|房租|-

2500

2017-

07-

30

19:

57:

57|衣服|-

1500

2017-

07-

30

19:

57:

58|吃饭|-

1000

2017-

07-

30

19:

57:

58|股票收入|

200

2017-

07-

30

19:

57:

58|看电影|-

200

2017-

07-

30

19:

57:

59|购物|-

1000

2017-

07-

30

19:

57:

59|水电费等|-

100

In [50]:

# 使用柱状图展示收支记录

%

matplotlib inline

import

matplotlib

import

numpy

as

np

import

matplotlib.pyplot

as

plt

plt

.

rcParams

[

'font.sans-serif'

]

=

[

'SimHei'

]

#用来正常显示中文标签

# 初始化数据

x_data

=

[]

# 金额

y_data

=

[]

# 描述

colors

=

[]

# 颜色

for

k

,

v

in

book

.

blocks

.

items

():

bill

=

v

[

'block'

]

y_data

.

append

(

bill

.

get_content

())

amount

=

bill

.

get_amount

()

if

amount

>

0

:

x_data

.

append

(

amount

)

colors

.

append

(

'blue'

)

else

:

x_data

.

append

(

-

amount

)

colors

.

append

(

'red'

)

y_pos

=

np

.

arange

(

len

(

y_data

))

plt

.

bar

(

y_pos

,

x_data

,

align

=

'center'

,

alpha

=

0.5

,

color

=

colors

)

plt

.

xticks

(

y_pos

,

y_data

)

plt

.

ylabel

(

'金额'

)

plt

.

title

(

'收支记录'

)

plt

.

show

()

In [55]:

# 简单分析支出组成

labels

=

[]

amounts

=

[]

colors

=

[

'gold'

,

'yellowgreen'

,

'lightcoral'

,

'lightskyblue'

]

# 用不同颜色显示

for

k

,

v

in

book

.

blocks

.

items

():

bill

=

v

[

'block'

]

amount

=

bill

.

get_amount

()

# 只展示支出

if

amount

<

0

:

labels

.

append

(

bill

.

get_content

())

amounts

.

append

(

-

amount

)

plt

.

pie

(

amounts

,

labels

=

labels

,

colors

=

colors

,

shadow

=

True

,

autopct

=

'

%1.1f%%

'

)

plt

.

axis

(

'equal'

)

plt

.

show

()

天善学院svip包含Excel BI、Python爬虫案例、Python机器学习、Python数据科学家、大数据、数据分析报告、数据分析师体系、深度学习、R语言案例10套课程火爆报名中,欢迎大家关注 www.hellobi.com/svip

转载请保留以下内容:

本文来源自天善社区101python老师的博客(公众号)。

原文链接:https://ask.hellobi.com/blog/101python/9072返回搜狐,查看更多

责任编辑:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐