Преобразование типов данных при загрузке данных из MS SQL в Pandas DataFrame и сохранение в Parquet
Pandas - мощная библиотека для анализа данных в языке программирования Python. Одной из её ключевых особенностей является работа с DataFrame, табличной структурой данных, которая предоставляет удобный интерфейс для манипуляций с данными. В этой статье мы рассмотрим, как произвести преобразование типов данных при загрузке данных из Microsoft SQL Server в Pandas DataFrame и как сохранить данные в формате Parquet с учетом корректных типов данных.
Шаг 1: Установка библиотек
Перед началом работы убедитесь, что у вас установлены необходимые библиотеки. Если их нет, установите их с помощью следующих команд:
pip install pandas pip install pyodbc pip install fastparquet
Шаг 2: Подключение к MS SQL и загрузка данных в Pandas DataFrame
Для начала подключимся к базе данных MS SQL Server с использованием библиотеки pyodbc:
import pandas as pd
import pyodbc
# Задайте свои параметры подключения
server = 'your_server'
database = 'your_database'
username = 'your_username'
password = 'your_password'
# Строка подключения
connection_string = f'DRIVER=ODBC Driver 17 for SQL Server;SERVER={server};DATABASE={database};UID={username};PWD={password}'
# Установка соединения
conn = pyodbc.connect(connection_string)
# SQL-запрос
sql_query = 'SELECT * FROM your_table'
# Загрузка данных в DataFrame
df = pd.read_sql(sql_query, conn)Шаг 3: Преобразование типов данных
После загрузки данных из базы данных MS SQL в DataFrame необходимо убедиться, что типы данных корректны. Для этого воспользуемся методом astype():
# Преобразование типов данных df['DatetimeColumn'] = pd.to_datetime(df['DatetimeColumn'], format='%Y-%m-%d %H:%M:%S', errors='coerce') df['DateColumn'] = pd.to_datetime(df['DateColumn'], format='%Y-%m-%d', errors='coerce').dt.date df['TimeColumn'] = pd.to_datetime(df['TimeColumn'], format='%H:%M:%S', errors='coerce').dt.time df['IntColumn'] = df['IntColumn'].astype(int) df['FlagColumn'] = df['FlagColumn'].astype(int) df['FloatColumn'] = df['FloatColumn'].astype(float)
В приведенном выше коде DatetimeColumn, DateColumn и TimeColumn преобразуются в соответствующие типы данных даты и времени. IntColumn преобразуется в целое число, FlagColumn - в целое число 0 или 1, а FloatColumn - в число с плавающей точкой.
Шаг 4: Сохранение в формате Parquet
Теперь, когда типы данных корректны, можно сохранить данные в формате Parquet с использованием библиотеки fastparquet:
# Задайте путь к файлу Parquet parquet_path = 'your_file.parquet' # Сохранение в Parquet df.to_parquet(parquet_path, index=False)
Теперь у вас есть DataFrame с корректными типами данных, загруженный из MS SQL Server, и сохраненный в формате Parquet.
Этот процесс обеспечивает правильное представление данных и сохраняет целостность типов при последующей загрузке данных в Pandas DataFrame.
Лучшие практики преобразования типов при загрузке данных в pandas
Преобразование типов данных при загрузке данных из CSV в DataFrame важно для обеспечения корректности анализа данных и оптимизации использования памяти. Ниже представлены лучшие практики для преобразования типов данных в Pandas DataFrame при чтении данных из CSV файлов:
Используйте параметр dtype при чтении данных:Параметр dtype позволяет явно указать тип данных для каждого столбца. Это может быть особенно полезно при загрузке больших данных, чтобы избежать автоматического определения типов, которое может быть медленным. Пример:
dtype_dict = {'column1': 'int32', 'column2': 'float64', 'column3': 'str'}
df = pd.read_csv('your_file.csv', dtype=dtype_dict)Используйте параметр parse_dates для дат:
Если ваши данные содержат столбцы с датами, используйте параметр parse_dates для автоматического преобразования в объекты даты. Пример:
date_columns = ['date_column1', 'date_column2']
df = pd.read_csv('your_file.csv', parse_dates=date_columns)Обрабатывайте пропущенные значения:
Используйте параметр na_values для указания значений, которые следует считать пропущенными. Это важно, чтобы Pandas правильно обрабатывал пропущенные значения и не превращал их в строки. Пример:
na_values = ['-1', 'NA', 'null']
df = pd.read_csv('your_file.csv', na_values=na_values)Выбирайте наименьший подходящий тип данных:Выбирайте наименьший подходящий тип данных для каждого столбца, чтобы оптимизировать использование памяти. Например, если столбец содержит целые числа в ограниченном диапазоне, используйте int8 или int16, чтобы сэкономить память.
Оптимизируйте строковые столбцы:Если столбцы содержат ограниченное количество уникальных значений, рассмотрите возможность использования категориальных данных с помощью astype('category'). Это снижает потребление памяти и может ускорить операции с данными.
df['categorical_column'] = df['categorical_column'].astype('category')Обрабатывайте большие файлы порциями:
При работе с большими CSV-файлами используйте параметр chunksize для чтения данных порциями. Это может быть полезно, если ваши ресурсы по памяти ограничены.
chunk_size = 10000
chunks = pd.read_csv('your_file.csv', chunksize=chunk_size)
for chunk in chunks:
# Обработка каждой порции данныхИспользуйте память для чисел с плавающей точкой:
Если столбцы содержат числа с плавающей точкой, рассмотрите возможность использования float32 вместо float64. Это уменьшит потребление памяти в два раза.
df['float_column'] = df['float_column'].astype('float32')Как обрабатывать отдельно пустые значения для строк, для int, для дат, datetime
При формировании DataFrame из разных типов столбцов в одной команде с использованием read_csv, можно применить более общий подход к обработке пустых значений для разных типов данных. Воспользуемся параметром converters для более гибкого управления преобразованием данных.
import pandas as pd
# Задайте путь к вашему CSV файлу
csv_file_path = 'your_file.csv'
# Функция для обработки пустых значений для строк (str)
def process_string(value):
return '' if value in ('', 'NA', 'null') else value
# Функция для обработки пустых значений для целых чисел (int)
def process_int(value):
return pd.to_numeric(value, errors='coerce')
# Функция для обработки пустых значений для дат
def process_date(value):
return pd.to_datetime(value, errors='coerce')
# Функция для обработки пустых значений для datetime
def process_datetime(value):
return pd.to_datetime(value, errors='coerce')
# Задайте словарь с функциями-обработчиками для каждого столбца
column_processors = {
'column1': process_string,
'column2': process_string,
'column3': process_int,
'column4': process_int,
'date_column1': process_date,
'date_column2': process_date,
'datetime_column1': process_datetime,
'datetime_column2': process_datetime,
}
# Чтение CSV с применением обработчиков
df = pd.read_csv(csv_file_path, converters=column_processors)- Создаются функции-обработчики (
process_string,process_int,process_date,process_datetime), каждая из которых принимает значение и возвращает преобразованное значение, обрабатывая пустые значения по своему усмотрению. - Создается словарь
column_processors, в котором каждому столбцу сопоставляется соответствующая функция-обработчик. - При чтении CSV используется параметр
converters, который применяет соответствующий обработчик для каждого столбца.