Лучшие способы заменить эту функцию в pandas? - PullRequest
1 голос
/ 26 апреля 2020

У меня есть датафрейм (df), состоящий из почасовых суточных показаний загрязнителей (5). Максимальное значение загрязняющего вещества, для значения часа или дня, будет служить ссылкой для получения индекса качества воздуха и добавления его в качестве метки к df.

AQI chart

В качестве примера, скажем, что для определенного часа / дня максимальное значение среди загрязнителей принадлежит 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 и как реализовать функцию.

1 Ответ

1 голос
/ 26 апреля 2020

Я бы порекомендовал функцию «вырезать». Это должно работать с учетом диаграммы IQA:

def get_IQA_label(df):

    df_2 = pd.DataFrame(index=df.index)

    df_2['O_3'] = pd.cut(input_df.O_3, bins=[0,80,120,180,240,600], 
                         labels=[1,2,3,4,5])
    df_2['NO_2'] = pd.cut(input_df.NO_2, bins=[0,40,100,200,400,1000], 
                          labels=[1,2,3,4,5])
    df_2['SO_2'] = pd.cut(input_df.SO_2, bins=[0,100,200,350,500,1250], 
                          labels=[1,2,3,4,5])
    df_2['PM10'] = pd.cut(input_df.PM10, bins=[0,20,35,50,100,1200], 
                          labels=[1,2,3,4,5])
    df_2['PM25'] = pd.cut(input_df.PM25, bins=[0,10,20,25,50,800], 
                          labels=[1,2,3,4,5])

    df['Label'] = temp_df.max(axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...