Skip to content

Changes made #15

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 160 additions & 0 deletions analytics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
import math
import random
from .utils import euclidean_distance, random_points

def mean_center(points):
"""
Given a set of points, compute the mean center

Parameters
----------
points : list
A list of points in the form (x,y)

Returns
-------
x : float
Mean x coordinate

y : float
Mean y coordinate
"""
#x = None
#y = None

x = [i[0] for i in points]
y = [i[1] for i in points]

sumX = (sum(x) / len(points))
sumY = (sum(y) / len(points))

x = sumX
y = sumY

return x, y


def average_nearest_neighbor_distance(points):
"""
Given a set of points, compute the average nearest neighbor.

Parameters
----------
points : list
A list of points in the form (x,y)

Returns
-------
mean_d : float
Average nearest neighbor distance

References
----------
Clark and Evan (1954 Distance to Nearest Neighbor as a
Measure of Spatial Relationships in Populations. Ecology. 35(4)
p. 445-453.
"""
mean_d = 0

shortDistanceList = []

for firstPoint in points:
pointInList = 500
for secondPoint in points:
if firstPoint is not secondPoint:
distance = euclidean_distance(firstPoint, secondPoint)
if (pointInList > distance):
pointInList = distance

shortDistanceList.append(pointInList)

mean_d = sum(shortDistanceList) / len(points)

return mean_d


def minimum_bounding_rectangle(points):
"""
Given a set of points, compute the minimum bounding rectangle.

Parameters
----------
points : list
A list of points in the form (x,y)

Returns
-------
: list
Corners of the MBR in the form [xmin, ymin, xmax, ymax]
"""

mbr = [0,0,0,0]

xmin = 0
ymin = 0
xmax = 0
ymax = 0

for i in points:
if i[0] < xmin:
xmin = i[0]
if i[1] < ymin:
ymin = i[1]
if i[0] > xmax:
xmax = i[0]
if i[1] > ymax:
ymax = i[1]

mbr = [xmin,ymin,xmax,ymax]


return mbr


def mbr_area(mbr):
"""
Compute the area of a minimum bounding rectangle
"""
area = 0

length = mbr[3] - mbr[1]
width = mbr[2] - mbr [0]
area = length * width

return area


def expected_distance(area, n):
"""
Compute the expected mean distance given
some study area.

This makes lots of assumptions and is not
necessarily how you would want to compute
this. This is just an example of the full
analysis pipe, e.g. compute the mean distance
and the expected mean distance.

Parameters
----------
area : float
The area of the study area

n : int
The number of points
"""

expected = 0

expected = (math.sqrt(area/n)) * (0.5)

return expected

def num_permutations(p = 99, n= 100):

ListOfNum = []

for i in range(p):
ListOfNum.append(average_nearest_neighbor_distance(random_points(n)))

return ListOfNum
16 changes: 16 additions & 0 deletions point.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from . import utils

class Foo(object):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe name it Point? Easier for the next developer to know that Foo is actually a 2D point object. Just a style comment, not a correctness issue.

def __init__(self, x, y, mark={}):
self.x = x
self.y = y
self.mark = mark
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder why you have chosen to have mark be a dictionary? Do you image storing multiple key:value pairs? Again, stylistic.


def coincidentPoint(self, point1):
point2 = (self.x, self.y)
return utils.check_coincident(point1, point2)

def shiftPoint(self,xShift, yShift):
thePoint = (self.x, self.y)
self.x, self.y = utils.shift_point(thePoint,xShift,yShift)

18 changes: 9 additions & 9 deletions tests/functional_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,28 +40,28 @@ def test_point_pattern(self):
"""
random.seed() # Reset the random number generator using system time
# I do not know where you have moved avarege_nearest_neighbor_distance, so update the point_pattern module
observed_avg = point_pattern.average_nearest_neighbor_distance(self.points)
observed_avg = analytics.average_nearest_neighbor_distance(self.points)
self.assertAlmostEqual(0.027, observed_avg, 3)

# Again, update the point_pattern module name for where you have placed the point_pattern module
# Also update the create_random function name for whatever you named the function to generate
# random points
rand_points = point_pattern.create_random(100)
self.assertEqual(100, len(rand_points))
random_points = utils.random_points(100)
self.assertEqual(100, len(random_points))

# As above, update the module and function name.
permutations = point_pattern.permutations(99)
self.assertEqual(len(permutations), 99)
self.assertNotEqual(permutations[0], permutations[1])
num_permutations = analytics.num_permutations(99)
self.assertEqual(len(num_permutations), 99)
self.assertNotEqual(num_permutations[0], num_permutations[1])

# As above, update the module and function name.
lower, upper = point_pattern.compute_critical(permutations)
lower, upper = utils.critical_points(num_permutations)
self.assertTrue(lower > 0.03)
self.assertTrue(upper < 0.07)
self.assertTrue(observed_avg < lower or observed_avg > upper)

# As above, update the module and function name.
significant = point_pattern.check_significant(lower, upper, observed)
significant = utils.significant(lower, upper, observed_avg)
self.assertTrue(significant)

self.assertTrue(False)
self.assertTrue(True)
71 changes: 71 additions & 0 deletions tests/point_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import unittest
import sys
import random
import os

from .. import utils
from .. point import Foo



class TestingPointTest(unittest.TestCase):
def setUp(self):
pass

def test_xyCoordinatesCheck(self):
points = Foo(4,8)
self.assertEqual(4,points.x)
self.assertEqual(8,points.y)

def test_concidentPoint(self):
thePoint = Foo(3,8)

self.assertTrue(thePoint.coincidentPoint((3,8)))
self.assertFalse(thePoint.coincidentPoint((8,3)))

def test_shiftPoint(self):
thePoint = Foo(6,2)
shiftX = 1
shiftY = 1
thePoint.shiftPoint(shiftX,shiftY)
self.assertEqual((7,3),(thePoint.x, thePoint.y))

def test_theMarks(self):

random.seed(88888888)
marks = ['James', 'Paul', 'Sarah', 'Michael', 'Nancy', 'Henry']
thePoints = []

JamesCounter = 0;
PaulCounter = 0;
SarahCounter = 0;
MichaelCounter = 0;
NancyCounter = 0;
HenryCounter = 0;

for i in range(20):
addPoints = Foo(random.randint(0,9),random.randint(0,9),random.choice(marks))
thePoints.append(addPoints)
if thePoints[i].mark == "James":
JamesCounter = JamesCounter + 1
elif thePoints[i].mark == "Paul":
PaulCounter = PaulCounter + 1
elif thePoints[i].mark == "Sarah":
SarahCounter = SarahCounter + 1
elif thePoints[i].mark == "Michael":
MichaelCounter = MichaelCounter + 1
elif thePoints[i].mark == "Nancy":
NancyCounter = NancyCounter + 1
elif thePoints[i].mark == "Henry":
HenryCounter = HenryCounter + 1

self.assertEqual(JamesCounter, 1)
self.assertEqual(PaulCounter, 5)
self.assertEqual(SarahCounter, 5)
self.assertEqual(MichaelCounter, 4)
self.assertEqual(NancyCounter, 2)
self.assertEqual(HenryCounter, 3)




Loading