## Python Project: Ant Escaping Path

** Python simulation project **

**Python, Graphics and simulation **

In this project we assume that we have a square pad and we put an ant in the center of this pad, we let the ant to walk, once it reach any eadgs of the square we move it with our hand to the middle again, say we doing this for x times and each time we colored the ant foots with gray level (light to dark) color. Our project is to write a code to simulate this task (ant movement).

**Enhancement: ** Here are some enhancement ideas:

1. We can use the Pi or Golden Ratio for the variables.

2. Also we can set a memory facto so with each time we move the Ant to the center the memory will increase so it may use the same path.

3. For the memory, we can set a position (x,y) as a food, and each time it reach the food it’s memory will increase.

**The Code**

# Create in 27/8/2019 .

import turtle

import random

screen = turtle.Screen()

screen.setworldcoordinates(-700,-700,700,700)

screen.tracer(5)

t1=turtle.Turtle()

t1.speed(0)

t1.penup()

# colors varibles

# r=240, g=240, b=240 is a light gray color

r=240

g=240

b=240

t1.pencolor(r,g,b)

cf = 3 # color increasing factor

ff = 0 # ant forward moving factor

#screen.bgcolor(“black”)

def rand_walk(x,the_t):

the_t.pendown()

# The color will be darker each time

the_t.pencolor(r-(x*cf),g-(x*cf),b-(x*cf))

the_t.forward(20+(ff*x))

def ant_walk ():

x = 1

while x < 7 : # Moving the Ant to the center 7 times

rand_walk(x,t1)

if random.randrange(1,100) %2:

t_ang = random.randrange(10,45)

t1.right(t_ang)

else:

t_ang = random.randrange(10,45)

t1.left (t_ang)

# if the ant reach the square boards then we move it to the center.

if (t1.xcor() > 650 ) or (t1.xcor() 650 ) or (t1.ycor() < -650 ):

t1.penup()

t1.goto(0,0)

x = x + 1

# Calling the Function

ant_walk()

Here is an GIF file

## Python: Orders Manager P2

**Orders Managment System **

** Subject: Main Menu and creation of the data file – P2 **

First thing we will talk about the menu, in this post we will cover the Main Menu and the user choice. Also we will add some validation.

**Main Menu:** Here is a list of what we will have in the main menu with some descriptions for each choice.

**Load File:** We will name the file as “orders_data.csv” so once we start the application the system will check if the file exist or not, if __Yes__ then the application will load it automatically as DataFrame (df) if not thats mean you are running the app for the first time, so we will go through file creating process.

**Show Data:** In this option we will have another sub menu page having:

1. Show all data.

2. Show sample data.

3. Show last 5 records.

**Sort:** Here we will have sorting as columns that we have, the user will select a column.

**Search:** We can here search for an order by Date, Price, Quantity or details, also we will do groping for the data.

**Missing Data:** To show us how many missing data we have so we can fill them.

**Add New Order:** To add new order to the system.

**Edit a Record:** To Edit/change a record.

**Delete a Record:** To delete a record from the DataFrame.

**Save:** To save what ever you do to the DataFrame.

**The Main Menu**

def the_menu ():

print(‘\n ::—–{ The menu }—-::’)

print(‘1. Create New csv File’)

print(‘2. Show Data’)

print(‘3. Sort.’)

print(‘4. Search.’)

print(‘5. Missing Data’)

print(‘6. Add New Record.’)

print(‘7. Edit a record.’)

print(‘8. Delete a Record.’)

print(’9. Save the File.’)

return input(‘\n Select from the menu (”q” to quit): ‘)

Main while loop: In the application body we will use a while loop to control the user input and run the function he select. Unlike what we did In the zoo managment system, we will add a validation on the user input as:

**Validation:**

1. If the user enter any thing else than numbers (1 to 9) or ([q – Q] for quit) nothing will happen.

2. If the user select (q to quit) then we will ask if he want to save before Exit.

Here is the code …

**Main while loop**

# calling the menu

user_enter = the_menu()

”’

Validation: If the user enter any thing else than numbers

or (q for quit) nothing will happen.

”’

while user_enter !=’q’ or ‘Q’ :

if user_enter in [‘q’,’Q’] :

print(‘\n You select to Exit the application.’)

save_it = input(‘\n Do your want to save your work/changes [y or n] ? ‘)

if save_it in [‘y’,’Y’]:

save_the_df (df)

break

elif user_enter not in [‘1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9’] :

user_enter = the_menu()

else:

user_choice(user_enter)

user_enter = the_menu()

Here is a screen shot for the code..

In this post we cover the Main Menu and the main while loop we need to call the functions, in the coming post we will create the data file and Adding new record.

## Python: Pandas Lesson 11

**Learning : Pandas Lesson 11 **

** Subject: Zoo Management System – P5 **

In this post we will cover another three functions, let’s start.

**Missing Data:** A commun problems we will face in any data file is Missing data, and if we are doing data analysis this may ledd us to a real problem. In this section we will cover only the missing data and will not go through any filling techniques.

**Missing Data Report**

def missing_data(df):

clear() # To clear the terminal.

print(‘\n\n *** Missing Data Report ***\n’)

print(‘ There are {} rows and {} columns.’.format(df.shape[0],df.shape[1]))

print(‘\n Number of missing data in each columns are:\n’)

total_miss = 0 # Counter

for each in df:

print(‘\n We have {} missing data in {} column.’.format(df[each].isnull().sum(),each))

total_miss = total_miss + df[each].isnull().sum()

print(‘\n Total missing data :’,total_miss)

print(‘\n The missing data represent {}% of the DataFrame.’.format((df.size*total_miss)/100))

input(‘\n\n\n\n ** Press any key to continue .. . . ‘)

This is a very simple missing data report, but doing the job for-now, we cover some part of missing data in lesson 5 read it **Here**.

**Add New Record:** I divide the editing function into three parts or three functions, Add new record, Edit a record and delete a record.

First we will work on **Add New Record**, from the name we know that this function will allow the user to add a record to the DataFrame, first we will get all columns in the dataframe, also we will get the maximum value in the ID column and increase it by one, then we will ask the user to enter the data for each column, and we are assuming that __the user will (or MUST) enter a valid data since we agree that we will not have any validation test in this version of the application__, also if the user just press ‘Enter’ thats mean NA data so we will add NaN to the field.

So let’s start..

**Add New Record**

def add_new_record(old_df):

clear() # To clear the terminal.

# First we will fitch the columns from the df

col_list = []

for each in old_df.columns :

col_list.append(each)

print(col_list)

# Get max id and increase it by 1

next_id = old_df[‘id’].max()+1

new_row={}

# let user enter the new record.

print(‘\n Enter the data for each field then press Enter.\n’ )

print(‘ If you just press Enter NaN will be entered.’)

for each in col_list:

if each !=’id’:

print(‘ Enter data for ‘,each)

new_row.update({each:(input(‘ : ‘))})

new_row.update({‘id’:next_id})

old_df = old_df.append([new_row])

for each in col_list :

if (old_df.loc[old_df[‘id’] == next_id, each][0]) ==”:

(old_df.loc[old_df[‘id’] == next_id,[each]]) = float(‘NaN’)

print(‘\n New Record added successfully..\n’)

# print out last 5 rows to show the new record.

print(‘\n The new record in the df..\n ”,old_df.tail(5))

global df # Reset the df as global variable

df = old_df

input(‘\n\n\n\n ** Press any key to continu .. . . ‘)

**Save :** At this point we will jump to the last function, simply after adding data to our DataFrame we need to keep this change, we need to save the new record so we can retrieve it next time we run the application. So to do this we will re-write the csv file again.

**Save the DataFrame**

def save_the_df (df):

clear() # To clear the terminal.

file_name=’data_file_zoo.csv’

df.to_csv(file_name, encoding=’utf-8′, index=False)

print(‘\n File saved .. ‘)

input(‘\n\n\n\n ** Press any key to continue .. . . ‘)

Now, if we close the application then re-open it again we will have the new records that we add. We just save the file and will not have any option to rename it.

In Next Post.. in coming post we will cover deleting and editting functions, also I will upload the full code file to the portal so any one can download it as python file.

**:: Pandas Lessons Post ::**

Lesson 1 | Lesson 2 | Lesson 3 | Lesson 4 |

Lesson 5 | Lesson 6 | Lesson 7 | Lesson 8 |

Lesson 9 | Lesson 10 | Lesson 11 |

## Python: Powerful Digit Counts

**Python: Powerful Digit Counts**

** Problem No.63 @ ProjectEuler**

Completed on: Completed on Thu, 11 Jul 2019, 17:21

Just to make my post simple, i am quoting from ProjectEuler page

The 5-digit number, 16807=7

^{5}, is also a fifth power. Similarly, the 9-digit number, 134217728=8^{9}, is a ninth power.

How many n-digit positive integers exist which are also an nth power?

Then, we need to find the loop that will solve this, and we did..

**The Code:**

# P63

# Power digit count

# Solved

# Completed on Thu, 11 Jul 2019, 17:21

c = 0

for x in range (1,50):

for p in range (1,50) :

if (len(str(x**p)) == p ):

c += 1

print(‘\n We have {} n-digit integers exist which are also an nth power.’.format(c))

## Python: Pentagon Numbers

**Python: Pentagon Numbers **

** Problem No.44 on ProjectEuler**

Completed on: Thu, 11 Jul 2019, 18:37

This problem talking about the Pentagonal numbers and gives us a formula. Using that formula for a certain range of numbers, the generated sequence showing that P4 + P7 = 22 + 70 = 92, 92 is the P8, but if we subtracting (P7 – P4) = 70 – 22 = 48, 48 is not in the generated sequence of pentagonal numbers, so 48 is not pentagonal.

The task here is to find the pair of pentagonal Pj,Pk which their sum and difference are Pentagonal D = Pk – Pj is minimised.(we need to get the D).

**The Code:**

# P44

# Pentagon Numbers

# Solved

#Completed on Thu, 11 Jul 2019, 18:37

def pn(n):

return int(n*(3*n-1)/2)

pn_list=[]

for n in range (1000,3000) : # I start increasing the range step by step.

pn_list.append(pn(n))

we_found_it = False

for x in range (0,len(pn_list)-1) :

px= pn_list[x]

for y in range (x+1,len(pn_list)-1) :

py= pn_list[y]

if (px+py) in pn_list:

if (py-px) in pn_list:

print(‘\n We found one ‘,px,py,’D = ‘,py-px )

we_found_it = True

if we_found_it : break

print(‘Done’)

## Python is_prime and time consuming

**Python: is_prime and time consuming **

** Function enhancement**

Once i start solving projectEuler problems i notes that i need the prime numbers in most of cases, so I wrote a function called ‘is_prime’ and it works fine. Some time just to get all the primes in a given range takes some seconds, seconds in computer time means waiting a lot. With some other problems that we need to get the prime in large numbers my function looks slow, since I am not deep in math I search the net for a better way to get the primes or to check if a given number is prime or not.

**Definition** A prime number (or a prime) is a natural number greater than 1 that cannot be formed by multiplying two smaller natural numbers. wikipedia.org.

So as I understand a prime number is not dividable by any other numbers, so my is_prime function is taking a number let’s say n= 13, and start a loop from 2 to n=13 if we fond a number that divide 13 then 13 is not a prime.

Here is the code:

def is_prime1(num):

for t in range (2, num):

if num % t == 0 :

return False

return True

The function is working fine and we can get the prime numbers, but as I mention above, if we have a large number or a wide range, this will take some time. After searching the web, I found some facts regarding the **Prime Numbers:**

1. The only even prime number is 2. (So any other even numbers are not prime)

2. If the sum of a number digits is a multiple of 3, that number can be divided by 3.

3. No prime number greater than 5 ends in/with 5.

OK, now I can first cut any range to half by not going through even numbers __(if even false)__. Then, I will see if the number end with 5 or not __(if end with 5 false)__,last I will do a summation of the digits in the number if the sum divide by 3 __(if yes false)__, and if the number pass then i will take it in the loop from 5 to n, and if any number divide it we will return false.

Here is the code after the enhancement:def is_prime2(num):

if num %2==0 : # pass the even numbers.

return False

num_d= str(num) # if last digits is 5, then not prime

t= len(num_d)

if (num_d[t-1]) == 5 :

return False

tot = 0

for each in str(num):

tot = tot + int(each)

if tot % 3 == 0 : # if digits sum divide by 3, then not prime

return False

for t in range (3, num, 2):

if num % t == 0 :

return False

return True

I test both function on my laptop, for different number ranges, and use the time function to see the time delays with each one. Here is the results. If any one know better way to do this please drop it here. Or on My **Twitter**.

## Python: Champernowne’s constant

**Python: Champernowne’s constant **

** Problem No.40 @ ProjectEuler**

Completed on: Mon, 1 Jul 2019, 18:01

**I**n This task No.40, basically we need to get some digits from a large decimal fraction, then finding the multiplication of those digits.

ProjectEuler assume that the fraction is: 0.123456789101112131415161718192021222324 …. until 1000000, then we should fined the digits in positions 1, and 10, 100, 1000, 10000, 100000 and 1000000. __Here is a copy of the problem screen__

**S**o to solve this I create a string variable **n_list** then using for loop i store the numbers from 1 to 1000000 in it as [12345678910111213141516 … 1000000], and simply get the digits I want using the list index, and Finally I calculate the needed multiplication as required. .. **And we solve it**. ..