Сравните SQL и изучите операции Pandas: механизм groupby

анализ данных pandas
Сравните SQL и изучите операции Pandas: механизм groupby

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Все, я Питер~

Всех с Национальным праздником ?

В операциях запросов к базе данных SQL или MySQL мы часто используемgroup byКлючевые слова для обозначения группировки по полю, а затем выполнения последующих агрегирующих и статистических операций.

В Pandas мы также можем реализовать аналогичные функции, используемые ключевые слова: groupby (соединены вместе)

Функция агрегации-функция агрегации

Независимо от того, является ли это базой данных SQL или Pandas, большинство последующих операций после группировки — это статистика агрегирования.Ниже приведен список часто используемых функций агрегирования:

  • Сумма: сумма
  • Максимальное значение: макс.
  • Мин: мин
  • Среднее: среднее
  • Статистика: количество

Многотабличный SQL-запрос

Теперь у нас есть две таблицы: Student и Score, которые соединены s_id.

С помощью следующего оператора SQL мы запрашиваем соответствующие 4 поля:

  • Имя
  • Пол
  • Курс №
  • достижение
select 
	s1.s_name  -- 姓名
	,s1.s_sex  -- 性别
	,s2.c_id   -- 课程编号
	,s2.s_score  -- 成绩分数
from Student s1
join Score s2 on s1.s_id = s2.s_id;

Мы принимаем приведенный выше результат каквременный стол т, а затем выполнять последующие операции запроса.

pymysql получить данные

Чтобы использовать Pandas для анализа данных, мы сначала подключаемся к локальной базе данных, считываем соответствующие данные и генерируем соответствующий DataFrame:

1. Подключиться к базе данных

import pandas as pd
import numpy as np
import pymysql  # 连接数据库

con1 = pymysql.connect(
    host="127.0.0.1",  # 数据库ip
    port=3306,  # 端口号
    user="root",  # 用户名
    password="password",   # 密码
    charset="utf8",  # 字符编码
    db="test"  # 数据库名称
)

cur1 = con1.cursor()  # 建立游标

# 待执行的SQL语句
sql1 = """   
select 
	s1.s_name  -- 姓名
	,s1.s_sex  -- 性别
	,s2.c_id   -- 课程编号
	,s2.s_score  -- 成绩分数
from Student s1
join Score s2 on s1.s_id = s2.s_id;
"""

# 在游标中执行SQL语句
cur1.execute(sql1)

Получается 18 фрагментов данных, что является результатом нашей временной таблицы t выше, которая также является 18 фрагментами данных.

2. Генерация данных

data1 = []
for i in cur1.fetchall():
    data1.append(i)
    
df = pd.DataFrame(data1,columns=["姓名","性别","课程id","分数"])
df

image-20210930221746184

Эти данные df используются в последующих операциях pandas.

единая агрегатная функция

1. Сумма: мы хотим знать, каков общий балл каждого ученика.

Реализация SQL:

select
	t.s_name
	,sum(t.s_score)
from(
  select 
    s1.s_name  -- 姓名
    ,s1.s_sex  -- 性别
    ,s2.c_id   -- 课程编号
    ,s2.s_score  -- 成绩分数
	from Student s1
	join Score s2 on s1.s_id = s2.s_id
)t
group by t.s_name;

Реализация панд:

Pandas имеет другой способ записи:

2. Найдите средний балл каждого ученика.

Реализация SQL:

select
	t.s_name
	,avg(t.s_score)   -- 改成均值函数
from(
  select 
    s1.s_name  -- 姓名
    ,s1.s_sex  -- 性别
    ,s2.c_id   -- 课程编号
    ,s2.s_score  -- 成绩分数
	from Student s1
	join Score s2 on s1.s_id = s2.s_id
)t
group by t.s_name;

Два разных способа написания реализации Pandas:

3. Найдите предмет с максимальным (минимальным) баллом каждого ученика

Реализация SQL:

select
	t.s_name
	,max(t.s_score)   -- 改成最大值函数
from(
  select 
    s1.s_name  -- 姓名
    ,s1.s_sex  -- 性别
    ,s2.c_id   -- 课程编号
    ,s2.s_score  -- 成绩分数
	from Student s1
	join Score s2 on s1.s_id = s2.s_id
)t
group by t.s_name;

Процесс внедрения панд:

4. Статистика: узнайте, сколько предметов сдавал каждый учащийся.

Реализация SQL:

select
	t.s_name
	,count(t.c_id)   -- 改成count函数,同时字段是课程c_id
from(
  select 
    s1.s_name  -- 姓名
    ,s1.s_sex  -- 性别
    ,s2.c_id   -- 课程编号
    ,s2.s_score  -- 成绩分数
	from Student s1
	join Score s2 on s1.s_id = s2.s_id
)t
group by t.s_name;

Процесс внедрения панд:

Несколько агрегатных функций

При запросе данных мы можем использовать несколько функций агрегации одновременно, например: мы хотим просмотреть учащихся разного пола:Общий балл, средний балл, количество человек, максимальный балл

Процесс реализации SQL:

select
	t.s_sex
	,sum(t.s_score)  -- 总成绩
	,avg(t.s_score)  -- 平均成绩
	,count(t.s_name)  -- 统计不同性别人数
	,max(t.s_score)  -- 成绩最大值
from(
  select 
    s1.s_name  -- 姓名
    ,s1.s_sex  -- 性别
    ,s2.c_id   -- 课程编号
    ,s2.s_score  -- 成绩分数
	from Student s1
	join Score s2 on s1.s_id = s2.s_id
)t
group by t.s_sex;   -- 根据性别分组统计

Процесс внедрения панд:

Изменить псевдонимы полей

В приведенных выше результатах данных, будь то результаты SQL или Pandas, используются имена полей по умолчанию, и мы можем изменить их соответствующим образом, чтобы сделать имена более значимыми:

единая агрегатная функция

Или общий балл каждого ученика в качестве примера

Реализация SQL: используйте as для получения псевдонимов, as можно не указывать

select
	t.s_name  as "姓名"   -- as可省略
	,sum(t.s_score) as  "总成绩"  -- as可省略
from(
  select 
    s1.s_name  -- 姓名
    ,s1.s_sex  -- 性别
    ,s2.c_id   -- 课程编号
    ,s2.s_score  -- 成绩分数
	from Student s1
	join Score s2 on s1.s_id = s2.s_id
)t
group by t.s_name;

Процесс внедрения панд:

Способ 1:Псевдоним в пандах достигается с помощью функции переименования

Способ 2:Измените свойство столбцов напрямую

Несколько агрегатных функций

1. Реализация SQL по-прежнему имеет псевдоним:

select
	t.s_sex  as "性别"
	,sum(t.s_score)  as "总成绩"  -- as可省略
	,avg(t.s_score)  as "平均成绩"
	,max(t.s_score)  as "最高成绩"
	,count(t.s_name)  as "总人数"
from(
  select 
    s1.s_name  -- 姓名
    ,s1.s_sex  -- 性别
    ,s2.c_id   -- 课程编号
    ,s2.s_score  -- 成绩分数
	from Student s1
	join Score s2 on s1.s_id = s2.s_id
)t
group by t.s_sex;   -- 根据性别分组统计

2. Реализация панд

df2 = df.groupby("性别").agg(
    总成绩 = pd.NamedAgg(column="分数", aggfunc="sum"),
    平均成绩 = pd.NamedAgg(column="分数", aggfunc="mean"),
    最高成绩 = pd.NamedAgg(column="分数", aggfunc="max"),
    总人数 = pd.NamedAgg(column="课程id", aggfunc="count")
)
df2

Классическая фигура

Наконец, предлагается классическая графика. На этом рисунке показано, как мы:

  • Выберите месяц поля группировки
  • Множественные операции агрегирования по одному и тому же полю (длительность): макс., мин., сумма
  • Псевдонимы (переименование) результатов: max_duration, min_duration, total_duration