Skip to content

Instantly share code, notes, and snippets.

@ChristianGaertner
Created July 7, 2016 12:29
Show Gist options
  • Save ChristianGaertner/f72e8c8636b4a8cd0e43e69c3dfd1f43 to your computer and use it in GitHub Desktop.
Save ChristianGaertner/f72e8c8636b4a8cd0e43e69c3dfd1f43 to your computer and use it in GitHub Desktop.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import random
def median(series):
return sum(series)/len(series)
class Beverage:
def __init__(self, name, median_cost, upper, lower, start, step=50):
self.name = name
self.series = []
self.sold_at = []
self.median_cost = median_cost
self.upper = upper
self.lower = lower
self.step = step
self.set_new(start)
@property
def sum_sold(self):
sold = 0
for volume, index in self.sold_at:
sold += volume * self.series[index]
return sold
@property
def sell_volume(self):
total = 0
for volume, _ in self.sold_at:
total += volume
return total
@property
def profit(self):
total = 0
for volume, index in self.sold_at:
total += volume * (self.series[index] - self.median_cost)
return total
@property
def current(self):
return self.series[-1]
def tick(self):
current = self.current
chance = 0.5
if self.profit < 1000:
chance -= 0.1
if median(self.series) < self.median_cost:
chance -= 0.05
elif median(self.series) > self.median_cost * 2:
chance += 0.05
if self.upper * 0.9 < current:
chance += 0.1
if self.lower * 1.2 > current:
chance -= 0.1
up = random.uniform(0, 1) > chance
change = random.randint(0, self.step)
new = current + change if up else current - change
# clip to range
self.set_new(max(min(self.upper, new), self.lower))
def set_new(self, value):
self.series.append(value)
def notify_sell(self, volume):
self.sold_at.append((volume, len(self.series) - 1))
# name, median, upper, lower, start
beverages = [
Beverage("Holsten", 300, 1100, 150, 150),
Beverage("Astra", 300, 1100, 100, 200)
]
total_profit = []
volume = []
for i in range(700):
if i % 10 == 0:
selected = random.choice(beverages)
selected.notify_sell(bev.upper // bev.current)
volume.append(bev.upper // bev.current)
else:
volume.append(0)
local_profit = 0
for bev in beverages:
bev.tick()
local_profit += bev.profit
total_profit.append(local_profit)
plt.figure(0)
for bev in beverages:
plt.plot(bev.series)
print("Name: ", bev.name)
print("Volume:", bev.sell_volume)
print("Umsatz:", bev.sum_sold)
print("Gewinn:", bev.profit)
plt.ylabel('Price')
#plt.figure(1)
#plt.plot(total_profit)
#plt.ylabel('Profit')
plt.figure(2)
plt.plot(volume)
plt.ylabel('Volume')
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment