Всем привет, меня зовут Кай.
Недавно столкнулся с требованием при обработке данных, суть в том, чтобы получить максимальное количество последовательных дней поведения. Здесь мы используем данные о качестве воздуха в Пекине в качестве примера, чтобы продемонстрировать, что необходимо выяснить, как долго продолжается непрерывное загрязнение воздуха в Пекине в течение самого длительного времени, и определить его цикл.
Исходя из данных на приведенном выше рисунке, мы видим, что непрерывное загрязнение воздуха продолжалось в течение 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()
Поскольку нам нужно только использовать 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)
2. Найдите количество дней непрерывного загрязнения
В сочетании с последним случаем "" здесь мы предлагаем 1 новую идею решения проблемы, всего 2 идеи решения проблемы.
Следующее решение исходит из小明哥
и才哥
2.1. Идея 1: отсортируйте разницу по времени, а затем сгруппируйте количество
Решение брата Цая в прошлый раз - это такой образ мышления. Оглядываясь назад на исходный код, он кажется относительно незрелым. Сегодня давайте посмотрим на решение брата Сяомина, которое очень интересно.
Шаг 1. Отфильтруйте данные о качестве воздуха на предмет загрязнения
t = aqi.query('空气质量=="污染"')
t.sample(5)
Шаг 2: Добавьте вспомогательный столбец (вспомогательный столбец можно добавить, не добавляя его к исходным данным).t
начальство)
Логика здесь примерно такая:
- Второй столбец ранжирования (в хронологическом порядке) — это количество дней между
- Затем используйте поле времени (время) и интервал, чтобы вычислить разницу, чтобы получить дату
- Если полученная дата одинакова, то эти дни являются последовательными днями загрязнения.
groupids = pd.to_datetime(aqi.time)-pd.to_timedelta(aqi.time.rank(),unit='d')
groupids.sample(5)
Шаг 3: Групповой подсчет, чтобы получить последовательные дни, и сгруппировать, чтобы найти минимальные и максимальные значения, чтобы получить даты начала и окончания непрерывного загрязнения.
t.groupby(groupids).agg({
'time': lambda x:f'{x.min()}~{x.max()}', # 求起止日期
'空气质量':"count", # 求连续天数
}).nlargest(5,'空气质量') # 取 空气质量 字段最大的前5组数据
вышеполный кодследующее:
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
Согласно этой логике мы можем получить данные вспомогательного столбца следующим образом:
Мы можем обнаружить, что подсчет с помощью группы вспомогательных столбцов может получить количество последовательных дней загрязнения, таких как отмеченная красным область выше.
aqi.groupby(groupids).agg(
{
'time': lambda x:f'{x.min()}~{x.max()}',
'空气质量':"count",
}
).nlargest(5,'空气质量')
Решение 2. Используйте shift и cumsum для создания вспомогательных столбцов.
- Сначала создайте столбец сдвига качества воздуха, сдвиньтесь на одну позицию вниз
- Если столбец сдвига и столбец качества воздуха равны, столбец оценки равен 0, в противном случае - 1.
- Вспомогательный столбец представляет собой совокупную сумму столбца суждений.
Мы также можем обнаружить, что количество последовательных дней с качеством воздуха (как хорошим, так и загрязненным) можно получить путем группировки и подсчета по вспомогательному столбцу, как показано в красной области выше.
(
aqi.query('空气质量=="污染"') # 这里筛选 污染 天气
.groupby((aqi.空气质量.shift() != aqi.空气质量).cumsum()) # 辅助列
.time.agg(['count','min','max']) # 计数及获取日期区间
.nlargest(5,'count')
)
Согласно выходу Xiaoming, код настройки выглядит следующим образом:
aqi.query("空气质量=='污染'").groupby((aqi.空气质量 != aqi.空气质量.shift()).cumsum()).agg(
{'time': lambda x: f"{x.min()}~{x.max()}", '空气质量': "count"}).nlargest(5, '空气质量')
Вышеизложенное является полным содержанием этого времени.На самом деле, мы можем столкнуться с похожими сценариями в нашей повседневной работе и жизни, такими как: подсчет количества последовательных дней входа пользователя, подсчет количества последовательных дней оплаты пользователя, подсчет количества последовательные дождливые дни в сезон дождей на юге и так далее!