我对如何在python中执行此任务有疑问: -
我有一系列条目,如: [IPAddress,connections,policystatus,activity flag,longitude,latitude](全部为字符串)
离。
['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个条目(有点大数据问题) 我的文件在.csv中,但我用它作为.txt在python中轻松使用它(不确定这是不是最好的主意)
我仍然是python的新手,所以我不确定最好的使用方法,但我真诚地感谢任何帮助或指导这个问题
提前感谢!
答案 0 :(得分:0)
不,如果您将文件设置为.csv,则将它们作为文本进行威胁是没有意义的,因为python附带了优秀的csv
模块。
您可以将csv行读入dict
进行分组,但我建议将数据写入适当的数据库,并使用SQL的AVG()
和GROUP BY
。 Python附带了大多数数据库的绑定。如果您尚未安装,请考虑使用sqlite
模块。
答案 1 :(得分:0)
我只会给你算法,你可以自己编写实际的代码来学习更多。
使用字典,将密钥作为(longitude, latitude)
形式的一对,并将值作为[ConnectionSum,policystatusSum,ActivityFlagSum]
循环输入一次(计算总条目数, N )
一个。对于每个条目,如果该位置存在 - 将conn,policystat和Activity值添加到现有总和。
湾如果该条目不存在,则将[0,0,0]指定为值
对所有文件执行1和2.
[ConnectionSum,policystatusSum,ActivityFlagSum]
的每个元素除以 N 以获得每个元素的平均值。答案 2 :(得分: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
。在每个步骤中,您只跟踪当前平均值和元素数量。这个解决方案将产生最少量的内存(不超过最终结果的大小!),并且不关心你访问元素的顺序。它会是这样的。有关CSV模块中需要的功能,请参阅http://docs.python.org/library/csv.html。
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米以内可能是合理的;参见纬度和经度。这只需要一点点数学/几何。)