<jupyter_start><jupyter_text>Загрузка данных<jupyter_code>dataset_place = 'test_additional.csv'
test = pd.read_csv(dataset_place)<jupyter_output><empty_output><jupyter_text>Генерация признаков<jupyter_code># Функция для подсчета дистанции между 2 точками
def dist(x_0, x_1):
    return ((x_0[0] - x_1[0]) ** 2 + (x_0[1] - x_1[1]) ** 2) ** (1/2)
# Импортируем необходимые для предсказаний переменный, которые мы получили при обучение модели
import pickle
with open('bst.pickle', 'rb') as f:
    bst, best_k = pickle.load(f)
    
with open('additional_data.pickle', 'rb') as f:
    global_mean, mean_dict, cnt_dict  = pickle.load( f)
    
train_cols = ['ETA', 'latitude', 'del_latitude', 'longitude', 'del_longitude', 'hour', 'weekday', 'e_speed', 'dist',
              'dist_center_start', 'div_dist', 'mean_speed_encoding', 'len_route', 'max_route_part']
def predict(test, bst, best_k, global_mean, mean_dict, cnt_dict):
    # Переводим время в нужный формат
    test['OrderedDate'] = pd.to_datetime(test['OrderedDate'])
    # Добавляем час и день недели
    test['hour'] = test['OrderedDate'].dt.hour
    test['weekday'] = test['OrderedDate'].dt.weekday
    # Считаем предпологаемую скорость
    test['e_speed'] = test['ETA'] / test['EDA']
    # Считаем дистанцию между началом и концом маршрута
    test['dist'] = dist([test['latitude'].values, test['longitude'].values], 
                [test['del_latitude'].values, test['del_longitude'].values])
    # Считаем дистанцию между началом маршрута и центром города
    test['dist_center_start'] = dist([test['latitude'].values, test['longitude'].values], 
                [test['center_latitude'].values, test['center_longitude'].values])
    # Смотрим отношения расстояния между началом и концом маршрута к предпологаемому расстоянию
    test['div_dist'] = test['dist'] / test['EDA']

    alpha = 20
    test['hour_locality'] = test['hour'].astype(str) + '_' + test['main_id_locality'].astype(str)
    # Считаем реальную среднюю скорость
    test['mean_speed_encoding'] = -1
    # сглаженная средняя скорость
    mean_target = []
    for x in test['hour_locality'].values:
        mean_target += [(alpha * global_mean + mean_dict.get(x, 0) * cnt_dict.get(x, 0)) / (alpha + cnt_dict.get(x, 0))]
    test['mean_speed_encoding'] = mean_target
    # Для предпологаемых путей посчитаем количество точек в маршруте
    route_list = []
    for route in test['route'].values:
        if route == route:
            route_list += [polyline.decode(route)]
        else:
            route_list += [()]
    test['len_route'] = [len(x) for x in route_list]
    # И посчитаем максимульную для между точками в каждом маршруте
    dist_route_list = []
    for route in route_list:
        dist_route_list += [[dist(x_0, x_1) for x_0, x_1 in zip(route[:-1], route[1:])]]
    test['max_route_part'] = [max(x) if len(x) > 0 else -1 for x in dist_route_list]
    # предсказываем ответ
    answer = np.clip(bst.predict(test[train_cols].values), 0, 2) * test['ETA'] - test['ETA'] * best_k
    return answer<jupyter_output><empty_output><jupyter_text>Проверим скорость предикта<jupyter_code>%%time
test_val = test.loc[[0], :].copy()
for x in range(1000):
    answer = predict(test_val, bst, best_k, global_mean, mean_dict, cnt_dict)
print('TIME FOR 1 PREDICT: 16.8 ms' )<jupyter_output>TIME FOR 1 PREDICT: 16.8 ms
{'fraction_non_alphanumeric': 0.144524236983842, 'fraction_numerical': 0.013165769000598444, 'mean_word_length': 4.248037676609105, 'pattern_counts': {'":': 0, '<': 12, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '391318', 'license': 'MIT', 'n_tokens_mistral': 1273, 'n_tokens_neox': 1350, 'n_words': 268, 'path': 'Inference.ipynb', 'repo_name': 'ArefievMC/Citimobil_MiptHack', 'size': '3342'}