2

我有一个关于如何在 python 中执行此任务的问题:-

我有一个条目数组,例如:[IPAddress、连接、策略状态、活动标志、经度、纬度](全部为字符串)

前任。

['172.1.21.26','54','1','2','31.15424','12.54464']
['172.1.21.27','12','2','4','31.15424','12.54464']
['172.1.27.34','40','1','1','-40.15474','-54.21454']
['172.1.2.45','32','1','1','-40.15474','-54.21454']

...直到大约 110000 个条目,大约 4000 种不同的经纬度组合

我想计算每个位置的平均连接数、平均策略状态、平均活动标志

像这样的东西:

[longitude,latitude,avgConn,avgPoli,avgActi]
['31.15424','12.54464','33','2','3']
['-40.15474','-54.21454','31','1','1']

... 很快

我有大约 195 个文件,每个文件有约 110,000 个条目(有点像大数据问题)

我还是 python 新手,所以我不确定什么是最好的使用方法,但我真诚地感谢任何关于这个问题的帮助或指导

提前致谢!

4

3 回答 3

0

我只会给你算法,你可以通过自己编写实际代码来了解更多信息。

使用字典,键作为表单对(longitude, latitude),值作为 for 的列表[ConnectionSum,policystatusSum,ActivityFlagSum]

  1. 遍历条目一次(计算条目总数N

  2. 一个。对于每个条目,如果位置存在 - 将 conn、policystat 和 Activity 值添加到现有总和中。

    湾。如果条目不存在,则分配 [0,0,0] 作为值

  3. 对所有文件执行 1 和 2。

  4. 扫描完所有条目后。遍历字典并将列表中的每个元素除以[ConnectionSum,policystatusSum,ActivityFlagSum]N获得每个元素的平均值。
于 2012-04-21T12:15:33.167 回答
0

只要您的位置被限制在同一个文件中(甚至在一个文件中彼此靠近),您需要做的就是流处理范例。例如,如果您知道重复位置仅出现在文件中,请读取每个文件,计算平均值,然后关闭文件。只要你让旧数据浮出范围,垃圾收集器就会为你处理掉它。基本上这样做:

def processFile(pathToFile):
    ...

totalResults = ...
for path in filePaths:
    partialResults = processFile(path)
    totalResults = combine...partialResults...with...totalResults

一个更优雅的解决方案是使用“在线”计算平均值的 O(1) 方法。例如,如果您的平均数为 5、6、7,您会做5/1=5.0, (5.0*1+6)/2=5.5, (5.5*2+7)/3=6. 在每个步骤中,您只跟踪当前平均值和元素数量。此解决方案将产生使用的最小内存量(不超过最终结果的大小!),并且不关心您访问元素的顺序。它会像这样。请参阅http://docs.python.org/library/csv.html了解您在 CSV 模块中需要哪些功能。

import csv

def allTheRecords():
    for path in filePaths:
        for row in csv.somehow_get_rows(path):
            yield SomeStructure(row)

averages = {}  # dict: keys are tuples (lat,long), values are an arbitrary
               # datastructure, e.g. dict, representing {avgConn,avgPoli,avgActi,num}

for record in allTheRecords():
    position = (record.lat, record.long)
    currentAverage = averages.get(position, default={'avgConn':0, 'avgPoli':0, 'avgActi':0, num:0})
    newAverage = {apply the math I mentioned above}
    averages[position] = newAverage

(请注意,“一个位置的平均值”的概念没有明确定义。好吧,它是明确定义的,但不是很有用:如果您知道每个 IP 事件的确切位置到无限精度,那么平均一切都是自己的。您可以压缩数据集的唯一原因是因为您的纬度和经度具有有限的精度。如果您在获取更精确的数据时遇到此问题,您可以选择四舍五入到适当的精度。这可能是合理的舍入到 10 米以内或其他东西;查看纬度和经度。这只需要一点数学/几何知识。)

于 2012-04-21T12:16:14.373 回答
0

不,如果你有 .csv 格式的文件,以文本形式威胁它们是没有意义的,因为 python 附带了出色的csv模块。您可以将 csv 行读入 adict以对它们进行分组,但我建议将数据写入适当的数据库中,并使用 SQLAVG()GROUP BY. Python 附带了大多数数据库的绑定。如果您没有安装,请考虑使用该sqlite模块。

于 2012-04-21T11:57:21.993 回答