← На главную Воспоминания

Вторник, 6 Февраля 2024

Прошел курс по очистке данных

Обработка пропущенных значений

посмотреть сколько рядов с пропущенными данными

nfl_data.isnull().sum()

сколько в процентном соотношении пропущеных

(sf_permits.isnull().sum().sum()/np.product(sf_permits.shape)) * 100

удалить ряды с пропущеными значениями

nfl_data.dropna()

удалить колонки с пропущеными значениями

nfl_data.dropna(axis=1)

заполнить пустые значения нулями

subset_nfl_data.fillna(0)

заполнить значениями которые идут следующими в той же колонке, что осталось заполнить нулями

subset_nfl_data.fillna(method='bfill', axis=0).fillna(0)

Скейлинг и нормализация

скейлинг - мы меняем размах значений, например было от 1 до 10, мы делаем 0 до 1, при этом пропорционально оставляем такие же промежутки в данных, чтобы распределение данных не менялось.

нормализация - похожа на скейлинг, но мы также приводим данные ближе к нормальному распределению(в виде шляпы или колокола)

# modules we'll use
import pandas as pd
import numpy as np

# for Box-Cox Transformation
from scipy import stats

# for min_max scaling
from mlxtend.preprocessing import minmax_scaling

# plotting modules
import seaborn as sns
import matplotlib.pyplot as plt

# set seed for reproducibility
np.random.seed(0)

мин макс скейлинг

minmax_scaling(original_data, columns="n_people")

нормализация

stats.boxcox(original_data)

Парсинг дат

# modules we'll use
import pandas as pd
import numpy as np
import seaborn as sns
import datetime

# read in our data
landslides = pd.read_csv("../input/landslide-events/catalog.csv")

# set seed for reproducibility
np.random.seed(0)

парсинг с маской

landslides['date_parsed'] = pd.to_datetime(landslides['date'], format="%m/%d/%y")

автоматический подбор маски

landslides['date_parsed'] = pd.to_datetime(landslides['Date'], infer_datetime_format=True)

Енкодинг

import charset_normalizer

енкодинг и декодинг

"some string".encode("utf-8", errors="replace").decode("utf-8")

попытка узнать кодировку данных

# look at the first ten thousand bytes to guess the character encoding
with open("../input/kickstarter-projects/ks-projects-201801.csv", 'rb') as rawdata:
    result = charset_normalizer.detect(rawdata.read(10000))

# check what the character encoding might be
print(result)

сохранить в кодировке ютф-8

kickstarter_2016.to_csv("ks-projects-201801-utf8.csv")

Инконсистент данные

import fuzzywuzzy
from fuzzywuzzy import process
import charset_normalizer

посмотреть на уникальные значения

# get all the unique values in the 'Country' column
countries = professors['Country'].unique()

# sort them alphabetically and then take a closer look
countries.sort()
countries

перевести в ловеркейс и удалить трейлинг пробелы

# convert to lower case
professors['Country'] = professors['Country'].str.lower()
# remove trailing white spaces
professors['Country'] = professors['Country'].str.strip()

посмотреть какие другие строки похожи на строку которую я даю

# get the top 10 closest matches to "south korea"
matches = fuzzywuzzy.process.extract("south korea", countries, limit=10, scorer=fuzzywuzzy.fuzz.token_sort_ratio)

# take a look at them
matches

заменить все похожие значения, у которых коофицент похожести больше некоторого порога

# function to replace rows in the provided column of the provided dataframe
# that match the provided string above the provided ratio with the provided string
def replace_matches_in_column(df, column, string_to_match, min_ratio = 47):
    # get a list of unique strings
    strings = df[column].unique()
    
    # get the top 10 closest matches to our input string
    matches = fuzzywuzzy.process.extract(string_to_match, strings, 
                                         limit=10, scorer=fuzzywuzzy.fuzz.token_sort_ratio)

    # only get matches with a ratio > 90
    close_matches = [matches[0] for matches in matches if matches[1] >= min_ratio]

    # get the rows of all the close matches in our dataframe
    rows_with_matches = df[column].isin(close_matches)

    # replace all rows with close matches with the input matches 
    df.loc[rows_with_matches, column] = string_to_match
    
    # let us know the function's done
    print("All done!")

На этом все, следующий курс по геоанализу