JovanPapi

[SNZ - lab6] Пресметка на статистики и еден подвижен прозоре

Jan 4th, 2020
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 31.58 KB | None | 0 0
  1. """Пресметка на статистиките од дадената листа x, врз основа на stat_config
  2.    вредностите.
  3.  
  4.    :param x: листа на временската серија на податоци
  5.    :type x: list(float)
  6.    :param stat_config: листа со имиња на статистики кои треба да се пресметаат
  7.    :type stat_config: list(str)
  8.    :return: листа со пресметаните статистики според редоследот од stat_config
  9.    :rtype: list
  10.    """
  11.     assert len(set(stat_config).difference(['len', 'min', 'max', 'range', 'mean', 'hmean',
  12.                                             'gmean', 'var', 'std', 'skew', 'kurtosis',
  13.                                             'median', 'mode', 'energy', 'energy_sample', 'snr'])) == 0
  14.  
  15.     x_array = np.array(x)
  16.     n = len(x)
  17.     if n == 0:
  18.         values = [0 for i in range(len(stat_config))]
  19.         return values, stat_config
  20.  
  21.     min_value = np.min(x_array)
  22.     if min_value < 1:
  23.         offset = 1 + np.abs(min_value)
  24.     else:
  25.         offset = 0
  26.     max_value = np.max(x_array)
  27.  
  28.     values = []
  29.     for stat_name in stat_config:
  30.         if stat_name == 'len':
  31.             values.append(n)
  32.         elif stat_name == 'min':
  33.             values.append(min_value)
  34.         elif stat_name == 'max':
  35.             values.append(max_value)
  36.         elif stat_name == 'range':
  37.             range_value = max_value - min_value
  38.             values.append(range_value)
  39.         elif stat_name == 'mean':
  40.             mean_value = np.mean(x_array)
  41.             values.append(mean_value)
  42.         elif stat_name == 'hmean':
  43.             hmean_value = sp.hmean(x_array + offset)
  44.             values.append(hmean_value)
  45.         elif stat_name == 'gmean':
  46.             gmean_value = sp.gmean(x_array + offset)
  47.             values.append(gmean_value)
  48.         elif stat_name == 'var':
  49.             std_value = np.std(x_array)
  50.             var_value = std_value ** 2
  51.             values.append(var_value)
  52.         elif stat_name == 'std':
  53.             std_value = np.std(x_array)
  54.             values.append(std_value)
  55.         elif stat_name == 'skew':
  56.             skew_value = sp.skew(x_array)
  57.             values.append(skew_value)
  58.         elif stat_name == 'kurtosis':
  59.             kurtosis_value = sp.kurtosis(x_array)
  60.             values.append(kurtosis_value)
  61.         elif stat_name == 'median':
  62.             median_value = np.median(x_array)
  63.             values.append(median_value)
  64.         elif stat_name == 'mode':
  65.             mode_value = sp.mode(x_array)[0][0]
  66.             values.append(mode_value)
  67.         elif stat_name == 'energy':
  68.             energy_value = np.sum(x_array ** 2)
  69.             values.append(energy_value)
  70.         elif stat_name == 'energy_sample':
  71.             energy_sample_value = np.sum(x_array ** 2) / n
  72.             values.append(energy_sample_value)
  73.         elif stat_name == 'snr':
  74.             mean_value = np.mean(x_array)
  75.             std_value = np.std(x_array)
  76.             snr_value = 0.0
  77.             if std_value != 0:
  78.                 snr_value = mean_value / std_value
  79.             values.append(snr_value)
  80.  
  81.     return values
  82.  
  83.  
  84. def percentiles_all(x, iqr=True, amplitude=True, percentiles_list=[5, 10, 25, 40, 50, 60, 75, 90, 95]):
  85.     """Пресметка на перцентили за дадените податоци
  86.  
  87.    :param x: листа на временската серија на податоци
  88.    :type x: list(float)
  89.    :param iqr: дали да се пресмета интерквартален ранг.
  90.           Ако е True, percentiles_list мора да ги содржи вредностите 25 и 75
  91.    :type iqr: bool
  92.    :param amplitude: дали да се пресмета амплитуда.
  93.           Ако е True, percentiles_list мора да ги содржи вредностите 1 и 99
  94.    :type amplitude: bool
  95.    :param percentiles_list: листа на перцентили кои е потребно да се пресметаат.
  96.           Листата мора да има барем еден елемент и вредностите да бидат поголеми од
  97.           0 и помали од 100.
  98.    :type percentiles_list: list(int)
  99.    :return: листа со вредности за перцентилите според редоследот од параметарот
  100.             percentiles_list, каде што доколку се бараат iqr и amplitude, тие се
  101.             додаваат на крајот на резултантната листа.
  102.    :rtype: list(float)
  103.    """
  104.     assert len(percentiles_list) > 0 and all([0 < q < 100 for q in percentiles_list])
  105.  
  106.     if len(x) == 0:
  107.         values = [0 for i in range(len(percentiles_list))]
  108.         return values
  109.  
  110.     values = list(np.percentile(x, percentiles_list))
  111.  
  112.     if iqr and 25 in percentiles_list and 75 in percentiles_list:
  113.         q1 = percentiles_list.index(25)
  114.         q3 = percentiles_list.index(75)
  115.         values.append(values[q3] - values[q1])
  116.     if amplitude and 1 in percentiles_list and 99 in percentiles_list:
  117.         q1 = percentiles_list.index(1)
  118.         q3 = percentiles_list.index(99)
  119.         values.append(values[q3] - values[q1])
  120.     return values
  121.  
  122.  
  123. def is_valid_example(i, window_size, y):
  124.     """Проверка дали податоците се валидни, односно дали сите
  125.    вредности во движечкиот прозорец имаат иста класа
  126.  
  127.    :param i: моментален индекс од податочното множество
  128.    :type i: int
  129.    :param window_size: големина на движечкиот прозорец
  130.    :type window_size: int
  131.    :param y: листа со лабели (класи)
  132.    :type y: list
  133.    :return: True или False
  134.    :rtype: bool
  135.    """
  136.     y_val = y[i - window_size]
  137.     for j in range(i - window_size + 1, i):
  138.         if y[j] != y_val:
  139.             return False
  140.     return True
  141.  
  142.  
  143. def generate_dataset(x, y, stat_config, w_long=0, w_short=0, shift=5):
  144.     """Генерирање на податочното множество за тренирање со дрво на одлука
  145.  
  146.    :param x: податоци од временската серија
  147.    :type x: np.array
  148.    :param y: податоци за лабелите (класите)
  149.    :type y: list
  150.    :param stat_config: листа со имиња на статистики кои треба да се пресметаат
  151.    :type stat_config: list(str)
  152.    :param w_long: големина на големиот движечки прозорец
  153.    :type w_long: int
  154.    :param w_short: големина на малиот движечки прозорец
  155.    :type w_short: int
  156.    :param shift: поместување при движењето на лизгачките прозорци
  157.    :type shift: int
  158.    :return: податочно множество, индекси од временската серија кои се влезени во податочното множество
  159.    :rtype: list(list), list(int)
  160.    """
  161.     rows = []
  162.     indices = []
  163.     for i in range(max(w_short, w_long), len(x), shift):
  164.         row = []
  165.         if is_valid_example(i, max(w_short, w_long), y):
  166.             for j in range(x.shape[1]):
  167.                 if w_long != 0:
  168.                     x_window_long = x[i - w_long:i, j]
  169.                     all_long = stats_calculate_all(x_window_long, stat_config)
  170.                     row.extend(all_long)
  171.                 if w_short != 0:
  172.                     x_window_short = x[i - w_short:i, j]
  173.                     all_short = stats_calculate_all(x_window_short, stat_config)
  174.                     row.extend(all_short)
  175.             indices.append(i - 1)
  176.             row.append(y[i])
  177.             rows.append(row)
  178.         else:
  179.             print('nevaliden podatok')
  180.     return rows, indices
  181.  
  182.  
  183. if __name__ == "__main__":
  184.     x = np.array(X_data)
  185.     shift = int(input())
  186.     w_long = int(input())
  187.  
  188.     for i in range(w_long, len(X_data), shift):
  189.         s1 = []
  190.         s2 = []
  191.         for j in range(6):
  192.             # tuka go polnime golemiot prozorec vo zavisnost od toa kolku podatoci max sobira vo nego
  193.             # od koga ke se popolni prozorecot  ( zemat soodvetniot broj na redici od soodvetnata kolona ),
  194.             # togas se pravi shiftanje za nekoj broj ( ako se zemat prvite 50 podatoci, sledno ke se zemat slednite 50 podatoci.
  195.             # pa slednite 50 i taka natamu se do kraj )
  196.             # zemanjeto na podatocite mozi da se prepraj ( da ne e vaka napisan vo zbunivacki redosled (50-50),
  197.             # (51-50), (52-50).... (100-50) .... )
  198.             x_window_long_data = x[i - w_long:i, j] # pocnuva od 0 do 100 ( + shiftanje ) i gi pominuva site koloni
  199.             s1 = stats_calculate_all(x_window_long_data, stat_config=['min', 'max', 'mean', 'std']) # presmetuva nesto ke kazime posle sega odam da pijam !
  200.             for number in s1:
  201.                 s2.append(round(number, 2))
  202.         print(str(i) + " " + str(s2))
Add Comment
Please, Sign In to add comment