我有一个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]
答案 0 :(得分:2)
您可以使用groupby使用pandas并将其聚合到适当的列:
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
使用mapper(dict或key函数,将给定函数应用于组,将结果作为系列返回)或通过一系列列的组系列
来自pandas docs:
“group by”我们指的是涉及以下一个或多个步骤的流程
根据某些标准将数据拆分成组 将功能独立应用于每个组
将结果组合成数据结构聚合:计算每个组的摘要统计信息(或统计信息) 一些例子:
计算组总和或表示
计算组大小/计数