Newer
Older
notebooks / py / poisson_generator.py
#%%
import random
from math import log
import matplotlib.pyplot as plt
import numpy as np

class PoissonProcess():
  def __init__(self, **kwargs):
    self.lam = kwargs.get("lam", 5) # rate
    self.size = kwargs.get("size", 100)

  def generate(self):
    _time = 0
    events = []
    for i in range(self.size):
      p = random.random()

      _interval = - log(1-p) / self.lam
      _time = _time + _interval

      events.append(_time)
    return events

#1 (events)
poi = PoissonProcess(lam = 5).generate()
print(poi)

#matplotlib: x=index, y=poi[index]
plt.eventplot(poi)


#2 (points)
poi = np.random.poisson(lam=5,size=100)
print(f"avergae is {np.average(poi)}")

#poi = [i-j for i,j in zip(poi[:-1],poi[1:])]

poi2 = [np.sum(poi[1:i]) for i in range(len(poi))]
print(poi2)
#poi = np.diff(poi) # alternative numpy solution for inter-interval durations
#plt.plot(poi2)

plt.show()
#%%

import numpy as np
from scipy.special import factorial

def events_prob(events_per_unit_time, total_time, num_of_events):
  # poisson dist
  lam = events_per_unit_time * total_time
  return np.exp(-lam) * np.power(lam, num_of_events) * factorial(num_of_events)


rate = 5
ks = np.arange(20)
ps = events_prob(5,20,ks)
print(np.argmax(ps), np.max(ps))