Pandas & NumPy Academy · Oppitunti

Epäyhtenäisten kategorioiden yhdenmukaistaminen

Yhdenmukaistakaa vapaatekstimuotoiset kategoriat yhdistämällä aliakset, korjaamalla kirjoitusvirheet sumealla haulla ja pakottamalla käyttöön kanoninen luettelo.

Oppitunti 3/413 vaihetta

Epäyhtenäisten kategorioiden yhdenmukaistaminen on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Epäyhtenäisten luokkien ongelma

Kun ihmiset syöttävät luokkadataa, sama käsite esiintyy monilla eri kirjoitusasuilla: Electronics, electronics, ELECTRONICS, Electronicss. Tämän sarakkeen groupby tuottaa kymmeniä pieniä ryhmiä yhden merkityksellisen ryhmän sijaan. Luokkien standardointi kanoniseksi luetteloksi on yksi tärkeimmistä puhdistusvaiheista ennen koostamista tai koneoppimisen piirteiden luomista.

import pandas as pd

df = pd.read_csv('products.csv')
print(df['category'].value_counts().head(20))

Kirjainkoon ja tyhjien merkkien normalisointi

Ensimmäinen ja helpoin standardointivaihe on kirjainkoon ja tyhjien merkkien normalisointi. Poistakaa alussa ja lopussa olevat välilyönnit ja muuttakaa kaikki merkit pieniksi kirjaimiksi komennolla .str.strip().str.lower() ennen muita vertailuja. Tämä yksi vaihe yhdistää monet muunnelmat: Electronics, electronics ja ' Electronics ' muuttuvat normalisoinnin jälkeen kaikki muotoon electronics.

df['category_clean'] = df['category'].str.strip().str.lower()

print('Before:', df['category'].nunique())
print('After:', df['category_clean'].nunique())

Aliasten yhdistäminen sanakirjan avulla

Kirjainkoon normalisoinnin jälkeen monet muunnelmat ovat edelleen erillisiä lyhenteiden, synonyymien tai vanhojen nimien vuoksi. Muodostakaa aliasmääritysten sanakirja, jossa avaimina ovat muunnelmien kirjoitusasut ja arvoina kanoniset muodot. Soveltakaa sitä komennolla df['category_clean'].map(alias_map).fillna(df['category_clean']) — fillna säilyttää sanakirjassa määrittelemättömät arvot sen sijaan, että korvaisi ne NaN-arvoilla.

alias_map = {
    'elect': 'electronics',
    'elec': 'electronics',
    'tech': 'electronics',
    'clothing': 'apparel',
    'clothes': 'apparel',
    'garments': 'apparel'
}

df['category_clean'] = df['category_clean'].map(alias_map).fillna(df['category_clean'])
print(df['category_clean'].value_counts().head())

str.replace-funktion käyttö kuviokorjauksiin

Joissakin luokkien nimissä on yhdenmukaisia muotoiluvirheitä, kuten useita peräkkäisiä välilyöntejä tai lopussa olevia numeroita. Käytä .str.replace()-funktiota säännöllisen lausekkeen kanssa korjataksesi nämä kuviot kaikilta riveiltä kerralla. Esimerkiksi .str.replace(r'\s+', ' ', regex=True) yhdistää useat välilyönnit yhdeksi, ja .str.replace(r'\d+$', '', regex=True) poistaa luokkien nimien lopussa olevat numerot.

df['category_clean'] = (
    df['category_clean']
    .str.replace(r'\s+', ' ', regex=True)  # collapse spaces
    .str.replace(r'\d+$', '', regex=True)   # strip trailing numbers
    .str.strip()
)

print(df['category_clean'].value_counts())

Sumea vastaavuus difflibillä

Kun kirjoitusvirheitä ei voi ennakoida, etsi sumean vastaavuuden avulla kullekin muunnelmalle lähin kanoninen luokka. Pythonin sisäänrakennettu difflib.get_close_matches() palauttaa merkkijonojen samankaltaisuuteen perustuvat parhaat vastaavuudet kelvollisten luokkien luettelosta. Sovella sitä apufunktiona komennolla df['category'].apply(), jotta voit ratkaista muunnelmat, joita pelkkä map() ei löydä.

from difflib import get_close_matches

CANONICAL = ['electronics', 'apparel', 'home', 'sports', 'beauty']

def fuzzy_fix(val):
    matches = get_close_matches(str(val).lower().strip(), CANONICAL, n=1, cutoff=0.7)
    return matches[0] if matches else val

df['category_fuzzy'] = df['category_clean'].apply(fuzzy_fix)
print(df[['category_clean', 'category_fuzzy']].head(10))

Kanonisen luokkaluettelon muodostaminen

Määritä kanoniset luokat eksplisiittisesti sen sijaan, että päättelisit ne datasta. Kovakoodattu luettelo ohjaa jokaisen arvon kelpoisuuden tarkistuksen läpi; kaikki luettelosta puuttuvat arvot merkitään tuntemattomiksi. Ylläpidä kanonista luetteloa asetustiedostossa tai erillisessä DataFrame-sarakkeessa, jotta sitä on helppo päivittää, kun liiketoiminta lisää uuden tuoteluokan ilman puhdistuskoodin muuttamista.

CANONICAL_CATEGORIES = {
    'electronics', 'apparel', 'home', 'sports',
    'beauty', 'food', 'toys', 'automotive'
}

df['is_known_category'] = df['category_fuzzy'].isin(CANONICAL_CATEGORIES)
unknown = df[~df['is_known_category']]['category_fuzzy'].unique()
print('Unknown categories remaining:', unknown)

Tuntemattomien luokkien käsittely

Tuntemattomat luokat, jotka eivät sumean korjauksen jälkeen vastaa mitään kanonista arvoa, tulee ryhmitellä Other-tunnisteen alle poistamisen sijaan, jotta rivejä ei menetetä huomaamatta. Aseta niiden arvoksi 'other' komennolla np.where() tai yksinkertaisella ehdollisella sijoituksella. Kirjaa, kuinka monta riviä yhdistettiin arvoon 'other', ja tarkista ne sellaisten kuvioiden varalta, jotka voisivat edellyttää uuden kanonisen luokan lisäämistä.

import numpy as np

df['category_final'] = np.where(
    df['category_fuzzy'].isin(CANONICAL_CATEGORIES),
    df['category_fuzzy'],
    'other'
)

print(df['category_final'].value_counts())

Categorical-dtypen pakottaminen

Standardoinnin jälkeen muunnetaan puhdas luokkasarake Pandasin Categorical-tietotyypiksi ja määritetään kelvollisten luokkien luettelo eksplisiittisesti. Tämä pakottaa skeeman noudattamiseen: yritys määrittää virheellisen luokan aiheuttaa virheen. Lisäksi muistinkulutus pienenee, koska luokkien merkkijonot tallennetaan sisäisesti kokonaislukukoodeina, ja suurten DataFrame-objektien groupby-operaatiot nopeutuvat.

df['category_final'] = pd.Categorical(
    df['category_final'],
    categories=list(CANONICAL_CATEGORIES) + ['other']
)

print(df['category_final'].dtype)
print(df['category_final'].cat.categories)

Puhdistetun sarakkeen validointi

Kun kaikki standardointivaiheet on suoritettu, tehdään lopullinen validointi: varmistetaan, ettei puhdistetussa sarakkeessa ole arvoja, jotka eivät kuulu kanoniseen joukkoon. Käyttäkää tähän assert df['category_final'].isin(valid_set).all()-lausetta. Sijoittakaa tämä tarkistus puhdistusfunktion loppuun, jotta se suoritetaan aina putken ajon yhteydessä ja havaitsee taantumat, kun uusi raakadata sisältää aiemmin näkemättömiä luokkanimiä.

valid_set = set(CANONICAL_CATEGORIES) | {'other'}

assert df['category_final'].isin(valid_set).all(), 'Invalid category found'
print('All categories valid. Distribution:')
print(df['category_final'].value_counts())

Standardointimuutosten seuranta

Muodostakaa diff-taulukko, jossa näytetään jokaiselta muuttuneelta riviltä alkuperäinen arvo ja sen puhdistettu korvaava arvo. Tämä auditointijälki antaa datan omistajille mahdollisuuden tarkistaa tiettyjä yhdistämisiä ja hyväksyä tai hylätä ne. Valitkaa muuttuneet rivit boolean-maskin avulla ja verratkaa alkuperäisiä ja lopullisia sarakkeita vierekkäin. Viekää diff CSV-tiedostona muiden kuin teknisten sidosryhmien tarkistettavaksi.

changed = df['category'] != df['category_final']
diff_table = df[changed][['category', 'category_final']].drop_duplicates()
diff_table.columns = ['original', 'mapped_to']
print(f'Unique mappings applied: {len(diff_table)}')
print(diff_table)

Standardoidun tietojoukon tallentaminen

Korvatkaa alkuperäinen sotkuinen luokkasarake standardoidulla sarakkeella ja poistakaa väliaikaiset työskentelysarakkeet ennen tallentamista. Tallentakaa alias-yhdistämisen sanakirja ja sumean korjauksen kynnysarvo putken asetuksiin, jotta standardointi voidaan toistaa täysin samanlaisena. Kaksi kuukautta myöhemmin uudelle datavedokselle tehtävän puhdistusajon tulisi tuottaa samoilla syötearvoilla täsmälleen samat tulokset.

df_out = df.drop(columns=['category_clean', 'category_fuzzy', 'is_known_category'])
df_out = df_out.rename(columns={'category_final': 'category'})

df_out.to_parquet('products_clean.parquet', index=False)
print('Saved. Category distribution:')
print(df_out['category'].value_counts())

Pikatarkistus

Testatkaa ymmärrystänne tämän oppitunnin data-analyysin käsitteistä.

Oppitunnin kertaus

Tässä oppitunnissa opitte: kirjainkoon ja tyhjemerkkien normalisoinnin ensimmäisenä standardointivaiheena, aliasten yhdistämisen ja sumean haun käytön kirjoitusvirheiden korjaamiseen sekä kanonisen luokkaluettelon pakottamisen Categorical-tietotyypin ja assertioiden avulla. Seuraavaksi tutustumme skeeman validointiin ja ajonaikaisiin assertioihin, joilla jokainen putken vaihe suojataan.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Epäyhtenäisten kategorioiden yhdenmukaistaminen” ilmainen?

Kyllä – oppitunnin ”Epäyhtenäisten kategorioiden yhdenmukaistaminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Epäyhtenäisten kategorioiden yhdenmukaistaminen”?

Yhdenmukaistakaa vapaatekstimuotoiset kategoriat yhdistämällä aliakset, korjaamalla kirjoitusvirheet sumealla haulla ja pakottamalla käyttöön kanoninen luettelo. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Epäyhtenäisten kategorioiden yhdenmukaistaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?

Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Kaksoiskappaleiden tunnistaminen ja poistaminen
  2. Poikkeamien tunnistaminen ja käsittely
  3. Epäyhtenäisten kategorioiden yhdenmukaistaminen
  4. Skeeman validointi ja assertion-tarkistukset
← Takaisin: Pandas & NumPy Academy