Общественный номер: 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
Эти данные 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