import numpy as np import pandas as pd import itertools import seaborn as sns import matplotlib.pyplot as plt # np.random.seed(127) low = 1000 high = 1200 repeat = 120 anom_perc = 0.2 sns.set() sns.set_style("darkgrid") def generator(low: float, high: float, repeat: int): for i in range(repeat): num = np.random.uniform(low, high) curve = float(i) ** 2 num = num + curve if num > high * 1.2: low = num - 10 high = num + 5 elif num < low: low = num - 5 high = num + 10 else: pass yield num mygenerator = generator(low, high, repeat) df = pd.DataFrame([]) for i, j in zip(mygenerator, np.arange(repeat)): df = df.append([pd.DataFrame({'time': j, 'bets': i, }, index=[0])]).round(0) def create_anom(dataframe, number): for _ in itertools.repeat(None, number): rows = dataframe.shape[0] anomaly = f"{float(dataframe.iloc[-1]['bets']) * (1 - anom_perc)}" anomaly = float(anomaly) dataframe = dataframe.append([pd.DataFrame( {'time': rows, 'bets': anomaly}, index=[0])]) return dataframe df_anom = create_anom(df, 3) f, axes = plt.subplots(2, 1) for ax in axes: ax.set_ylim([low * 0.5, high * 1.5]) sns.lineplot(x='time', y='bets', data=df, ax=axes[0]) sns.lineplot(x='time', y='bets', data=df_anom, ax=axes[1]) plt.show()