The basics of block chains are described in the previous Python block chain primer, and the structure of block and block chains is implemented in Python. In this article, we will implement a simple bookkeeping function based on the above content.
The functions of bookkeeping are as follows: to achieve basic income and expenditure records, calculate current balances, and make a simple statistical analysis of income and expenditure.
Billing records are formatted as follows:
Date | description | amount
Here's a step-by-step implementation of these features. I. Definition of income and expenditure records
In the previous section, the content of the block is a simple text, where implementation will be based on blocks to implement a support record format class, the code is as follows:
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)
'
get amount of quantity
' 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]:
# Create Records
Accountbill (' Test ', 100)
OUT[37]:
bill:2017-07-30 10:46:23| Test |100>
ii. Calculation of current balance
The revenue and expenditure records are defined above, and then a method is defined on the basis of blockchain to calculate the current balance. The code is as follows:
In [91]:
From collections import Ordereddict
class Accountbook (Blockchain):
def __init__ (self):
Self.head = None # Point to the newest block
self.blocks = ordereddict () # contains a dictionary of all chunks
'
add Records '
def add_block (self, New_bill):
new_bill.mine ()
super (Accountbook, self). Add_block (New_bill)
'
calculate current balance
'
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]:
# create several records book
= Accountbook ()
B1 = Accountbill (' wages ', 10000)
Book.add_block (b1) b2
= Accountbill (' Rent ',- 2500)
Book.add_block (b2)
B3 = Accountbill (' clothes ', -1500)
Book.add_block (b3) B4
= Accountbill (' Eat ',- 1000)
book.add_block (b4)
B5 = Accountbill (' Stock income ',) Book.add_block
(B5) B6
= Accountbill (' See movie ', -200)
Book.add_block (b6)
b7 = Accountbill (' shopping ', -1000)
Book.add_block (b7) B8
= Accountbill (' Water and electricity costs, etc. ', -100
book.add_block (B8)
In [93]:
# Calculate Current balance
book.balance ()
OUT[93]:
3900
Brief analysis of income and expenditure records
In [76]:
# Print revenue record for
k,v in Book.blocks.items ():
print (v[' block '].data)
2017-07-30 19:57:57| wage |10000
2017-07-30 19:57:57| rent |-2500
2017-07-30 19:57:57| dress |-1500
2017-07-30 19:57:58| dinner |-1000
2017-07-30 19:57:58| stock income |200
2017-07-30 19:57:58| Watch movie |-200
2017-07-30 19:57:59| shopping |-1000
2017-07-30 19:57:59| Utilities | -100
In [50]:
# showing revenue and expenditure records using a histogram
%matplotlib inline
import matplotlib
import numpy as NP
import Matplotlib.pyplot as plt< c4/>plt.rcparams[' Font.sans-serif ']=[' Simhei '] #用来正常显示中文标签
# initialize data
x_data = [] # amount
y_data = [] # Description
colors = [] # color 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 (' Amount ')
plt.title (' Income record ')
plt.show ()
In [55]:
# Simple analysis Expenditure composition
labels = []
amounts = []
colors = [' Gold ', ' yellowgreen ', ' lightcoral ', ' Lightskyblue '] # display in different colors
for k,v in Book.blocks.items ():
bill = v[' blocks ']
amount = Bill.get_amount ()
# Show only expenses
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 ()
Author: Walker Python enthusiasts Community column author authorized original release, please do not reprint, thank you.
Source: Python's block chain simple bookkeeping implementation