Панды «Анализ данных» справляются со спросом на дни непрерывного поведения

анализ данных

Всем привет, меня зовут Кай.

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

图1:案例数据

Исходя из данных на приведенном выше рисунке, мы видим, что непрерывное загрязнение воздуха продолжалось в течение 6 дней с 21 января по 26 января.

Однако при фактической обработке данных наши исходные данные часто бывают больше, и они могут быть не видны напрямую. Далее мы представляем несколько решений для справки.

1. Получите данные о случае

Вы можете ответить прямо в фоновом режиме0427Чтобы получить данные о случаях, вы также можете получить данные о случаях следующими способами.

import akshare as ak

air_quality_hist_df = ak.air_quality_hist(city="北京", period="day", start_date="2021-01-01", end_date="2021-04-26")
air_quality_hist_df.head()

图2:akshare数据预览

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

import pandas as pd

# 重置索引
aqi = air_quality_hist_df['aqi'].reset_index()
# 将aqi列改为int类型
aqi.aqi = aqi.aqi.astype('int')
# 使用分箱进行空气质量定级
aqi['空气质量'] = pd.cut(aqi.aqi,
                        bins=[0,100,500],
                        labels=['优良','污染'])
# 取10个样本预览
aqi.sample(10)

图3:处理后数据

2. Найдите количество дней непрерывного загрязнения

В сочетании с последним случаем "" здесь мы предлагаем 1 новую идею решения проблемы, всего 2 идеи решения проблемы.

Следующее решение исходит из小明哥и才哥

2.1. Идея 1: отсортируйте разницу по времени, а затем сгруппируйте количество

Решение брата Цая в прошлый раз - это такой образ мышления. Оглядываясь назад на исходный код, он кажется относительно незрелым. Сегодня давайте посмотрим на решение брата Сяомина, которое очень интересно.

Шаг 1. Отфильтруйте данные о качестве воздуха на предмет загрязнения

t = aqi.query('空气质量=="污染"')
t.sample(5)

图4:筛选空气质量污染的数据

Шаг 2: Добавьте вспомогательный столбец (вспомогательный столбец можно добавить, не добавляя его к исходным данным).tначальство)

Логика здесь примерно такая:

  • Второй столбец ранжирования (в хронологическом порядке) — это количество дней между
  • Затем используйте поле времени (время) и интервал, чтобы вычислить разницу, чтобы получить дату
  • Если полученная дата одинакова, то эти дни являются последовательными днями загрязнения.
groupids = pd.to_datetime(aqi.time)-pd.to_timedelta(aqi.time.rank(),unit='d')
groupids.sample(5)

图5:辅助列

Шаг 3: Групповой подсчет, чтобы получить последовательные дни, и сгруппировать, чтобы найти минимальные и максимальные значения, чтобы получить даты начала и окончания непрерывного загрязнения.

t.groupby(groupids).agg({
    'time': lambda x:f'{x.min()}~{x.max()}', # 求起止日期
    '空气质量':"count", # 求连续天数
}).nlargest(5,'空气质量') # 取 空气质量 字段最大的前5组数据

图6:解法1的结果

вышеполный кодследующее:

t = aqi.query('空气质量=="污染"')
t.groupby(
    pd.to_datetime(t.time)-pd.to_timedelta(t.time.rank(),unit='d')
         ).agg(
    {
    'time': lambda x:f'{x.min()}~{x.max()}',
    '空气质量':"count",
    }
).nlargest(5,'空气质量')

2.2. Идея 2: Сравните показатели качества воздуха за два соседних дня.

Идея 2 имеет два решения: одно — использовать цикл для создания вспомогательных столбцов, другое — использовать сдвиг и cumsum для создания вспомогательных столбцов, подробности можно посмотреть ниже.

Решение 1. Используйте цикл для создания вспомогательного столбца

  • Создайте вспомогательный столбец и создайте функцию для получения значения вспомогательного столбца в соответствии со следующими идеями.
  • Если качество воздуха хорошее, значение вспомогательного столбца равно +1; если текущее качество воздуха отличается от предыдущего дня, значение вспомогательного столбца также равно +1.
  • Если ничего из вышеперечисленного не выполняется, значение вспомогательного столбца остается неизменным.
last = None
num = 0
groupids = []
for v in aqi.空气质量.values:
    if v != last or v != '污染':
        num += 1
    groupids.append(num)
    last = v

Согласно этой логике мы можем получить данные вспомогательного столбца следующим образом:

图7:辅助列值预览

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

aqi.groupby(groupids).agg(
    {
    'time': lambda x:f'{x.min()}~{x.max()}',
    '空气质量':"count",
    }
).nlargest(5,'空气质量')

图8:思路2的解法1结果

Решение 2. Используйте shift и cumsum для создания вспомогательных столбцов.

  • Сначала создайте столбец сдвига качества воздуха, сдвиньтесь на одну позицию вниз
  • Если столбец сдвига и столбец качества воздуха равны, столбец оценки равен 0, в противном случае - 1.
  • Вспомогательный столбец представляет собой совокупную сумму столбца суждений.

图9:辅助列创建思路预览

Мы также можем обнаружить, что количество последовательных дней с качеством воздуха (как хорошим, так и загрязненным) можно получить путем группировки и подсчета по вспомогательному столбцу, как показано в красной области выше.

(
    aqi.query('空气质量=="污染"') # 这里筛选 污染 天气
    .groupby((aqi.空气质量.shift() != aqi.空气质量).cumsum()) # 辅助列
    .time.agg(['count','min','max']) # 计数及获取日期区间
    .nlargest(5,'count')
)

图9:思路2的解法2结果

Согласно выходу Xiaoming, код настройки выглядит следующим образом:

aqi.query("空气质量=='污染'").groupby((aqi.空气质量 != aqi.空气质量.shift()).cumsum()).agg(
    {'time': lambda x: f"{x.min()}~{x.max()}", '空气质量': "count"}).nlargest(5, '空气质量')

图10:思路2的解法2小明哥结果

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