Lifeinhockey commited on
Commit
259b314
·
verified ·
1 Parent(s): dde9da0

Upload Modules_Error_Анализ_Данных_Синтетич.py

Browse files
Modules_Error_Анализ_Данных_Синтетич.py ADDED
@@ -0,0 +1,957 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Модель связывает организацию кода в части использования разных программных модулей для разных архитектурных элементов (маркированных классов)
2
+ # с количеством фиксируемых ошибок в работе кода.
3
+ # Анализ данных, синтез данных.
4
+
5
+ # Метолика использования.
6
+ # Удаление строк из data не удовлетворяющих условиям: < data_Max и >= data_Min
7
+ # Удаление дублирующихся строк, оставлены первые вхождения
8
+ # Заполнение пустых ячеек нулевыми значениями, если нужно
9
+ # 0. Увеличение количества СТОЛБЦОВ датасета, если нужно ???
10
+ # 1. Генерация нулевых значений данных (из одной строки с нулями - файл Modules_Error_Исходн_0.xlsx).
11
+ # 1.1. Сгенерировать нулевые значения входных параметров.
12
+ # 1.2. Сгенерировать нулевые значения выходов - target.
13
+ # 1.3. Зашумить данные нормальным шумом с K_SKO = 0.0001 - выходной файл Modules_Error_0.xlsx.
14
+ # 2. Генерация значений входных параметров с заданным шагом.
15
+ # 2.1. Сгенерировать значения входных параметров с заданным шагом - входной файл из одной строки с нулями Modules_Error_Исходн_0.xlsx.
16
+ # 2.2. Вычислить значения выходов - target - выходной файл Modules_Error_перебор_значений_0.xlsx.
17
+ # 2.3. Зашумить данные нормальным шумом с K_SKO = 0.0001 - выходной файл Modules_Error_перебор_значений_шум.xlsx.
18
+ # 3. Генерация значений входных параметров на основе реальных данных.
19
+ # 3.1. Увеличение количества строк в датасете на основе случайного изменения исходного датасета - входной файл Modules_Error_Исходн_Синт.xlsx.
20
+ # 3.2. Вычислить значения выходов - target - входной файл Modules_Error_увел_исходн.xlsx, выходной - Modules_Error_увел_исходн_target.xlsx.
21
+ # 3.3. Зашумить данные нормальным шумом с K_SKO = 0.0001 - выходной файл Modules_Error_шум_исходн_target.xlsx.
22
+ # 4. Объединить все сгенерированные данные в один файл - итоговый файл Modules_Error_Синтетические.xlsx.
23
+
24
+ # 5. Генерация данных на основе полного перебора значений с заданным шагом
25
+ # 5.1. Генерация данных входных параметров на основе полного перебора значений с заданным шагом - входной файл из одной строки с нулями Modules_Error_Исходн_0.xlsx.
26
+ # 5.2. 3.2. Вычисление количества ошибок (target) на основе количества и соотношения LOG, lack - входной файл Modules_Error_увел_исходн.xlsx, выходной - Modules_Error_увел_исходн_target.xlsx.
27
+ # 5.3. 3.3. Зашумить данные нормальным шумом с K_SKO = 0.0001 - выходной файл Modules_Error_шум_исходн_target.xlsx.
28
+
29
+
30
+
31
+
32
+
33
+ # импорт библиотек
34
+ import os
35
+ import warnings
36
+ warnings.filterwarnings(action='ignore')
37
+ from tensorflow import keras
38
+ import pickle
39
+ import pandas as pd
40
+ import numpy as np
41
+ import copy
42
+ from sklearn.model_selection import cross_validate
43
+ from sklearn.base import BaseEstimator, TransformerMixin
44
+ from sklearn.utils import check_array
45
+ from sklearn.impute import SimpleImputer
46
+ from sklearn.feature_selection import SelectFwe, f_regression, VarianceThreshold
47
+ from sklearn.cluster import FeatureAgglomeration
48
+ from sklearn.linear_model import LassoLarsCV, LassoCV
49
+ from sklearn.decomposition import PCA
50
+ from sklearn.ensemble import ExtraTreesRegressor
51
+ from sklearn.pipeline import Pipeline
52
+ from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
53
+ import random
54
+ from numba import njit
55
+ from numba import types
56
+ from numba.typed import Dict
57
+
58
+ import matplotlib.pyplot as plt
59
+ import seaborn as sb
60
+
61
+ # Монтаж Google Диска
62
+ #from google.colab import drive
63
+ #drive.mount('/content/drive')
64
+
65
+ # Параметры модели ------------------------------------------------------------------------------
66
+ model_name = 'Model_Modules_Error.keras' # Имя файла модели
67
+ img_file = 'Structure_model.png' # Имя файла структуры модели
68
+ inp_file = 'inp_monitoring-dataset.xlsx' # Имя файла с входными данными для прогноза
69
+ num_increment_cycles = 20 #2000 #40 #36 # 80 Количество циклов увеличения строк данных
70
+ #SKO_random_normal = 5 # СКО нормального распределения при расширении исходного датасета
71
+ K_SKO = 0.0001 # 0.2 # Коэффициент для определения СКО
72
+ SKO_random_normal = 0.2 # Коэффициент для определения СКО
73
+ data_Min = 1
74
+ data_Max = 10000 # 10000
75
+ data_Max_2 = data_Max * 0.5
76
+ target_min = 1
77
+ #X_max = 100000
78
+ #y_max = 100000
79
+ # -----------------------------------------------------------------------------------------------
80
+
81
+ # версии библиотек
82
+ import sklearn
83
+ import pandas
84
+ import numpy
85
+ import tensorflow
86
+
87
+ print(f'{sklearn.__version__=}')
88
+ print(f'{pandas.__version__=}')
89
+ print(f'{numpy.__version__=}')
90
+ print(f'{tensorflow.__version__=}')
91
+
92
+ #from google.colab import files
93
+ #uploaded = files.upload() # Загрузка файла с компьютера
94
+
95
+ target = 'target'
96
+ num_features = [
97
+ 'bean',
98
+ 'bean_lack',
99
+ 'component',
100
+ 'component_lack',
101
+ 'config',
102
+ 'config_lack',
103
+ 'controller',
104
+ 'controller_lack',
105
+ 'entity',
106
+ 'entity_lack',
107
+ 'repository',
108
+ 'repository_lack',
109
+ 'service',
110
+ 'service_lack',
111
+ 'interface',
112
+ 'interface_lack',
113
+ 'interfimps',
114
+ 'interfimps_lack',
115
+ 'cyclomatic_complexity_lack',
116
+ 'lines_of_code_lack',
117
+ 'lambda_count_lack',
118
+ 'nesting_depth_lack',
119
+ 'try_catch_count_lack',
120
+ ]
121
+
122
+ # Чтение данных
123
+ data = pd.read_excel('Modules_Error.xlsx')
124
+ data = data.astype(float)
125
+ data.shape
126
+ print('data.shape = ', data.shape)
127
+
128
+ # Удаление дублирующихся строк, оставлены первые вхождения
129
+ data = data.drop_duplicates(subset=num_features)
130
+
131
+ # Удаление строк с дубликатами в столбце 'target', оставлены первые вхождения
132
+ # Округляем значение в столбце 'target'
133
+ # data['target'] = data['target'].round(3)
134
+ # data = data.drop_duplicates(subset=['target'], keep='first')
135
+
136
+ # Удаление индексов строк из датафрейма
137
+ data = data.reset_index(drop=True)
138
+ print('Удаление дублирующихся строк')
139
+ print('data.shape = ', data.shape)
140
+
141
+
142
+
143
+
144
+ '''
145
+ # 1.1, 1.2, 1.3. Генерация нулевых значений данных ------------------------------------------------------------------------------------
146
+ # Увеличение количества строк в датасете и зашумление на основе случайного изменения одной строки с нулями
147
+
148
+ # Выделение столбцов с логированием (LOG) и без логирования (lack)
149
+ lack_cols = [x for x in num_features if '_lack' in x]
150
+ LOG_cols = [x for x in num_features if not '_lack' in x]
151
+
152
+ data_ = copy.deepcopy(data)
153
+ data__ = copy.deepcopy(data)
154
+
155
+ data_shape_0 = data.shape[0]
156
+ for j in range(num_increment_cycles):
157
+ print('j = ', j)
158
+
159
+ # Случайное изменение исходного датасета - внесение случайной составляющей в значения входных показателей и target -----------------
160
+ for i in range(data_shape_0):
161
+ # Случайное изменение значений target
162
+ Delta = np.random.normal(0, abs(data_.at[i, target] * K_SKO), 1) # MO, SKO, Кол-во
163
+ data_.at[i, target] = data_.at[i, target] + Delta
164
+ if data_.at[i, target] <= 0: data_.at[i, target] = abs(np.random.normal(0, K_SKO, 1))
165
+
166
+ # Случайное изменение значений входных показателей
167
+ if Delta > 0: # Количество ошибок возросло
168
+ for col_1 in LOG_cols: # Количество логирования уменьшилось
169
+ data_.at[i, col_1] = data_.at[i, col_1] - abs(np.random.normal(0, abs(data_.at[i, col_1]) * K_SKO, 1))
170
+ if data_.at[i, col_1] <= 0: data_.at[i, col_1] = abs(np.random.normal(0, K_SKO * 0.5, 1))
171
+ for col_2 in lack_cols: # Количество без логирования возросло
172
+ data_.at[i, col_2] = data_.at[i, col_2] + abs(np.random.normal(0, abs(data_.at[i, col_2]) * K_SKO, 1))
173
+ if data_.at[i, col_2] <= 0: data_.at[i, col_2] = abs(np.random.normal(0, K_SKO, 1))
174
+ else: # Количество ошибок уменьшилось
175
+ for col_1 in LOG_cols: # Количество логирования возросло
176
+ data_.at[i, col_1] = data_.at[i, col_1] + abs(np.random.normal(0, abs(data_.at[i, col_1]) * K_SKO, 1))
177
+ if data_.at[i, col_1] <= 0: data_.at[i, col_1] = abs(np.random.normal(0, K_SKO, 1))
178
+ for col_2 in lack_cols: # Количество без логирования уменьшилось
179
+ data_.at[i, col_2] = data_.at[i, col_2] - abs(np.random.normal(0, abs(data_.at[i, col_2]) * K_SKO, 1))
180
+ if data_.at[i, col_2] <= 0: data_.at[i, col_2] = abs(np.random.normal(0, K_SKO * 0.5, 1))
181
+
182
+ if j == 0: # Удаление первой строки из data
183
+ data = data_
184
+ else:
185
+ data = data._append(data_)
186
+ data_ = copy.deepcopy(data__)
187
+
188
+ #data = data.drop(0)
189
+ # ----------------------------------------------------------------------------------------------------------------------
190
+ '''
191
+
192
+
193
+ '''
194
+ # 5.1. Генерация данных входных параметров на основе полного перебора значений с заданным шагом --------------------------------------------------------------
195
+ # Входной файл из одной строки с нулями Modules_Error_Исходн_0.xlsx
196
+ @njit
197
+ def PolniPerebor_njit(data_init_np):
198
+ data_Max = 10000 #10000
199
+ Parametr_shag = 40
200
+ PokazKachastva_Max = 1000
201
+ PokazKachastva_shag = 40
202
+ KolSluchZadaniiAnnot = 12
203
+ KolSluchZadaniiPokazKachastva = 12
204
+ cyclomatic_complexity_Min = 1
205
+ lines_of_code_Min = 3
206
+ nesting_depth_Min = 1
207
+
208
+ # Создаём список списков (не numpy-массивов)
209
+ result_data = []
210
+ data_ = data_init_np.copy() # Копируем первую строку
211
+
212
+ i = Parametr_shag
213
+ while i <= data_Max:
214
+ print(i)
215
+
216
+ for _ in range(KolSluchZadaniiAnnot):
217
+ Kol_Klassov = np.random.randint(i - Parametr_shag, i) # Задание количества класов в диапазоне (i - Parametr_shag, Parametr_shag)
218
+ if Kol_Klassov == 0: # data_[0] - bean, data_[1] - bean_lack
219
+ if np.random.rand() < 0.6:
220
+ data_[1] = 1; data_[0] = 0;
221
+ else:
222
+ data_[1] = 0; data_[0] = 1;
223
+ else:
224
+ data_[0] = np.random.randint(0, Kol_Klassov); data_[1] = Kol_Klassov - data_[0];
225
+ if Kol_Klassov == 0: # data_[2] - component, data_[3] - component_lack
226
+ if np.random.rand() < 0.6:
227
+ data_[3] = 1; data_[2] = 0;
228
+ else:
229
+ data_[3] = 0; data_[2] = 1;
230
+ else:
231
+ data_[2] = np.random.randint(0, Kol_Klassov); data_[3] = Kol_Klassov - data_[2];
232
+ if Kol_Klassov == 0: # data_[4] - config, data_[5] - config_lack
233
+ if np.random.rand() < 0.6:
234
+ data_[5] = 1; data_[4] = 0;
235
+ else:
236
+ data_[5] = 0; data_[4] = 1;
237
+ else:
238
+ data_[4] = np.random.randint(0, Kol_Klassov); data_[5] = Kol_Klassov - data_[4];
239
+ if Kol_Klassov == 0: # data_[6] - controller, data_[7] - controller_lack
240
+ if np.random.rand() < 0.6:
241
+ data_[7] = 1; data_[6] = 0;
242
+ else:
243
+ data_[7] = 0; data_[6] = 1;
244
+ else:
245
+ data_[6] = np.random.randint(0, Kol_Klassov); data_[7] = Kol_Klassov - data_[6];
246
+ if Kol_Klassov == 0: # data_[8] - entity, data_[9] - entity_lack
247
+ if np.random.rand() < 0.6:
248
+ data_[9] = 1; data_[8] = 0;
249
+ else:
250
+ data_[9] = 0; data_[8] = 1;
251
+ else:
252
+ data_[8] = np.random.randint(0, Kol_Klassov); data_[9] = Kol_Klassov - data_[8];
253
+ if Kol_Klassov == 0: # data_[10] - repository, data_[11] - repository_lack
254
+ if np.random.rand() < 0.6:
255
+ data_[11] = 1; data_[10] = 0;
256
+ else:
257
+ data_[11] = 0; data_[10] = 1;
258
+ else:
259
+ data_[10] = np.random.randint(0, Kol_Klassov); data_[11] = Kol_Klassov - data_[10];
260
+ if Kol_Klassov == 0: # data_[12] - service, data_[13] - service_lack
261
+ if np.random.rand() < 0.6:
262
+ data_[13] = 1; data_[12] = 0;
263
+ else:
264
+ data_[13] = 0; data_[12] = 1;
265
+ else:
266
+ data_[12] = np.random.randint(0, Kol_Klassov); data_[13] = Kol_Klassov - data_[12];
267
+ if Kol_Klassov == 0: # data_[14] - interface, data_[15] - interface_lack
268
+ if np.random.rand() < 0.6:
269
+ data_[15] = 1; data_[14] = 0;
270
+ else:
271
+ data_[15] = 0; data_[14] = 1;
272
+ else:
273
+ data_[14] = np.random.randint(0, Kol_Klassov); data_[15] = Kol_Klassov - data_[14];
274
+ if Kol_Klassov == 0: # data_[16] - interfimps, data_[17] - interfimps_lack
275
+ if np.random.rand() < 0.6:
276
+ data_[17] = 1; data_[16] = 0;
277
+ else:
278
+ data_[17] = 0; data_[16] = 1;
279
+ else:
280
+ data_[16] = np.random.randint(0, Kol_Klassov); data_[17] = Kol_Klassov - data_[16];
281
+
282
+ j = PokazKachastva_shag
283
+ while j <= PokazKachastva_Max:
284
+ for __ in range(KolSluchZadaniiPokazKachastva):
285
+ aa = random.uniform(0, j)
286
+ if aa < cyclomatic_complexity_Min: aa = cyclomatic_complexity_Min
287
+ data_[18] = aa # cyclomatic_complexity_lack
288
+ bb = random.uniform(2, 5)
289
+ aa = aa * bb
290
+ if aa < lines_of_code_Min: aa = lines_of_code_Min
291
+ data_[19] = aa # lines_of_code_lack
292
+ data_[20] = random.uniform(0, j / 10) # lambda_count_lack
293
+ aa = random.uniform(0, j / 2)
294
+ if aa < nesting_depth_Min: aa = nesting_depth_Min
295
+ data_[21] = aa # nesting_depth_lack
296
+ data_[22] = random.uniform(0, j / 10) # try_catch_count_lack
297
+
298
+ # Вручную преобразуем массив в список (без .tolist())
299
+ row_list = [data_[k] for k in range(len(data_))]
300
+ result_data.append(row_list)
301
+
302
+ j += PokazKachastva_shag
303
+
304
+ i += Parametr_shag
305
+
306
+ return result_data
307
+
308
+ # Подготовка данных перед вызовом njit-функции
309
+ # columns = [
310
+ # 'bean', 'bean_lack', 'component', 'component_lack', 'config', 'config_lack',
311
+ # 'controller', 'controller_lack', 'entity', 'entity_lack', 'repository', 'repository_lack',
312
+ # 'service', 'service_lack', 'interface', 'interface_lack', 'interfimps', 'interfimps_lack',
313
+ # 'cyclomatic_complexity_lack', 'lines_of_code_lack', 'lambda_count_lack',
314
+ # 'nesting_depth_lack', 'try_catch_count_lack', 'target'
315
+ # ]
316
+ columns = data.columns.tolist()
317
+
318
+ # Берём первую строку исходного DataFrame и конвертируем в numpy
319
+ data_init_np = data.iloc[0].to_numpy()
320
+
321
+ # Вызываем Numba-функцию
322
+ result_data = PolniPerebor_njit(data_init_np)
323
+
324
+ # Конвертируем результат в numpy-массив и удаляем строки с cyclomatic_complexity_lack == 0
325
+ result_np = np.array(result_data)
326
+ mask = result_np[:, 18] != 0
327
+ result_np = result_np[mask]
328
+
329
+ # Конвертируем обратно в DataFrame
330
+ data = pd.DataFrame(result_np, columns=columns)
331
+ # --------------------------------------------------------------------------------------------------------------------------------------------
332
+ '''
333
+
334
+
335
+
336
+
337
+
338
+ '''
339
+ # 2.1, 2.2. Генерация данных LOG, lack и target на основе перебора значений с заданным шагом --------------------------------------------------------------
340
+ def Gener_LOG_lack_target(data_data, Name_LOG, Name_LOG_lack, LOG_max, LOG_shag, target_max):
341
+ data_ = copy.deepcopy(data_data.iloc[0]) # Извлечение из датафрейма первой строки
342
+
343
+ if Name_LOG != '': # Если есть данные с LOG и с lack
344
+
345
+ i = 0
346
+ while i <= LOG_max: # Количество LOG
347
+
348
+ k = 0
349
+ while k <= LOG_max: # Количество LOG_lack
350
+
351
+ if i + k > LOG_max:
352
+ k = LOG_max
353
+ else:
354
+ if i + k != 0:
355
+ data_[Name_LOG] = i
356
+ data_[Name_LOG_lack] = k
357
+
358
+ summa = (i / (i + k))
359
+ targ = -(target_max - target_min) * summa + target_max
360
+ targ = targ * (2.5e-4 * k + 0.9997498749) # targ * [от 1 - до 1.5] # При i == 0 и одинаковом index: terg тем больше, чем больше k
361
+
362
+ if k == 0: # Множитель при Name_LOG_lack = 0
363
+ targ = targ * (-5.0e-4 * i + 2.0) # targ * [от 1 - до 2]
364
+
365
+ data_[target] = targ
366
+
367
+ data_data = data_data._append(data_)
368
+
369
+ k += LOG_shag
370
+
371
+ i += LOG_shag
372
+
373
+ else: # Если нет данных с LOG, есть только с lack
374
+
375
+ i = 0
376
+ while i <= LOG_max: # Количество LOG_lack
377
+
378
+ data_[Name_LOG_lack] = i
379
+
380
+ # if i > 0:
381
+ # targ = data_Min + ((target_max - data_Min) * i) / LOG_max - LOG_shag / i
382
+ # else:
383
+ # targ = data_Min + ((target_max - data_Min) * i) / LOG_max
384
+
385
+ targ = data_Min + ((target_max - data_Min) * i) / LOG_max
386
+
387
+ data_[target] = targ
388
+
389
+ data_data = data_data._append(data_)
390
+
391
+ i += LOG_shag
392
+
393
+ return data_data
394
+
395
+
396
+ data__ = copy.deepcopy(data)
397
+
398
+ # LOG_max = data_Max; LOG_shag = 10; target_max = 60; target_min = target_min
399
+
400
+ data_gen = Gener_LOG_lack_target(data__, 'bean', 'bean_lack', LOG_max=data_Max, LOG_shag=50, target_max=700)
401
+ data = data._append(data_gen); print(1)
402
+ data_gen = Gener_LOG_lack_target(data__, 'component', 'component_lack', LOG_max=data_Max, LOG_shag=50, target_max=300)
403
+ data = data._append(data_gen); print(2)
404
+ data_gen = Gener_LOG_lack_target(data__, 'config', 'config_lack', LOG_max=data_Max, LOG_shag=50, target_max=700)
405
+ data = data._append(data_gen); print(3)
406
+ data_gen = Gener_LOG_lack_target(data__, 'controller', 'controller_lack', LOG_max=data_Max, LOG_shag=50, target_max=500)
407
+ data = data._append(data_gen); print(4)
408
+ data_gen = Gener_LOG_lack_target(data__, 'entity', 'entity_lack', LOG_max=data_Max, LOG_shag=50, target_max=500)
409
+ data = data._append(data_gen); print(5)
410
+ data_gen = Gener_LOG_lack_target(data__, 'repository', 'repository_lack', LOG_max=data_Max, LOG_shag=50, target_max=1000)
411
+ data = data._append(data_gen); print(6)
412
+ data_gen = Gener_LOG_lack_target(data__, 'service', 'service_lack', LOG_max=data_Max, LOG_shag=50, target_max=1200)
413
+ data = data._append(data_gen); print(7)
414
+ data_gen = Gener_LOG_lack_target(data__, 'interface', 'interface_lack', LOG_max=data_Max, LOG_shag=50, target_max=500)
415
+ data = data._append(data_gen); print(8)
416
+ data_gen = Gener_LOG_lack_target(data__, 'interfimps', 'interfimps_lack', LOG_max=data_Max, LOG_shag=50, target_max=500)
417
+ data = data._append(data_gen); print(9)
418
+
419
+ data_gen = Gener_LOG_lack_target(data__, '', 'cyclomatic_complexity_lack', LOG_max=data_Max, LOG_shag=50, target_max=1300)
420
+ data = data._append(data_gen); print(10)
421
+ data_gen = Gener_LOG_lack_target(data__, '', 'lines_of_code_lack', LOG_max=data_Max, LOG_shag=50, target_max=1000)
422
+ data = data._append(data_gen); print(11)
423
+ data_gen = Gener_LOG_lack_target(data__, '', 'lambda_count_lack', LOG_max=data_Max, LOG_shag=50, target_max=500)
424
+ data = data._append(data_gen); print(12)
425
+ data_gen = Gener_LOG_lack_target(data__, '', 'nesting_depth_lack', LOG_max=data_Max, LOG_shag=50, target_max=800)
426
+ data = data._append(data_gen); print(13)
427
+ data_gen = Gener_LOG_lack_target(data__, '', 'try_catch_count_lack', LOG_max=data_Max, LOG_shag=50, target_max=500)
428
+ data = data._append(data_gen); print(14)
429
+ # ----------------------------------------------------------------------------------------------------------------------------------------------------------
430
+ '''
431
+
432
+
433
+ '''
434
+ data = data.drop_duplicates(keep=False)
435
+
436
+ # Удаление индексов строк из датафрейма
437
+ data = data.reset_index(drop=True)
438
+ print('data.shape = ', data.shape)
439
+
440
+
441
+ # Удаление дублирующихся строк, оставлены первые вхождения
442
+ data = data.drop_duplicates(subset=num_features)
443
+ print('data.shape = ', data.shape)
444
+
445
+ # Удаление строк из data не удовлетворяющих условиям: < data_Max и >= data_Min
446
+ #data = data.loc[data[target] < data_Max]
447
+ #data = data.loc[data[target] >= data_Min]
448
+ #for col in num_features:
449
+ # data = data.loc[data[col] < data_Max]
450
+ #print('data.shape = ', data.shape)
451
+
452
+ # Сохранение модифицированного датасета в файл
453
+ data.to_excel('Modules_Error_.xlsx', index=False)
454
+ print('Файл сохранён.')
455
+ '''
456
+
457
+
458
+
459
+
460
+
461
+
462
+ '''
463
+ # 3.1. Увеличение количества строк в датасете на основе случайного изменения исходного датасета --------------------------------------
464
+ def Gener_LOG_lack(Name_LOG, Name_LOG_lack, j):
465
+
466
+ a = data_.at[j, Name_LOG]
467
+ if (a == 0) and (np.random.random() >= 0.5): a = data_Min
468
+ a = abs(np.random.normal(a, a * SKO_random_normal, 1))
469
+ if a > data_Max: a = data_Max - 1
470
+ b = data_.at[j, Name_LOG_lack]
471
+ if (b == 0) and (np.random.random() >= 0.5): b = data_Min
472
+ b = abs(np.random.normal(b, b * SKO_random_normal, 1))
473
+ if b > data_Max: d = data_Max - 1
474
+ data_.at[j, Name_LOG] = a
475
+ data_.at[j, Name_LOG_lack] = b
476
+
477
+ return data_.at[j, Name_LOG], data_.at[j, Name_LOG_lack]
478
+
479
+ def Gener_lack(Name_LOG_lack, j):
480
+
481
+ b = data_.at[j, Name_LOG_lack]
482
+ if (b == 0) and (np.random.random() >= 0.5): b = data_Min
483
+ b = abs(np.random.normal(b, b * SKO_random_normal, 1))
484
+ if b > data_Max: d = data_Max - 1
485
+ data_.at[j, Name_LOG_lack] = b
486
+
487
+ return data_.at[j, Name_LOG_lack]
488
+
489
+ data_ = copy.deepcopy(data)
490
+ data__ = copy.deepcopy(data)
491
+
492
+ np.random.seed(0)
493
+ data_shape_0 = data.shape[0]
494
+
495
+ for i in range(num_increment_cycles):
496
+ print(i)
497
+
498
+ for j in range(data_shape_0):
499
+
500
+ data_.at[j, 'bean'], data_.at[j, 'bean_lack'] = Gener_LOG_lack('bean', 'bean_lack', j)
501
+ data_.at[j, 'component'], data_.at[j, 'component_lack'] = Gener_LOG_lack('component', 'component_lack', j)
502
+ data_.at[j, 'config'], data_.at[j, 'config_lack'] = Gener_LOG_lack('config', 'config_lack', j)
503
+ data_.at[j, 'controller'], data_.at[j, 'controller_lack'] = Gener_LOG_lack('controller', 'controller_lack', j)
504
+ data_.at[j, 'entity'], data_.at[j, 'entity_lack'] = Gener_LOG_lack('entity', 'entity_lack', j)
505
+ data_.at[j, 'repository'], data_.at[j, 'repository_lack'] = Gener_LOG_lack('repository', 'repository_lack', j)
506
+ data_.at[j, 'service'], data_.at[j, 'service_lack'] = Gener_LOG_lack('service', 'service_lack', j)
507
+ data_.at[j, 'interface'], data_.at[j, 'interface_lack'] = Gener_LOG_lack('interface', 'interface_lack', j)
508
+ data_.at[j, 'interfimps'], data_.at[j, 'interfimps_lack'] = Gener_LOG_lack('interfimps', 'interfimps_lack', j)
509
+
510
+ data_.at[j, 'cyclomatic_complexity_lack'] = Gener_lack('cyclomatic_complexity_lack', j)
511
+ data_.at[j, 'lines_of_code_lack'] = Gener_lack('lines_of_code_lack', j)
512
+ data_.at[j, 'lambda_count_lack'] = Gener_lack('lambda_count_lack', j)
513
+ data_.at[j, 'nesting_depth_lack'] = Gener_lack('nesting_depth_lack', j)
514
+ data_.at[j, 'try_catch_count_lack'] = Gener_lack('try_catch_count_lack', j)
515
+
516
+ #data_.at[j, 'target'] = Gener_lack('target', j)
517
+
518
+ data = data._append(data_)
519
+ data_ = copy.deepcopy(data__)
520
+ # ----------------------------------------------------------------------------------------------------------------------
521
+ '''
522
+
523
+
524
+ '''
525
+ # 3.2, 5.2. Вычисление количества ошибок (target) на основе количества и соотношения LOG, lack в реальных данных ---------------------------------
526
+ @njit
527
+ def Gener_target_njit(data_np, columns_idx, Name_LOG, Name_LOG_lack, target_min, target_max, j):
528
+ targ = 0.0
529
+
530
+ if Name_LOG != '': # Если есть данные с LOG и с lack
531
+ i_idx = columns_idx[Name_LOG]
532
+ k_idx = columns_idx[Name_LOG_lack]
533
+ i = data_np[j, i_idx]
534
+ k = data_np[j, k_idx]
535
+
536
+ if i + k != 0:
537
+ index = i / (i + k)
538
+ targ = -(target_max - target_min) * index + target_max
539
+ targ = targ * (2.5e-4 * k + 0.9997498749) # targ * [от 1 - до 1.5] # При i == 0 и одинаковом index: terg тем больше, чем больше k
540
+ if k == 0:
541
+ targ = targ * (-5.0e-4 * i + 2.0)
542
+ else: # Если нет данных с LOG, есть только с lack
543
+ k_idx = columns_idx[Name_LOG_lack]
544
+ i = data_np[j, k_idx]
545
+ targ = data_Min + ((target_max - data_Min) * i) / data_Max
546
+
547
+ return targ
548
+
549
+ @njit
550
+ def Opred_target_njit(data_np, columns_idx, target_idx):
551
+ target_min = 1
552
+ np.random.seed(0)
553
+ data_shape_0 = data_np.shape[0]
554
+
555
+ for j in range(data_shape_0):
556
+ if j % 5000 == 0:
557
+ print(j)
558
+
559
+ target_summ = 0.0
560
+ target_summ += Gener_target_njit(data_np, columns_idx, 'bean', 'bean_lack', target_min, 350, j)
561
+ target_summ += Gener_target_njit(data_np, columns_idx, 'component', 'component_lack', target_min, 150, j)
562
+ target_summ += Gener_target_njit(data_np, columns_idx, 'config', 'config_lack', target_min, 350, j)
563
+ target_summ += Gener_target_njit(data_np, columns_idx, 'controller', 'controller_lack', target_min, 250, j)
564
+ target_summ += Gener_target_njit(data_np, columns_idx, 'entity', 'entity_lack', target_min, 250, j)
565
+ target_summ += Gener_target_njit(data_np, columns_idx, 'repository', 'repository_lack', target_min, 500, j)
566
+ target_summ += Gener_target_njit(data_np, columns_idx, 'service', 'service_lack', target_min, 600, j)
567
+ target_summ += Gener_target_njit(data_np, columns_idx, 'interface', 'interface_lack', target_min, 250, j)
568
+ target_summ += Gener_target_njit(data_np, columns_idx, 'interfimps', 'interfimps_lack', target_min, 250, j)
569
+
570
+ target_summ += Gener_target_njit(data_np, columns_idx, '', 'cyclomatic_complexity_lack', target_min, 650, j)
571
+ target_summ += Gener_target_njit(data_np, columns_idx, '', 'lines_of_code_lack', target_min, 500, j)
572
+ target_summ += Gener_target_njit(data_np, columns_idx, '', 'lambda_count_lack', target_min, 250, j)
573
+ target_summ += Gener_target_njit(data_np, columns_idx, '', 'nesting_depth_lack', target_min, 400, j)
574
+ target_summ += Gener_target_njit(data_np, columns_idx, '', 'try_catch_count_lack', target_min, 250, j)
575
+
576
+ data_np[j, target_idx] = target_summ
577
+
578
+ return data_np
579
+
580
+ # Подготовка данных перед вызовом функций
581
+ columns = data.columns.tolist()
582
+
583
+ # Создаем Numba-совместимый словарь (исправленная версия)
584
+ columns_idx = Dict.empty(
585
+ key_type=types.unicode_type, # Используем unicode_type вместо unicode_string
586
+ value_type=types.int64
587
+ )
588
+ for idx, col in enumerate(columns):
589
+ columns_idx[col] = idx
590
+
591
+ target_idx = columns_idx['target']
592
+
593
+ # Конвертируем DataFrame в numpy array
594
+ data_np = data.to_numpy().astype(np.float64) # Явно указываем тип float64 для Numba
595
+
596
+ # Вызываем Numba-функцию
597
+ result_np = Opred_target_njit(data_np, columns_idx, target_idx)
598
+
599
+ # Конвертируем обратно в DataFrame
600
+ data = pd.DataFrame(result_np, columns=columns)
601
+ # -------------------------------------------------------------------------------------------------------------------------------------------
602
+ '''
603
+
604
+
605
+
606
+
607
+
608
+
609
+ '''
610
+ # Удаление дублирующихся строк, оставлены первые вхождения
611
+ data = data.drop_duplicates(subset=num_features)
612
+ print('data.shape = ', data.shape)
613
+
614
+ # Удаление строк из data не удовлетворяющих условиям: < data_Max и >= data_Min
615
+ #data = data.loc[data[target] < data_Max]
616
+ #data = data.loc[data[target] >= data_Min]
617
+ #for col in num_features:
618
+ # data = data.loc[data[col] < data_Max]
619
+ #print('data.shape = ', data.shape)
620
+
621
+ # Сохранение модифицированного датасета в файл
622
+ data.to_excel('Modules_Error_.xlsx', index=False)
623
+ print('Файл сохранён.')
624
+
625
+
626
+ # Чтение данных
627
+ data = pd.read_excel('Modules_Error_.xlsx')
628
+ data = data.astype(float)
629
+ data.shape
630
+ print('Данные загружены, data.shape = ', data.shape)
631
+ '''
632
+
633
+
634
+
635
+
636
+
637
+ '''
638
+ # Чтение данных
639
+ data = pd.read_excel('Modules_Error_.xlsx')
640
+ data = data.astype(float)
641
+ data.shape
642
+ print('Данные загружены, data.shape = ', data.shape)
643
+ '''
644
+
645
+
646
+
647
+ '''
648
+ # 2.3, 3.3, 5.3. Зашумление исходного датасета - внесение случайной составляющей в значения входных показателей и target -----
649
+ # Без увеличения количества строк в датасете
650
+ @njit
651
+ def Zashumlenie_njit(data_np, target_idx, LOG_cols_idx, lack_cols_idx):
652
+ K_SKO=0.0001
653
+ np.random.seed(0)
654
+ data_shape_0 = data_np.shape[0]
655
+
656
+ for i in range(data_shape_0):
657
+ if i % 5000 == 0: print(i)
658
+
659
+ # Обработка target
660
+ Delta = np.random.normal(0, abs(data_np[i, target_idx] * K_SKO))
661
+ data_np[i, target_idx] += Delta
662
+ if data_np[i, target_idx] <= 0:
663
+ data_np[i, target_idx] = abs(np.random.normal(0, K_SKO))
664
+
665
+ if Delta > 0: # Ошибки возросли
666
+ for col_idx in LOG_cols_idx: # Уменьшаем логирование
667
+ delta = abs(np.random.normal(0, abs(data_np[i, col_idx] * K_SKO)))
668
+ data_np[i, col_idx] -= delta
669
+ if data_np[i, col_idx] <= 0:
670
+ data_np[i, col_idx] = abs(np.random.normal(0, K_SKO * 0.5))
671
+ for col_idx in lack_cols_idx: # Увеличиваем отсутствие логирования
672
+ delta = abs(np.random.normal(0, abs(data_np[i, col_idx] * K_SKO)))
673
+ data_np[i, col_idx] += delta
674
+ if data_np[i, col_idx] <= 0:
675
+ data_np[i, col_idx] = abs(np.random.normal(0, K_SKO))
676
+ else: # Ошибки уменьшились
677
+ for col_idx in LOG_cols_idx: # Увеличиваем логирование
678
+ delta = abs(np.random.normal(0, abs(data_np[i, col_idx] * K_SKO)))
679
+ data_np[i, col_idx] += delta
680
+ if data_np[i, col_idx] <= 0:
681
+ data_np[i, col_idx] = abs(np.random.normal(0, K_SKO))
682
+ for col_idx in lack_cols_idx: # Уменьшаем отсутствие логирования
683
+ delta = abs(np.random.normal(0, abs(data_np[i, col_idx] * K_SKO)))
684
+ data_np[i, col_idx] -= delta
685
+ if data_np[i, col_idx] <= 0:
686
+ data_np[i, col_idx] = abs(np.random.normal(0, K_SKO * 0.5))
687
+
688
+ return data_np
689
+
690
+ # Подготовка данных перед вызовом функции
691
+ columns = data.columns.tolist()
692
+ num_features = [col for col in columns if col != 'target']
693
+ lack_cols = [x for x in num_features if '_lack' in x]
694
+ LOG_cols = [x for x in num_features if not '_lack' in x]
695
+
696
+ # Получаем индексы колонок
697
+ target_idx = columns.index('target')
698
+ LOG_cols_idx = [columns.index(col) for col in LOG_cols]
699
+ lack_cols_idx = [columns.index(col) for col in lack_cols]
700
+
701
+ # Конвертируем DataFrame в numpy array
702
+ data_np = data.to_numpy()
703
+
704
+ # Вызываем Numba-функцию
705
+ result_np = Zashumlenie_njit(data_np, target_idx, LOG_cols_idx, lack_cols_idx)
706
+
707
+ # Конвертируем обратно в DataFrame
708
+ data = pd.DataFrame(result_np, columns=columns)
709
+ #-------------------------------------------------------------------------------------------------------------------------
710
+ '''
711
+
712
+
713
+
714
+
715
+
716
+ # Умножение на число ------------------------------------------------------------------------------------------------
717
+ #data = data / 10
718
+ # -------------------------------------------------------------------------------------------------------------------
719
+
720
+
721
+ # Удаление дублирующихся строк, оставлены первые вхождения
722
+ data = data.drop_duplicates(subset=num_features)
723
+ print('data.shape = ', data.shape)
724
+
725
+ # Удаление строк из data не удовлетворяющих условиям: < data_Max и >= data_Min
726
+ data = data.loc[data[target] < data_Max]
727
+ #data = data.loc[data[target] >= data_Min]
728
+ for col in num_features:
729
+ data = data.loc[data[col] < data_Max]
730
+ data.shape
731
+ print('Удаление строк из data не удовлетворяющих условиям: < data_Max и >= data_Min')
732
+ print('data.shape = ', data.shape)
733
+
734
+ # Сохранение модифицированного датасета в файл
735
+ data.to_excel('Modules_Error_.xlsx', index=False)
736
+ print('Файл сохранён.')
737
+
738
+
739
+
740
+
741
+ '''
742
+ # Многомерный анализ и определение корреляций --------------------------------------------------------------------------
743
+ correl = data.corr()
744
+ cmap = sb.diverging_palette(220, 10, as_cmap = True)
745
+
746
+ mask = np.zeros_like(correl, dtype = np.bool_)
747
+ mask[np.triu_indices_from(mask)] = True
748
+
749
+ f, ax = plt.subplots(figsize = (30, 30))
750
+
751
+ sb.heatmap(correl, mask = mask, cmap = cmap, vmax = 0.9, center = 0, annot = True, square = True, linewidths = 0.2, cbar_kws = {"shrink": .5});
752
+ # ----------------------------------------------------------------------------------------------------------------------
753
+
754
+ from sklearn.model_selection import train_test_split
755
+ # разбиение на признаки и целевую переменную
756
+ X = data.drop(columns=[target])
757
+ y = data[target]
758
+ print('X.shape = ', X.shape,' y.shape = ', y.shape)
759
+ #print(y)
760
+
761
+ # заполнение пропусков
762
+ strategy = 'median'
763
+ nan_cols = X.columns[X.isna().any()].tolist()
764
+ for col in nan_cols:
765
+ #print(col)
766
+ imputer = SimpleImputer(strategy=strategy)
767
+ X[col] = imputer.fit_transform(np.array(X[col]).reshape(-1, 1))
768
+ print(X[col])
769
+
770
+ # Преобразование X и y в массив numpy
771
+ X, y = np.array(X), np.array(y)
772
+
773
+ # # Ограничение выбросов в данных
774
+ # for i in range(X.shape[0]):
775
+ # for j in range(X.shape[1]):
776
+ # if X[i][j] > X_max: X[i][j] = X_max + np.random.normal(0, SKO_random_normal, 1) # MO, SKO, Кол-во
777
+
778
+ # for i in range(y.shape[0]):
779
+ # if y[i] > y_max: y[i] = y_max + np.random.normal(0, SKO_random_normal, 1) # MO, SKO, Кол-во
780
+
781
+ # Визуализация входных данных модели -------------------------------------------------------------------------------------
782
+ plt.figure(figsize = (18,7))
783
+ #for i in range(10):
784
+ for i in range(len(X)):
785
+ plt.plot(X[i])
786
+ plt.show()
787
+ plt.close()
788
+
789
+ # Визуализация целевых данных
790
+ plt.figure(figsize = (18,7))
791
+ #plt.plot(y[:100])
792
+ plt.plot(y)
793
+ plt.show()
794
+ plt.close()
795
+
796
+ # Визуализация столбцов входных данных модели X_train
797
+ X_t = X.reshape(-1, X.shape[0])
798
+ # print('X_t.shape: ', X_t.shape)
799
+ plt.figure(figsize = (18,10))
800
+ for i in range(X_t.shape[0]):
801
+ plt.plot(X_t[i])
802
+ # plt.subplot(611)
803
+ # plt.plot(X_t[0])
804
+ plt.show()
805
+ plt.close()
806
+ '''
807
+
808
+
809
+
810
+
811
+
812
+ # # Проверка качества модели на реальных (не синтезированных данных)
813
+ # # Загрузка готовой модели из файла или папки
814
+ # #*************************************************************************************************************
815
+ # model_name = 'Model_Logging_Error_LSTM_30102024.keras'
816
+ # print()
817
+ # print('Загрузка готовой модели из файла\n')
818
+ # model_ = keras.models.load_model(model_name)
819
+ # #model.summary()
820
+
821
+ # #model_ = model
822
+
823
+ # # Прогнозирование - тестирование качества модели на тестовых данных ************************************************************
824
+ # max_y = data_Max
825
+ # max_X = data_Max
826
+ # Dobavka = 0
827
+
828
+ # X_test = X / max_X
829
+ # y_test = y
830
+
831
+ # predictions = model_.predict(X_test)
832
+
833
+ # # Возврат масштабированных прогнозных данных обратно к их фактическим значениям.
834
+ # # y_test = y_test.reshape(-1, 1)
835
+ # # y_test = scaler_y.inverse_transform(y_test)
836
+ # # predictions = scaler_y.inverse_transform(predictions)
837
+ # predictions = predictions * max_y
838
+ # predictions = predictions - Dobavka
839
+
840
+ # # Не должно быть отрицательных значений
841
+ # for i in range(len(predictions)):
842
+ # if predictions[i] < 0: predictions[i] = 0
843
+ # #print('y = ', predictions)
844
+
845
+ # def print_result_regression(y_true, y_pred):
846
+ # r2 = r2_score(y_true, y_pred)
847
+ # mae = mean_absolute_error(y_true, y_pred)
848
+ # rmse = mean_squared_error(y_true, y_pred)**0.5
849
+ # print(f'''
850
+ # r2: {r2:.4f}
851
+ # mae: {mae:.4f}
852
+ # rmse: {rmse:.4f}
853
+ # ''')
854
+ # return f'{r2:.4f}',f'{mae:.4f}',f'{rmse:.4f}'
855
+
856
+ # # Контроль показателей качества работы модели по тестовой выборке
857
+ # r2, mae, rmse = print_result_regression(y_test, predictions)
858
+
859
+ # # Вывод нескольких последних значений цели и прогноза
860
+ # print(' Цель Прогноз Отклонение')
861
+ # for i in range(len(predictions)-30, len(predictions)):
862
+ # print(f''' {y_test[i]:8.4f} {predictions[i][0]:8.4f} {abs(y_test[i] - predictions[i][0]):8.4f} ''')
863
+
864
+
865
+ --------------------------------------------------------------------------------------------------------------------
866
+
867
+ Дан датафрейм data с колонками:
868
+ 'bean'
869
+ 'bean_lack'
870
+ 'component'
871
+ 'component_lack'
872
+ 'config'
873
+ 'config_lack'
874
+ 'controller'
875
+ 'controller_lack'
876
+ 'entity'
877
+ 'entity_lack'
878
+ 'repository'
879
+ 'repository_lack'
880
+ 'service'
881
+ 'service_lack'
882
+ 'interface'
883
+ 'interface_lack'
884
+ 'interfimps'
885
+ 'interfimps_lack'
886
+ 'cyclomatic_complexity_lack'
887
+ 'lines_of_code_lack'
888
+ 'lambda_count_lack'
889
+ 'nesting_depth_lack'
890
+ 'try_catch_count_lack'
891
+ 'target'
892
+
893
+ и даны функции:
894
+ @njit
895
+ def Gener_target(Name_LOG, Name_LOG_lack, target_min, target_max, j):
896
+
897
+ if Name_LOG != '': # Если есть данные с LOG и с lack
898
+
899
+ targ = 0
900
+ i = data.at[j, Name_LOG]
901
+ k = data.at[j, Name_LOG_lack]
902
+ if i + k != 0:
903
+ index = (i / (i + k))
904
+ targ = -(target_max - target_min) * index + target_max
905
+ targ = targ * (2.5e-4 * k + 0.9997498749) # targ * [от 1 - до 1.5] # При i == 0 и одинаковом index: terg тем больше, чем больше k
906
+
907
+ if k == 0: # Множитель при Name_LOG_lack = 0
908
+ targ = targ * (-5.0e-4 * i + 2.0) # targ * [от 1 - до 2]
909
+
910
+ else: # Если нет данных с LOG, есть только с lack
911
+
912
+ targ = 0
913
+ i = data.at[j, Name_LOG_lack]
914
+ targ = data_Min + ((target_max - data_Min) * i) / data_Max
915
+
916
+ return targ
917
+
918
+ @njit
919
+ def Opred_target():
920
+
921
+ target_min = 1
922
+ np.random.seed(0)
923
+ data_shape_0 = data.shape[0]
924
+
925
+ for j in range(data_shape_0):
926
+ if j % 5000 == 0: print(j)
927
+
928
+ target_summ = 0
929
+ target_summ = target_summ + Gener_target('bean', 'bean_lack', target_min, 350, j)
930
+ target_summ = target_summ + Gener_target('component', 'component_lack', target_min, 150, j)
931
+ target_summ = target_summ + Gener_target('config', 'config_lack', target_min, 350, j)
932
+ target_summ = target_summ + Gener_target('controller', 'controller_lack', target_min, 250, j)
933
+ target_summ = target_summ + Gener_target('entity', 'entity_lack', target_min, 250, j)
934
+ target_summ = target_summ + Gener_target('repository', 'repository_lack', target_min, 500, j)
935
+ target_summ = target_summ + Gener_target('service', 'service_lack', target_min, 600, j)
936
+ target_summ = target_summ + Gener_target('interface', 'interface_lack', target_min, 250, j)
937
+ target_summ = target_summ + Gener_target('interfimps', 'interfimps_lack', target_min, 250, j)
938
+
939
+ target_summ = target_summ + Gener_target('', 'cyclomatic_complexity_lack', target_min, 650, j)
940
+ target_summ = target_summ + Gener_target('', 'lines_of_code_lack', target_min, 500, j)
941
+ target_summ = target_summ + Gener_target('', 'lambda_count_lack', target_min, 250, j)
942
+ target_summ = target_summ + Gener_target('', 'nesting_depth_lack', target_min, 400, j)
943
+ target_summ = target_summ + Gener_target('', 'try_catch_count_lack', target_min, 250, j)
944
+
945
+ data.at[j, target] = target_summ
946
+
947
+ return data
948
+
949
+ data = Opred_target(data)
950
+
951
+ Как преобразовать код, чтобы функции Gener_target и Opred_target работали с @njit ?
952
+
953
+
954
+
955
+
956
+
957
+