出納銀行、現(xiàn)金日記賬用pandas實(shí)現(xiàn)財(cái)務(wù)自動(dòng)化的功能和一些思路
視頻講解請(qǐng)看這里:https://www.bilibili.com/video/BV1CD4y1d7W6/
??????? 由于今年疫情和公司環(huán)境的變化,公司安排我兼任出納職位,我本來(lái)是搞工程技術(shù)的,現(xiàn)在又要兼顧出納崗位,對(duì)財(cái)務(wù)的東西基本沒(méi)有什么了解,可以說(shuō)是一竅不通,小公司為了生存沒(méi)辦法,我只能硬著頭皮接下來(lái)了,正式交接后才發(fā)現(xiàn)工作量不小,發(fā)工資、報(bào)銷費(fèi)用、收付工程賬款、農(nóng)民工工資發(fā)放,社保、醫(yī)保、還要記賬,我看了交接的財(cái)務(wù)資料一天…懵逼了!
??????? 先從日常簡(jiǎn)單重復(fù)的看起,看看能不能用電腦實(shí)現(xiàn)一些自動(dòng)化的操作,解放我的時(shí)間,目前有兩本手寫賬簿,一個(gè)是《現(xiàn)金日記賬》一個(gè)是《銀行日記賬》,摸索了一下,這兩個(gè)相當(dāng)于本質(zhì)上就是出入庫(kù)賬本,就是動(dòng)錢的時(shí)候就要做記錄,按月統(tǒng)計(jì)余額、收付款數(shù)目。那先從這個(gè)入手,這兩個(gè)賬本就用python的pandas庫(kù)來(lái)把紙質(zhì)記錄電子化程序化吧。
先看看這兩本賬的格式,大概都長(zhǎng)這個(gè)樣子,封面不同:


???? 先把數(shù)據(jù)做成下面的格式,保存成csv文件或者電子表格文件也行,我下面得代碼是讀取csv格式的:

?????? 目前實(shí)現(xiàn)的是按月現(xiàn)金類統(tǒng)計(jì)(在每個(gè)月最后一行添加統(tǒng)計(jì)數(shù)據(jù),在余額列逐行計(jì)算并寫入余額),python代碼如下:
import pandas as pd
import numpy as py
import datetime#日期計(jì)算庫(kù)
import calendar#日期計(jì)算庫(kù)
?
?
def cumsum_data(datax):
??? data = datax.copy()#拷貝一份,否則賦值會(huì)有警告
??? data.loc[:,"余額"] = data["借方"].cumsum(0) - data["貸方"].cumsum(0) + data["余額"].cumsum(0)#各項(xiàng)的累計(jì):借方-貸方+余額計(jì)算出當(dāng)前余額
??? jief = data["借方"].sum()
??? daif = data["貸方"].sum()
??? ye = jief - daif + data['余額'][0]
??? #獲得數(shù)據(jù)最后一條得日期
??? ti = data.index[-1]
??? # 獲取當(dāng)月第一天的星期和當(dāng)月的總天數(shù)
??? firstDayWeekDay, monthRange = calendar.monthrange(ti.year, ti.month)
??? #獲取當(dāng)月最后一天
??? lastDay = datetime.date(year=ti.year, month=ti.month, day=monthRange)
??? # 計(jì)算出下個(gè)月第一天
??? next_month = lastDay + datetime.timedelta(days=1)
??? next_month = pd.to_datetime(next_month)#轉(zhuǎn)換數(shù)據(jù)格式
??? total = pd.DataFrame([{'日期':next_month,'交易類型':'現(xiàn)金','經(jīng)辦人':'-','憑據(jù)編號(hào)':'-','摘要':str(data.index.month[-1]) + '月合計(jì)','借方':jief,'貸方':daif,'余額':ye}]).set_index('日期')#計(jì)算合計(jì)行
??? total1 = pd.DataFrame([{'日期':next_month,'交易類型':'現(xiàn)金','經(jīng)辦人':'-','憑據(jù)編號(hào)':'-','摘要':str(data.index.month[-1]) + '月余額','借方':0,'貸方':0,'余額':ye}]).set_index('日期')#計(jì)算余額行,用于下個(gè)月計(jì)算
??? data = data.append(total)#在結(jié)尾添加合計(jì)行
??? return data,total1
?
?
?
#df? = pd.read_excel('test.xlsx')
df = pd.read_csv('data.csv', encoding = 'gbk')
df['日期'] = pd.to_datetime(df['日期']) #將數(shù)據(jù)類型轉(zhuǎn)換為日期類型
df = df.fillna(0)
df = df.set_index('日期')
month = list(set(df.index.month)) #利用集函數(shù)提取月份,不重復(fù)
df_month = df['2020-' + str(month[0])]#df['2020-9']
df_cash = df_month[df_month['交易類型'] == '現(xiàn)金']
df_process,total1 = cumsum_data(df_cash)#計(jì)算余額跟合計(jì)行
for m in month[1:]:
??? df_month = df['2020-' + str(m)]#原始數(shù)據(jù)讀取下個(gè)月數(shù)據(jù)
??? df_cash = df_month[df_month['交易類型'] == '現(xiàn)金']#現(xiàn)金流
??? df_cash = total1.append(df_cash)#在結(jié)尾添加新月份數(shù)據(jù)
??? df_process1,total1 = cumsum_data(df_cash)#計(jì)算余額跟合計(jì)行
??? df_process = df_process.append(df_process1[1:])#在結(jié)尾添加新月份數(shù)據(jù),丟棄第一行再合并
?
df_process.to_csv('現(xiàn)金日記賬.csv',encoding = 'gbk')
df_process
?
輸出如下(并根據(jù)輸出的數(shù)據(jù)保存一份“現(xiàn)金日記賬.csv”的文件):
