Professional Expense Tracker in Python

NeuralNine
14 Jan 202318:35

Summary

TLDRIn this tutorial video, the host guides viewers through building a command-line expense tracking tool using Python and SQLite3. The project is designed for beginners, focusing on creating a database, establishing a connection, and implementing a user interface with a menu for entering new expenses and viewing summaries. The script covers SQL statements for inserting data and querying expenses by month and category, concluding with a demonstration of the tool in action.

Takeaways

  • 😀 The video is a tutorial on building an expense tracking tool in the command line using Python.
  • 🛠️ The project utilizes SQLite3 for database management to store expense data persistently.
  • 📝 It starts by creating a Python file named 'create_DB.py' to set up the database and table structure.
  • 🔑 The table 'expenses' has columns for ID, date, description, category, and price, with ID as the primary key.
  • 🔍 The script includes a main menu for the user to choose between entering a new expense or viewing expenses.
  • 📅 When entering a new expense, users are prompted to input the date, description, and category, with the option to create new categories.
  • 💰 The price input is handled with prepared statements to prevent SQL injection.
  • 📊 There are options to view all expenses or view monthly expenses by category, providing summaries of spending.
  • 🔄 The application includes a loop for continuous use, allowing users to add multiple expenses and view summaries repeatedly.
  • 🔒 The connection to the database is properly closed after operations to ensure data integrity.
  • 📚 The tutorial is aimed at beginners, providing a practical project to practice Python and database skills.

Q & A

  • What is the main purpose of the video?

    -The main purpose of the video is to guide viewers on how to build an expense tracking tool in the command line using Python and SQLite database, which is suitable for beginners to practice their coding skills.

  • What is the first step in creating the expense tracking tool?

    -The first step is to create a new Python file called 'create_DB' to establish a connection with the SQLite database and set up the initial database structure using SQL commands.

  • What does the 'expenses' table in the database consist of?

    -The 'expenses' table consists of columns for 'ID' as an integer and primary key, 'date', 'description' as text, 'category' as text, and 'price' as a real (decimal) data type.

  • How does the video script handle the user input for the date of the expense?

    -The script prompts the user to enter the date of the expense in the format YYYY-MM-DD, which is a four-digit year, two-digit month, and two-digit day.

  • What is the method used to display existing categories to the user?

    -The script uses a SQL query with 'SELECT DISTINCT category FROM expenses' to fetch unique categories and then enumerates them to create a menu for the user to select from or create a new category.

  • How does the script handle the insertion of a new expense into the database?

    -The script collects the date, description, category, and price from the user, uses prepared statements to avoid SQL injections, and then executes an 'INSERT INTO' statement to add the new expense to the 'expenses' table.

  • What are the two main options provided in the user menu for the expense tracking tool?

    -The two main options are to 'enter a new expense' and to 'view expenses summary', which includes viewing all expenses or monthly expenses by category.

  • How does the script display the summary of expenses?

    -The script provides two options to display the summary: viewing all expenses or viewing monthly expenses grouped by category. It uses SQL queries to fetch and display the data accordingly.

  • What is the purpose of using prepared statements in the script?

    -The purpose of using prepared statements is to securely pass user inputs into SQL queries, which helps to prevent SQL injection attacks by ensuring inputs are safely typecast and handled.

  • How does the script handle the user's choice to exit the tool?

    -The script includes an 'if' condition to check if the user's choice is invalid or if they choose to exit by entering an option that is not recognized or by answering 'no' to the prompt 'would you like to do something else?'.

  • What is the final step in the script after all operations are completed?

    -The final step is to close the database connection using 'connection.close()' to ensure all data is saved and the connection is properly terminated.

Outlines

00:00

📝 Building a Command-Line Expense Tracker in Python

The video introduces a project to create an expense tracking tool in the command line using Python and SQLite for database management. The tutorial is aimed at beginners and begins with setting up a database using a 'create_DB.py' file. The script includes creating a table with columns for ID, date, description, category, and price. The video demonstrates how to establish a connection, create a cursor, and execute a SQL statement to build the database structure. It then proceeds to show how to commit changes and close the connection, setting the foundation for persistent storage of expenses.

05:02

🔍 Implementing User Interaction for Expense Entry

The script continues with the development of the 'main.py' file, which handles user interactions. It starts by connecting to the database and setting up a menu-driven interface with options to enter a new expense or view an expense summary. The process of entering a new expense involves prompting the user for the date, description, and category of the expense. It also includes a feature to select from existing categories or create a new one by querying the database for distinct categories. The user is then asked to input the price of the expense, and the details are inserted into the database using a prepared statement to prevent SQL injection.

10:02

📊 Displaying Expense Summaries and Reports

The video script explains how to display expense summaries with two options: viewing all expenses or viewing monthly expenses by category. The code snippet shows how to execute SQL queries to fetch and display the required data. For viewing all expenses, a simple SELECT statement retrieves all records from the expenses table. For monthly expenses by category, the script uses an aggregate function to sum up the prices and groups the results by category, filtered by the specified month and year. The script assumes valid user input and demonstrates how to format and display the results to the user.

15:04

🔄 Iterative User Experience and Closing the Database Connection

The final part of the script focuses on creating an iterative user experience by asking if the user would like to perform another action after each operation. The loop continues until the user decides to exit by responding with anything other than 'yes'. The script ensures that the database connection is closed at the end of the session to maintain the integrity and performance of the application. The video concludes with a demonstration of entering multiple expenses, viewing a summary of all expenses, and generating a monthly expense report by category, showcasing the functionality of the expense tracker.

Mindmap

Keywords

💡Expense Tracking Tool

An expense tracking tool is a software application designed to monitor and record expenditures, helping individuals or businesses manage their finances effectively. In the video's context, the tool is being developed in the command line using Python, which involves creating a database to store expense records. The script describes the process of building this tool from setting up the database to implementing user interaction for entering and viewing expenses.

💡Command Line

The command line, also known as the terminal or shell, is a text-based interface for interacting with a computer's operating system. In the script, the command line is used as the platform for building the expense tracking tool, where Python commands are executed to create and interact with the database.

💡Python

Python is a high-level, interpreted programming language known for its readability and efficiency. It is the language of choice in the video for creating the expense tracking tool due to its simplicity and the powerful libraries it offers for database interaction and command-line user interfaces.

💡Database

A database is an organized collection of data, typically stored and accessed electronically. In the video, a SQLite database is created to persistently store the expense records. The script explains how to establish a connection with the database and execute SQL statements to create a table and manage expense data.

💡SQLite

SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured SQL database engine. It is used in the video to demonstrate how to create a simple database for the expense tracker without the need for a separate database server.

💡SQL

SQL (Structured Query Language) is a domain-specific language used in programming and designed for managing data held in a relational database management system. The script includes SQL statements such as 'CREATE TABLE' for setting up the database schema and 'SELECT' queries for retrieving data.

💡Primary Key

In a database table, a primary key is a unique identifier for each record. The script mentions that the 'ID' field in the expenses table is an integer and serves as the primary key, ensuring that each expense entry can be uniquely identified.

💡Cursor

In the context of database programming, a cursor is a control structure that enables traversal over the rows of a result set. The script uses a cursor to execute SQL commands and interact with the database, such as creating the expenses table and inserting new expense records.

💡Data Type

A data type defines the type of value a variable can hold, such as integer, text, or real (decimal). The script specifies different data types for the columns in the expenses table, like 'INTEGER' for the ID, 'TEXT' for the description and category, and 'REAL' for the price.

💡User Input

User input refers to the data provided by a user through various means, such as command-line prompts. The script describes how the expense tracking tool collects input from the user for the date, description, category, and price of an expense, which are then stored in the database.

💡Menu

A menu in a command-line application is a list of options presented to the user to select a particular action. The script outlines a simple menu system for the expense tracker, offering choices like entering a new expense or viewing a summary of expenses.

💡Loop

In programming, a loop is a sequence of instructions that is continually repeated until a certain condition is reached. The script uses a 'while true' loop to create an endless loop for the main menu of the expense tracker, allowing the user to continuously interact with the tool until they choose to exit.

💡Exception Handling

Exception handling is a programming technique for responding to unwanted or exceptional events that require special processing. Although the script mentions it, it does not delve into implementing exception handling for the expense tracker, suggesting that the focus is on the core functionality rather than robust error checking.

💡SQL Injection

SQL injection is a code injection technique that might destroy the integrity of a database. The script briefly mentions the use of prepared statements with placeholders (question marks) to avoid SQL injection vulnerabilities when inserting data into the database.

💡Aggregation

In SQL, aggregation is the process of combining a set of values into a single summary value, such as SUM, AVG, MIN, or MAX. The script uses the SUM function to aggregate the total price per category for expenses, providing a way to view the total expenses per category for a given month and year.

💡Group By

The GROUP BY clause in SQL groups rows that have the same values in specified columns into aggregated data. The script uses the GROUP BY clause to organize the expenses by category, allowing the user to view the total expenses per category for a specific time period.

Highlights

Introduction of building an expense tracking tool in the command line using Python and SQLite database.

Creating a new Python file 'create_DB.py' for setting up the database connection.

Using SQLite3 to establish a connection and create a cursor for database operations.

Executing a SQL statement to create an 'expenses' table with specified columns.

Committing changes to the database and closing the connection.

Creating the main Python file 'main.py' for the expense tracking application logic.

Designing a basic menu for user interaction with options to enter expenses and view summaries.

Implementing functionality to enter a new expense with prompts for date, description, category, and price.

Using SQL's 'distinct' to list unique categories for expense categorization.

Allowing users to select an existing category or create a new one for expenses.

Using prepared statements to insert new expense data into the database securely.

Providing options to view all expenses or monthly expenses by category.

Using SQL aggregation functions to sum up expenses per category for monthly reports.

Demonstrating the application flow with sample data entry and retrieval.

Closing the database connection at the end of the application run.

Encouraging viewers to like, comment, subscribe, and turn on notifications for future videos.

Transcripts

play00:00

what is going on guys welcome back in

play00:02

today's video we're going to build an

play00:03

expense tracking tool in the command

play00:04

line using python which will also make

play00:06

use of a database making it a perfect

play00:09

project for beginners to practice their

play00:11

skills so let us get right into it

play00:17

[Music]

play00:22

all right so let us get started with a

play00:24

database first and for that we're going

play00:25

to create a new python file which we're

play00:27

going to call create underscore DB and

play00:31

we're going to keep it simple here we're

play00:32

just going to import sqlite 3 and we're

play00:35

going to establish a connection by

play00:38

saying sqlite3 connect

play00:40

expense dot DB or expenses dot b

play00:45

and then we're going to say that we want

play00:47

to have a cursor which is going to be a

play00:49

connection.cursor and we just want to

play00:52

execute a simple create statement so

play00:54

cursor.execute and we're going to use a

play00:56

multi-line string here in which we're

play00:59

going to say create

play01:00

up here create

play01:02

table if not exists expenses

play01:07

and as I said we're going to keep it

play01:09

simple so we're going to say we have an

play01:11

ID which is an integer and a primary key

play01:14

we're going to have a date which is

play01:16

going to be a date we're going to have a

play01:18

description

play01:20

so what was the money spent on which is

play01:22

going to be a text then we're going to

play01:24

also have a category which is going to

play01:27

be a text as well and then we're going

play01:29

to have the actual amount so the actual

play01:31

price which is going to be a real which

play01:33

is the decimal data type if you want in

play01:37

um

play01:38

in sqlite3 and we're going to of course

play01:41

close

play01:42

this bracket here so this is our

play01:44

structure and in order to create this

play01:46

database we now say connection dot

play01:49

commit to commit the changes and then

play01:51

connection.close

play01:53

to wrap everything up and once we run

play01:55

this you can see we have this expenses

play01:57

database here I can double click it here

play02:00

in pycharm I can open it I can connect

play02:01

to it and then I can say select

play02:04

everything from expenses

play02:09

and when I run this you can see that we

play02:12

have the correct structure down here ID

play02:14

date description category price

play02:18

um and this is our basis here this is

play02:21

where we're going to store the expenses

play02:22

this is where we're going to get the

play02:23

expenses from so that we have a

play02:25

persistent storage across the individual

play02:27

sessions and now we're going to start

play02:30

with the main file so we're going to

play02:32

create this main.py file in here we're

play02:34

also going to import sqli3 because we

play02:37

need to connect to the database and

play02:39

we're also going to import date time

play02:42

so first we're going to again connect to

play02:45

the database so sqlite3 connect expenses

play02:48

DB and we're going to create a cursor

play02:52

connection.cursor this is going to be

play02:54

our basis for the individual actions and

play02:56

then we're going to have this basic menu

play02:58

or main Loop if you want to call it that

play03:02

we're going to say while true so

play03:03

basically an endless loop we're going to

play03:05

print the following select an option and

play03:08

we're going to provide the user with

play03:11

different options

play03:14

we're going to say one enter a new

play03:18

expense

play03:20

and 2 is going to be view expenses

play03:24

summary or something

play03:29

and then we're going to say okay if the

play03:30

choice or actually we're going to say

play03:32

Choice equals

play03:35

the integer of the input

play03:38

and we're going to say if the choice is

play03:40

equal to 1 we're going to do one thing

play03:43

and otherwise alif the choice is equal

play03:46

to 2 we're going to do another thing and

play03:48

else of the choice is invalid we're just

play03:50

going to exit

play03:52

um and let's go ahead and Implement now

play03:54

the first section here which is entering

play03:56

a new expense now to do this we need

play03:58

some information from the users so what

play04:01

date was the expense on uh what was the

play04:04

money spent on and so on

play04:06

so we're going to say here first of all

play04:07

that the date is going to be input and

play04:10

we're going to prompt here enter the

play04:13

date of the expense and we're going to

play04:15

provide the format here year year year

play04:17

so four digits for the year two for the

play04:21

month and two for the day

play04:24

and then we're going to do the same

play04:26

thing with the description but without a

play04:28

format obviously so description is going

play04:30

to be input

play04:32

enter the

play04:37

description of the expense and we're

play04:39

going to get rid of this format here

play04:43

um and then we can basically uh what we

play04:46

want to do is we want to be able to add

play04:48

a category but we want to also be able

play04:50

to choose an existing category so what

play04:51

we want to do here is we don't want to

play04:53

just ask the user for a string like give

play04:55

me the category of this purchase but we

play04:57

want to say okay here are the categories

play04:59

you already have if you want to choose

play05:01

one of those enter a number otherwise

play05:03

you can create a new one so what we want

play05:04

to do here is we want to use the cursor

play05:06

to execute the following statement we

play05:08

want to say select and then uh distinct

play05:13

category

play05:15

from expenses and what this does

play05:18

essentially distinct means that we want

play05:19

to have only the unique values so in the

play05:22

beginning we won't have any categories

play05:23

in the database so we're only going to

play05:25

be able to create a new one

play05:27

um but

play05:29

um over time if we have a 100 entries

play05:31

but we have only three different

play05:34

categories across all these entries it

play05:36

will show us only those three distinct

play05:38

categories this is the the functionality

play05:40

of the distinct statement here and we

play05:44

want to get this we want to get the

play05:46

results categories by saying cursor dot

play05:49

fetch all

play05:51

and then we're going to iterate over the

play05:53

categories that we have and we're going

play05:55

to also enumerate them so that we have

play05:56

an automatic menu so we're going to say

play05:59

here for or actually want to say first

play06:02

select a category

play06:05

by number or something

play06:08

and then we're going to say four index

play06:11

category in enumerate

play06:14

categories we're going to print

play06:18

an F string here with the index a DOT or

play06:22

actually an index plus one because we

play06:23

want to have options one two whatever

play06:25

and not zero

play06:28

um zero to whatever so we're going to

play06:30

say here Dot and then the category

play06:34

and we want to print

play06:37

uh the category zero

play06:42

so the actual category name

play06:45

that is that and in the end we want to

play06:47

also print here

play06:48

the following we want to print an F

play06:51

string we're going to have length of the

play06:55

categories

play06:57

plus one to add an additional object

play06:59

here and this object is going to be

play07:02

create a new category this is going to

play07:05

allow us to also have the final option

play07:07

of if you don't like all these

play07:08

categories you can create a new one

play07:11

and in order to do or in order to see

play07:14

what the user wants to do we're going to

play07:15

now say the category choice

play07:18

is going to be equal to input

play07:21

and then if

play07:24

category choice

play07:26

equals

play07:28

length of the categories if that is the

play07:31

case uh actually plus one this is what

play07:33

we did up here so if we have this

play07:36

particular choice what we're going to do

play07:37

is we're going to create a new category

play07:38

so the category is going to be equal to

play07:41

enter the new category name

play07:46

and otherwise if that is not the case

play07:48

provided we have a valid um input we're

play07:51

just going to assume now that the user

play07:52

is not going to enter a number that does

play07:54

not exist but provided that that is the

play07:56

case provided that the input is valid

play07:58

we're going to say category equals

play08:00

categories category Choice minus one and

play08:04

from that index 0 so the actual category

play08:08

um and for this we actually need to make

play08:12

this an integer

play08:13

otherwise it won't work

play08:15

there you go now you could also as I

play08:18

said

play08:19

um check if that is less than length of

play08:22

categories because otherwise you would

play08:24

say invalid solution but we're not going

play08:26

to take care of all the edge cases of

play08:29

all the exceptions that can arise

play08:30

because that would just not focus too

play08:32

much on the essence here but

play08:33

theoretically if you want to do that

play08:34

exception handling you would just have

play08:36

to say elif category choice is less than

play08:39

or less or equal to the length of

play08:40

categories and then process it otherwise

play08:43

and of course above zero it's also

play08:45

important and otherwise say that it's

play08:48

invalid in exit the script but you would

play08:50

have to do that on a bunch of occasions

play08:51

here so as I said we're not going to do

play08:53

that

play08:54

uh once we have that we're going to ask

play08:56

for the price so the price is going to

play08:58

be input

play08:59

enter the price of the expense

play09:04

and once all of this is done we're going

play09:06

to say cursor

play09:09

dot execute and we're going to insert

play09:12

into

play09:14

expenses

play09:17

the dates the description

play09:20

the category

play09:23

the price

play09:25

the following values

play09:27

which are going to be we're going to use

play09:29

a secure prepare a prepared statements

play09:31

so question marks

play09:33

to avoid any SQL injections

play09:37

and here we're going to pass the dates

play09:40

the description the category and the

play09:44

price

play09:45

[Applause]

play09:46

and it's fine to pass the string because

play09:48

it's going to automatically be Typecast

play09:49

into a date or into a price that's not a

play09:52

problem and finally we just say

play09:55

connection dot commit to commit the

play09:58

changes and that's it for the choice one

play10:02

for the choice two to actually display

play10:03

the summary to actually display the

play10:05

expenses we're going to keep it simple

play10:08

we're going to have two options so

play10:11

select an option

play10:15

and the two options are going to be one

play10:18

view all expenses

play10:23

and then two view monthly expenses by

play10:29

category and of course you can add more

play10:33

um customized options like weekly

play10:35

expenses or yearly expenses or all

play10:38

expenses by category I'm just going to

play10:40

use those two and I think if you follow

play10:43

along with the code you will be able to

play10:44

change them or add additional options

play10:46

here

play10:47

so we're going to see here the view

play10:49

choice is going to be equal to input

play10:54

um

play10:54

yeah actually just to input we don't

play10:56

need to ask for anything specific here

play10:58

and we're going to again turn this into

play11:00

an integer

play11:03

and we're going to say

play11:05

if view Choice equals to one

play11:09

is going to be one thing and LF view

play11:12

Choice equals to 2 is going to be

play11:14

another thing in this case I'm going to

play11:16

once again add an else with an exit just

play11:19

because it's simple and we don't need to

play11:21

do too much to prevent

play11:22

are wrong input being processed and for

play11:26

the first option we just have to view

play11:28

everything so we're going to say cursor

play11:30

dot execute select everything from

play11:35

expenses

play11:37

that's quite simple and then we're going

play11:39

to say expenses

play11:42

is going to be cursor.fetch all and then

play11:45

four expense

play11:48

in expenses we can just print the full

play11:51

expense

play11:52

that's quite simple and if we want to

play11:54

have it by month and by category we're

play11:57

going to get the month and the category

play11:59

so we're going to ask first of all

play12:01

input

play12:03

enter the month mm

play12:06

[Applause]

play12:07

then we also want to know which year of

play12:09

course because I cannot just say January

play12:11

I need to know January 2021 for example

play12:14

so enter the year as well

play12:16

with four years

play12:19

and then we're going to also say

play12:22

um

play12:23

actually we don't need to enter the

play12:24

category because we're going to list all

play12:26

the categories but we're going to group

play12:27

by category that's what we want to do

play12:29

here so we're going to say here now

play12:30

cursor.execute

play12:32

and we're going to say select category

play12:36

sum of price so we're going to aggregate

play12:39

here in the SQL statement so we're going

play12:41

to say category the sum of the price

play12:43

column from expenses there's now a

play12:46

little uh SQL magic here

play12:49

if you're a beginner this might be magic

play12:51

otherwise it's quite simple uh where

play12:53

where the not actually the category

play12:55

sorry with the string format of the time

play12:58

strf time

play13:00

we're going to get the month so percent

play13:03

M actually we need to use single

play13:05

quotations here

play13:07

to make this happen

play13:10

so month off the date

play13:13

is going to be equal to a question mark

play13:15

again a prepared statement we're going

play13:16

to inject later on

play13:18

um and strf time year of the date here

play13:22

has to be

play13:25

also equal to a question mark

play13:30

maybe can I can I maybe do this on a new

play13:33

line there you go this should work or

play13:36

maybe let's do it do it as a multi-line

play13:38

string

play13:39

to have a better overview here

play13:44

there you go

play13:46

and actually not ants this was equal to

play13:50

another question mark and then we have

play13:53

the statement Group by category

play13:57

so basically what we do is we select the

play13:59

category and the price sum for this

play14:02

category we grouped by the category so

play14:04

we sum up the price column for each

play14:07

category where the month is equal to

play14:09

something and the year is equal to

play14:11

something and this something will now be

play14:13

passed here as a tuple month and year

play14:16

that were entered here again we're not

play14:20

gonna check if the input is correct

play14:22

we're just going to assume that the user

play14:24

enters something valid

play14:26

um and then as a result we're going to

play14:28

say expenses equals cursor dot fetch all

play14:33

four expense

play14:37

in expenses we're going to print an F

play14:41

string

play14:43

where the category

play14:46

is going to be

play14:48

expense zero because that's the first

play14:51

thing that we ask for here

play14:53

and then the total is going to be

play14:59

expense one which is the second thing

play15:01

the sum of the price per category

play15:04

uh that's it and once we have that all

play15:08

we need to do here is after this

play15:11

um

play15:12

after all of this here we're going to

play15:14

say

play15:16

repeat equals input

play15:19

would you like to do something else

play15:24

and we can say yes or no

play15:27

[Applause]

play15:29

maybe you want to add

play15:31

backslash in

play15:34

and then we can say if repeat

play15:37

dot lower is equal to yes we're going oh

play15:42

actually it's not equal to yes sorry

play15:45

if it's not equal to yes we're going to

play15:47

break out of the loop otherwise we're

play15:48

just going to repeat so if we enter a no

play15:50

or an N or anything else but a yes so

play15:53

everything else but a y we're going to

play15:54

break out of the loop otherwise we're

play15:56

going to repeat the process and in the

play15:57

end we want to close the connection

play16:00

connection Dot close

play16:03

so if we didn't do any mistakes here or

play16:05

if I didn't do any mistakes here

play16:08

this should work we should be able to

play16:09

enter a new expense let's say we want to

play16:12

enter it 2020

play16:14

January 12th

play16:16

into the description uh I don't know

play16:19

bananas

play16:21

the category we're going to create a new

play16:23

one it's going to be food and the price

play16:26

I bought quite a lot so 150 dollars

play16:29

would you like to do something else yes

play16:31

I want to enter a new expense 2020

play16:34

January 5th

play16:37

I want to enter uh I don't know a

play16:40

skateboard that I bought is going to be

play16:43

you can see I can choose now food or I

play16:45

can create a new category I will name it

play16:47

fun and then I will say 300 and then I

play16:51

would like to add one more

play16:52

enter a new expense or actually two more

play16:54

because I want to show some stuff here

play16:56

I'm going to enter one more in 2020

play16:58

January let's say 27th

play17:01

it's going to be uh groceries

play17:07

it's going to be food so I'm going to

play17:08

just pick one

play17:10

and it's going to be 120 and then I

play17:12

would like to do one more thing enter a

play17:14

new expense let's say 20 21 February

play17:20

10th

play17:21

and then this is going to be I don't

play17:23

know again bananas

play17:26

food

play17:28

twenty dollars

play17:29

and I would like to do something else I

play17:31

would like to view the expensive summary

play17:33

now so view all expenses there you go we

play17:35

can see a list of all the all the stuff

play17:37

that we have here and I would like to do

play17:40

something else I would like to also show

play17:42

monthly expenses by category the year of

play17:45

the month is going to be January so 0 1

play17:47

and the year is going to be 2020 and you

play17:50

can see now here we have category food a

play17:53

total of 270 and category final total of

play17:57

300. so this is how you build a simple

play18:00

expense tracker in Python so that's it

play18:03

for today's video I hope you enjoyed it

play18:05

and hope you learned something if so let

play18:07

me know by hitting a like button and

play18:08

leaving a comment in the comment section

play18:09

down below and of course don't forget to

play18:11

subscribe to this Channel and hit the

play18:12

notification Bell to not miss a single

play18:14

future video for free other than that

play18:16

thank you much for watching see you in

play18:17

the next video and bye

play18:19

[Music]

play18:33

thank you

Rate This

5.0 / 5 (0 votes)

Ähnliche Tags
PythonExpense TrackerDatabaseCommand LineBeginner TutorialSQLite3Coding SkillsProject PracticeFinancial ManagementEducational Content
Benötigen Sie eine Zusammenfassung auf Englisch?