python模拟银行交易流水

模拟自动生成银行交易流水,其中包括:入账账号、出账账号、交易金额、交易余额、交易时间、出入表示关键字段


#acct opp_acct debit_credit amt bal_amt tr_dt tr_tm
import datetime
import random

import os
import pandas as pd

path = 'D:\\data\\temp.csv'

# 余额字典
bal_dic = {}

for i in range (0,10000):  #总共产生的账号数量
    amt = 0
    bal_amt = 0
    
    acct=datetime.datetime.now().strftime("%Y%m%d%H%M%S")

    randomNum=random.randint(0,99)
    randomNum22 = ''

    if randomNum<=10:
        randomNum22=str(0)+str(randomNum)  

    acct = str(acct)+str(randomNum22) #账号
    
    print(acct)
    
    if(acct in bal_dic):
        bal_amt = bal_dic[acct]
    else:
        bal_amt = 0
    
    dateN = randomNum//2
    
    tr_dt = random.randint(20230101, 20230131)
    
    startHour = 000000
    
    for m in range(dateN):   # tr_dt 同一个日期多个账号
        ret = random.randrange(6213910000300920000, 6213910000300935000)   #随机生成对手账号
        
        # 每个账号一个交易小时时间
        startHour = random.randint(startHour, 245959)
        
        # 实际交易
        samples = ["C", "D"]   #出入表示
        debit_credit = random.sample(samples, 1)
        
        if(debit_credit[0] == 'C'):   #入账
            amt = round(random.uniform(0.1,100005.4), 2)  #随机的入金额
            
            bal_amt += amt   #更新余额
            
            bal_dic[acct] = bal_amt
        else:   #出账
            if(bal_amt < 0.1):
                continue
            amt = round(random.uniform(0.1,bal_amt ), 2)  #出金额
            
            bal_amt -= amt  #更新余额
            
            bal_dic[acct] = bal_amt
            

        # print(acct, ret, debit_credit[0], amt, round(bal_amt, 2), tr_dt, str(tr_dt) + " " + str(startHour))
        
        # 一次写入一行
        df = pd.DataFrame(data=[[str(acct), str(ret), debit_credit[0], amt, round(bal_amt, 2), tr_dt, str(tr_dt) + " " + str(startHour)]])
        # 一次写入多行
        # df = pd.DataFrame(data=[['1', '98.2789%'], ['2', '76.2345%']])
        # 解决追加模式写的表头重复问题
        if not os.path.exists(path):
            df.to_csv(path, header=['acct', 'opp_acct', 'debit_credit', 'amt', 'bal_amt', 'tr_dt', 'tr_tm'], index=False, mode='a')
        else:
            df.to_csv(path, header=False, index=False, mode='a')
            
        
        # 同一个账号多个时间
    ret = random.randrange(6213910000300920000, 6213910000300935000)   #随机生成对手账号
    startDate = 20230101
    startHour = 000000
    
    for ff in range(dateN): # ret  同一个账号多个时间
        startDate = random.randint(startDate, 20230131)
        
        # 每个账号一个交易小时时间
        startHour = random.randrange(startHour, 245959, (245959//dateN))
        
        # 实际交易
        samples = {"C", "D"}   #出入表示
        debit_credit = random.sample(samples, 1)
        
        if(debit_credit[0] == 'C'):   #入账
            amt = round(random.uniform(0.1,100005.4), 2)  #随机的入金额
            
            bal_amt += amt   #更新余额
            
            bal_dic[acct] = bal_amt
            
        else:   #出账
            if(bal_amt < 0.1):
                continue
            amt = round(random.uniform(0.1,bal_amt), 2)  #出金额
            
            bal_amt -= amt  #更新余额
            
            bal_dic[acct] = bal_amt

        # print(acct, ret, debit_credit[0], amt, round(bal_amt, 2), tr_dt, str(tr_dt) + " " + str(startHour))
        
        # 一次写入一行
        df = pd.DataFrame(data=[[str(acct), str(ret), debit_credit[0], amt, round(bal_amt, 2), tr_dt, str(tr_dt) + " " + str(startHour)]])
        # 一次写入多行
        # df = pd.DataFrame(data=[['1', '98.2789%'], ['2', '76.2345%']])
        # 解决追加模式写的表头重复问题
        if not os.path.exists(path):
            df.to_csv(path, header=['acct', 'opp_acct', 'debit_credit', 'amt', 'bal_amt', 'tr_dt', 'tr_tm'], index=False, mode='a')
        else:
            df.to_csv(path, header=False, index=False, mode='a')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值