Skip to content

Instantly share code, notes, and snippets.

@quinor
Last active August 29, 2015 14:03
Show Gist options
  • Save quinor/838b9b595a63537eea9c to your computer and use it in GitHub Desktop.
Save quinor/838b9b595a63537eea9c to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import random
from statistics import *
def game (days, hitrate, moneypart):
money=1
for i in range(days):
if random.random()<hitrate:
money*=1+moneypart
else:
money*=1-moneypart
return money
def statfor(days, hitrate, moneypart, games):
return Statistics((game(days, hitrate, moneypart) for i in range(games)),)
#!/usr/bin/env python3
from sortedcontainers import SortedList
class Statistics:
CUT_PERCENTAGE=0.05 # from each side
def __init__ (self, elements=[]):
self.__sum=0
self.__multiply=1
self.__zeroes_count=0
self.__square_sum=0
self.__edges=0
self.__edges_count=0
self.__median_index=0
self.__deviation=0
self.__deviation_computed=False
self.__nums=SortedList()
self.count=0
for e in elements:
self.insert(e)
def __repr__ (self):
return "<Statistics of: {}>".format(self.__nums.as_list())
def insert (self, element):
self.count+=1
self.__nums.add(element)
self.__sum+=element
if element!=0:
self.__multiply*=element
else:
self.__zeroes_count+=1
self.__square_sum+=element**2
self.__deviation_computed=False
def erase (self, element):
if element not in self.__nums:
return
self.count-=1
self.__nums.discard(element)
self.__sum-=element
if element!=0:
self.__multiply/=element
else:
self.__zeroes_count-=1
self.__square_sum-=element**2
self.__deviation_computed=False
def aritmetic_average (self):
if self.count==0:
return float("nan")
else:
return self.__sum/self.count
def geometric_average (self):
if self.count==0:
return float("nan")
elif self.__zeroes_count!=0:
return 0
else:
return self.__multiply**(1/self.count)
def square_average (self):
if self.count==0:
return float("nan")
else:
return (self.__square_sum/self.count)**0.5
def median (self):
if self.count==0:
return float("nan")
else:
return self.__nums[self.__median_index]
def standard_deviation (self):
if self.count==0:
return float("nan")
else:
if not self.__deviation_computed:
self.__deviation_computed=True
self.__deviation=0
average=self.aritmetic_average()
for e in self.__nums:
self.__deviation+=(e-average)**2
self.__deviation/=self.count
self.__deviation**=0.5
return self.__deviation
def minimum (self):
if self.count==0:
return float("nan")
else:
return self.__nums[0]
def percentage_minimum (self, p):
if self.count==0:
return float("nan")
else:
return self.__nums[int(self.count*p/100)]
def maximum (self):
if self.count==0:
return float("nan")
else:
return self.__nums[-1]
def percentage_maximum (self, p):
if self.count==0:
return float("nan")
else:
return self.__nums[-1-int(self.count*p/100)]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment