PostgreSQL и MongoDB: два подхода к управлению данными
В мире баз данных существует множество решений, каждое из которых подходит для определённых задач. Два популярных представителя — это PostgreSQL и MongoDB. Они представляют собой разные подходы к хранению и обработке данных: реляционный и документоориентированный. Рассмотрим их основные особенности.
PostgreSQL: мощь реляционных баз данных
PostgreSQL — это объектно-реляционная система управления базами данных (СУБД) с открытым исходным кодом. Она поддерживает SQL (Structured Query Language) и предлагает широкие возможности для работы со структурированными данными. PostgreSQL известна своей надёжностью, поддержкой транзакций ACID (атомарность, согласованность, изолированность, долговечность) и расширяемостью.
Преимущества PostgreSQL:
-
Поддержка сложных запросов и JOIN-операций.
-
Высокая согласованность данных.
-
Возможность создания пользовательских типов данных и функций.
-
Поддержка JSON и JSONB для работы с полуструктурированными данными.
-
Широкие возможности для аналитики и работы с большими объёмами данных.
from sqlalchemy import create_engine # Параметры подключения к базе данных host = 'localhost:5432' # Например, localhost database = 'first_db' user = 'postgres' password = 'password' # Создаем строку подключения и создаем engine engine = create_engine(f'postgresql://{user}:{password}@{host}/{database}') # Устанавливаем подключение к базе данных connection = engine.raw_connection() connection # Напишем SQL-запрос query = "SELECT * FROM *" # Замените на свой запрос # Загружаем данные в DataFrame df = pd.read_sql(query, connection)
PostgreSQL отлично подходит для приложений, где важна целостность данных, сложные запросы и структурированные схемы, например, финансовые системы, CRM или ERP-системы.
MongoDB: гибкость документоориентированного подхода
MongoDB — это NoSQL-база данных, которая хранит данные в формате BSON (бинарный JSON). В отличие от PostgreSQL, MongoDB не требует строгой схемы данных, что делает её более гибкой для работы с быстро изменяющимися или неструктурированными данными.
Преимущества MongoDB:
-
Гибкость схемы: данные могут быть изменены без необходимости пересоздания таблиц.
-
Высокая производительность для операций чтения и записи.
-
Масштабируемость: поддержка горизонтального масштабирования через шардирование.
-
Удобство работы с иерархическими и вложенными данными.
-
Подходит для работы с большими объёмами данных в реальном времени.
MongoDB часто используется в приложениях, где важна скорость разработки и гибкость, например, в социальных сетях, IoT-платформах или системах с большим количеством пользовательских данных.
from pymongo import MongoClient # подключаемся к нашему клиенту client = MongoClient("mongodb://localhost:27017/") # выбираем базу данных mydb = client['db'] # выводим список доступных таблиц mydb.list_collection_names() # создаем коллекции данных по таблице collection1 = mydb['tb'] # Извлекаем данные из коллекций data1 = list(collection1.find()) # Преобразуем данные в DataFrame df1 = pd.DataFrame(data1)
PostgreSQL vs MongoDB: что выбрать?
Выбор между PostgreSQL и MongoDB зависит от задач вашего проекта. Если вам нужна строгая структура данных, сложные запросы и высокая согласованность, PostgreSQL будет лучшим выбором. Если же ваши данные часто меняются, имеют сложную иерархию или вам нужно быстро масштабироваться, MongoDB может оказаться более подходящим решением.
В некоторых случаях эти две системы могут использоваться вместе, например, PostgreSQL для хранения структурированных данных, а MongoDB — для работы с неструктурированными или полуструктурированными данными.
Таким образом, и PostgreSQL, и MongoDB имеют свои сильные стороны, и правильный выбор зависит от специфики вашего проекта.
import pandas as pd import numpy as np from collections import Counter from tqdm.notebook import tqdm from sklearn.ensemble import RandomForestRegressor, VotingRegressor from catboost import CatBoostRegressor from sklearn.neighbors import KNeighborsRegressor from lightgbm import LGBMRegressor from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder, StandardScaler, MinMaxScaler, RobustScaler from sklearn.decomposition import PCA from sklearn.model_selection import PredefinedSplit from sklearn.model_selection import GridSearchCV df = pd.read_csv('train.zip', compression='zip', sep='\t') df df.duplicated().sum() df.columns # # mb # df = df[[col for col in df.columns if not col.startswith('mb_')]] # df df.info() Counter(df.target) df.isna().sum().sum() # # df.fillna(df.mean(), inplace=True) # df.fillna(df.median(), inplace=True) # df.isna().sum().sum() # df1 = df[df.target == 1] # df1 # df0 = df[df.target == 0] # df0 # # удаление выбросов # for col in df.columns[:-1]: # mean = df1[col].mean() # std = df1[col].std() # threshold = 3 # df1 = df1[(df1[col] < mean + threshold * std) & (df1[col] > mean - threshold * std)] # df1 # # удаление выбросов # for col in df.columns[:-1]: # mean = df0[col].mean() # std = df0[col].std() # threshold = 3 # df0 = df0[(df0[col] < mean + threshold * std) & (df0[col] > mean - threshold * std)] # df0 # df = pd.concat([df1, df0], axis=0) # df Counter(df.target) test = pd.read_csv('test.zip', compression='zip', sep='\t', index_col=0) test # # mb # test = test[[col for col in test.columns if not col.startswith('mb_')]] # test test.isna().sum().sum() # # test.fillna(test.mean(), inplace=True) # test.fillna(df.median(), inplace=True) # test.isna().sum().sum() X = df.drop(['target'], axis=1) X # scaler = StandardScaler() # X = pd.DataFrame(data=scaler.fit_transform(X)) # X # pca = PCA(n_components=30) # X = pd.DataFrame(data=pca.fit_transform(X)) # X y = df.target y X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y) # knn knn = KNeighborsRegressor(n_jobs=-1) knn.fit(X, y) #Проведем оценку модели # mae = mean_absolute_error(knn.predict(X_test), y_test) # mse = mean_squared_error(knn.predict(X_test), y_test) # r2 = r2_score(knn.predict(X_test), y_test) # print(mae,mse,r2) # catboost cat = CatBoostRegressor(iterations=1000000, od_wait=1000, task_type='GPU') cat.fit(X_train, y_train, verbose=200, eval_set=(X_test, y_test)) # cat = CatBoostRegressor() # grid = {'depth':[None, 7, 8, 9], # 'iterations':[15000], # 'od_wait':[1000], # 'task_type':['GPU']} # cat.grid_search(grid, # X=X, # y=y, # verbose=200, # train_size=0.8) # cat = CatBoostRegressor(iterations=15000, task_type='GPU') # cat.fit(X, y, verbose=200, eval_set=(X_test, y_test)) #Проведем оценку модели mae = mean_absolute_error(cat.predict(X_test), y_test) mse = mean_squared_error(cat.predict(X_test), y_test) r2 = r2_score(cat.predict(X_test), y_test) print(mae,mse,r2) # lgbm lgbm = LGBMRegressor(n_jobs=-1) lgbm.fit(X_train, y_train, eval_set=(X_test, y_test)) #Проведем оценку модели mae = mean_absolute_error(lgbm.predict(X_test), y_test) mse = mean_squared_error(lgbm.predict(X_test), y_test) r2 = r2_score(lgbm.predict(X_test), y_test) print(mae,mse,r2) # voting ensemle vot = VotingRegressor( estimators=[ ('knn', KNeighborsRegressor(n_jobs=-1)), ('catboost', CatBoostRegressor(verbose=0)), ('lgbm', LGBMRegressor(n_jobs=-1)), ], voting='hard', n_jobs=-1, verbose=True ) vot.fit(X_train, y_train) mae = mean_absolute_error(vot.predict(X_test), y_test) mse = mean_squared_error(vot.predict(X_test), y_test) r2 = r2_score(vot.predict(X_test), y_test) print(mae,mse,r2) # create submit test sub = pd.read_csv('sample_submission.csv', index_col=0) sub X_pred = test # X_pred = scaler.transform(X_pred) # X_pred = pca.fit_transform(X_pred) pred =cat.predict(X_pred) sub['target'] = pred sub sub.to_csv('sub.csv')
ссылка на оригинал статьи https://habr.com/ru/articles/885824/
Добавить комментарий