Last active
August 29, 2015 14:03
-
-
Save quinor/838b9b595a63537eea9c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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)),) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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