Основная цель — понять процесс анализа данных на практике и ознакомиться с основными операциями анализа данных Python с помощью реальных данных. Завершите kaggle с помощью практического обучения формальному анализу данныхтитаническая миссия, весь процесс фактического анализа данных.
Он разделен на три части, которые можно условно разделить на: основные операции с данными, очистка и реконструкция данных, моделирование и оценка.
- Первая часть: мы получаем данные для анализа, я хочу научиться загружать данные, просматривать данные, затем изучать некоторые основные операции Pandas и, наконец, начать пробовать исследовательский анализ данных.
- Часть 2. После того, как мы сможем умело работать с данными и понять данные, нам нужно начать очистку и реконструкцию данных, а также превратить исходные данные в пригодные для использования и пригодные для использования данные, чтобы подготовиться к включению их в модель позже.
- Третья часть: Нам нужно подумать, какую модель построить в соответствии с различными требованиями задачи.Для построения модели мы используем популярную библиотеку sklearn. Для качества модели нам нужно оценить, а затем мы оценим нашу модель и оптимизируем модель.
1 Загрузка данных и предварительное наблюдение
1.1 Загрузить данные
1.1.1 Задача 1: Импорт numpy и pandas
#写入代码
import pandas as pd
import numpy as np
[Советы] Если загрузка не удалась, узнайте, как установить библиотеки numpy и pandas в вашей среде Python.
1.1.2 Задача 2: загрузить данные
(1) Загрузить данные, используя относительный путь
(2) Загрузить данные, используя абсолютный путь
#写入代码
data=pd.read_csv('train.csv')
data.head(5)
#写入代码
data=pd.read_csv(r'C:\Users\87479\Desktop\my_data_analysis\第一章项目集合\train.csv')
data.head(5)
[Совет] Если при загрузке относительного пути сообщается об ошибке, попробуйте использовать os.getcwd() для просмотра текущего рабочего каталога.
[Вывод] Загрузка данных — это первый шаг во всей работе. Наша работа будет подвергаться воздействию различных форматов данных (например: .csv; .tsv; .xlsx), но метод и идея загрузки одинаковы. будущее В процессе работы и ведения проектов, если вы столкнулись с проблемами, с которыми ранее не сталкивались, вам необходимо проверить больше информации, использовать google, понять бизнес-логику, понять, что такое ввод и вывод.
1.1.3 Задача 3: Один модуль данных на каждые 1000 строк, чтение по блокам
#写入代码
#设置chunksize参数,来控制每次迭代数据的大小
chunker = pd.read_csv("train.csv",chunksize=1000)
for piece in chunker:
print(type(piece))
#<class 'pandas.core.frame.DataFrame'>
print(len(piece))
#891
[Мышление] Что такое поблочное чтение? Зачем читать блок за блоком?
Когда мы имеем дело с большими файлами, читаем в одном из файловнебольшой фрагментили нажмитемаленькие кусочкиХорошей практикой является перебор файлов
1.1.4 Задача 4: Изменить заголовок на китайский и индекс на идентификатор пассажира (для некоторых английских данных мы можем более интуитивно ознакомиться с нашими данными посредством перевода)
PassengerId => ID пассажира
Выжил => Выжил
Pclass => пассажирский класс (1/2/3 класс)
Имя => имя пассажира
Секс => секс
Возраст => возраст
SibSp => количество кузенов/сестер
Парч => количество родителей и детей
Билет => Информация о билете
Тариф => Тариф
Кабина => Кабина
Посадка => Посадка в порт
#写入代码
data.rename(columns={'PassengerId':'乘客ID','Survived':'是否幸存','Pclass':'乘客等级(1/2/3等舱位)',
'Name':'乘客姓名','Sex':'性别','Age':'年龄','SibSp':'堂兄弟/妹个数','Parch':'父母与小孩个数','Ticket':'船票信息',
'Fare':'票价','Cabin':'客舱','Embarked':'登船港口'},inplace=True)
data.head(5)
[Думаю] Одна из идей изменения заголовка на китайский язык состоит в том, чтобы заменить заголовок английского имени столбца на китайский. Есть ли другой способ?
1.2 Предварительные наблюдения
После импорта данных вам может понадобиться обзор общей структуры и образцов данных, например размер данных, количество столбцов, формат каждого столбца, содержит ли он нуль и т. д. .
1.2.1 Задача 1: Просмотр основной информации о данных
# написать код
# 查看每列的类型,dataframe的属性dtypes可以返回表示每列数据名称及类型的列表:
print(data.dtypes)
# 获取每列数据的统计特征(eg:总行数,列数据的平均值、标准差,etc)
# 使用:dataframe.describe()即可查看每列数据的
'''
(1)总行数统计count
(2)平均值mean
(3)标准差std
(4)最小值min
(5)25%分位值“25%”
(6)50%分位值“50%”
(7)75%分位值“75%”
(8)最大值max
'''
data.describe()
'''
注意:方法describe()只统计(没有任何参数的情况下)数据类型(numeric-typed数据类型,例如int,float等)列的统计特征,并且会自动NaN值。
如果我们想查看所有列的统计特征(即包括非数据类型的列,例如object类型的列),就需要在describe()方法中添加参数(include = “all”)
'''
data.describe(include='all')
'''
获取指定列的统计学特征
使用如下语句:
dataframe[[‘column1’, ‘column2’, ‘column3’]].describe()
'''
data[['乘客ID','年龄']].describe()
'''
使用方法info()来查看dataframe的简介描述
使用如下语句:
dataframe.info()
此方法打印有关dataframe的信息,包括索引dtype和列、非空值和内存使用情况。
'''
data.info()
'''
查看数据的行数及列数
通过属性shape,获取数据集的(行数,列数)
'''
print(data.shape)
'''
是否包含null
'''
print(data.isnull())
1.2.2 Задача 2: Наблюдение за данными в первых 10 строках таблицы и данными в последних 15 строках
#写入代码
data.head(10)
#写入代码
data.tail(15)
1.2.3 Задача 3: Определить, являются ли данные пустыми, вернуть True, если они пусты, и вернуть False в остальных
#写入代码
'''
1、判断数值是否为空,可以用pd.isna,pd.isnull,np.isnan;
2、判断字符串是否为空,可以用pd.isna,pd.isnull;
3、判断时间是否为空,可以用pd.isna,pd.isnull,np.isnat;
4、判断转换类型后的字符串,空值也转换成了字符串nan,所以不能用常规方法判断了,直接判断字符串是否相等即可。
'''
data.isnull().head(20)
# data.isna()
[Вывод] Все вышеперечисленные операции представляют собой наблюдения за самими данными при анализе данных.
1.3 Сохранить данные
1.3.1 Задача 1: Сохраните загруженные и измененные данные как новый файл train_chinese.csv в рабочем каталоге.
#写入代码
#注意:不同的操作系统保存下来可能会有乱码。大家可以加入encoding='GBK' 或者 encoding = 'utf-8'
data.to_csv('train_chinese.csv')
df=pd.read_csv('train_chinese.csv')
df.head(5)
[Резюме] Загрузка и начало работы с данными, затем мы коснемся работы с самими данными.В основном мы будем осваивать применение numpy и pandas в рабочих и проектных сценариях.
Суммировать:Первый шаг анализа данных, загрузку данных, мы уже изучили. Когда данные представлены нам, первый шаг, который мы должны сделать, это узнать его, и то, что мы собираемся узнать сегодня, этоПонимание значения полей и первоначальных наблюдений.
2. Основы панд
1.4 Знайте, как называются ваши данные
Мы изучили основные операции панд, так что же это за тип данных, загруженных через панды в предыдущем разделе?
Импортируйте numpy и pandas перед запуском
import numpy as np
import pandas as pd
1.4.1 Задача 1: В пандах есть два типа данных DateFrame и Series, и их легко понять с помощью поиска. Тогда сами напишите небольшой пример про эти два типа данных ? [открытый вопрос]
#写入代码
'''
维数 名称 描述
1 Series 带标签的一维同构数组
2 DataFrame 带标签的,大小可变的,二维异构表格
#为什么有多个数据结构?
Pandas 数据结构就像是低维数据的容器。比如,DataFrame 是 Series 的容器,Series 则是标量的容器。使用这种方式,可以在容器中以字典的形式插入或删除对象。
'''
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
example_1 = pd.Series(sdata)
print(example_1)
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
example_2 = pd.DataFrame(data)
print(example_2)
1.4.2 Задача 2: Загрузите файл «train.csv» в соответствии с методом предыдущего урока
#写入代码
data=pd.read_csv('train.csv')
1.4.3 Задача 3: Просмотр имени каждого столбца данных DataFrame
#写入代码
# 现在有一个dataframe对象df1,查看索引使用使用df1.index,查看列名使用df1.columns,查看所有的值为df1.values。
# print(list(data))
data.columns
1.4.4 Задача 4: Проверить все значения в колонке "Кабина" [есть много способов]
#写入代码
data['Cabin']
#写入代码
data.Cabin
1.4.5 Задача 5: Загрузите файл «test_1.csv», затем сравните «train.csv», чтобы увидеть, какие дополнительные столбцы есть, а затем удалите лишние столбцы.
После нашего наблюдения мы обнаружили, что тестовый набор test_1.csv имеет избыточный столбец, нам нужно удалить этот избыточный столбец.
#写入代码
data1=pd.read_csv('test_1.csv')
data1.head(5)
#写入代码
del data1['a']
data1.head(5)
[Думаю] Есть ли другой способ удалить лишние столбцы?
# # 思考回答
# import datacompy
# compare = datacompy.Compare(data, data1)
# # Compare 参数:
# # df1: 数据框1
# # df2: 数据框2
# # join_columns: 指定索引的列名,默认“None”,可以传入数组,比如:['key', 'AdID']
# # on_index: 是否要开启索引,开启之后不需要指定 join_columns,默认“False”
# # abs_tol: 绝对公差,默认“0”
# # rel_tal: 相对公差,默认“0”
# # df1_name: 报告中数据框1的名字,默认“df1”
# # df2_name: 报告中数据框2的名字,默认“df2”
# # ignore_spaces: 是否忽略空格,默认“False”
# # ignore_case: 是否忽略大小写,默认“False”
# print(compare.matches()) # 最后判断是否相等,返回 bool
# print(compare.report()) # 打印报告详情,返回 string
# # print(compare.sample_mismatch('用户数')) # 取出不相同的某一列数据,返回 dataframe
1.4.6 Задача 6. Скройте элементы столбца ['PassengerId','Имя','Возраст','Билет'] и наблюдайте только за другими элементами столбца.
#写入代码
'''
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
这是drop函数的所有参数
labels是指要删除的标签,一个或者是列表形式的多个,axis是指处哪一个轴,columns是指某一列或者多列,level是指等级,针对多重索引的情况,inplaces是否替换原来的dataframe
'''
data.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(5)
# data.head(5)
[Мышление] Сравнивая Задание 5 и Задание 6, используете ли вы разные методы (функции)? Если вы используете одну и ту же функцию, как выполнить вышеуказанные разные требования?
【Думать и отвечать】 Если вы хотите полностью удалить свою структуру данных, используйте inplace=True, потому что использование inplace перезапишет исходные данные, так что это просто скрытие
1.5 Логика фильтрации
В табличных данных самая важная функция — иметь возможность фильтровать, выбирать нужную мне информацию и отбрасывать бесполезную информацию.
Ниже мы по-прежнему используем реальный бой, чтобы изучить функции панд.
1.5.1 Задача 1: Мы используем «Возраст» в качестве условия фильтра для отображения информации о пассажирах младше 10 лет.
#写入代码
data[data['Age']<10].head(5)
1.5.2 Задача 2: Используя «Возраст» в качестве условия, отобразите информацию о пассажирах старше 10 лет и моложе 50 лет и назовите эти данные средним возрастом.
#写入代码
midage=data[(data['Age']>10) & (data['Age']<50)] #此时的索引已经不连续了,需要重置索引
midage.head(100)
[Совет] Узнайте об условной фильтрации панд и о том, как использовать операции пересечения и объединения.
1.5.3 Задача 3: Отобразить данные «Pclass» и «Sex» в 100-й строке данных среднего возраста.
#写入代码
'''
此时DataFrame或Series类型的数据不再是连续的索引,可以使用reset_index()重置索引。
'''
midage = midage.reset_index(drop=True)
midage.head(100)
midage.loc[[100],['Pclass','Sex']]
1.5.4 Задача 4: Используйте метод loc для отображения данных «Pclass», «Name» и «Sex» в строках 100, 105 и 108 данных среднего возраста.
#写入代码
midage.loc[[100,105,108],['Pclass','Name','Sex']]
# midage.loc[[100,105,108],'Pclass':'Sex'] #相同写法
1.5.5 Задача 5: Используйте метод iloc для отображения данных «Pclass», «Имя» и «Пол» в строках 100, 105 и 108 данных среднего возраста.
#写入代码
midage.iloc[[100,105,108],[2,3,4]]
【Мышление】Сравнениеiloc
иloc
сходства и различия
- Функция loc в основном основана на метке строки и метке столбца (x_label, y_label) для индексации: при использовании функции loc индекс представляет собой строку, которая берется до и после, что относится к случаю «закрытие спереди, а затем закрытие"
- Функция iloc в основном основана на индексе строки и индексе столбца (индексе, столбцах), начиная с 0: более того, данные, индексируемые функцией iloc, представляют собой целое число int, поэтому в Python по умолчанию используется закрытие спереди и открытие сзади. Обратите внимание, что вы можете говорить только тип int, то есть числа, если вы введете символы, будет сообщено об ошибке. (Обратите внимание, что индекс начинается с 0 по умолчанию), а входящий должен быть списком
Суммировать:Мы изучили основы Pandas раньше и знаем, как использовать Pandas для чтения добавлений, удалений и изменений данных csv.Исследовательский анализ данных, в основном знакомит с тем, как использовать Pandas для сортировки, арифметических вычислений и использования функции описания вычислений description().
3 Исследовательский анализ данных
Перед запуском импортируйте пакеты numpy, pandas и данные.
#加载所需的库
import numpy as np
import pandas as pd
#载入之前保存的train_chinese.csv数据,关于泰坦尼克号的任务,我们就使用这个数据
data=pd.read_csv('train_chinese.csv')
data.head(5)
1.6 Знаешь свои данные?
1.6.1 Задача 1. Используйте Pandas для сортировки выборочных данных в порядке возрастания
#自己构建一个都为数字的DataFrame数据
'''
我们举了一个例子
pd.DataFrame() :创建一个DataFrame对象
np.arange(8).reshape((2, 4)) : 生成一个二维数组(2*4),第一列:0,1,2,3 第二列:4,5,6,7
index=[2,1] :DataFrame 对象的索引列
columns=['d', 'a', 'b', 'c'] :DataFrame 对象的索引行
'''
data1=np.arange(8).reshape((2,4))
# print(data)
index=[2,1]
columns=['d','a','b','c']
df=pd.DataFrame(data=data1,index=index,columns=columns)
df.head(2)
【Анализ кода】
pd.DataFrame(): создает объект DataFrame.
np.arange(8).reshape((2, 4)) : создать двумерный массив (2*4), первый столбец: 0, 1, 2, 3 второй столбец: 4, 5, 6, 7
index=['2, 1] : столбец индекса объекта DataFrame
columns=['d', 'a', 'b', 'c'] : индексная строка объекта DataFrame
[Вопрос]: Большую часть времени мы хотим сортировать по значению столбца, поэтому располагайте данные в DataFrame, который вы создаете, в соответствии с определенным столбцом в порядке возрастания.
#回答代码
'''
升序排列是把数据从小到大进行排列,而降序排列是把数据从大到小进行排列
DataFrame.sort_values(by, ascending=True, inplace=Flase )
参数说明:
by: 字符串或者List<字符串>,单列排序或者多列排序
ascending:bool或者list,升序还是降序,如果是list对应by的多列 默认为True升序排序,为False降序排序
inplace:是否修改原始的DataFrame
'''
df.sort_values(by='a',ascending=True).head(2)
[Сводка] Ниже приводится сводка различных методов сортировки.
1. Отсортируйте индекс строки в порядке возрастания
#代码
'''
axis=0代表往跨行(down),而axis=1代表跨列(across)
使用0值表示沿着每一列或行标签/索引值向下执行方法
使用1值表示沿着每一行或者列标签横向执行对应的方法
'''
df.sort_index(axis=0,ascending=True).head(2)
Понимание оси
2. Отсортируйте индекс столбца в порядке возрастания
#代码
df.sort_index(axis=1,ascending=True).head(2)
3. Пусть индекс столбца сортируется в порядке убывания
#代码
df.sort_index(axis=1,ascending=False).head(2)
4. Пусть любые два столбца данных одновременно отсортированы по убыванию
#代码
df.sort_values(by=['a','c'],ascending=False).head(2)
1.6.2 Задача 2: Всесторонне отсортировать (в порядке убывания) данные Титаника (trian.csv) по двум столбцам: стоимость проезда и возраст Что можно проанализировать на основе этих данных?
#代码
# data.sort_values(by=['年龄','票价'],ascending=False).head(20)
data.sort_values(by=['票价', '年龄'], ascending=False).head(20)
[Мышление] После сортировки, если мы сосредоточимся только на двух столбцах возраста и платы за проезд. Согласно здравому смыслу, я знаю, что чем выше тариф, тем лучше салон, поэтому мы ясно увидим, что 14 пассажиров выжили среди 20 лучших тарифов, что является очень высокой долей, поэтому мы можем пойти дальше? цена билета и выживание, а также взаимосвязь между возрастом и выживанием? Анализ данных начинается, когда вы начинаете обнаруживать связи между данными.
Понимание многоколоночной сортировки
d = {'A': [3, 6, 6, 7, 9], 'B': [2, 5, 8, 0, 0]}
df = pd.DataFrame(data=d)
print('排序前:\n', df)
'''
排序前:
A B
0 3 2
1 6 5
2 6 8
3 7 0
4 9 0
'''
res = df.sort_values(by=['A', 'B'], ascending=[False, True])
print('按照A列B列的值排序:\n', res)
'''
按照A列B列的值排序:
A B
4 9 0
3 7 0
1 6 5
2 6 8
0 3 2
'''
Сортировка по нескольким столбцам сначала сортируется в соответствии с соответствующим порядком и соответствующей логикой в списке по [] и в списке по возрастанию []. Сначала метка первого столбца списка по сортируется в соответствии с соответствующей логикой в списке по возрастанию, и затем метка первого столбца списка по сортируется в соответствии с соответствующей логикой в восходящем списке, соответствующая логика двух меток столбцов и их списков по возрастанию сортируется и так далее.
Делайте больше сортировки данных
#代码
data.sort_values(by=['年龄']).head(20)
Большинство младших детей выжили.Похоже, когда случилась катастрофа, все первыми пропустили детей в спасательную шлюпку.
1.6.3 Задача 3: Используйте Pandas для выполнения арифметических вычислений и вычисления результата добавления двух данных DataFrame
#自己构建两个都为数字的DataFrame数据
#代码
frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3),
columns=['a', 'b', 'c'],
index=['one', 'two', 'three'])
frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3),
columns=['a', 'e', 'c'],
index=['first', 'one', 'two', 'second'])
print(frame1_a.head())
print(frame1_b.head())
Добавьте frame_a и frame_b
#代码
df3=frame1_a.add(frame1_b) #fill_value=0用来定义对空值使用0填充
df3.head()
Добавьте frame_a и frame_b, если fill_value=0 используется для определения использования 0 для заполнения пустого значения (пока существует соответствующая позиция данных, будет значение, если одна из добавленных таблиц не найдена, например, frist b не может найти соответствующее значение в обеих таблицах, поэтому оно может быть только NaN)
#代码
df3=frame1_a.add(frame1_b,fill_value=0) #fill_value=0用来定义对空值使用0填充
df3.head()
[Напоминание] После добавления двух DataFrames будет возвращен новый DataFrame, и будут добавлены значения соответствующих строк и столбцов, а если соответствующих нет, оно станет нулевым значением NaN.
1.6.4 Задача 4: Как рассчитать, сколько членов самой большой семьи на корабле, исходя из данных Титаника?
#代码
result=data['堂兄弟/妹个数'].add(data['父母与小孩个数'],fill_value=0)
# max(data)
max(result)
# data['堂兄弟/妹个数'].head(10)
10
1.6.5 Задача 5. Научитесь использовать функцию Pandas description() для просмотра базовой статистики данных
#代码
frame2 = pd.DataFrame([[1.4, np.nan],
[7.1, -4.5],
[np.nan, np.nan],
[0.75, -1.3]
], index=['a', 'b', 'c', 'd'], columns=['one', 'two'])
frame2
Вызовите функцию описания, чтобы просмотреть основные данные кадра2.
#代码
frame2.describe()
1.6.6 Задача 6: Взгляните на базовую статистику столбцов тарифа, родителей и детей в наборе данных «Титаник» Что вы можете найти?
'''
看看泰坦尼克号数据集中 票价 这列数据的基本统计数据
'''
#代码
data['票价'].describe()
[Вывод] В этом разделе мы провели предварительный статистический просмотр данных через некоторые встроенные функции Pandas, Самое главное в этом процессе — не освоить эти функции, а понять данные из этих функций и построить свой собственное мышление по анализу данных, Это также самый важный пункт первой главы. Я надеюсь, что после первой главы вы сможете получить базовое представление о данных, понять, что вы делаете и почему вы это делаете. В следующих главах мы начнем очищать данные и анализировать их дальше.