02 августа 2023

🐼 ВОП-5 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Pandas 2.0: Data Science спСциалисты отправятся Β«Π² ΡƒΡ‚ΠΈΠ»ΡŒΒ»?

Blockchain-developer, IT-ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΡ†Π°, ΠΏΠΈΡˆΡƒ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈ Π³Π°ΠΉΠ΄Ρ‹.
ВсС Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Pandas 2.0 для Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π° популярных ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…: ydata-profiling, matplotlib, seaborn ΠΈ scikit-learn.
2
🐼 ВОП-5 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Pandas 2.0: Data Science спСциалисты отправятся Β«Π² ΡƒΡ‚ΠΈΠ»ΡŒΒ»?

НовыС ВОП-5 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для эффСктивной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… освободят Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² P.S. Π”ΠΎΡ‡ΠΈΡ‚Π°ΠΉ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°! Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡˆΡŒ бонус ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с pandas 2.0 β€” ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΏΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Благодаря своСй ΠΎΠ±ΡˆΠΈΡ€Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, pandas Π·Π°Π²ΠΎΠ΅Π²Π°Π»Π° мСсто Π² сСрдцС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ спСциалиста data science.

πŸ’‘ Pandas β€” это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° структурированных Π΄Π°Π½Π½Ρ‹Ρ…, Π΅Ρ‘ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ происходит ΠΎΡ‚ Β«panel dataΒ» (Β«ΠΏΠ°Π½Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅Β»).

ΠŸΠ°Π½Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ исслСдований ΠΈ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π² Π²ΠΈΠ΄Π΅ Ρ‚Π°Π±Π»ΠΈΡ†. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚Π°ΠΊΠΈΠΌΠΈ массивами Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ создан Pandas.

БчастливыС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ <code class="inline-code">pandas</code>
БчастливыС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ pandas

ΠžΡ‚ Π²Π²ΠΎΠ΄Π° / Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎ очистки ΠΈ прСобразования Π΄Π°Π½Π½Ρ‹Ρ… β€” практичСски Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π±Π΅Π· import pandas as pd, Π²Π΅Ρ€Π½ΠΎ?

Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΠΈ ΡΡ‚ΠΎΠ»ΡŒ популярной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ слоТа Ρ€ΡƒΠΊΠΈ Π½Π΅ сидСли, ΠΈ Π²ΠΎΡ‚ 16 ΠΌΠ°Ρ€Ρ‚Π°, послС 3 Π»Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π±Ρ‹Π» Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅Π»ΠΈΠ· pandas 2.0. Π’ pandas 2.0 появилось ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ массивов Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ pyarrow для Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΡ‚ наносСкундного, Π° Ρ‚Π°ΠΊΠΆΠ΅ мноТСство исправлСний ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ API.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ€Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ pandas 2.0? НастраиваСм свои Π½Π΅ΠΉΡ€ΠΎΠ½Ρ‡ΠΈΠΊΠΈ ΠΈ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌ πŸ’ͺ

🐍 Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»

1. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ использования памяти

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ pandas Π±Ρ‹Π» создан с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ numpy, которая Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π½Π΅ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»Π°ΡΡŒ Π² качСствС сСрвСрной части для Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· основных ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ pandas Π±Ρ‹Π»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти.

Π’ этом Ρ€Π΅Π»ΠΈΠ·Π΅ 2.0 большоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ связано с Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ΠΌ сСрвСрной части Apache Arrow для Π΄Π°Π½Π½Ρ‹Ρ… pandas.

По сути, Arrow β€” это стандартизированный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ столбчатых Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти с доступными Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… языков программирования (C, C++, R, Python ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ…). Для Python Π΅ΡΡ‚ΡŒ PyArrow, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ основан Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Arrow Π½Π° C++ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΡ‡Π΅Π½ΡŒ быстр!

Буммируя, PyArrow заботится ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ограничСниях памяти вСрсий 1.X ΠΈ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ быстрыС ΠΈ экономичныС с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния памяти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, особСнно для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

Π’ΠΎΡ‚ сравнСниС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π±Π΅Π· сСрвСрной части pyarrow ΠΈ с Π΅Π΅ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Hacker News, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ составляСт ΠΎΠΊΠΎΠ»ΠΎ 650 ΠœΠ‘ (лицСнзия CC BY-NC-SA 4.0):

        %timeit df = pd.read_csv("data/hn.csv")
# 12 s Β± 304 ms per loop (mean Β± std. dev. of 7 runs, 1 loop each)

%timeit df_arrow = pd.read_csv("data/hn.csv", engine='pyarrow', dtype_backend='pyarrow')
# 329 ms Β± 65 ms per loop (mean Β± std. dev. of 7 runs, 1 loop each)
    

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, использованиС Π½ΠΎΠ²ΠΎΠ³ΠΎ бэкСнда ускоряСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‡Ρ‚ΠΈ Π² 35 Ρ€Π°Π·! Π”Ρ€ΡƒΠ³ΠΈΠ΅ аспСкты, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅:

  1. Π‘Π΅Π· сСрвСрной части pyarrow ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ столбСц / ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ хранится ΠΊΠ°ΠΊ свой ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…: числовыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ хранятся ΠΊΠ°ΠΊ int64 ΠΈΠ»ΠΈ float64, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ строковыС значСния хранятся ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.
  2. Π’ yarrow всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏΡ‹ стрСлок: ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ [pyarrow] ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…: int64 , float64 , string , timestamp ΠΈ double:
df.info(): ИсслСдованиС Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ….
        df = pd.read_csv("data/hn.csv")
df.info()

# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 3885799 entries, 0 to 3885798
# Data columns (total 8 columns):
# #   Column              Dtype  
# ---  ------              -----  
# 0   Object ID           int64  
# 1   Title               object 
# 2   Post Type           object 
# 3   Author              object 
# 4   Created At          object 
# 5   URL                 object 
# 6   Points              int64  
# 7   Number of Comments  float64
# dtypes: float64(1), int64(2), object(5)
# memory usage: 237.2+ MB

df_arrow = pd.read_csv("data/hn.csv", dtype_backend='pyarrow', engine='pyarrow')
df_arrow.info()

# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 3885799 entries, 0 to 3885798
# Data columns (total 8 columns):
# #   Column              Dtype                
# ---  ------              -----                
# 0   Object ID           int64[pyarrow]       
# 1   Title               string[pyarrow]      
# 2   Post Type           string[pyarrow]      
# 3   Author              string[pyarrow]      
# 4   Created At          timestamp[s][pyarrow]
# 5   URL                 string[pyarrow]      
# 6   Points              int64[pyarrow]       
# 7   Number of Comments  double[pyarrow]      
# dtypes: double[pyarrow](1), int64[pyarrow](2), string[pyarrow](4), timestamp[s][pyarrow](1)
# memory usage: 660.2 MB
    

2. Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… со стрСлками ΠΈ числовыС индСксы

Помимо чтСния Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ являСтся ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ случаСм, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ для ряда Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, особСнно Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны со строковыми опСрациями, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рСализация Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… string Π² pyarrow довольно эффСктивна:

        %timeit df["Author"].str.startswith('phy')
# 851 ms Β± 7.89 ms per loop (mean Β± std. dev. of 7 runs, 1 loop each)

%timeit df_arrow["Author"].str.startswith('phy')
# 27.9 ms Β± 538 Β΅s per loop (mean Β± std. dev. of 7 runs, 10 loops each)

    

ЀактичСски Arrow ΠΈΠΌΠ΅Π΅Ρ‚ большС (ΠΈ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ) Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Π΅ΠΌ numpy, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ Π²Π½Π΅ Π½Π°ΡƒΡ‡Π½ΠΎΠΉ (числовой) области: Π΄Π°Ρ‚Ρ‹ ΠΈ врСмя, Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ числа, дСсятичныС Π΄Ρ€ΠΎΠ±ΠΈ, списки ΠΈ ΠΊΠ°Ρ€Ρ‚Ρ‹.

Π‘Π΅Π³Π»Ρ‹ΠΉ просмотр эквивалСнтности ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ pyarrow ΠΈ numpy Π½Π° самом Π΄Π΅Π»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ΠΌ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² индСксах ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ большС numpy-числовых Ρ‚ΠΈΠΏΠΎΠ². Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ int64, uint64 ΠΈ float64 освободили мСсто для всСх индСксных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ числовых Ρ‚ΠΈΠΏΠΎΠ² numpy, поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вмСсто этого ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΡ… 32-Ρ€Π°Π·Ρ€ΡΠ΄Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ:

        pd.Index([1, 2, 3])
# Index([1, 2, 3], dtype='int64')

pd.Index([1, 2, 3], dtype=np.int32)
# Index([1, 2, 3], dtype='int32')

    

πŸ’‘ Π­Ρ‚ΠΎ Π΄ΠΎΠ»Π³ΠΎΠΆΠ΄Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ индСксы ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² pandas, позволяя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, срСди ΠΏΡ€ΠΎΡ‡ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. По сути, Ρ‡Π΅ΠΌ мСньшС индСкс, Ρ‚Π΅ΠΌ эффСктивнСС Π±ΡƒΠ΄ΡƒΡ‚ эти процСссы!

3. УпрощСнная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

Из-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ pandas Π±Ρ‹Π» построСн ΠΏΠΎΠ²Π΅Ρ€Ρ… numpy, Π΅ΠΌΡƒ Π±Ρ‹Π»ΠΎ слоТно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ значСния простым ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΌ способом, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ numpy Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ значСния null для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

НапримСр, Ρ†Π΅Π»Ρ‹Π΅ числа автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, Ρ‡Ρ‚ΠΎ Π½Π΅ идСально:

        df = pd.read_csv("data/hn.csv")

points = df["Points"]
points.isna().sum()
# 0

points[0:5]
# 0    61
# 1    16
# 2     7
# 3     5
# 4     7
# Name: Points, dtype: int64

# Setting first position to None
points.iloc[0] = None

points[0:5]
# 0     NaN
# 1    16.0
# 2     7.0
# 3     5.0
# 4     7.0
# Name: Points, dtype: float64

    

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ points автоматичСски измСняСтся с int64 Π½Π° float64 послС ввСдСния СдинствСнного значСния None.

НСт Π½ΠΈΡ‡Π΅Π³ΠΎ Ρ…ΡƒΠ΄ΡˆΠ΅Π³ΠΎ для ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Π΅ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, особСнно Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° искусствСнного ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚Π°, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅.

Π§Π΅ΠΌ ΠΆΠ΅ это опасно? πŸ’€

ΠžΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Π΅ Π½Π°Π±ΠΎΡ€Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π² автоматичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ ΡƒΠ³Ρ€ΠΎΠ·Ρƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΎΡ‚Π²Π΅Ρ‚ Π²Ρ‹Π΄Π°ΡŽΡ‚ бСссмыслСнныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Π’ pandas 2.0 ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ dtype = 'numpy_nullable', Π³Π΄Π΅ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ значСния ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ°, поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ наши исходныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС int64):

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ β€˜numpy_nullable’, pandas 2.0 ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ значСния Π±Π΅Π· измСнСния исходных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….
        df_null = pd.read_csv("data/hn.csv", dtype_backend='numpy_nullable')

points_null = df_null["Points"]
points_null.isna().sum()
# 0

points_null[0:5]
# 0    61
# 1    16
# 2     7
# 3     5
# 4     7
# Name: Points, dtype: Int64

points_null.iloc[0] = None

points_null[0:5]
# 0    <NA>
# 1      16
# 2       7
# 3       5
# 4       7
# Name: Points, dtype: Int64

    

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ, Π½ΠΎ ΠΏΠΎ ΠΏΡ€Π°Π²Π΄Π΅, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ pandas ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Arrow для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ значСниями. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ эффСктивными, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² pandas Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ….

4. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ копирования ΠΏΡ€ΠΈ записи

Pandas 2.0 Ρ‚Π°ΠΊΠΆΠ΅ добавляСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ копирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² сСрии Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ прСдставлСния, Π° Π½Π΅ ΠΊΠΎΠΏΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° функция copy-on-write (копирования ΠΏΡ€ΠΈ записи), Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ использования памяти Π·Π° счСт свСдСния ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ дублирования Π΄Π°Π½Π½Ρ‹Ρ….

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ особСнно остороТным ΠΏΡ€ΠΈ использовании Ρ†Π΅ΠΏΠ½Ρ‹Ρ… Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Если Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ copy-on-write, Ρ†Π΅ΠΏΠ½Ρ‹Π΅ присвоСния Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ индСксирования (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡ€ΠΈ записи Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ копия).

Когда copy_on_write ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½, Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ Π½Π°Ρ€Π΅Π·ΠΊΠ°, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ исходный df ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ…:

        pd.options.mode.copy_on_write = False # disable copy-on-write (default in pandas 2.0)

df = pd.read_csv("data/hn.csv")
df.head()

# Throws a 'SettingWithCopy' warning
# SettingWithCopyWarning: 
# A value is trying to be set on a copy of a slice from a DataFrame
df["Points"][0] = 2000

df.head() # <---- df changes

    

Когда copy_on_write Π²ΠΊΠ»ΡŽΡ‡Π΅Π½, копия создаСтся ΠΏΡ€ΠΈ присвоСнии, ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, исходный Ρ„Ρ€Π΅ΠΉΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ измСняСтся. Π’ Ρ‚Π°ΠΊΠΈΡ… ситуациях Pandas 2.0 Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ChainedAssignmentError (ΠΎΡˆΠΈΠ±ΠΊΡƒ привязанного назначСния), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ скрытых ошибок:

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ copy_on_write: исходный Ρ„Ρ€Π΅ΠΉΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ измСняСтся ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… назначСниях.
        pd.options.mode.copy_on_write = True

df = pd.read_csv("data/hn.csv")
df.head()

# Throws a ChainedAssignmentError
df["Points"][0] = 2000

# ChainedAssignmentError: A value is trying to be set on a copy of a DataFrame
# or Series through chained assignment. When using the Copy-on-Write mode, 
# such chained assignment never works to update the original DataFrame
# or Series, because the intermediate object on which we are setting 
# values always behaves as a copy.
# Try using '.loc[row_indexer, col_indexer] = value' instead, 
# to perform the assignment in a single step.

df.head() # <---- df does not change

    

5. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ зависимости

ΠŸΡ€ΠΈ использовании pip вСрсия 2.0 Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ Π² установкС Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… зависимостСй, Ρ‡Ρ‚ΠΎ являСтся плюсом с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния настройки ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ рСсурсов.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ установку ΠΊ нашим ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ трСбованиям, Π½Π΅ тратя дисковоС пространство Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, это избавляСт ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΡ… Β«Π³ΠΎΠ»ΠΎΠ²Π½Ρ‹Ρ… Π±ΠΎΠ»Π΅ΠΉ с зависимостями», сниТая Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π² Π½Π°ΡˆΠΈΡ… срСдах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ:

Установка Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… зависимостСй.
        pip install "pandas[postgresql, aws, spss]>=2.0.0"

    

Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ аккорд…

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ остаСтся вопрос: Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ ΡˆΡƒΠΌΠΈΡ…Π° ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π°? Π‘Ρ‹Π»ΠΎ Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, обСспСчил Π»ΠΈ pandas 2.0 Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ: ydata-profiling, matplotlib, seaborn, scikit-learn.

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ydata-ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” ΠΎΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ pandas 2.0. Π’ Π½ΠΎΠ²ΠΎΠΉ вСрсии ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈΡ… ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ Π½Π΅ ΡΠ»ΠΎΠΌΠ°ΡŽΡ‚ΡΡ, Ссли ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ pandas 2.0, ΠΈ это большой плюс! Но Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅?

По ΠΏΡ€Π°Π²Π΄Π΅ говоря, ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ydata Π±Ρ‹Π»ΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых Π»ΡŽΠ±ΠΈΠΌΡ‹Ρ… инструмСнтов ΠΌΠ½ΠΎΠ³ΠΈΡ… спСциалистов для ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…! Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, это всСго лишь 1 строка ΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΠ»Π½ΠΎ вычислСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ β€” ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ статистика, построСниС гистограмм, Π°Π½Π°Π»ΠΈΠ· коррСляций ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ влияниС Π΄Π²ΠΈΠΆΠΊΠ° pyarrow Π½Π° всС это сразу с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ усилиями?

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· с ydata-profiling
        import pandas as pd
from ydata_profiling import ProfileReport

# Using pandas 1.5.3 and ydata-profiling 4.2.0
%timeit df = pd.read_csv("data/hn.csv")
# 10.1 s Β± 215 ms per loop (mean Β± std. dev. of 7 runs, 1 loop each)

%timeit profile = ProfileReport(df, title="Pandas Profiling Report")
# 4.85 ms Β± 77.9 Β΅s per loop (mean Β± std. dev. of 7 runs, 100 loops each)

%timeit profile.to_file("report.html")
# 18.5 ms Β± 2.02 ms per loop (mean Β± std. dev. of 7 runs, 1 loop each)

# Using pandas 2.0.2 and ydata-profiling 4.3.1
%timeit df_arrow = pd.read_csv("data/hn.csv", engine='pyarrow')
# 3.27 s Β± 38.1 ms per loop (mean Β± std. dev. of 7 runs, 1 loop each)

%timeit profile_arrow = ProfileReport(df_arrow, title="Pandas Profiling Report")
# 5.24 ms Β± 448 Β΅s per loop (mean Β± std. dev. of 7 runs, 100 loops each)

%timeit profile_arrow.to_file("report.html")
# 19 ms Β± 1.87 ms per loop (mean Β± std. dev. of 7 runs, 1 loop each)

    

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, считываниС Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΠΈΠΆΠΊΠ° yarrow, хотя созданиС профиля Π΄Π°Π½Π½Ρ‹Ρ… сущСствСнно Π½Π΅ измСнилось с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния скорости.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ различия ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ эффСктивности использования памяти, для Ρ‡Π΅Π³ΠΎ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ провСсти Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π°Π½Π°Π»ΠΈΠ·. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π½Π°Π΄ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ: для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ вСрсиями 1.5.2 ΠΈ 2.0 каТСтся Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ.

Но Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ydata-profiling Π΅Ρ‰Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… pyarrow. Π­Ρ‚ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ большоС влияниС ΠΊΠ°ΠΊ Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΈ Π½Π° объСм памяти, ΠΈ ΠΌΡ‹ с Π½Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π½ΠΈΠ΅ΠΌ ΠΆΠ΄Π΅ΠΌ Π΅Π³ΠΎ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ…!

Π’Π΅Ρ€Π΄ΠΈΠΊΡ‚: ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ, ΠΈΠ½Ρ‚Π΅Ρ€-ΠΎΠΏΠ΅Ρ€Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ!

Π­Ρ‚Π° новая вСрсия pandas 2.0 обСспСчиваСт Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ благодаря Ρ‚ΠΎΠ½ΠΊΠΈΠΌ, Π½ΠΎ Π²Π°ΠΆΠ½Ρ‹ΠΌ модификациям Β«ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌΒ».

ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ½ΠΈ ΠΈ Π½Π΅ Β«ΠΊΡ€ΠΈΡ‡Π°Ρ‰ΠΈΠ΅Β» для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ² Π² области Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ ΠΎΠ½ΠΈ словно Π²ΠΎΠ΄Π° Π² пустынС для ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… спСциалистов ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ ΠΏΡ€Ρ‹Π³Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· горящиС костры, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ ограничСния ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вСрсий.

Подводя ΠΈΡ‚ΠΎΠ³, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π³Π»Π°Π²Π½Ρ‹Π΅ прСимущСства, прСдставлСнныС Π² Π½ΠΎΠ²ΠΎΠΉ вСрсии:

  1. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: Благодаря Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΡŽ сСрвСрной части Apache Arrow, Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΌΡƒ количСству индСксов numpydtype ΠΈ Ρ€Π΅ΠΆΠΈΠΌΡƒ копирования ΠΏΡ€ΠΈ записи;
  2. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ настройка: позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ зависимостями ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСимущСства Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Apache Arrow (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ обнулСния с самого Π½Π°Ρ‡Π°Π»Π°!);
  3. Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это ΠΌΠ΅Π½Π΅Π΅ Β«ΠΏΡ€ΠΈΠ·Π½Π°Π½Π½ΠΎΠ΅Β» прСимущСство Π½ΠΎΠ²ΠΎΠΉ вСрсии, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Arrow Π½Π΅ зависит ΠΎΡ‚ языка, Π΄Π°Π½Π½Ρ‹Π΅ Π² памяти ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, построСнными Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Python, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ R, Spark ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Apache Arrow!

Pandas 2.0 ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ мноТСство Π½ΠΎΠ²Ρ‹Ρ… ΠΈ интСрСсных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠœΡ‹ ознакомились с ΠΏΠ°Ρ€ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈ рассмотрСли, ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π’ ΡƒΡ‚ΠΈΠ»ΡŒ data science спСциалистов ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠΊΠ° Ρ€Π°Π½ΠΎ β€” Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π° pandas 2.0 Π² этом ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚! НадССмся, Ρ‡Ρ‚ΠΎ данная ΡΡ‚Π°Ρ‚ΡŒΡ оказалась для вас ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ!

Бонус!

Π£Ρ€Π°! Π’Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π» всю ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ знаСшь большС ΠΏΡ€ΠΎ pandas 2.0. НиТС ΠΌΡ‹ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΠ»ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΏΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

        import pandas as pd
import numpy as np
import matplotlib as mpl

df = pd.DataFrame({
    "strings": ["Adam", "Mike"],
    "ints": [1, 3],
    "floats": [1.123, 1000.23]
})
df.style \
  .format(precision=3, thousands=".", decimal=",") \
  .format_index(str.upper, axis=1) \
  .relabel_index(["row 1", "row 2"], axis=0)
    
🐼 ВОП-5 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Pandas 2.0: Data Science спСциалисты отправятся Β«Π² ΡƒΡ‚ΠΈΠ»ΡŒΒ»?
        weather_df = pd.DataFrame(np.random.rand(10,2)*5,
                          index=pd.date_range(start="2021-01-01", periods=10),
                          columns=["Tokyo", "Beijing"])

def rain_condition(v):
    if v < 1.75:
        return "Dry"
    elif v < 2.75:
        return "Rain"
    return "Heavy Rain"

def make_pretty(styler):
    styler.set_caption("Weather Conditions")
    styler.format(rain_condition)
    styler.format_index(lambda v: v.strftime("%A"))
    styler.background_gradient(axis=None, vmin=1, vmax=5, cmap="YlGnBu")
    return styler

weather_df.loc["2021-01-04":"2021-01-08"].style.pipe(make_pretty)
    
🐼 ВОП-5 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Pandas 2.0: Data Science спСциалисты отправятся Β«Π² ΡƒΡ‚ΠΈΠ»ΡŒΒ»?

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

 
 
21 августа 2023

КакоС Ρƒ вас Π·Π½Π°ΠΊΠΎΠΌΠΎΠ΅ описаниС профиля 😁😁

10 августа 2023

Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ скорости ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‡Ρ‚ΠΈ Π² 35 Ρ€Π°Π·, Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ)

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию
Backend developer (PHP / Go)
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
Senior Marketing Analyst
ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
Go-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ
ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

Подпишись

Π½Π° push-увСдомлСния