Расчет среднего значения столбца в 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, применять данную функцию к группе, возвращать результат в виде ряда) или по серии столбцов
Из панд документы:
Под "группировкой" мы подразумеваем процесс, включающий один или несколько из следующих шагов
Разделение данных на группы по некоторым критериям
Применение функции к каждой группе независимо
Объединение результатов в структуру данныхАгрегирование: вычисление сводной статистики (или статистики) по каждой группе.
Некоторые примеры:Рассчитать групповые суммы или средства
Вычислить размеры / количество групп