Файл: Методические указания по выполнению лабораторных работ для студентов, обучающихся с применением.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 05.12.2023

Просмотров: 130

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

39
1   2   3   4   5   6   7

1.7.2
Обработка Kaggle датасетов
Kaggl e предоставляет данные для анализа и NoteBook для написания кода на Python. Кроме того, проект проводит соревнования по обработке данных.
Выбрав необходимые данные на сайте, можно получить сразу готовый код, в котором присутствует считывание csv-файла. При этом даже не нужно реги- стрироваться (хотя лучше это сделать, чтобы не потерять нужные вам результа- ты). Можно также добавлять markdown-текст (например, данный документ написан с использованием markdown).
Попробуйте проделать по шагам действия, указанные ниже. Если Вас смутила тематика датасета, можете попробовать найти свой вариант и выпол- нять действия по аналогии, но результат не гарантируется.
Переходим по ссылке
Kaggle datasets
(https://www.kaggle.com/datasets).
Нажимаем New Notebook.
Add Data (
ищем temperature, рис. 1.21).
Рис. 1.21 – Выбор датасета по температуре
Выбираем "Climate Change: Earth Surface Temperature Data Exploring glob- al temperatures since 1750".
Соглашаемся на добавление данных
В результате получаем две ячейки с кодом и можем сразу приступать к анализу данных.

40
Листинг
# This Python 3 environment comes with many helpful analytics
# libraries installed
# It is defined by the kaggle/python docker image:
# https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in
import
numpy
as
np
# linear algebra
# data processing, CSV file I/O (e.g. pd.read_csv)
import
pandas
as
pd
# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter)
# will list all files under the input directory
import
os
for
dirname, _, filenames
in
os walk(
'/kaggle/input'
):
for
filename
in
filenames:
print
(os path join(dirname, filename))
# Any results you write to the current directory are saved as output.
import
pandas
as
pd
GlobalLandTemperaturesByCity
=
pd read_csv(
"../input/climate-change-earth- surface-temperature-data/GlobalLandTemperaturesByCity.csv"
)
GlobalLandTemperaturesByCountry
=
pd read_csv(
"../input/climate-change- earth-surface-temperature-data/GlobalLandTemperaturesByCountry.csv"
)
GlobalLandTemperaturesByMajorCity
=
pd read_csv(
"../input/climate-change- earth-surface-temperature-data/GlobalLandTemperaturesByMajorCity.csv"
)
GlobalLandTemperaturesByState
=
pd read_csv(
"../input/climate-change-earth- surface-temperature-data/GlobalLandTemperaturesByState.csv"
)
GlobalTemperatures
=
pd read_csv(
"../input/climate-change-earth-surface- temperature-data/GlobalTemperatures.csv"
)
Печать таблицы на экран покажет нам столбцы (поля), которые содержит таблица, первые и последние строки таблицы.
print
(GlobalLandTemperaturesByCountry)
print
(GlobalLandTemperaturesByCity)

41
Здесь указаны данные о температуре по городам и странам начиная с 1700-х гг. Для таблицы с городами также указаны широта и долгота. Кое-где есть пропуски данных Nan.
Попробуем провести какой-либо анализ указанных данных. df
=
GlobalLandTemperaturesByCity
print
(df describe())
Функция describe описывает для каждого поля DataFrame различные харак- теристики, включая среднее, среднеквадратическое отклонение, максимальное, минимальное значение, квантили. Запустите указанный код, который выведет на экран всю информацию о датасете, по данной информации уже можно сделать различные выводы, например о том, что разброс температур от –42 до +39 ºС.
Этот факт вызывает некоторое сомнения, ведь в некоторых регионах бывают и куда меньшие и большие температуры. Максимальная ошибка для макси- мальных температур составляет до 15 °С, возможно, для данных, указанных для
XVIII и XIX вв. Но это нужно выяснить.
Посмотрим, какие страны присутствуют в списке, получив только уни- кальные названия стран, и поместим их в список.
print
(pd unique(df[
'Country'
])
tolist())
print
(f
"Number of countries = {len(pd.unique(df['Country']).tolist())}"
)
В списке присутствует 159 различных стран.
Вероятно, здесь присутствуют не все страны. Попробуем уточнить дан- ные по России. Заодно определим, какие столбцы данных присутствуют в таб- лице. df
=
GlobalLandTemperaturesByCity
print
(df columns tolist())
# получаем данные по России, | - или
with_russia
=
df[ (df[
'Country'
]
==
'Russia'
)
|
(df[
'Country'
]
==
'USSR'
)
|
(df[
'Country'
]
==
'Russian Federation'
)]
print
(pd unique(with_russia[
'Country'
])
tolist())
print
(with_russia)
Столбцы, присутствующие в таблице:
[
'dt'
,
'AverageTemperature'
,
'AverageTemperatureUncertainty'
,


42
'City'
,
'Country'
,
'Latitude'
,
'Longitude'
]
Очевидно, что мы могли и ошибиться немного в названии, вдруг в базе названия стран указаны со строчной буквы. with_dif
=
df[df[
'Country'
]
str contains(
r'(ru|sov|us)'
,case
=
False
)]
print
(pd unique(with_dif[
'Country'
])
tolist())
При запуске придется подождать, ведь данных очень много.
Пытаемся получить все страны в именах, в которых присутствуют ука- занные символы, здесь мы использовали регулярное выражение.
['Russia', 'Australia', 'Peru', 'Belarus', 'Burundi', 'Austria', 'Cyprus', 'Uruguay',
'Mauritius']
Скорее всего, в базе не отражены изменения названий стран в разные пе- риоды истории, а указано текущее положение дел.
Среди стран нет США (USA), возможно, указанное государство пред- ставлено под другим названием, проверим нашу догадку. with_dif
=
df[df[
'Country'
]
str contains(
r'(united)'
,case
=
False
)]
print
(pd unique(with_dif[
'Country'
])
tolist())
Догадка оказалась верной ['United Kingdom', 'United States', 'United Arab
Emirates'].
Построим графики, на которых будет отображена средняя температура для каких-либо нескольких стран по годам. Очевидно, нам для этого потребует- ся группировка и агрегированная функция mean. Так как в данных присутствует дата проведения измерения, потребуется группировать и по году в поле «Дата», для этого есть различные варианты, мы можем даже создать новые столбы, в которые занесем отдельно день, месяц и год, но это необязательно. df
=
GlobalLandTemperaturesByCity
# преобразуем строку в тип данных дата-время
df[
'dt'
]
=
df[
'dt'
]
astype(
'datetime64[ns]'
)
# группируем по стране и по году в дате
df_by_dt
=
df groupby([df[
'Country'
],df[
'dt'
]
dt year])
mean()
# убираем индексы, Country и dt становятся column
df_by_dt
=
df_by_dt reset_index()
print
(df_by_dt)

43
Конечно, это может быть неоптимально, логичнее было бы сначала вы- брать страны, чтобы потом проводить групповые операции. Можете сделать это самостоятельно. Кроме того, можно использовать параметр groupby as_index =
False
(но аккуратно).
Выберем несколько стран и попробуем отобразить данные о них по го- дам. Очевидно, что в качестве среднего значения по стране за год будет высту- пать температура. df
=
df_by_dt
# запишем более коротко условие по выбору стран
df_by_country
=
df[df[
'Country'
]
isin([
'Russia'
,
'Italy'
,
'Canada'
])]
print
(df_by_country columns tolist())
print
(df_by_country) pd unique(df_by_country[
'Country'
])
tolist()
Теперь преобразуем таблицу так, чтобы данные по странам оказались в отдельных столбцах для каждой страны.
# преобразуем таблицу так, чтобы столбцы опять стали индексами
# либо уберем reset_index() в коде выше
df_by_country
=
df_by_country set_index([
'Country'
,
'dt'
]) dfun
=
df_by_country unstack(
'Country'
)
# печатаем полученные столбцы
print
(
list
(dfun))
Получим следующий результат:
[(
'AverageTemperature'
,
'Canada'
), (
'AverageTemperature'
,
'Italy'
),
(
'AverageTemperature'
,
'Russia'
), (
'AverageTemperatureUncertainty'
,
'Canada'
),
(
'AverageTemperatureUncertainty'
,
'Italy'
),
(
'AverageTemperatureUncertainty'
,
'Russia'
)]
Теперь названия столбцов представляют собой кортеж. Нарисуем гра- фики.
# выбираем только те столбцы, где есть столбец AverageTemperature
newcols
=
[item
for
item
in
dfun
if
item[
0
]
==
'AverageTemperature'
]
# строим новую таблицу из столбцов
dpop
=
dfun[newcols]
# выводим наш график
dpop plot()
# выбираем только те столбцы, где есть столбец AverageTemperatureUncertainty


44 newcols
=
[item
for
item
in
dfun
if
item[
0
]
==
'AverageTemperatureUncertainty'
]
# строим новую таблицу из столбцов
dpop
=
dfun[newcols]
# выводим наш график
dpop plot()
Пример графика представлен на рисунке 1.22.
Рис. 1.22 – График со средней температурой
По графику можно сделать вывод, что после 1950 г. средняя температура во всех странах растет. Первые столетия измерения температур показывают не- которую «близость» температур в Канаде и России, что, возможно, связано с отсутствием измерений в холодных областях.
Пример графика с погрешностями измерения температуры за все годы представлен на рисунке 1.23.

45
Рис. 1.23 – График погрешности в измерениях температуры
Как и ожидалось, точность указанной температуры со временем выросла и даже составляет менее 1 градуса.
Действительно, если запустить код, который размещен ниже, то обнару- жим, что измерения для Томска присутствуют только с 1825 г. При группиров- ке для столбца City мы получим значения False и True, в столбце False указаны сгруппированные данные по тем полям, где условие по Томску не сработало, поэтому эти данные можно отобразить отдельно или отбросить (рис. 1.24). df_by_dt
=
df groupby([df[
'City'
]
==
'Tomsk'
,df[
'dt'
]
dt year])
mean() df_by_dt
=
df_by_dt reset_index()
print
(df_by_dt) df_by_dt[df_by_dt[
"City"
]
==
True
]
plot(x
=
'dt'
, y
=
'AverageTemperature'
) df_by_dt[df_by_dt[
"City"
]
==
False
]
plot(x
=
'dt'
, y
=
'AverageTemperature'
) dfTomsk
=
df[df[
'City'
]
==
'Tomsk'
]
print
(dfTomsk)

46
Рис. 1.24 – Пример графика средней температуры по городу Томску
Очевидно, что логичнее было бы сделать то же самое следующим обра- зом: df_by_dt
=
df[df[
'City'
]
==
'Tomsk'
]
groupby(df[
'dt'
]
dt year)
mean() df_by_dt
=
df_by_dt reset_index()
print
(df_by_dt) df_by_dt plot(x
=
'dt'
, y
=
'AverageTemperature'
)
На графике после 1950 г. виден некоторый тренд роста температуры.
Отобразим таким же образом и наши предыдущие графики для разных стран, используя построение графиков seaborn и выбор по условию. df
=
GlobalLandTemperaturesByCity df[
'dt'
]
=
df[
'dt'
]
astype(
'datetime64[ns]'
) df_by_dt
=
df groupby([df[
'Country'
],df[
'dt'
]
dt year])
mean() df_by_dt
=
df_by_dt reset_index() df
=
df_by_dt df_by_country
=
df[df[
'Country'
]
isin([
'Russia'
,
'Italy'
,
'Canada'
])]
print
(df_by_country columns tolist())
print
(df_by_country) pd unique(df_by_country[
'Country'
])
tolist()
# преобразуем таблицу так, чтобы столбцы опять стали индексами
# либо уберем reset_index() в коде выше
df_by_country
=
df_by_country set_index([
'Country'
])
import
seaborn
# Нарисует среднее среди всех
# c максимальными и минимальными отклонениями


47 seaborn lineplot(x
=
'dt'
,y
=
'AverageTemperature'
, data
=
df_by_country) df_by_country
=
df_by_country reset_index()
import
matplotlib.pyplot
as
plt
# создаем два подграфика, расположенных по вертикали.
# axv –
осевая система для отображения одного графика
# здесь две осевые системы, axv[0] и axv[1] для
# двух подграфиков
fig, axv
=
plt subplots(nrows
=
2
,ncols
=
1
,figsize
=
(
6
,
7
)) countries
=
pd unique(df_by_country[
'Country'
])
tolist()
for
country
in
countries:
# выбираем страну для отображения графиков на одной системе axv[0]
df_by_country[df_by_country[
'Country'
]
==
country]
plot( x
=
'dt'
, y
=
'AverageTemperature'
, ax
=
axv[
0
], label
=
country)
# выбираем страну для отображения графиков на другой системе axv[1]
df_by_country[df_by_country[
'Country'
]
==
country]
plot( x
=
'dt'
, y
=
'AverageTemperatureUncertainty'
, ax
=
axv[
1
], label
=
country) fig show()
Получим примерно то же самое, что и в прошлый раз, только теперь гра- фики имеют подписи для стран и совмещены на одном поле (рис. 1.25, 1.26).
Рис. 1.25 – Средняя температура на графике seaborn

48
Рис. 1.26 – Построение двух графиков вместе
Полезный график pairplot в seaborn позволяет посмотреть соотношение данных попарно по отношению друг к другу (рис. 1.27). df
=
GlobalLandTemperaturesByCity df[
'dt'
]
=
df[
'dt'
]
astype(
'datetime64[ns]'
) df
=
df[df[
'City'
]
==
'Tomsk'
] df_by_dt
=
df groupby([df[
'dt'
]
dt year])
mean() df
=
df_by_dt reset_index()
import
seaborn
seaborn pairplot(df)

49
Рис. 1.27 – График pairplot
Например, очевидно, что температура в Томске в среднем с годами вы- росла, неопределенность в определении температуры с годами снизилась. А вот средняя температура в Мехико выросла еще больше, и тренд куда более четкий
(
рис. 1.28).

50
Рис. 1.28 – График pairplot для города Мехико
Еще один пример обработки данных на
Kaggle datasets
(
рис. 1.29).

51
Рис. 1.29 – Выбор датасета
Нажимаем New Notebook.
Add Data (
ищем suicide)
Выбираем Suicide rates Overview 1985 to 2016.
Соглашаемся на добавление данных
В результате получаем две ячейки с кодом и можем сразу приступать к анализу данных.
Листинг
# This Python 3 environment comes with many helpful analytics
# libraries installed
# It is defined by the kaggle/python docker image:
# https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in
import
numpy
as
np
# linear algebra
# data processing, CSV file I/O (e.g. pd.read_csv)
import
pandas
as
pd
# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter)
# will list all files under the input directory