import numpy as np
import matplotlib.pyplot as plt

N = 1000
phase = np.linspace(0, 1, N)
error = np.random.normal(0, 0.1, 1000)
mA = phase*0 + error
mB = np.cos(2*np.pi*phase) + error
mC = np.exp(-(phase-0.5)**2/0.01) + error

plt.figure(figsize=(15, 7))

plt.subplot(231)
plt.plot(phase, mA, "r+", markersize=5)
plt.xlabel("Faza")
plt.ylim(-1.5, 1.5)
plt.ylabel("Hviezdna velkost hvezdy A")
plt.gca().invert_yaxis()

plt.subplot(232)
plt.plot(phase, mB, "b+", markersize=5)
plt.xlabel("Faza")
plt.ylim(-1.5, 1.5)
plt.ylabel("Hviezdna velkost hvezdy B")
plt.gca().invert_yaxis()

plt.subplot(233)
plt.plot(phase, mC, "g+", markersize=5)
plt.xlabel("Faza")
plt.ylim(-1.5, 1.5)
plt.ylabel("Hviezdna velkost hvezdy C")
plt.gca().invert_yaxis()

plt.subplot(234)
plt.hist(mA, 20, edgecolor="white", linewidth=3)
plt.xlabel("Hviezdna velkost hvezdy A")
plt.ylabel("Pocetnost")

plt.subplot(235)
plt.hist(mB, 20, edgecolor="white", linewidth=3)
plt.xlabel("Hviezdna velkost hvezdy B")
plt.ylabel("Pocetnost")

plt.subplot(236)
plt.hist(mC, 20, edgecolor="white", linewidth=3)
plt.xlabel("Hviezdna velkost hvezdy C")
plt.ylabel("Pocetnost")

def get_stats(x):
    """
    Vypocita sikmost a spicatost datoveho suboru.
    
    Args:
        x: List dat.
        
    Returns: Hodnoty sikmosti a spicatosti.
    """    
    n = len(x)
    sigma = np.sqrt(np.sum(np.power(x - np.average(x), 2))/(n - 1))
    gama1 = np.sum(np.power(x - np.average(x), 3))/n/sigma**3
    gama2 = (n + 1)/(n - 1)*np.sum(np.power(
            x - np.average(x), 4))/n/sigma**4 - 3
    return round(gama1, 3), round(gama2, 3)

print("Sikmost a spicatost pre hviezdu A: ", get_stats(mA)) 
print("Sikmost a spicatost pre hviezdu B: ", get_stats(mB))
print("Sikmost a spicatost pre hviezdu C: ", get_stats(mC))

# Zo sikmosti vyplyva, ze rozdelenie je symetricke pre hodnoty [-0.5, 0.5], co
# plati pre hviezdu A a B, pripadne lavostranne pre kladne hodnoty (pripad C)
# a lavostranne pre zaporne hodnoty.
# Zo spicatosti vyplyva, ze rozdelenie je spicate pre kladne hodnoty (pripad C)
# a ploche pre nizke hodnoty (pripad B).
