Сберегательный банк счета класса в Python (панды)


Я настроил детей класс банковского счета, чтобы научить их спасать, и сам, как написать класс в Python. Первоначальной идеей было создать панды фрейма данных, которые показывают, как деньги получает проценты по загрузке:

<AccountName>.df 

Сначала я создал таблицу данных из 365 дней с datetime.date.today() + datetime.timedelta(days=236) в качестве показателей, я думаю, сделал поиск индекса для ежедневный процент приращения немного тяжеловато... мягко говоря.

class  Account:


    def __init__(self, holder, start_date):
        import datetime 
        import pandas as pd

        self.df = pd.DataFrame(index=pd.date_range(start_date, start_date + datetime.timedelta(365), freq='D'), columns=['deposit', 'withdrawl', 'balance'])
        self.df.withdrawl = 0.0
        self.df.deposit = 0.0
        self.df.balance = 0.0
        self.df.dif = 0.0

        for i in self.df.index[1:]:
            self.df.loc[i,('balance')] = self.df.loc[str(datetime.datetime.strptime(str(i)[:10], '%Y-%m-%d') - datetime.timedelta(days=1))[:10], ('balance')] * (1+(0.08 / 365))

        self.history = []

        self.holder = holder

    def __str__(self):
        return 'The account of: {0}, balance is: {1} '.format(self.holder, self.df.loc[str(datetime.datetime.today())[:10], 'balance'])

    def __repr__(self):
        return '{0.__class__.__name__}(name={0.holder})(balance={1})'.format(self, self.df.loc[str(datetime.datetime.today())[:10], 'balance'])

    def get_balance(self):
        return self.df.loc[str(datetime.datetime.today())[:10], 'balance']

    def make_deposit(self, amount, date):
        self.history.append((amount, date))
        if type(date) is datetime.datetime or datetime.date:
            self.df.loc[date.strftime('%Y-%m-%d'), ('deposit')] += amount
            self.df.loc[date.strftime('%Y-%m-%d'), ('balance')] += amount
        for i in self.df.index[self.df.index.slice_locs(date + datetime.timedelta(days=1))[0] :]:
            self.df.loc[i, 'balance'] = self.df.loc[i-datetime.timedelta(days=1), 'balance']* (1+(0.08 / 365)) + self.df.loc[i, 'deposit'] - self.df.loc[i, 'withdrawl']

    def withdraw_money(self, amount, date):
        self.history.append((amount*-1, date))
        if type(date) is datetime.datetime or datetime.date:
            self.df.loc[date.strftime('%Y-%m-%d'), ('withdrawl')] += amount
            self.df.loc[date.strftime('%Y-%m-%d'), ('balance')] -= amount
        for i in self.df.index[self.df.index.slice_locs(date + datetime.timedelta(days=1))[0] :]:
            self.df.loc[i, 'balance'] = self.df.loc[i-datetime.timedelta(days=1), 'balance']* (1+(0.08 / 365)) + self.df.loc[i, 'deposit'] - self.df.loc[i, 'withdrawl']

Я ищу идеи по улучшению для этого (а также повторяя во всех функциях). Я тоже ищу аккуратнее в pandas о присвоении вчерашний баланс + сегодняшнем депозит - сегодня снять + ежедневные проценты. (Я знаю, что это очень щедрый интерес, но они мои детки и маленькие гроши, они умудряются собирать ее не очень...)

Я начинаю счет, вот так:

import datetime
test = Account('my_name', datetime.date.today())

Я улучшил мой __str__ и __repr__ методы после того как я прочитал все предложения, предложенные на этот вопрос, ничего не делал о конфиденциальности и свойства, но в первую очередь.

Не меняется дата из индекса в свою колонку и с использованием целочисленных индексов сделать его проще для доступа и поиска данных?



Комментарии
1 ответ

Я думаю, что ваш дизайн-это немного "перебор". Ведь банки не оставляйте пустые записи для каждого дня в году, ждет вас, чтобы прийти и выполнить транзакцию.
Вместо того, чтобы использовать таблицы данных, я думаю, вам лучше разойтись запись данных в собственном классе, с инкрементом и декрементом функции.

Функциональность дисплей не является частью записи данных, он сам был бы отдельный класс и наследоваться банкоматы или кассир/компьютер диспетчер банке/техника. Независимо от того, это что-то для детей, так что это нормально нарушать некоторые твердые принципы.

О def __init__(self, holder, start_date): вы могли бы сделать start_date = date.today() как сделки, как правило, происходит в тот же день, если вы выполняете чек активности (которую откладывали).

Что касается вашего вопроса, если вы измените дату с индексом в своей колонке, вы сдвигая колонки[:Лок] как поиск, по существу добавив дополнительный шаг.
Для использования целочисленных индексов для поиска данных, это плохая идея, как вы должны попытаться сохранить любой [lookup_integer] значений, определенных констант - так они не произвольные числа (вы будете удивлены, как часто люди делают простые входные ошибок при кодировании, а, как они, как правило, действительные числа, люди ломают голову, почему дата в адрес в десятичное число (сложение и вычитание бы тогда еще быть допустимым, поэтому он не сразу взял, если вы выполняете тесты данных в рамках процесса CI и живи с неисправными код).

Удачи!

1
ответ дан 12 марта 2018 в 12:03 Источник Поделиться