从Python中的交易排序列表中计算余额

问题描述

我是一名在银行工作的设计师,我正在尝试创建一个Python脚本,该脚本将创建随机交易CSV(使用随机和日期时间来创建)。这样可以节省大量时间和脑力。

我可以生成多个交易的列表,每个交易都包含一个日期和金额,但是,我一直在努力计算余额。具体来说,这是因为我需要按日期对列表进行排序,然后进行余额计算,而且我不知道在进行日期排序后如何进行此操作。 (在以前的尝试中,我发现新的余额计算不会更新全局变量,而只会更新单个交易行余额。)

无论是否使用课堂/词典方法,我都迷失了方向,想要获得一些外部意见。任何帮助将不胜感激。

import random
from datetime import datetime,timedelta


ledger = [] #complete ledger (multiple transactions)
today = datetime.Now()
account_balance = 1500

def create_date():  

    ''' Create date for transaction'''
    date_step = random.randrange(1,11) # Set range of days
    raw_date = today + timedelta(days=-date_step)

    ''' Format date to match app's format'''
    date = raw_date.strftime('%w %b %y')

    return date

def create_amount():
    
    ''' Create amount up to 10.00 '''
    raw_number = round(random.uniform(0.10,10.0),2)

    return raw_number

def create_ledger(x):
    global ledger
        
    for n in range(x):
        transaction = create_date(),create_amount() 
        ledger.append(transaction)
    
    date_sort = lambda item: item[0]
    ledger.sort(key=date_sort,reverse=True)

    print(ledger)

create_ledger(10)

解决方法

请勿按日期降序对其进行排序:

FILENAME REFFILE '<path_to_the_file>';

在总帐上运行一个for循环,并以此方式替换它

FILENAME REFFILE '<path_to_the_file>' encoding="latin1";

如果您确实希望日期按升序排序,请在生成此输出后对其重新排序。

示例输出:

https://example.com/path/some-slug-with-numbers-int ✅

example.com/path/some-slug-with-numbers-int/ ✅

example.com/path/some-slug-with-numbers-int/external/slug ❌ // ignore and don't capture

警告,您的整个过程只适合生成相对较小的玩具示例 preg_match('/example\.com\/path\/(.*?)(\/|$)(?!\w)/',$input,$match); if (!empty($match)) { $slug = $match[1]; // $slug == 'some-slug-with-numbers-int' } ,因为它会可怕地扩展。

此外,每当您在处理与财务相关的软件时,您都应该诚实地使用def create_ledger(x): global ledger for n in range(x): transaction = create_date(),create_amount() ledger.append(transaction) date_sort = lambda item: item[0] ledger.sort(key=date_sort,reverse=False) #<- set reverse=False print(ledger) 而不是for i in range(len(ledger)): tup = ledger[i] account_balance -= tup[1] ledger[i] = (tup[0],tup[1],account_balance) ,因为浮点数可以累积serious rounding errors(请参见account_balance的最后几行怎么会有一些荒谬的长数字。

IIRC的标准做法是将所有内容乘以100并将其存储为[('1 Aug 20',1.72,1498.28),('2 Aug 20',1.54,1496.74),3.47,1493.27),4.46,1488.81),4.53,1484.28),('3 Aug 20',5.46,1478.82),5.93,1472.8899999999999),('4 Aug 20',0.96,1471.9299999999998),('5 Aug 20',4.72,1467.2099999999998),('6 Aug 20',2.51,1464.6999999999998)] ,因此,您将使用美分而不是所用货币的美元。