Python居然還能用到財務當中?資料清洗中的運用!無所不能的Py
目前,江北區審計局資料分析小組運用Python語言對區級20個部門預算執行審計專案的多個部門財務資料進行了清理,相對其他資料清理工具,Python更加靈活、簡潔、高效和準確。
由於我區各部門財務核算軟體未統一,各單位財務軟體型別和版本各異,會計科目設定及會計處理方式不一致,給我們進行資料分析帶來了難度,導致我們不能直接將轉換後的財務資料進行總體分析。根據審計目標和重點,在充分了解20個部門財務資料結構的情況下,我們利用Python工具按照《2017年政府收支分類科目》對財務資料中經濟分類科目進行重新標記,便於從巨集觀層面分析各類經濟科目的日常支出,例如將含有燃油費、燃料費、洗車費及過路過橋等關鍵詞的科目統一標記為公務用車執行維護費。
進群:548377875 即可獲取數十套PDF以及大量的視訊教程!
一、 建立關鍵詞表
按照《2017年政府收支分類科目》的支出經濟分類科目以及可能出現的代表同類型的經濟科目的詞彙錄入支出經濟分類科目表中。如下圖:
二、 資料清理步驟
(一)在資料庫中查詢20個單位的會計憑證及輔助憑證建立審計中間表,以防止對原始資料產生影響,並新增經濟分類編碼、經濟分類名稱、整理標記三列,其中整理標記是辨別資料準確程度的標記。
(二)確定整理標記為兩類,一是會計科目末級為經濟分類科目末級且上一級科目為經濟分類科目上一級的,標記為“一類”;二是會計科目末級雖為經濟分類科目末級但上一級科目不是經濟分類科目上一級的,標記為“二類”。
(三)程式碼執行過程。首先清空上述三列資料,遍歷人工錄入的支出經濟分類科目表中的關鍵詞,將對應的經濟分類科目名稱及編碼標記到審計中間表中,依次標記到上述兩類整理標記,已標記的不重複執行。
以下為Python執行程式碼:
import cx_Oracle
import datetime
import connection
# 連線資料庫
def connect(user,pw,dsn):
return cx_Oracle.connect(user,pw,dsn)
# 清空待標記的列
def clean_e(table_name):
cur = conn.cursor()
sql_clean = """
update %s set 經濟分類編碼='',經濟分類名稱='',整理標記=''
"""%table_name
cur.execute(sql_clean)
conn.commit()
cur.close()
return True
def up_tb(tb_name,lx,sql_up):
tb_name = tb_name
cur = conn.cursor()
sql_ecode = """
select * from jbaudit2.支出經濟分類科目
"""
cur.execute(sql_ecode)
re_fi = cur.fetchall()
for r in re_fi:
kmlm = r[1]
kmkm = r[3]
gjc = r[4].split(',')
kmbm = r[5]
# 遍歷支出經濟分類科目表中每一行的所有關鍵詞
for i in gjc:
if lx=='一類':
# 更新憑證或輔助憑證中上級科目中包含經濟科目大類,且會計科目名稱或輔助科目名稱與關鍵詞完全一樣的記錄
sql_up_f = sql_up.format(tb_name=tb_name,e_code=kmbm,e_name=kmkm,ff_name=kmlm,f_name=i,lx=lx)
else:
# 更新憑證或輔助憑證中會計科目名稱或輔助科目名稱與關鍵詞完全一樣的記錄
sql_up_f = sql_up.format(tb_name=tb_name,e_code=kmbm, e_name=kmkm, f_name=i,lx=lx)
cur.execute(sql_up_f)
record = cur.rowcount
update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
conn.commit()
# 匯入日誌記錄到資料庫
sql_insert = """
insert into uprecord(表名,更新時間,經濟科目大類,經濟科目名稱,關鍵詞,更新條數,型別) values('%s','%s','%s','%s','%s','%s','%s')
"""%(tb_name,update_time,kmlm,kmkm,i,record,lx)
cur.execute(sql_insert)
conn.commit()
cur.close()
# 更新表的sql語句
sql_up_one = """
update {tb_name} set 經濟分類編碼='{e_code}',經濟分類名稱='{e_name}',整理標記='{lx}'
where 會計科目編碼 like '5%' and
會計科目全稱 like '%'||'{ff_name}'||'%' and 會計科目名稱='{f_name}' and 整理標記 is null
"""
sql_up_two = """
update {tb_name} set 經濟分類編碼='{e_code}',經濟分類名稱='{e_name}',整理標記='{lx}'
where 會計科目編碼 like '5%' and
會計科目名稱='{f_name}' and 整理標記 is null
"""
sql_up_th = """
update {tb_name} set 經濟分類編碼='{e_code}',經濟分類名稱='{e_name}',整理標記='{lx}'
where 會計科目編碼 like '5%' and
會計科目全稱 like '%'||'{ff_name}'||'%' and (會計科目名稱='{f_name}' or 輔助科目名稱='{f_name}') and 整理標記 is null
"""
sql_up_fo = """
update {tb_name} set 經濟分類編碼='{e_code}',經濟分類名稱='{e_name}',整理標記='{lx}'
where 會計科目編碼 like '5%' and
(會計科目名稱='{f_name}' or 輔助科目名稱='{f_name}') and 整理標記 is null
"""
if __name__ == "__main__":
conn = connect(connection.user, connection.pw, connection.dsn)
a = clean_e('財務賬憑證查詢_20部門')
if a == True:
up_tb('財務賬憑證查詢_20部門', '一類', sql_up_one)
up_tb('財務賬憑證查詢_20部門', '二類', sql_up_two)
print('update 財務賬憑證查詢_20部門 is done!')
b = clean_e('財務賬輔助憑證明細_20部門')
if b == True:
up_tb('財務賬輔助憑證明細_20部門', '一類', sql_up_th)
up_tb('財務賬輔助憑證明細_20部門', '二類', sql_up_fo)
print('update 財務賬輔助憑證明細_20部門 is done!')
conn.close()
標記結果圖展示:
三、成果運用
清理後的資料表格式統一,能夠對20個部門的經濟活動進行總體分析,可實現對20個部門總支出以及每一類經濟分類的橫向比對,計算出人均、車均資料,發現疑點,分散核查,確保審計結果的準確性。