Machine Learning: Кое е новото в Pandas 1.0?

Новото pandas 1.0

В новата версия на Pandas от 29-ти януари 2020 г. са направени доста подобрения на библиотеката и са въведени редица нови възможности, които значително улесняват процеса на работа при анализ на данни с Python.

В тази статия ще ви запозная с някои от по-интересните нововъведения в Pandas 1.0, като ще видите с какво те могат да бъдат полезни и какви са разликите със старата версия.

Данните, използвани за примерите, които ще видите по-надолу в статията, са синтетични. Те съдържат 6 записа с информация за студенти, които на базата на определена оценка са преминали или не даден курс.

Липсващи стойности с pandas.NA

С версия 1.0 бе въведен нов начин за отбелязване на липсващи стойности. До преди това се използваше само np.nan за данни от тип float64 или object, np.NaT за DateTime и None за object. Целта на pandas.NA е да бъде индикатор за липсващи стойности независимо от типа на данните. Тъй като това е само експериментална фунционалност, е напълно възможно да настъпят редица изменения в следващи версии на Pandas.

Пример:

data = {'Student':['John Smith','Dave Willington', 'Caroline Reyes',
                   'Alexa Stone', 'Jessica Scott', 'Mikayla Jackson'],
       'Grade': [3, 4, 6, pd.NA, 4, 5],
       'Passed': [False, True, True, pd.NA, True, True]}

df = pd.DataFrame(data)

Резултат:

StudentGradePassed
0John Smith3False
1Dave Willington4True
2Caroline Reyes6True
3Alexa Stone< NA >< NA >
4Jessica Scott4True
5Mikayla Jackson5True

Получават се различни резултати от аритметични операции при прилагане на pandas.NA за разлика от np.nan. За почти всяка от тях, полученият резултат е , докато при използване на np.nan е False или nan.

Няколко примера:

  • Аритметични операции
np.nan > 1

Output:
False

pd.NA > 1

Output:
<NA>
np.nan + 1

Output:
nan

pd.NA + 1

Output:
<NA>

Изключения:

pd.NA ** 0

Output:
1
1 ** pd.NA

Output:
1
  • Логически операции
pd.NA | True

Output:
True
pd.NA | False

Output:
False

Конвертиране към Markdown

Конвертирането на DataFrame структурата в Markdown таблица е едно полезно нововъведение, което предлага новата версия на Pandas. За тази цел е създаден методът to_markdown(). От него получаваме като резултат Markdown таблица във вид на низ. Това е полезно, когато искаме да представим таблица с данните в интернет.

Пример:

print(df.to_markdown())

Output:
|    | Student         | Grade   | Passed   |
|---:|:----------------|:--------|:---------|
|  0 | John Smith      | 3       | False    |
|  1 | Dave Willington | 4       | True     |
|  2 | Caroline Reyes  | 6       | True     |
|  3 | Alexa Stone     | <NA>    | <NA>     |
|  4 | Jessica Scott   | 4       | True     |
|  5 | Mikayla Jackson | 5       | True     |

Въвеждането на to_markdown() значително улеснява работата на анализаторите. Липсата на този метод в старата версия е налагало например ръчно писане на Markdown таблиците, използване на някакъв онлайн инструмент за конвертиране, създаване на собствени функции или използване на модула tabulate.

Методът convert_dtypes()

Convert_dtypes() е създаден с цел да се насърчи използването на новите типове данни. Той преобразува всяка колона до най-подходящия тип, който поддържа новият индикатор за липсващи стойности – pandas.NA.

Пример:

df.dtypes

Output:

Student object
Grade float64
Passed object
dtype: object
df_new = df.convert_dtypes()

df_new.dtypes

Output:

Student string
Grade Int64
Passed boolean
dtype: object

String и Boolean типове

Въведени са 2 нови типа данни – string за текст и boolean за True/False стойности. Тъй като това са експериментални функционалности, Pandas не задава автоматично тези типове и все още определя нечисловите колони като object. Ако искаме изрично да зададем да бъдат string или boolean, трябва да го посочим явно. Полезността се проявява в това, че с въвеждането на тези типове се прави ясно разграничение на данните.

Пример:

df['Student'] = df['Student'].astype('string')
df['Passed'] = df['Passed'].astype('boolean')

df.info()

Output:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 3 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   Student  6 non-null      string 
 1   Grade    5 non-null      object 
 2   Passed   5 non-null      boolean
dtypes: boolean(1), object(1), string(1)
memory usage: 236.0+ bytes

Някои подобрения на съществуващи методи

Методът select_dtypes() позволява отделяне на част от DataFrame на базата на типове колони. В новата версия на Pandas, този метод е направен да работи чрез векторизация вместо итерации на цикъл.

df_new.select_dtypes(include=['Int64','string'])

Резултат:

StudentGrade
0John Smith3
1Dave Willington4
2Caroline Reyes6
3Alexa Stone< NA >
4Jessica Scott4
5Mikayla Jackson5
df_new.select_dtypes(exclude=['Int64','string'])

Резултат:

Passed
0False
1True
2True
3< NA >
4True
5True

Методът info() дава възможност да видим основна информация за данните – колко е броят записи и колони, дали има липсващи стойности, какъв е типът на променливите и колко памет се използва. Това е изключително полезно, когато си опознаваме данните. В новата версия на Pandas в резултата от метода info() вече се показват и номерата на редовете.

Пример:

  • Pandas 0.25.x
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 3 columns):
Student    6 non-null object
Grade      5 non-null float64
Passed     5 non-null object
dtypes: float64(1), object(2)
memory usage: 272.0+ bytes
  • Pandas 1.0.0
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 3 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   Student  6 non-null      string 
 1   Grade    5 non-null      object 
 2   Passed   5 non-null      boolean
dtypes: boolean(1), object(1), string(1)
memory usage: 236.0+ bytes

Разгледаните нововъведения не се изчерпват до тук. Има още много подобрения на съществуващи методи, както и премахване на остарели такива, което значително подобрява работата с библиотеката. Можете да научите повече информация в официалната документация.

Искате да научите повече за машинното обучение?

Включете се в курса по машинно обучение и анализ на данни с Python.

Научете повече

Автор: Десислава Христова