我正在尝试计算每个源地址的概率,从而给出了来自packet_in消息的一定目标IP。为此,我首先使用DataFrame团聚这些地址,然后使用嵌套循环来解决发生不同的发生概率。该代码确实在IDE上起作用,但是,它为控制器提供了不同的输出。我的代码中的循环语句似乎有问题,您能给我一只手吗?
您可以使用Pandas的分裂抗曲线特征来消除循环。
首先,让我们通过使用Integer SRC/DST创建数据框来抽象问题的" Pox"部分。
import pandas as pd
import numpy as np
src = np.trunc(np.random.uniform(0, 5, size=1000))
dst = np.trunc(np.random.uniform(0, 3, size=1000)) + src
df = pd.DataFrame({'dst': x, 'src': y})
因此,在此示例中,SRC和DST相关。为了获得频率计数,单行可用
df.groupby('dst').src.value_counts()
产生类似以下内容。
dst src
0.0 0.0 71
2.0 68
1.0 45
1.0 3.0 80
2.0 76
1.0 60
2.0 4.0 84
3.0 61
2.0 56
3.0 3.0 90
4.0 58
5.0 50
4.0 4.0 71
6.0 67
5.0 63
这为您提供了每个SRC/DST对的原始计数。您可以通过使用GroupBy对象两次将每个SRC出现给定给定DST的时间的时间很少:一次:一次计算上述每个SRC/DST的频率,然后一次计算每个DST的频率。
g = df.groupby('dst')
g.src.value_counts() / g.size()
会产生
之类的东西dst src
0.0 0.0 0.385870
1.0 0.244565
2.0 0.369565
...
4.0 4.0 0.353234
5.0 0.313433
6.0 0.333333
如果您不使用其他任何内容的数据帧,则可以通过将字符串IP地址转换为ipaddress
对象来使用itertools.groupby
,以便可以对其进行排序。
import ipaddress, itertools
ipList_Dst = ['10.0.0.2', '10.0.0.2', '10.0.0.2', '10.0.0.2',
'10.0.0.2', '10.0.0.2', '10.0.0.2', '10.0.0.2',
'10.0.0.2', '10.0.0.2', '10.0.0.2', '10.0.0.2']
ipList_Src = ['70.240.175.230', '243.41.191.23', '18.191.71.228',
'62.95.69.19', '167.31.217.139', '30.63.153.99',
'74.88.164.220', '135.131.110.167', '59.237.249.54',
'34.24.183.147', '21.201.47.164', '167.31.217.139']
dst = map(ipaddress.ip_address,ipList_Dst)
src = map(ipaddress.ip_address,ipList_Src)
pairs = sorted(zip(dst, src))
for key,group in itertools.groupby(pairs):
print([str(addr) for addr in key])
groupby
对象的每个key
将是唯一的(dst,src)
组合。