- •Инструментальные средства разработки инфокоммуникационных систем с искусственным интеллектом
- •ОГЛАВЛЕНИЕ
- •Введение в инструментальные средства разработки ИКС с ИИ
- •ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
- •Пример:
- •Кодировка символов
- •в верху файла.
- •IPython notebooks
- •Модули
- •Looking at what a module contains, and its documentation (Глядя на то, что содержит модуль, и его документацию)
- •Переменные и типы Имена символов
- •Присваивание
- •Основные типы
- •Функциональная утилита Type
- •Вывод type
- •Операторы и сравнения
- •Составные типы: строки, список и словари. Текстовые переменные
- •Индексация начинается с 0!
- •Лист
- •Кортежи
- •Словари
- •Услоаные операторы и табуляция Условные операторы: if, elif, else
- •else:
- •Циклы
- •Списки: создание списков с использованием циклов for:
- •while циклы:
- •Функции
- •Аргумент по умолчанию и ключевые слова
- •Безымянные функции (lambda функция)
- •Классы
- •Исключения
- •Дополнительная литература
- •Часть 2. Введение в pandas Цели обучения:
- •Основные понятия
- •Работа с колонками и строками DataFrame
- •Манипулирование данными
- •Решение
- •Indexes
- •Упражнение #2
- •Копирование DataFrame
- •Введение в анализ данных (очистка, интерполяция, экстраполяция)
- •Формирование дата фрейма и интерполяция пропущенны значений
- •Графическое представление обработанного дата фрейма (библ. pyplot)
- •Анализ графика и удаление значений за неполный день
- •Обработка аномалий временного хода и апроксимация Детектирование аномалий
- •Интерполяция
- •Визуализация аномалий
- •Сглаживание временного ряда
- •Анализ временных рядов (регрессия)
- •ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
- •Базовые методы программирования систем ИИ
- •ТЕОРЕТИЧЕСКАЯ ЧАСТЬ:
- •ПРАКТИЧЕСКАЯ ЧАСТЬ.
- •Кластерный анализ
- •Применение нейронных сетей для анализа временных рядов
- •Когнитивные системы связи
Работа с колонками и строками DataFrame
Вы можете получить доступ к данным DataFrame, используя знакомые операции
Python dict/list:
cities = pd.DataFrame({ 'City name': city_names, 'Population': population }) print(type(cities['City name']))
cities['City name']
<class 'pandas.core.series.Series'>
0San Francisco
1San Jose
2Sacramento
Name: City name, dtype: object print(type(cities['City name'][1])) cities['City name'][1]
<class 'str'> {"type":"string"} print(type(cities[0:2])) cities[0:2]
<class 'pandas.core.frame.DataFrame'>
|
City name Population |
|
0 |
San Francisco |
852469 |
1 |
San Jose |
1015785 |
Кроме того, pandas предоставляет чрезвычайно богатый API для расширенного доступа по индексам и колонкам.
Манипулирование данными
Возможно применить основные арифметические операции Python к Series. Например: population / 1000.
0852.469
11015.785
2485.199 dtype: float64
NumPy — популярный инструментарий для научных вычислений. pandas Series можно использовать в качестве аргументов для большинства функций NumPy:
import numpy as np
np.log(population)
26
013.655892
113.831172
213.092314
dtype: float64
Для более сложных одностолбцовых преобразований вы можете использовать
Series.apply. Как Python функция сопоставления (map function), Series.apply принимает в качестве аргумента lambda функцию, которая применяется к каждому значению. В приведенном ниже примере создается новая Series, которая указывает, превышает ли population один миллион:
population.apply(lambda val: val > 1000000)
0False
1True
2False dtype: bool
Изменение DataFrames также просто. Например, следующий код добавляет два Series к существующему DataFrame:
cities['Area square miles'] = pd.Series([46.87, 176.53, 97.92]) cities['Population density'] = cities['Population'] / cities['Area square miles']
cities |
|
|
|
|
|
City name Population Area square miles |
Population density |
||
0 San Francisco |
852469 |
46.87 |
18187.945381 |
|
1 |
San Jose |
1015785 |
176.53 |
5754.177760 |
2 |
Sacramento |
485199 |
97.92 |
4955.055147 |
bold text## Упражнение #1
Измените таблицу cities, добавив новый логический столбец, который имеет значение True тогда и только тогда, когда оба следующих условия верны:
•Город назван в честь святого.
•Площадь города превышает 50 квадратных миль.
Примечание. Логические Series объединяются с использованием побитовых, а не традиционных логических операторов. Например, при выполнении логического И используйте & вместо and.
Подсказка. 'San' по-испански означает 'святой (saint)'.
# Ваш код здесь
Решение
Щелкните ниже для просмотра решения.
cities['Is wide and has saint name'] = (cities['Area square miles'] > 50) & cities['City name'].apply(lambda name: name.startswith('San'))
cities |
|
|
|
|
|
City name Population Area square miles |
Population density \ |
||
0 |
San Francisco |
852469 |
46.87 |
18187.945381 |
1 |
San Jose |
1015785 |
176.53 |
5754.177760 |
2 |
Sacramento |
485199 |
97.92 |
4955.055147 |
|
Is wide and has saint name |
|
|
|
0 |
False |
|
|
|
1 |
True |
|
|
|
2 |
False |
|
|
Indexes
Объекты Series и DataFrame также определяют свойство index, которое присваивает значение идентификатора каждому элементу Series или строке DataFrame.
27
По умолчанию при построении pandas присваивает значения индекса, отражающие порядок исходных данных. После создания значения индекса стабильны (неизменны), то есть они не меняются при переупорядочении данных.
city_names.index RangeIndex(start=0, stop=3, step=1) cities.index
RangeIndex(start=0, stop=3, step=1)
Вызовите DataFrame.reindex, чтобы вручную изменить порядок строк. Например, следующее имеет тот же эффект, что и сортировка по названию города: cities.reindex([2, 0, 1])
|
City name Population Area square miles |
Population density \ |
||
2 |
Sacramento |
485199 |
97.92 |
4955.055147 |
0 |
San Francisco |
852469 |
46.87 |
18187.945381 |
1 |
San Jose |
1015785 |
176.53 |
5754.177760 |
|
Is wide and has saint name |
|
|
|
2 |
False |
|
|
|
0 |
False |
|
|
|
1 |
True |
|
|
Переиндексация — отличный способ перетасовать (рандомизировать) DataFrame. В приведенном ниже примере мы берем индекс, похожий на массив, и передаем его функции random.permutation NumPy, которая перемешивает его значения на месте. Вызов reindex с этим перетасованным массивом приводит к тому, что строки DataFrame перетасовываются таким же образом. Попробуйте запустить следующую ячейку несколько раз! cities.reindex(np.random.permutation(cities.index))
|
City name Population Area square miles |
Population density \ |
||
2 |
Sacramento |
485199 |
97.92 |
4955.055147 |
1 |
San Jose |
1015785 |
176.53 |
5754.177760 |
0 |
San Francisco |
852469 |
46.87 |
18187.945381 |
|
Is wide and has saint name |
|
|
|
2 |
False |
|
|
|
1 |
True |
|
|
|
0 |
False |
|
|
Для получения дополнительной информации см..
Упражнение #2
Метод reindex позволяет использовать значения индекса, которых нет в исходных значениях индекса DataFrame. Попробуйте использовать данный метод. Как вы думаете, почему это разрешено?
# Your code here
Решение
Щелкните ниже для просмотра решения.
Если ваш входной массив reindex включает значения, не входящие в исходные значения индекса DataFrame, reindex добавит новые строки для этих «отсутствующих» индексов и заполнит все соответствующие столбцы значениями NaN:
cities.reindex([0, 4, 5, 2]) |
|
|
||
|
City name Population Area square miles |
Population density \ |
||
0 San Francisco |
852469.0 |
46.87 18187.945381 |
||
4 |
NaN |
NaN |
NaN |
NaN |
5 |
NaN |
NaN |
NaN |
NaN |
2 |
Sacramento |
485199.0 |
97.92 |
4955.055147 |
28
|
Is wide and has saint name |
0 |
False |
4 |
NaN |
5 |
NaN |
2 |
False |
Такое поведение желательно, потому что индексы часто представляют собой строки, взятые из фактических данных (см. pandas reindex documentation для примера в котором значения индекса являются именами браузеров).
В этом случае разрешение «отсутствующих» индексов упрощает переиндексацию с использованием внешнего списка.
Копирование DataFrame
Pandas предоставляет два разных способа дублирования DataFrame:
•Referencing (ссылка). Если вы назначите DataFrame новой переменной, любое изменение в DataFrame или в новой переменной будет отражено в другом.
•Copying (копирование). Если вы вызываете метод pd.DataFrame.copy, вы создаете настоящую независимую копию. Изменения исходного DataFrame или копии не будут отражены в другом.
Разница тонкая, но важная.
#Создадим список Python, содержащий имена четырех столбцов. my_column_names = ['Eleanor', 'Chidi', 'Tahani', 'Jason']
#Создадим массив 3x4 numpy, каждая ячейка которого заполнена случайным целым числом.
my_data = np.random.randint(low=0, high=101, size=(3, 4))
#Создадим DataFrame.
df = pd.DataFrame(data=my_data, columns=my_column_names)
#Вывод DataFrame print(df)
#Создайте ссылку, назначив my_dataframe новой переменной. print("Пример с сылкой:")
reference_to_df = df
#Вывод начального значения конкретной ячейки. print(" Начальное значение df: %d" % df['Jason'][1])
print(" Начальное значение reference_to_df: %d\n" % reference_to_df['Jason'][1])
#Изменение ячейки в df.
df.at[1, 'Jason'] = df['Jason'][1] + 5
print(" Обновление df: %d" % df['Jason'][1])
print(" Обновление reference_to_df: %d\n\n" % reference_to_df['Jason'][1])
#Создание настоящей копии my_dataframe print("Пример с копией df:")
copy_of_df = df.copy()
#Вывод начального значения конкретной ячейки. print(" Начальное значение df: %d" % df['Eleanor'][1])
print(" Начальное значение copy_of_df: %d\n" % copy_of_df['Eleanor'][1])
29
# Изменение ячейки в df.
df.at[1, 'Eleanor'] = df['Eleanor'][1] + 3
print(" Обновление df: %d" % df['Eleanor'][1])
print(" copy_of_df не обновился: %d" % copy_of_df['Eleanor'][1])
|
Eleanor Chidi Tahani Jason |
|||
0 |
30 |
60 |
44 |
73 |
1 |
76 |
15 |
61 |
56 |
2 |
80 |
50 |
64 |
49 |
Пример с сылкой: Начальное значение df: 56
Начальное значение reference_to_df: 56
Обновление df: 61
Обновление reference_to_df: 61
Пример с копией df: Начальное значение df: 76
Начальное значение copy_of_df: 76
Обновление df: 79 copy_of_df не обновился: 76
ПРАКТИЧЕСКАЯ ЧАСТЬ Задание на лабораторную работу
Для произвольного цифрового набора данных, организованного в формат листа, который состоит минимум из 5-ти колонок и 10-ти строк выполнить:
1.Циклическое суммирование значений колонок
2.Реализовать блок "исключения" для детектирования ошибки индекса листа
3.Использовать lamda функцию для перемножения всех строк одной из колонок массива
4.Создать функцию класса, принимающую на вход номера двух колонок и строчек, для выполнения последующего суммирования значений данных ячеек массива
Для произвольного цифрового набора данных, организованного в формат датафрейма, который состоит минимум из 5-ти колонок и 10-ти строк выполнить:
1.Построить гистограмму
2.Получить статистику датафрейма
3.Транспонировать датафрейм
4.Создать индекс формата DatetimeIndex
5.Суммировать значения двух любых колонок датафрейма в колонку sum
30