Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Большие данные и машинное обучение (v2) - лекци...

Avatar for Anton Anton
December 10, 2024

Большие данные и машинное обучение (v2) - лекция-3: табличные данные в Python, библиотека Pandas

Лекция курса "Большие данные и машинное обучение" (v2.0-МОТ)
Лекция-3: табличные данные в Python, библиотека Pandas
- Python + NumPy + Pandas + CSV: «эксель» без мышки (работа с табличными данными)
- Табличные данные и массивы в Python: Pandas и Numpy
- Качаем данные: датасет ILO (МОТ - Международная организация труда) ilostat.ilo.org
- Таблица для анализа: средня зарплата по видам деятельности, полу, странам и годам
- Формат хранения табличных данных в тексте CSV - comma separated values, RFC-4180
- Загружаем данные из файла CSV
- Pandas DataFrame - таблица, с которой можно делать что угодно (она же 2д-массив NumPy)
- Произвольный доступ к данным: диапазон строк, диапазон колонок, доступ к отдельный ячейке
- Оператор "квадратные скобки" DataFrame[] vs DataFrame.iloc[]
- Pandas Series - отдельная колонка таблицы (она же 1д-массив NumPy)
- Доступ к колонкам: через квадратные скобки по имени vs ООП-стиль через точку
- Запросы к данным: фильтр строк по значениям, больше волшебства оператора "квадратные скобки"
- Фильтр данных по значениям строковых значений
- Фильтр данных по диапазонам числовых значений
- Составные фильтры: средняя зарплата в стране за выбранный диапазон лет
- Разоблачение волшебства запросов через квадратные скобки: фильтрация данных массивом булевых значений
- Поэлементные логические операторы NumPy
- Статистические операции: минимум (min), максимум (max), среднее (mean), медиана (median)
- Среднее vs медиана (cредняя зарплата vs медианная зарплата)
- Проверка данных на правдоподобность, дополнительная проверка в сторонних источниках: откуда бы ни пришел датасет, всегда ожидайте подвох
- Больше загрузки данных: переименование колонок для приведения к удобному для использования в программе виду
- Склеивание таблиц по ключу: DataFrame.join
- Подключаем к таблице колонку с полным названием страны в дополнение к колонке с трехбуквенным кодом
- Итоги лекции: извлечение знаний из массивов данных
- Задания на самостоятельную работу

Большие данные и машинное обучение, лекция-2: предварительная подготовка, платформа Python
https://www.youtube.com/watch?v=GXbBDaKCiD8 (вторая половина)
Большие данные и машинное обучение, лекция-3: табличные данные в Python, библиотека Pandas
https://www.youtube.com/watch?v=ODFwEwMe8X0

Avatar for Anton

Anton

December 10, 2024
Tweet

More Decks by Anton

Other Decks in Education

Transcript

  1. Python + NumPy + Pandas + CSV: «эксель» без мышки

    (работа с табличными данными)
  2. Библиотека Pandas — анализ и обработка данных (работа с таблицами)

    • pandas.pydata.org/pandas-docs/stable/ • Изучаем pandas. Второе издание. Груздев А.В., Хейдт М., 2019, 1700 руб dmkpress.com/catalog/computer/programming/python/978-5- 97060-670-4/ • Excel vs Python: How to do Common Data Analysis Tasks towardsdatascience.com/excel-vs-python-how-to-do-common- data-analysis-tasks-54f1bdd6dfaa • Хабра, Стековерфлоу, итернет и т. п.
  3. Библиотека NumPy • numpy.org/ numpy.org/doc/stable/user/index.html numpy.org/doc/stable/reference/index.html • Работа с многомерными

    массивами и матрицами • Арифметика, всевозможные математические операции с массивами и матрицами • Под капотом у Pandas
  4. Установка Pandas pip install pandas • или pip install --user

    pandas • или python -m pip install pandas • или conda install pandas
  5. ILO — International Labour Organization • (МОТ — Международная организация

    труда) www.ilo.org en.wikipedia.org/wiki/International_Labour_Organization ru.wikipedia.org/wiki/Международная_организация_труда «Междунаро́дная организа́ция труда́ (МОТ, англ. International Labour Organization, ILO) — специализированное учреждение ООН, международная организация, занимающаяся вопросами регулирования трудовых отношений. На сегодняшний день участниками МОТ являются 187 государств. С 1920 года штаб-квартира Организации — Международного бюро труда, находится в Женеве. В Москве находится офис Субрегионального бюро для стран Восточной Европы и Центральной Азии.»
  6. www.ILO.org > статистика и базы данных www.ilo.org/global/statistics-and-databases/lang-- en/index.htm • Ссылки

    в разделе: - всякие нормативные документы - на портал статистики ILOSTAT • ILOSTAT: The leading source of labour statistics ilostat.ilo.org
  7. Зайдём в раздел • Working conditions > Wages ilostat.ilo.org/topics/wages/ •

    Data > Mean nominal monthly earnings of employees by sex and economic activity | Annual • Zipped CSV: www.ilo.org/ilostat-files/WEB_bulk_download/indicator/ EAR_4MTH_SEX_ECO_CUR_NB_A.csv.gz • Расшифровки кодов: www.ilo.org/ilostat-files/WEB_bulk_download/html/bulk_dic.html
  8. Data > иконка «(i)» справа Zipped CSV Download a zipped

    CSV file (gzip) to get data in bulk. These files contain only codes. Download the dictionary with labels here. www.ilo.org/ilostat- files/WEB_bulk_download/html/bulk_dic.html • Скачать все файлы *_en.csv
  9. Mean nominal monthly earnings of employees by sex and economic

    activity | Annual • Working conditions > wages ilostat.ilo.org/topics/wages/ • Database: Wages and working time statistics (COND) • Subject: Subject Earnings and labour income • Code: EAR_4MTH_SEX_ECO_CUR_NB_A • The earnings of employees relate to the gross remuneration in cash and in kind paid to employees, as a rule at regular intervals, for time worked or work done together with remuneration for time not worked, such as annual vacation, other type of paid leave or holidays. This is a harmonized series: (1) data reported as weekly and yearly are converted to monthly in the local currency series, using data on average weekly hours if available; and (2) data are converted to U.S. dollars as the common currency, using exchange rates or using 2017 purchasing power parity (PPP) rates for private consumption expenditures. The latter series allows for international comparisons by taking account of the differences in relative prices between countries. For more information, refer to the concepts and definitions page. • File: www.ilo.org/ilostat- files/WEB_bulk_download/indicator/EAR_4MTH_SEX_ECO_CUR_NB_A.csv.gz
  10. Mean nominal monthly earnings of employees by sex and economic

    activity | Annual • The earnings of employees relate to the gross remuneration in cash and in kind paid to employees, as a rule at regular intervals, for time worked or work done together with remuneration for time not worked, such as annual vacation, other type of paid leave or holidays. This is a harmonized series: (1) data reported as weekly and yearly are converted to monthly in the local currency series, using data on average weekly hours if available; and (2) data are converted to U.S. dollars as the common currency, using exchange rates or using 2017 purchasing power parity (PPP) rates for private consumption expenditures. The latter series allows for international comparisons by taking account of the differences in relative prices between countries. For more information, refer to the concepts and definitions page.
  11. Файл: EAR_4MTH_SEX_ECO_CUR_NB_A.csv • EAR — Earnings • 4MTH — ??

    • SEX — детализация по полу • ECO — Economic activity • CUR — ?? (currency?) • NB — ?? • A — Annual (по годам)
  12. Формат CSV • Простой текст, позволяет хранить табличные данные •

    Одна строка в файле — одна строка в таблице • Первая строка — заголовок (не обязательно) • Ячейки резделены запятыми (или любыми другими выбранными разделителями) • (если ячейка содержит запятую, можно взять в кавычки и т.п — отдельная история) • Офисные пакеты умеют импортировать и экспортировать • RFC-4180 tools.ietf.org/html/rfc4180 Common Format and MIME Type for Comma-Separated Values (CSV) Files Status of This Memo: This memo provides information for the Internet community. It does not specify an Internet standard of any kind. Distribution of this memo is unlimited.
  13. Файл: EAR_4MTH_SEX_ECO_CUR_NB_A.csv • Колонки: ref_area, indicator, source, sex, classif1, classif2,

    time, obs_value, note_classif, note_indicator, note_source • 275217 строк (без заголовка)
  14. Файл: EAR_4MTH_SEX_ECO_CUR_NB_A.csv • ref_area — код территории (код страны), •

    indicator — EAR_4MTH_SEX_ECO_CUR_NB_A • source — код источника данных (см. далее) • sex — пол • classif1 — классификатор-1: вид деятельности (см. далее) • classif2 — классификатор-2: валюта (см. далее) • time – год • obs_value — целевое значение: средняя зарплата для указанной страны для вида деятельности и т. п. в указанный год в указанной валюте • note_classif, note_indicator, note_source — дополнительные заметки
  15. Разминка: загрузка данных • DataFrame — двумерная таблица с метками

    колонок и строк pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.html • Series — одномерный массив ndarray с метками элементов-строк (ndarray — массив из Numpy) pandas.pydata.org/pandas- docs/stable/reference/api/pandas.Series.html
  16. Библиотека NumPy • numpy.org/ numpy.org/doc/stable/user/index.html numpy.org/doc/stable/reference/index.html numpy.org/doc/stable/reference/generated/numpy.ndarray.html • Работа с

    многомерными массивами и матрицами • Арифметика, всевозможные математические операции с массивами и матрицами • Под капотом у Pandas
  17. #coding=utf-8 # (unicode support, # required only with python 2.7)

    import pandas файл: pandas-ilo-test.py
  18. Замечание: если убрать #coding=utf-8 • Плюс любой юникодный (не-аски) символ

    в файле (в комментарии или строке) • Python 2.7: SyntaxError: Non-ASCII character '\xd0' in file titanic.py on line 18, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details • Python 3: ok
  19. ref_area indicator source sex classif1 classif2 time obs_value note_classif note_indicator

    note_source 0 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_TOTAL CUR_TYPE_LCU 2010 3013.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 1 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_TOTAL CUR_TYPE_PPP 2010 1860.38 NaN T30:62_T11:142_T12:145_T33:396 S3:20 2 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_TOTAL CUR_TYPE_USD 2010 1683.24 NaN T30:62_T11:142_T12:145_T33:396 S3:20 3 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_LCU 2010 2187.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 4 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_PPP 2010 1350.37 NaN T30:62_T11:142_T12:145_T33:396 S3:20 ... ... ... ... ... ... ... ... ... ... ... ... 275212 ZWE EAR_4MTH_SEX_ECO_CUR_NB DA:1824 SEX_T ECO_ISIC2_8 CUR_TYPE_USD 2001 596193.28 NaN T30:367_T33:396 NaN 275213 ZWE EAR_4MTH_SEX_ECO_CUR_NB DA:1824 SEX_T ECO_ISIC2_9 CUR_TYPE_LCU 2001 14681.49 NaN T30:367_T33:396 NaN 275214 ZWE EAR_4MTH_SEX_ECO_CUR_NB DA:1824 SEX_T ECO_ISIC2_9 CUR_TYPE_USD 2001 266380.85 NaN T30:367_T33:396 NaN 275215 ZWE EAR_4MTH_SEX_ECO_CUR_NB DA:1824 SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2001 12770.84 C5:2067 T30:367_T33:396 NaN 275216 ZWE EAR_4MTH_SEX_ECO_CUR_NB DA:1824 SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2001 231714.03 C5:2067 T30:367_T33:396 NaN [275217 rows x 11 columns]
  20. DataFrame — двумерная таблица с метками по осям • data

    — объект DataFrame pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.html • Идентификаторы (метки) колонок — имена колонок (первая строка таблицы в файле CSV, если не указать специально) • Идентификаторы (метки) строк (дополнительная колонка DataFrame.index) — генерируются автоматически (или можно указать в качестве индекса колонку исходного файла CSV с уникальными значениями)
  21. print( "Row count:" ) print( len(data) ) print( len(data.index) )

    print( data.shape[0] ) Row count: 275217 275217 275217 • docs.python.org/3/library/functions.html#len • docs.python.org/3/reference/datamodel.html#object.__len__ • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.index.html • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.shape.html • stackoverflow.com/questions/15943769/how-do-i-get-the-row-count-of-a-pandas-dataframe Количество строк в таблице
  22. print( "Column count:" ) print( data.shape[1] ) Column count: 11

    Количество колонок в таблице (не считая индекса) • pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.shape.html
  23. (row_count, col_count) = data.shape print( "row count=" + str(row_count) +

    ", column count=" + str(col_count) ) Можно так • pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.shape.html row count=275217, column count=11
  24. Не путать: • data.size: количество ячеек во всей таблице: кол-во

    строк * кол-во колонок pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.size.html • data.count(): количество непустых ячеек в каждой из колонок таблицы pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.count.html • (size — без круглых скобок, т. к. это поле, а не функция) • (count() — с круглыми скобками, т. к. это функция, а не поле)
  25. print( data.head() ) • pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.head.html Первые пять строк ref_area

    indicator source sex classif1 classif2 time obs_value note_classif note_indicator note_source 0 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_TOTAL CUR_TYPE_LCU 2010 3013.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 1 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_TOTAL CUR_TYPE_PPP 2010 1860.38 NaN T30:62_T11:142_T12:145_T33:396 S3:20 2 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_TOTAL CUR_TYPE_USD 2010 1683.24 NaN T30:62_T11:142_T12:145_T33:396 S3:20 3 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_LCU 2010 2187.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 4 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_PPP 2010 1350.37 NaN T30:62_T11:142_T12:145_T33:396 S3:20
  26. print( data[:10] ) Произвольный диапазон: первые 10 строк ref_area indicator

    source sex classif1 classif2 time obs_value note_classif note_indicator note_source 0 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_TOTAL CUR_TYPE_LCU 2010 3013.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 1 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_TOTAL CUR_TYPE_PPP 2010 1860.38 NaN T30:62_T11:142_T12:145_T33:396 S3:20 2 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_TOTAL CUR_TYPE_USD 2010 1683.24 NaN T30:62_T11:142_T12:145_T33:396 S3:20 3 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_LCU 2010 2187.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 4 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_PPP 2010 1350.37 NaN T30:62_T11:142_T12:145_T33:396 S3:20 5 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_USD 2010 1221.79 NaN T30:62_T11:142_T12:145_T33:396 S3:20 6 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_LCU 2010 1830.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 7 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_PPP 2010 1129.94 NaN T30:62_T11:142_T12:145_T33:396 S3:20 8 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_USD 2010 1022.35 NaN T30:62_T11:142_T12:145_T33:396 S3:20 9 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_C CUR_TYPE_LCU 2010 2619.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20
  27. print( data[4:10] ) ref_area indicator source sex classif1 classif2 time

    obs_value note_classif note_indicator note_source 4 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_PPP 2010 1350.37 NaN T30:62_T11:142_T12:145_T33:396 S3:20 5 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_USD 2010 1221.79 NaN T30:62_T11:142_T12:145_T33:396 S3:20 6 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_LCU 2010 1830.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 7 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_PPP 2010 1129.94 NaN T30:62_T11:142_T12:145_T33:396 S3:20 8 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_USD 2010 1022.35 NaN T30:62_T11:142_T12:145_T33:396 S3:20 9 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_C CUR_TYPE_LCU 2010 2619.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 print( data[4:12] ) ref_area indicator source sex classif1 classif2 time obs_value note_classif note_indicator note_source 4 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_PPP 2010 1350.37 NaN T30:62_T11:142_T12:145_T33:396 S3:20 5 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_USD 2010 1221.79 NaN T30:62_T11:142_T12:145_T33:396 S3:20 6 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_LCU 2010 1830.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 7 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_PPP 2010 1129.94 NaN T30:62_T11:142_T12:145_T33:396 S3:20 8 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_USD 2010 1022.35 NaN T30:62_T11:142_T12:145_T33:396 S3:20 9 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_C CUR_TYPE_LCU 2010 2619.00 NaN T30:62_T11:142_T12:145_T33:396 S3:20 10 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_C CUR_TYPE_PPP 2010 1617.11 NaN T30:62_T11:142_T12:145_T33:396 S3:20 11 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_C CUR_TYPE_USD 2010 1463.13 NaN T30:62_T11:142_T12:145_T33:396 S3:20
  28. Произвольный диапазон строк • Оператор «квадратные скобки» + диапазон (т.

    н. slice object) data[ индекс_начала : «индекс_конца + 1» ] • Возвращает выбранные строки как объект DataFrame • «индекс_конца + 1» <=> «индекс_начала + кол-во» • Пустое значение индекс_начала: начать с первого элемента (идекс = 0) • Пустое значение «индекс_конца + 1»: вывести все элементы, начиная с индекс_начала, до последнего • Если индекс_начала >= «индекс_конца + 1»: пустая таблица DataFrame
  29. Отдельная строка по индексу print( data[4] ) <= ERROR Traceback

    (most recent call last): [...] File "/[...]/python3.9/site-packages/pandas/core/frame.py", line 3024, in __getitem__ indexer = self.columns.get_loc(key) File "/[...]/python3.9/site-packages/pandas/core/indexes/base.py", line 3082, in get_loc raise KeyError(key) from err KeyError: 4
  30. Отдельная строка по индексу print( data.iloc[4] ) ref_area ABW indicator

    EAR_4MTH_SEX_ECO_CUR_NB source AA:22 sex SEX_T classif1 ECO_ISIC3_A classif2 CUR_TYPE_PPP time 2010 obs_value 1350.37 note_classif NaN note_indicator T30:62_T11:142_T12:145_T33:396 note_source S3:20 Name: 4, dtype: object • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html
  31. Диапазон строк с диапазоном колонок print( data.iloc[4:12, 0:8] ) print(

    type(data.iloc[4:12, 0:8]) ) ref_area indicator source sex classif1 classif2 time obs_value 4 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_PPP 2010 1350.37 5 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_A CUR_TYPE_USD 2010 1221.79 6 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_LCU 2010 1830.00 7 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_PPP 2010 1129.94 8 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_B CUR_TYPE_USD 2010 1022.35 9 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_C CUR_TYPE_LCU 2010 2619.00 10 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_C CUR_TYPE_PPP 2010 1617.11 11 ABW EAR_4MTH_SEX_ECO_CUR_NB AA:22 SEX_T ECO_ISIC3_C CUR_TYPE_USD 2010 1463.13 <class 'pandas.core.frame.DataFrame'> • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html
  32. DataFrame.iloc • DataFrame.iloc + оператор «квадратные скобки» + индекс строки

    data.iloc[ индекс_строки ] - возвращает: объект Series • DataFrame.iloc + оператор «квадратные скобки» + диапазон для строк + диапазон для колонок (необязательный) data.iloc[ «диапазон slice object для строк», «диапазон slice object для колонок» ] data.iloc[ индекс_начала : «индекс_конца + 1», индекс_первой_колонки : «индекс_последней_колонки + 1» ] - возвращает: объект DataFrame • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html
  33. Оператор «квадратные скобки» []: DataFrame[] vs DataFrame.iloc[] • Квадратные скобки

    (square brackets) [] • Любой объект Python может заполучить себе такие же, если реализует метод __getitem__ (для чтения) и __setitem__ (для записи) docs.python.org/3/reference/datamodel.html#object.__getitem__ docs.python.org/3/reference/datamodel.html#object.__setitem__ • В Pandas оператор квадратные скобки есть как минимум у самого объекта DataFrame и у поля DataFrame.iloc • Использовать можно и то и другое: pandas.pydata.org/docs/getting_started/intro_tutorials/03_subset_data.html pandas.pydata.org/pandas-docs/stable/user_guide/10min.html#selection pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html
  34. Оператор «квадратные скобки» []: DataFrame[] vs DataFrame.iloc[] • Они во

    многом друг друга дублируют • DataFrame[] немного лаконичнее • Но, как видим, у DataFrame.iloc[] есть возможности, которых нет у DataFrame[] • Верно и обратное: DataFrame[] умеет делать некоторые вещи, которые не умеет DataFrame.iloc[] • (спойлер: у DataFrame есть еще другие специализированные индексаторы, кроме iloc)
  35. Оператор «квадратные скобки» []: DataFrame[] vs DataFrame.iloc[] • При этом,

    документация на DataFrame.iloc размещена в разделе «Indexing, iteration» API Pandas DataFrame pandas.pydata.org/pandas-docs/stable/reference/frame.html#indexing-iteration pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html • но документации на реализацию DataFrame.__getitem__ (DataFrame[]) там почему-то нет missing docs (??): pandas.DataFrame.__getitem__.html • Дальше: будем использовать DataFrame[] (DataFrame.__getitem__) там, где можно не использовать DataFrame.iloc[]
  36. Список названий колонок print( list(data.columns.values) ) или print( data.columns.values.tolist() )

    ['ref_area', 'indicator', 'source', 'sex', 'classif1', 'classif2', 'time', 'obs_value', 'note_classif', 'note_indicator', 'note_source'] • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.columns.html • docs.python.org/3/library/functions.html#func-list
  37. Значения отдельной колонки print( data['sex'] ) print( type(data['sex']) ) 0

    SEX_T 1 SEX_T 2 SEX_T 3 SEX_T ... 275213 SEX_T 275214 SEX_T 275215 SEX_T 275216 SEX_T Name: sex, Length: 275217, dtype: object <class 'pandas.core.series.Series'>
  38. Отдельная колонка • Оператор DataFrame «квадратные скобки» + имя колонки

    data[ "имя_колонки" ] а вот так нельзя (обращение к DataFrame.iloc не по числовому индексу): data.iloc[ "имя_колонки" ] <= ERROR • возвращает: объект Series • Series — одномерный массив ndarray с метками элементов-строк (ndarray — массив из Numpy) pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.html numpy.org/doc/stable/reference/generated/numpy.ndarray.html
  39. Количество элементов в колонке print( data['sex'].size ) 275217 • обратить

    внимание: size не функция, а поле pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.size.html
  40. Обращение к колонкам: через скобки vs через точку • Should

    you use "dot notation" or "bracket notation" with pandas? www.dataschool.io/pandas-dot-notation-vs-brackets/ • Варианты равносильны за исключением некоторых технических нюансов • Через точку лаконичней и красивей, • но, например, через точку обратиться просто так не получится, если имя колонки содержит спецсимволы (например, точки и пробелы) • Будем обращаться через точку, где возможно
  41. print( data.sex.value_counts() ) print( data['sex'].value_counts() ) SEX_T 112279 SEX_M 82663

    SEX_F 80275 Name: sex, dtype: int64 • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.value_counts.html print( data.sex.value_counts()['SEX_T'] ) 112279 Уникальные значения и их количество: Series.value_counts
  42. Уникальные значения и их количество: Series.value_counts pandas.pydata.org/pandas- docs/stable/reference/api/pandas.Series.value_counts.html • Удобно

    посмотреть количество элементов для категорий (повторяющиеся элементы в колонке) и получить сами категории • Результат — тоже объект Series: - ключ (метка): уникальное значение в колонке - значение: количество вхождений этого уникального значения
  43. заглянем в bulk_dic/sex_en.csv • "SEX_M","Sex: Male" — мужчины • "SEX_F","Sex:

    Female" — женщины • "SEX_O","Sex: Other" — другое • "SEX_T","Sex: Total" — все вместе
  44. • В нашу выборку попали: SEX_T, SEX_M, SEX_F • Логично

    было бы предположить, что SEX_T берется из SEX_M и SEX_F и усредняется. • В таком случае количество записей SEX_T должно быть равно SEX_M и SEX_F, но это не так. • Есть группы записей, в которых фигурирует только SEX_T, но нет SEX_M и SEX_F, • Или, наоборот, есть разбивка по SEX_M и SEX_F, но нет SEX_T • Поэтому получить SEX_T из SEX_M и SEX_F мы не можем (по крайней мере, не для всех записей). • Нужно смотреть методику, как собирали информацию (помним, что есть поле «источник информации» source для каждой из строк). • Далее будем использовать данные для SEX_T («среднее по всем полам»)
  45. Посмотрим все страны print( data.ref_area.value_counts() ) print( data['ref_area'].value_counts() ) EGY

    5729 BRA 5625 CRI 5516 USA 5233 URY 5061 ... HTI 60 AIA 24 BHS 12 KWT 12 TKM 8 Name: ref_area, Length: 181, dtype: int64
  46. Посмотрим все страны • Стран много (181 шт.) • В

    таблице используются 3-хбуквенные коды территорий • Видим знакомый код: «USA»
  47. print( data[data.ref_area == 'USA'] ) ref_area indicator source sex classif1

    classif2 time obs_value note_classif note_indicator note_source 260541 USA EAR_4MTH_SEX_ECO_CUR_NB BA:453 SEX_T ECO_ISIC4_TOTAL CUR_TYPE_LCU 2003 2869.14 NaN T30:105 R1:3513_T2:85 260542 USA EAR_4MTH_SEX_ECO_CUR_NB BA:453 SEX_T ECO_ISIC4_TOTAL CUR_TYPE_PPP 2003 2869.14 NaN T30:105 R1:3513_T2:85 260543 USA EAR_4MTH_SEX_ECO_CUR_NB BA:453 SEX_T ECO_ISIC4_TOTAL CUR_TYPE_USD 2003 2869.14 NaN T30:105 R1:3513_T2:85 260544 USA EAR_4MTH_SEX_ECO_CUR_NB BA:453 SEX_T ECO_ISIC4_A CUR_TYPE_LCU 2003 2074.25 NaN T30:105 R1:3513_T2:85 260545 USA EAR_4MTH_SEX_ECO_CUR_NB BA:453 SEX_T ECO_ISIC4_A CUR_TYPE_PPP 2003 2074.25 NaN T30:105 R1:3513_T2:85 ... ... ... ... ... ... ... ... ... ... ... ... 265769 USA EAR_4MTH_SEX_ECO_CUR_NB DA:1765 SEX_T ECO_ISIC2_9 CUR_TYPE_PPP 2002 2151.23 NaN T30:105_T33:396_I11:266 S7:57_S9:67 265770 USA EAR_4MTH_SEX_ECO_CUR_NB DA:1765 SEX_T ECO_ISIC2_9 CUR_TYPE_USD 2002 2151.23 NaN T30:105_T33:396_I11:266 S7:57_S9:67 265771 USA EAR_4MTH_SEX_ECO_CUR_NB DA:1765 SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2002 2180.85 C5:2067 T30:105_T33:396_I11:266 S7:57_S9:67 265772 USA EAR_4MTH_SEX_ECO_CUR_NB DA:1765 SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2002 2180.85 C5:2067 T30:105_T33:396_I11:266 S7:57_S9:67 265773 USA EAR_4MTH_SEX_ECO_CUR_NB DA:1765 SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2002 2180.85 C5:2067 T30:105_T33:396_I11:266 S7:57_S9:67 [5233 rows x 11 columns] Что там в США
  48. Данные по России print( data[data.ref_area == 'RUS'] ) ref_area indicator

    source sex classif1 classif2 time obs_value note_classif note_indicator note_source 226269 RUS EAR_4MTH_SEX_ECO_CUR_NB DA:122 SEX_T ECO_ISIC2_1 CUR_TYPE_LCU 1982 155.00 NaN T30:333_T33:396 NaN 226270 RUS EAR_4MTH_SEX_ECO_CUR_NB DA:122 SEX_T ECO_ISIC2_5 CUR_TYPE_LCU 1982 227.00 NaN T30:333_T33:396 NaN 226271 RUS EAR_4MTH_SEX_ECO_CUR_NB DA:122 SEX_T ECO_ISIC2_6 CUR_TYPE_LCU 1982 145.00 NaN T30:333_T33:396 NaN 226272 RUS EAR_4MTH_SEX_ECO_CUR_NB DA:122 SEX_T ECO_ISIC2_7 CUR_TYPE_LCU 1982 217.00 NaN T30:333_T33:396 NaN 226273 RUS EAR_4MTH_SEX_ECO_CUR_NB DA:122 SEX_T ECO_ISIC2_8 CUR_TYPE_LCU 1982 180.00 NaN T30:333_T33:396 NaN ... ... ... ... ... ... ... ... ... ... ... ... 227377 RUS EAR_4MTH_SEX_ECO_CUR_NB DA:122 SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 690.93 NaN T30:201_T12:145 S3:21_S4:34 227378 RUS EAR_4MTH_SEX_ECO_CUR_NB DA:122 SEX_M ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2019 52533.00 NaN T30:201_T12:145 S3:21_S4:34 227379 RUS EAR_4MTH_SEX_ECO_CUR_NB DA:122 SEX_M ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 811.48 NaN T30:201_T12:145 S3:21_S4:34 227380 RUS EAR_4MTH_SEX_ECO_CUR_NB DA:122 SEX_F ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2019 37872.00 NaN T30:201_T12:145 S3:21_S4:34 227381 RUS EAR_4MTH_SEX_ECO_CUR_NB DA:122 SEX_F ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 585.01 NaN T30:201_T12:145 S3:21_S4:34 [1113 rows x 11 columns]
  49. Срежем лишние колонки • indicator: EAR_4MTH_SEX_ECO_CUR_NB • source: источник данных,

    код источника в source_en.csv • note_classif: заметки по классификатору, много NaN (но не везде), код замечания в note_classif_en.csv • note_indicator: заметки по индикатору, код замечания в note_indicator_en.csv • note_source: заметки по источнику, код замечания в note_source_en.csv
  50. Срежем лишние колонки data = data[['ref_area', 'sex', 'classif1', 'classif2', 'time',

    'obs_value']] • Оставим: ref_area, sex, classif1, classif2, time, obs_value
  51. Выбрать отдельные колонки • Оператор DataFrame «квадратные скобки» + массив

    имен колонок data[ ["имя_колонки_1", "имя_колонки_2",...] ] • Вернет таблицу с теми же строками, но только с перечисленными колонками • Можно изменить порядок колонок • возвращает: объект DataFrame
  52. ref_area sex classif1 classif2 time obs_value 226269 RUS SEX_T ECO_ISIC2_1

    CUR_TYPE_LCU 1982 155.00 226270 RUS SEX_T ECO_ISIC2_5 CUR_TYPE_LCU 1982 227.00 226271 RUS SEX_T ECO_ISIC2_6 CUR_TYPE_LCU 1982 145.00 226272 RUS SEX_T ECO_ISIC2_7 CUR_TYPE_LCU 1982 217.00 226273 RUS SEX_T ECO_ISIC2_8 CUR_TYPE_LCU 1982 180.00 ... ... ... ... ... ... ... 227377 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 690.93 227378 RUS SEX_M ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2019 52533.00 227379 RUS SEX_M ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 811.48 227380 RUS SEX_F ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2019 37872.00 227381 RUS SEX_F ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 585.01 [1113 rows x 6 columns] print( data[data.ref_area == 'RUS'] ) Остались колонки
  53. print( data[data.ref_area == 'RUS'].time .value_counts() ) 2017 162 2019 108

    2005 54 2016 54 2015 54 2014 54 2013 54 2012 54 2011 54 2010 54 2009 54 2008 54 2007 54 2006 54 1997 51 1998 17 1996 17 1995 17 1994 9 1993 9 1992 7 1991 7 1990 7 1989 7 1988 7 1987 7 1986 7 1985 7 1984 7 1983 6 1982 6 Name: time, dtype: int64 Какие наши годы
  54. print( data[data.ref_area == 'RUS'].time .value_counts().sort_index() ) 1982 6 1983 6

    1984 7 1985 7 1986 7 1987 7 1988 7 1989 7 1990 7 1991 7 1992 7 1993 9 1994 9 1995 17 1996 17 1997 51 1998 17 2005 54 2006 54 2007 54 2008 54 2009 54 2010 54 2011 54 2012 54 2013 54 2014 54 2015 54 2016 54 2017 162 2019 108 Name: time, dtype: int64 - Видим, что идут подряд с 1982 по 2019, - Перерыв 1999-2004 Отсортируем по году, т.е. по индексу • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.sort_index.html • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.sort_values.html
  55. Посмотрим данные по России за 2005 год • Здесь оператор

    сравнения «==» • Сравнение со строкой и целым числом (типы данных определились автоматически при загрузке) • Оператор логическое И (AND): «&» • Обратить внимание: операнды «&» взяты в скобки — это не излишество, а суровая необходимость, т. к. у него более высокий приоритет по отношению к операторам «==» и он будет «перетягивать» себе их параметры docs.python.org/3/reference/expressions.html#operator-precedence stackoverflow.com/questions/50656307/numpy-typeerror-ufunc-bitwise-and-not-supported-for-the-input- types-when-us print( data[ (data.ref_area == 'RUS') & (data.time == 2005) ] )
  56. ref_area sex classif1 classif2 time obs_value 226464 RUS SEX_T ECO_ISIC3_TOTAL

    CUR_TYPE_LCU 2005 8555.00 226465 RUS SEX_T ECO_ISIC3_TOTAL CUR_TYPE_PPP 2005 638.87 226466 RUS SEX_T ECO_ISIC3_TOTAL CUR_TYPE_USD 2005 302.46 226467 RUS SEX_T ECO_ISIC3_A CUR_TYPE_LCU 2005 3839.00 226468 RUS SEX_T ECO_ISIC3_A CUR_TYPE_PPP 2005 286.69 226469 RUS SEX_T ECO_ISIC3_A CUR_TYPE_USD 2005 135.73 226470 RUS SEX_T ECO_ISIC3_B CUR_TYPE_LCU 2005 10234.00 226471 RUS SEX_T ECO_ISIC3_B CUR_TYPE_PPP 2005 764.25 226472 RUS SEX_T ECO_ISIC3_B CUR_TYPE_USD 2005 361.82 ... 226509 RUS SEX_T ECO_ISIC3_O CUR_TYPE_LCU 2005 6291.00 226510 RUS SEX_T ECO_ISIC3_O CUR_TYPE_PPP 2005 469.80 226511 RUS SEX_T ECO_ISIC3_O CUR_TYPE_USD 2005 222.42 226512 RUS SEX_T ECO_ISIC3_Q CUR_TYPE_LCU 2005 18922.00 226513 RUS SEX_T ECO_ISIC3_Q CUR_TYPE_PPP 2005 1413.06 226514 RUS SEX_T ECO_ISIC3_Q CUR_TYPE_USD 2005 668.99 226515 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2005 8555.00 226516 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2005 638.87 226517 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2005 302.46
  57. • ref_area, sex, time — всё понятно • В колонке

    obs_value (средняя зарплата) видим странные периодические скачки • Уже видно, что obs_value для строк с classif2==CUR_TYPE_LCU в несколько раз больше, чем для classif2==CUR_TYPE_PPP и для classif2==CUR_TYPE_USD • Посмотрим, что это за классификаторы - classif1 - classif2
  58. print( data.classif1.value_counts() ) ECO_AGGREGATE_TOTAL 14440 ECO_ISIC4_TOTAL 6175 ECO_ISIC4_C 6143 ECO_ISIC4_G

    6117 ECO_ISIC4_K 6076 ... ECO_ISIC3_Q 1483 ECO_AGGREGATE_X 1357 ECO_ISIC4_X 1227 ECO_ISIC3_X 894 ECO_ISIC2_0 120 Name: classif1, Length: 61, dtype: int64 классификатор-1: колонка classif1
  59. • Все значения начинаются на «ECO_» (но это не точно)

    • Самое частое значение: «ECO_AGGREGATE_TOTAL»
  60. classif1 — вид экономической активности • "ECO_AGGREGATE_TOTAL","Economic activity (Aggregate): Total",183

    • "ECO_AGGREGATE_AGR","Economic activity (Aggregate): Agriculture",184 • "ECO_AGGREGATE_MAN","Economic activity (Aggregate): Manufacturing",185 • "ECO_AGGREGATE_MANEL","Economic activity (Aggregate): Manufacturing; Electricity, gas and water supply",186 • "ECO_AGGREGATE_CON","Economic activity (Aggregate): Construction",187 • "ECO_AGGREGATE_MEL","Economic activity (Aggregate): Mining and quarrying; Electricity, gas and water supply",188 • "ECO_AGGREGATE_MKT","Economic activity (Aggregate): Trade, Transportation, Accommodation and Food, and Business and Administrative Services",189 • "ECO_AGGREGATE_PUB","Economic activity (Aggregate): Public Administration, Community, Social and other Services and Activities",190 • "ECO_AGGREGATE_X","Economic activity (Aggregate): Not classified",191 • ...
  61. • Разбивка зарплат по видам деятельности • В файле classif1_en.csv

    встречаются и другие классификаторы по другим темам, но в нашем датасете встречаются только варианты «ECO_XXX» («ECO» — «Economical activity») • Вариант ECO_XXX_TOTAL — по всем видам деятельности вместе • ECO_AGGREGATE_TOTAL — наиболее популярный вариант классификации, но есть и другие • ECO_ISIC4_TOTAL, ECO_ISIC3_TOTAL и т. п.
  62. • Классификатор ECO_AGGREGATE_TOTAL встречается 1 раз на 1 год на

    одну страну (для выбранных sex и classif2) (САМОСТОЯТЕЛЬНО: проверьте) • Может быть такое, что для страны данные есть на выбранный год, но записи ECO_AGGREGATE_TOTAL не указано • Но он все равно встречается значительно чаще остальных • Будем использовать ECO_AGGREGATE_TOTAL для получения значения средней зарплаты для выбранной страны в выбранный год
  63. print( data.classif2.value_counts() ) CUR_TYPE_LCU 104605 CUR_TYPE_USD 94732 CUR_TYPE_PPP 75880 Name:

    classif2, dtype: int64 классификатор-2: колонка classif2
  64. classif2 — валюта (currency) Из всего множества значений classif2 здесь

    используются только 3 (начинаются на «CUR_» — «currency» ): • "CUR_TYPE_LCU","Currency: Local currency",242 • "CUR_TYPE_PPP","Currency: 2017 PPP $",243 • "CUR_TYPE_USD","Currency: U.S. dollars",244
  65. classif2 — валюта (currency) • CUR_TYPE_LCU — локальная валюта (рубли,

    юани и т. п.) • CUR_TYPE_PPP — purchasing power parity (парите́т покупа́тельной спосо́бности), доллары en.wikipedia.org/wiki/Purchasing_power_parity ru.wikipedia.org/wiki/Паритет_покупательной_способности Парите́т покупа́тельной спосо́бности (англ. purchasing power parity) — соотношение двух или нескольких денежных единиц, валют разных стран, устанавливаемое по их покупательной способности применительно к определённому набору товаров и услуг. Согласно теории о паритете покупательной способности, на одну и ту же сумму денег, пересчитанную по текущему курсу в национальные валюты, в разных странах мира можно приобрести одно и то же количество товаров и услуг при отсутствии транспортных издержек и ограничений по перевозке. • CUR_TYPE_USD — доллары США по историческому курсу на целевой год • Будем использовать: CUR_TYPE_USD (не учитывает инфляцию и разность цен по странам, но для поверхностного взгляда сойдет)
  66. print( data[ (data.ref_area == 'RUS') & (data.classif1 == 'ECO_AGGREGATE_TOTAL') &

    ( (data.time >= 2013) & (data.time <= 2015) ) ] ) ref_area sex classif1 classif2 time obs_value 226947 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2013 29792.00 226948 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2013 1425.99 226949 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2013 935.76 227001 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2014 32495.00 227002 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2014 1453.57 227003 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2014 846.70 227055 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2015 34030.00 227056 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2015 1382.00 227057 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2015 558.44
  67. Проверим данные на правдоподобность • Помним: в 2014-м году произошло

    падение курса рубля в 2 раза с 30 руб. до 60 руб. за $1. • CUR_TYPE_LCU — получается, наши рубли • CUR_TYPE_USD — получается, американские доллары CUR_TYPE_LCU / CUR_TYPE_USD • 2013: 29792 / 935 = 31.86 • 2014: 32495 / 846 = 38.41 • 2015: 34030 / 558 = 60.99 • ок — сходится, похоже на правду
  68. Запросы к данным: почему так можно? • Внутри квадратных скобок

    стоим запросы не хуже, чем в SQL • Но здесь не чужеродная строка с запросом, а родные конструкции самого языка Пайтон • Откуда такое волшебство?
  69. Запросы к данным: почему так можно? • Всё благодаря тому,

    что оператор «квадратные скобки» DataFrame и Series (т. е. Numpy ndarray) принимает массив булевых значений True/False (boolean array) в качестве фильтра • И еще благодаря операторам сравнения и булевым операциям объектов Series (поэлементные операции Numpy ndarray), которые работают поэлементно и генерируют в качестве результата те самые массивы булевых значений (булевы массивы)
  70. data_rus = data[ (data.ref_area == 'RUS') & (data.classif1 == 'ECO_AGGREGATE_TOTAL')

    & ( (data.time >= 2013) & (data.time <= 2015) ) ] print( data_rus ) ref_area sex classif1 classif2 time obs_value 226947 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2013 29792.00 226948 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2013 1425.99 226949 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2013 935.76 227001 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2014 32495.00 227002 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2014 1453.57 227003 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2014 846.70 227055 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2015 34030.00 227056 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2015 1382.00 227057 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2015 558.44 Для наглядности подрежем data до data_rus:
  71. boolean_filter = (data_rus.time == 2014) print( boolean_filter ) print( type(boolean_filter)

    ) 226947 False 226948 False 226949 False 227001 True 227002 True 227003 True 227055 False 227056 False 227057 False Name: time, dtype: bool <class 'pandas.core.series.Series'> • Поэлементное сравнение: по одному значению True/False на каждый элемент data_rus.time • Результат: объект Pandas Series
  72. print( data_rus[boolean_filter] ) ref_area sex classif1 classif2 time obs_value 227001

    RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2014 32495.00 227002 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2014 1453.57 227003 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2014 846.70 ref_area sex classif1 classif2 time obs_value 226947 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2013 29792.00 226948 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2013 1425.99 226949 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2013 935.76 227001 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2014 32495.00 227002 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2014 1453.57 227003 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2014 846.70 227055 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_LCU 2015 34030.00 227056 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_PPP 2015 1382.00 227057 RUS SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2015 558.44 226947 False 226948 False 226949 False 227001 True 227002 True 227003 True 227055 False 227056 False 227057 False • В массиве булевых значений столько же значений, сколько в исходной таблице строк • После применения фильтра в таблице остаются только те строки, для которых в булевом массиве- фильтре стоит True Применим фильтр
  73. «Квадратные скобки»: фильтр по булеву массиву • DataFrame/Series + оператор

    «квадратные скобки» + массив булевых значений (boolean array) data[ булев_массив ] • возвращает: объект DataFrame/Series • В массиве булев_массив столько же значений, сколько в исходной таблице строк • После применения фильтра в таблице остаются только те строки, для которых в булевом массиве-фильтре булев_массив стоит True
  74. Операторы сравнения в Питоне <, <=, ==, !=, >, >=

    • Каждый класс может перегрузить: __lt__, __le__, __eq__, __ne__, __gt__, __ge__ • docs.python.org/3/reference/datamodel.html#object.__lt__ docs.python.org/3/reference/datamodel.html#object.__le__ docs.python.org/3/reference/datamodel.html#object.__eq__ … • docs.python.org/3/library/stdtypes.html#comparisons • docs.python.org/3/reference/expressions.html#operator-precedence
  75. Побитовые логические операторы в Питоне & («И»), I («ИЛИ») •

    (т. н. побитовые bitwise operators, не путать с булевыми «and» и «or») • Каждый класс может перегрузить: __and__, __or__ • docs.python.org/3/reference/datamodel.html#object.__and__ docs.python.org/3/reference/datamodel.html#object.__or__ • docs.python.org/3/reference/expressions.html#operator-precedence
  76. В Numpy ndarray (=> в Pandas Series) они перегружены и

    работают поэлементно «Arithmetic and comparison operations on ndarrays are defined as element-wise operations, and generally yield ndarray objects as results.» • numpy.org/doc/stable/reference/arrays.ndarray.html#arithmetic- matrix-multiplication-and-comparison-operations • numpy.org/doc/stable/reference/ufuncs.html#comparison-functions
  77. Посмотрим разные значения • Максимальная средняя зарплата в долларах по

    миру (любой год) • Минимальная средняя зарплата в долларах по миру (любой год) • Средняя средняя зарплата в долларах по миру за все годы • Медианная средняя зарплата в долларах по миру за все годы
  78. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].obs_value.max() ) 99686341.6 • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.max.html Максимальная средняя зарплата в долларах по миру (любой год)
  79. Максимальная средняя зарплата в долларах по миру (любой год) •

    Максимальное значение колонки obs_value в отфильтрованной таблице: Series.max() • Валюта — доллары США (classif2 == 'CUR_TYPE_USD') • Результат: $99686341.6 • (99 миллионов 686 тысяч 341.6 долларов США в месяц) • Это среднемесячная зарплата в какой-то пока неизвестной нам стране (по данным нашего датасета) • Это довольно много, будет интересно узнать, в какой стране платят такие зарплаты в среднем, а не отдельным гражданам
  80. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].obs_value.min() ) 0.18 • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.min.html Минимальная средняя зарплата в долларах по миру (любой год)
  81. Минимальная средняя зарплата в долларах по миру (любой год) •

    Минимальное значение колонки obs_value в отфильтрованной таблице: Series.min() • Валюта — доллары США (classif2 == 'CUR_TYPE_USD') • Результат: $0.18 • (ноль целых 18 сотых доллара США, т. е. 18 центов в месяц) • Это среднемесячная зарплата в какой-то пока неизвестной нам стране (по данным нашего датасета)
  82. Минимальная средняя зарплата в долларах по миру (любой год) •

    0.18$ (18 центов) в месяц — это довольно мало, даже по нашим меркам • Можно было бы предположить, что жители с такой зарплатой ничего не едят, а питаются энергией Солнца • Но дело может быть в том, что у них основа экономики — натуральное сельское хозяйство (т. е. продукты питания, например, не покупаются за деньги, а выращиваются и сразу потребляются на месте) • Значительная часть привычных нам продуктов (одежда, бытовая техника и т. п.), конечно, жителям такой страны будет не доступна. т. к. она продаётся за деньги и производится не у них • Но и ошибку в данных тоже нельзя исключать • В любом случае, будет интересно выяснить, что это за страна
  83. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].obs_value.mean() ) 48796.33351594073 • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.mean.html Средняя средняя зарплата в долларах по миру (любой год)
  84. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].obs_value.sum() / len(data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') & (data.classif2 == 'CUR_TYPE_USD') ]) ) 48796.33351594073 • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.sum.html Или так (по формуле):
  85. Средняя средняя зарплата в долларах по миру (любой год) •

    Средняя средняя (два раза — не опечатка) • Среднее значение всех значений колонки obs_value (которые, в свою очередь, сами являются значениями средней зарплаты) в отфильтрованной таблице: Series.mean() • Валюта — доллары США (classif2 == 'CUR_TYPE_USD') • Результат: $48796 • (48 тысяч 796 долларов США в месяц) • Как средняя зарплата по миру звучит не очень правдоподобно, но на фоне $100 млн. уже не поражает воображение • Заметим: усреднение идет не по количеству людей, а по отдельным странам в выборке, т. е. страна с населением 1 млрд. человек и страна с населением 100 тыс. человек в «среднее среднее» дадут равноправный вклад.
  86. Среднее (mean) vs медиана (median) • у меня з/п 200

    тыс. руб., вас 10 человек с з/п 20 тыс. руб. (всего 11 человек) • Средняя зарплата у нас (200+200)/11 = 36.4 тыс. руб. на человека • Медианная зарплата у нас 20 тыс. руб.: 20 20 20 20 20 < [20] < 20 20 20 20 200 (половина значений в выборке меньше, другая половина — больше этого значения) • (медиана срезает всплески по краям)
  87. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].obs_value.median() ) 449.91 • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.median.html Медианная средняя зарплата в долларах по миру (любой год)
  88. Медианная средняя зарплата в долларах по миру (любой год) •

    Медианное значение всех значений колонки obs_value (которые, в свою очередь, являются значениями средней зарплаты) в отфильтрованной таблице: Series.median() • Валюта — доллары США (classif2 == 'CUR_TYPE_USD') • Результат: $449.91 • (450 долларов США в месяц) • А вот это уже вполне реалистично (медиана срезала по краям аномалии) • Заметим: вычисление медианы идет не по количеству людей, а по отдельным странам в выборке, т. е. страна с населением 1 млрд. человек и страна с населением 100 тыс. человек в «медианное среднее» дадут равноправный вклад.
  89. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].sort_values(by='obs_value', ascending=False)[:50] ) • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html Топ 50 стран с максимальной зарплатой за все годы
  90. ref_area sex classif1 classif2 time obs_value 26869 BLR SEX_T ECO_AGGREGATE_TOTAL

    CUR_TYPE_USD 2000 99686341.60 27061 BLR SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2008 461992.68 274802 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1982 378579.73 27037 BLR SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2007 365783.48 274780 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1981 352834.41 274758 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1980 324148.58 274824 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1983 308410.05 27013 BLR SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2006 307288.54 274912 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1987 283444.93 274956 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 277183.25 274846 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1984 273405.31 26989 BLR SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2005 258145.99 274890 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1986 254963.14 ... 275084 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1995 168119.09 275040 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1993 155793.99 275150 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1998 155512.87 275062 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1994 145173.28 26941 BLR SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2003 144788.29 275172 ZWE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1999 138457.43 26917 BLR SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2002 123009.63 26893 BLR SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2001 118705.04 45915 CHE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2014 7976.85 46095 CHE SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2016 7602.03 196773 NOR SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2013 7234.04
  91. • Первые 30 элементов с значениями obs_value > $100 тыс.

    — BLR и ZWE (коды ref_area) • (в т. ч. на первом месте BLR с известными нам $100 млн. в 2000-м году) • BLR (Belarus) — Белоруссия (см. bulk_dic/ref_area_en.csv) • ZWE (Zimbabwe) — Зимбабве • На 31-м месте CHE (Switzerland) — Швейцария с приземленными $7977 в мес. в 2014 году • Конечно, скорее всего это или ошибка в данных, или это число нужно как-то по-другому интерпретировать • На всякий случай сверимся с внешним источником
  92. В 2000-м году в Белоруссии • Средняя зарплата в декабре

    1999: 35 млн. белорусских рублей • Средняя зарплата в январе 2020: 36 тыс. белорусских рублей • Произошла деноминация 1 к 1000 • Потом: курс доллара вырос с 320 б.р./доллар в январе 2020 до 1180 б.р./доллар в декабре 2020 (TODO: указать источник) • Короче, полная чехарда • В январе 2020 средняя зарплата в USD: 36000/320 = $112
  93. • $100 млн. в месяц все равно никак не получается

    • Кроме того, суммы > 100 тыс не только в 2000-м году, но за все годы в Белоруссии и Зимбабве • Резюме: удалим из выборки Зимбабве (ref_area=ZWE) и Белоруссию (ref_area=BRL) TODO САМОСТОЯТЕЛЬНО: проверить значения колонок source и note_source, возможно, там найдутся объяснения
  94. data = data[ (data.ref_area != 'BLR') & (data.ref_area != 'ZWE')

    ] Удалим из выборки Зимбабве (ref_area=ZWE) и Белоруссию (ref_area=BRL)
  95. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].obs_value.max() ) 7976.85 • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.max.html Максимальная средняя зарплата в долларах по миру (любой год)
  96. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].obs_value.min() ) 0.18 • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.min.html Минимальная средняя зарплата в долларах по миру (любой год)
  97. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].obs_value.mean() ) 942.7245566727605 • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.mean.html Средняя средняя зарплата в долларах по миру (любой год)
  98. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].obs_value.median() ) 436.41499999999996 • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.median.html Медианная средняя зарплата в долларах по миру (любой год)
  99. Пересчитали • Максимальная средняя зарплата в долларах по миру (любой

    год): $7976.85 - было: $100 млн. - (теперь не фантастично) • Минимальная средняя зарплата в долларах по миру (любой год): $0.18 - (без изменений) • Средняя средняя зарплата в долларах по миру за все годы: $942 - было: $48796 - (теперь тоже правдоподобно) • Медианная средняя зарплата в долларах по миру за все годы: $436 - было: $449.91 - (уползла немного вниз за счет того, что из верхней части диапазона удалили некоторое количество строчек) - (но, в целом, почти не изменилась, т. к. медиана изначально усточива к единичным аномальным всплескам, которые срезаются с краёв)
  100. Но сначала сделаем одну вещь: • Смотреть коды стран в

    колонке ref_area не очень удобно • Было удобнее, если бы там были названия стран, а не коды • Названия стран, ассоциированные с кодами, есть файле bulk_dic/ref_area_en.csv • Давайте его загрузим и приклеем к нашей таблице
  101. data_ref_area = pandas.read_csv( 'bulk_dic/ref_area_en.csv', index_col='ref_area') print( data_ref_area[:10] ) Загрузим файл

    bulk_dic/ref_area_en.csv в новую таблицу DataFrame ref_area.label ref_area.sort ref_area X01 World 1 X02 World: Low income 2 X03 World: Lower-middle income 3 X04 World: Upper-middle income 4 X05 World: High income 5 X06 Africa 6 X07 Africa: Low income 7 X08 Africa: Lower-middle income 8 X09 Africa: Upper-middle income 9 X93 Africa: High income 10
  102. print( data_ref_area.columns.values.tolist() ) Точные названия колонок [' ref_area.label', ' ref_area.sort']

    • Кода ref_area нет в списке колонок, она превратилась в DataFrame.index • Имена оставшихся колонок начинаются с пробела • И содержат точку в середине
  103. • С пробелом и точкой в названии колонки мы не

    сможем обращаться к колонкам в формате data.col_name, только в формате data["col_name"] • Проблемы нет, можно и так, но пробел в начале мозолит глаза — он похож на недоработку, от него лучше избавиться • Переименуем колонки, чтобы избавиться от пробела • Заодно заменим точку «.» на нижнее подчеркивание «_»: « ref_area.label» => «ref_area_label» • Колонка « ref_area.sort» нам не нужна
  104. data_ref_area = data_ref_area.rename( columns={' ref_area.label': 'ref_area_label'}) data_ref_area = data_ref_area[['ref_area_label']] print(

    data_ref_area[:5] ) Переименуем колонку и оставим только её ref_area_label ref_area X01 World X02 World: Low income X03 World: Lower-middle income X04 World: Upper-middle income X05 World: High income • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename.html
  105. data = data.join(data_ref_area, on=['ref_area']) print( data[:5] ) Подклеим таблицу data_ref_area

    к исходной таблице data по значениям колонки "ref_area" (для data_ref_area это индекс) ref_area sex classif1 classif2 time obs_value ref_area_label 0 ABW SEX_T ECO_ISIC3_TOTAL CUR_TYPE_LCU 2010 3013.00 Aruba 1 ABW SEX_T ECO_ISIC3_TOTAL CUR_TYPE_PPP 2010 1860.38 Aruba 2 ABW SEX_T ECO_ISIC3_TOTAL CUR_TYPE_USD 2010 1683.24 Aruba 3 ABW SEX_T ECO_ISIC3_A CUR_TYPE_LCU 2010 2187.00 Aruba 4 ABW SEX_T ECO_ISIC3_A CUR_TYPE_PPP 2010 1350.37 Aruba • pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html
  106. • В таблице data появилась новая колонка ref_area_label — она

    содержит человеческие расшифровки к кодам ref_area • Для каждой строки data по значению колонки data.ref_area в таблице data_ref_area находится строка с таким же значением в data_ref_area.index • Из этой строки берется значение data_ref_area.ref_area_label и вклеивается в текущую строку data в качестве значения новой колонки data.ref_area_label • Другие режимы объединений таблиц — см. параметры DataFrame.join() pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.join.html
  107. data = data[ ['ref_area', 'ref_area_label', 'sex', 'classif1', 'classif2', 'time', 'obs_value']]

    print( data[:5] ) Сдвинем новую колонку влево ближе к её коду ref_area ref_area_label sex classif1 classif2 time obs_value 0 ABW Aruba SEX_T ECO_ISIC3_TOTAL CUR_TYPE_LCU 2010 3013.00 1 ABW Aruba SEX_T ECO_ISIC3_TOTAL CUR_TYPE_PPP 2010 1860.38 2 ABW Aruba SEX_T ECO_ISIC3_TOTAL CUR_TYPE_USD 2010 1683.24 3 ABW Aruba SEX_T ECO_ISIC3_A CUR_TYPE_LCU 2010 2187.00 4 ABW Aruba SEX_T ECO_ISIC3_A CUR_TYPE_PPP 2010 1350.37
  108. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].sort_values(by='obs_value', ascending=False)[:20] ) Топ 20 стран с максимальной зарплатой за все годы
  109. ref_area ref_area_label sex classif1 classif2 time obs_value 45915 CHE Switzerland

    SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2014 7976.85 46095 CHE Switzerland SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2016 7602.03 196773 NOR Norway SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2013 7234.04 196395 NOR Norway SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2011 7065.62 196584 NOR Norway SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2012 7047.70 130741 ISL Iceland SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2018 7008.30 196962 NOR Norway SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2014 6950.54 45549 CHE Switzerland SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2010 6741.13 130615 ISL Iceland SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2017 6664.20 45738 CHE Switzerland SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2012 6619.50 196206 NOR Norway SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2010 6303.60 29591 BMU Bermuda SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2013 6221.10 130827 ISL Iceland SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 6190.52 161470 LUX Luxembourg SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2011 5971.30 162766 LUX Luxembourg SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2018 5960.79 161902 LUX Luxembourg SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2013 5942.86 29543 BMU Bermuda SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2012 5869.80 29497 BMU Bermuda SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2010 5835.50 196017 NOR Norway SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2009 5820.30 29699 BMU Bermuda SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2009 5788.70
  110. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') ].sort_values(by='obs_value', ascending=True)[:20] ) Топ 20 стран с минимальной зарплатой за все годы
  111. ref_area ref_area_label sex classif1 classif2 time obs_value 17299 BEN Benin

    SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2011 0.18 154084 LBR Liberia SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2010 4.66 7159 ARM Armenia SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1994 6.06 247711 TJK Tajikistan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2000 7.50 247732 TJK Tajikistan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2001 9.91 247753 TJK Tajikistan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2002 11.78 186738 MWI Malawi SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1995 12.30 242961 SWE Sweden SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1993 12.32 77932 EGY Egypt SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2008 13.12 260540 URY Uruguay SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1996 14.19 247774 TJK Tajikistan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2003 14.57 145492 KGZ Kyrgyzstan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2017 17.20 7198 ARM Armenia SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1995 17.39 145681 KGZ Kyrgyzstan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2018 17.87 186705 MWI Malawi SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1994 19.21 145809 KGZ Kyrgyzstan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 19.45 47769 CHN China SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1971 20.21 47765 CHN China SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1970 20.61 247795 TJK Tajikistan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2004 20.81 47761 CHN China SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1969 20.92
  112. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') & (data.time == 2019) ].sort_values(by='obs_value', ascending=False)[:20] ) Топ 20 стран с максимальной средней зарплатой в 2019
  113. ref_area ref_area_label sex classif1 classif2 time obs_value 130827 ISL Iceland

    SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 6190.52 194069 NOR Norway SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 5373.86 68444 DEU Germany SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 4925.69 264917 USA United States SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 4233.08 129029 IRL Ireland SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 3818.72 242846 SWE Sweden SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 3732.15 89700 FIN Finland SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 3518.51 201235 NZL New Zealand SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 3373.14 229776 SGP Singapore SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 3344.92 42838 CAN Canada SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 3316.64 153078 KOR Korea, Republic of SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 3192.15 12038 AUT Austria SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 3187.14 96926 GBR United Kingdom SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 3168.06 223824 QAT Qatar SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 3106.59 132922 ITA Italy SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 2453.89 87466 EST Estonia SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 1575.10 159090 LTU Lithuania SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 1451.29 239332 SVK Slovakia SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 1412.78 165892 LVA Latvia SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 1155.30 47753 CHL Chile SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 1151.50
  114. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') & (data.time == 2019) ].sort_values(by='obs_value', ascending=True)[:20] ) Топ 20 стран с минимальной средней зарплатой в 2019
  115. ref_area ref_area_label sex classif1 classif2 time obs_value 145809 KGZ Kyrgyzstan

    SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 19.45 215031 POL Poland SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 106.75 178059 MMR Myanmar SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 138.13 79214 EGY Egypt SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 154.77 126244 IDN Indonesia SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 183.47 138493 JPN Japan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 235.22 7002 ARM Armenia SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 235.70 273208 ZAF South Africa SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 263.00 266398 UZB Uzbekistan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 263.06 211925 PHL Philippines SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 283.67 270642 VNM Viet Nam SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 288.79 114874 HND Honduras SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 299.43 71850 DOM Dominican Republic SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 317.05 174235 MEX Mexico SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 343.32 236151 SLV El Salvador SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 347.29 108421 GTM Guatemala SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 357.39 14651 AZE Azerbaijan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 373.41 219159 PRY Paraguay SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 391.37 54154 COL Colombia SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 398.07 255475 UKR Ukraine SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 2019 406.14
  116. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') & (data.time == 1989) ].sort_values(by='obs_value', ascending=False)[:20] ) Топ 20 стран с максимальной средней зарплатой в 1989
  117. ref_area ref_area_label sex classif1 classif2 time obs_value 191990 NLD Netherlands

    SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 1682.40 93225 GBR United Kingdom SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 1519.46 265452 USA United States SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 1447.26 236413 SMR San Marino SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 1388.31 101970 GIB Gibraltar SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 1227.43 109421 GUM Guam SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 1156.53 61235 CYP Cyprus SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 1097.80 149436 KOR Korea, Republic of SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 805.13 21481 BHR Bahrain SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 609.04 229936 SGP Singapore SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 482.75 47012 CHL Chile SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 473.25 165914 MAC Macau, China SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 281.43 80264 EGY Egypt SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 244.81 185352 MUS Mauritius SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 242.82 55109 CRI Costa Rica SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 215.11 39881 BWA Botswana SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 214.90 134661 JOR Jordan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 192.17 219445 PRY Paraguay SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 190.58 117343 HUN Hungary SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 177.11 212323 PHL Philippines SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 165.25
  118. print( data[ (data.classif1 == 'ECO_AGGREGATE_TOTAL') & (data.sex == 'SEX_T') &

    (data.classif2 == 'CUR_TYPE_USD') & (data.time == 1989) ].sort_values(by='obs_value', ascending=True)[:20] ) Топ 20 стран с минимальной средней зарплатой в 1989
  119. ref_area ref_area_label sex classif1 classif2 time obs_value 48035 CHN China

    SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 42.83 157281 LKA Sri Lanka SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 48.88 186540 MWI Malawi SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 59.68 121766 IDN Indonesia SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 61.14 108681 GTM Guatemala SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 107.29 143182 KEN Kenya SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 138.52 212323 PHL Philippines SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 165.25 117343 HUN Hungary SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 177.11 219445 PRY Paraguay SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 190.58 134661 JOR Jordan SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 192.17 39881 BWA Botswana SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 214.90 55109 CRI Costa Rica SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 215.11 185352 MUS Mauritius SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 242.82 80264 EGY Egypt SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 244.81 165914 MAC Macau, China SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 281.43 47012 CHL Chile SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 473.25 229936 SGP Singapore SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 482.75 21481 BHR Bahrain SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 609.04 149436 KOR Korea, Republic of SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 805.13 61235 CYP Cyprus SEX_T ECO_AGGREGATE_TOTAL CUR_TYPE_USD 1989 1097.80
  120. Самостоятельно • Лаба 1.0: воспроизвести код лекции • Лаба 1.1:

    вычислить аналогичные показатели и рейтинги для - мужчин и женщин отдельно (sex: SEX_M и SEX_F) - других видов экономической деятельности (classif1) • Лаба 1.2: аналогичным образом разобрать любой другой датасет с сайта ilostat.ilo.org