У меня есть датафрейм (df), состоящий из почасовых суточных показаний загрязнителей (5). Максимальное значение загрязняющего вещества, для значения часа или дня, будет служить ссылкой для получения индекса качества воздуха и добавления его в качестве метки к df.
В качестве примера, скажем, что для определенного часа / дня максимальное значение среди загрязнителей принадлежит PM10 со значением 65 мкг / м3. , При обращении к диаграмме определяется, что индекс качества воздуха равен 4, поскольку его показания находятся в диапазоне 50-100.
То, как я вычисляю метку, определяется следующей функцией:
# IQA label function
def get_IQA_label(df):
for index, val in df[[x for x in df.columns if x != 'date']].iterrows():
max_column = np.argmax(val)
max_column_val = np.max(val)
if max_column == 0: # O_3
if max_column_val <= 80:
df.at[index, 'Label'] = 1
if 80 < max_column_val <= 120:
df.at[index, 'Label'] = 2
if 120 < max_column_val <= 180:
df.at[index, 'Label'] = 3
if 180 < max_column_val <= 240:
df.at[index, 'Label'] = 4
if 240 < max_column_val <= 600:
df.at[index, 'Label'] = 5
if max_column == 1: # NO_2
if max_column_val <= 40:
df.at[index, 'Label'] = 1
if 40 < max_column_val <= 100:
df.at[index, 'Label'] = 2
if 100 < max_column_val <= 200:
df.at[index, 'Label'] = 3
if 200 < max_column_val <= 400:
df.at[index, 'Label'] = 4
if 400 < max_column_val <= 1000:
df.at[index, 'Label'] = 5
if max_column == 2: # SO_2
if max_column_val <= 100:
df.at[index, 'Label'] = 1
if 100 < max_column_val <= 200:
df.at[index, 'Label'] = 2
if 200 < max_column_val <= 350:
df.at[index, 'Label'] = 3
if 350 < max_column_val <= 500:
df.at[index, 'Label'] = 4
if 500 < max_column_val <= 1250:
df.at[index, 'Label'] = 5
if max_column == 3: # PM_10
if max_column_val <= 20:
df.at[index, 'Label'] = 1
if 20 < max_column_val <= 35:
df.at[index, 'Label'] = 2
if 35 < max_column_val <= 50:
df.at[index, 'Label'] = 3
if 50 < max_column_val <= 100:
df.at[index, 'Label'] = 4
if 100 < max_column_val <= 1200:
df.at[index, 'Label'] = 5
if max_column == 4: # PM_2.5
if max_column_val <= 10:
df.at[index, 'Label'] = 1
if 10 < max_column_val <= 20:
df.at[index, 'Label'] = 2
if 20 < max_column_val <= 25:
df.at[index, 'Label'] = 3
if 25 < max_column_val <= 50:
df.at[index, 'Label'] = 4
if 50 < max_column_val <= 800:
df.at[index, 'Label'] = 5
return df
При прохождении df для получения дневных меток:
day_df = get_IQA_label(day_df)
day_df
Вывод:
O_3 NO_2 SO_2 PM10 PM25 CO Label
date
2001-01-01 19.685217 53.789130 10.870435 20.306522 12.505127 1.055217 2.0
2001-01-02 25.496667 64.332083 10.119167 27.647917 12.505127 0.965417 2.0
2001-01-03 17.052917 69.595833 10.700833 33.777500 12.505127 0.965833 2.0
2001-01-04 18.335000 69.926666 11.472500 36.369583 12.505127 0.855000 2.0
2001-01-05 9.731667 65.272917 10.611250 32.444167 12.505127 1.174583 2.0
... ... ... ... ... ... ... ...
2018-04-27 52.875000 52.125000 1.000000 15.166667 7.125000 0.362500 1.0
2018-04-28 63.208333 30.625000 1.000000 13.000000 7.791667 0.245833 1.0
2018-04-29 68.375000 29.833333 1.000000 5.458333 3.750000 0.241667 1.0
2018-04-30 60.916667 37.375000 2.708333 4.083333 3.208333 0.279167 1.0
2018-05-01 52.000000 43.000000 4.000000 6.000000 4.000000 0.300000 1.0
Интересно, какими еще способами я мог бы нацелиться, чтобы Получив метки, я нахожу функцию get_IQA_label (df) большой частью кода, и я чувствую, что ее можно оптимизировать гораздо лучше.
Я думал о преобразовании диаграммы IQA в df2 и вычислении Максимальное значение для каждой строки в показаниях основного загрязнителя df, создайте какую-то функцию, принимающую в качестве параметров максимальное значение и имя загрязнителя, чтобы сравнить его с df2 и получить индекс качества воздуха.
При вычислении значение max (), которое я использую:
# Getting max values from each contaminant on each row
max_value = df.max(axis=1)
max_value
И чтобы получить имя столбца из максимального значения, которое я использую:
# Obtaining maximum value column name for each row
label_max_colName = hour_df.eq(hour_df.max(1), axis=0).dot(hour_df.columns)
label_max_colName
Но приведенное выше возвращает ser Я и я не смогли передать эти ряды в функцию, чтобы получить желаемый результат.
В общем, не слишком уверен, как составить df2 для диаграммы AQI и как реализовать функцию.