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

时间:2020-08-27 08:26:32

标签: python transactions calculation

我是一名在银行工作的设计师,我正在尝试创建一个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)

1 个答案:

答案 0 :(得分:0)

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

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), ('2 Aug 20', 3.47, 1493.27), ('2 Aug 20', 4.46, 1488.81), ('2 Aug 20', 4.53, 1484.28), ('3 Aug 20', 5.46, 1478.82), ('3 Aug 20', 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)] ,因此,您将使用美分而不是所用货币的美元。

相关问题