Расчет среднего значения столбца в CSV в час

У меня есть CSV-файл, который содержит данные в следующем формате.

Layer   relative_time   Ht    BSs    Vge    Temp    Message
57986   2:52:46       0.00m   87    15.4    None    CMSG 
20729   0:23:02       45.06m  82    11.6    None    BMSG 
20729   0:44:17       45.06m  81    11.6    None    AMSG 

Я хочу, чтобы прочитать в этом CSV-файл и рассчитать среднее BSs за каждый час. Мой CSV-файл довольно большой около 2000 значений. Однако значения распределяются неравномерно по каждому часу. Например,

я имею 237 samples from hour 3 and only 4 samples from hour 6, Также я должен отметить, что BSs может быть получен из нескольких источников. Значение всегда варьируется от 20-100, Из-за этого это дает искаженный результат. Для каждого часа я рассчитываю сумму BSs за этот час, деленный на количество образцов в этот час. Основная цель - понять, как BSs развивается со временем.

Но каков общий подход к этой проблеме. Это где люди применяют нормализацию? Было бы здорово, если бы кто-то мог объяснить, как применять нормализацию в такой ситуации.

Код, который я использую для своей обработки, показан ниже. Я считаю, что приведенный ниже код является правильным.

#This 24x2 matrix will contain no of values recorded per hour per hour
hours_no_values = [[0 for i in range(24)] for j in range(2)]

#This 24x2 matrix will contain mean bss stats per hour
mean_bss_stats = [[0 for i in range(24)] for j in range(2)]


with open(PREFINAL_OUTPUT_FILE) as fin, open(FINAL_OUTPUT_FILE, "w",newline='') as f:
    reader = csv.reader(fin, delimiter=",")
    writer = csv.writer(f)
    header = next(reader)  # <--- Pop header out
    writer.writerow([header[0],header[1],header[2],header[3],header[4],header[5],header[6]]) # <--- Write header
    sortedlist = sorted(reader, key=lambda row: datetime.datetime.strptime(row[1],"%H:%M:%S"), reverse=True)
    print(sortedlist)
    for item in sortedlist:
        rel_time = datetime.datetime.strptime(item[1], "%H:%M:%S")
        if rel_time.hour not in hours_no_values[0]:
            print('item[6] {}'.format(item[6]))
            if 'MAN' in item[6]:
                print('Hour found {}'.format(rel_time.hour))
                hours_no_values[0][rel_time.hour] = rel_time.hour
                mean_bss_stats[0][rel_time.hour] = rel_time.hour

                mean_bss_stats[1][rel_time.hour] += int(item[3])

                hours_no_values[1][rel_time.hour] +=1
            else:
                pass
        else:
            if 'MAN' in item[6]:
                print('Hour Previous {}'.format(rel_time.hour))
                mean_bss_stats[1][rel_time.hour] += int(item[3])

                hours_no_values[1][rel_time.hour] +=1
            else:
                pass

    for i in range(0,24):
        if(hours_no_values[1][i] != 0):
            mean_bss_stats[1][i] = mean_bss_stats[1][i]/hours_no_values[1][i]    
        else:
            mean_bss_stats[1][i] = 0


    pprint.pprint('mean bss stats {} \n hour_no_values {} \n'.format(mean_bss_stats,hours_no_values))

Количество значений за каждый час следующие для часов, начиная с 0 to 23,

[31, 117, 85, 237, 3, 67, 11, 4, 57, 0, 5, 21, 2, 5, 10, 8, 29, 7, 14, 3, 1, 1, 0, 0]

1 ответ

Вы можете сделать это с пандами используя groupby и объединить в соответствующий столбец:

import pandas as pd
import numpy as np
df = pd.read_csv("your_file")
df.groupby('hour')['BSs'].aggregate(np.mean)

Если у вас нет этого столбца в исходном фрейме данных, вы можете добавить его:

df['hour'] = your_hour_data

numpy.mean - вычисляет среднее значение массива.

Вычислить среднее арифметическое по указанной оси.

pandas.groupby

Группировать ряды, используя маппер (функция dict или key, применять данную функцию к группе, возвращать результат в виде ряда) или по серии столбцов

Из панд документы:

Под "группировкой" мы подразумеваем процесс, включающий один или несколько из следующих шагов

Разделение данных на группы по некоторым критериям
Применение функции к каждой группе независимо
Объединение результатов в структуру данных

Агрегирование: вычисление сводной статистики (или статистики) по каждой группе.
Некоторые примеры:

Рассчитать групповые суммы или средства
Вычислить размеры / количество групп

Другие вопросы по тегам