np.arange
函数在我的代码中表现很奇怪。 24是我的增量,在此示例中,它打印“ ortalama” 24次。为什么会这样?
import numpy as np
import pandas as pd
from kafka import KafkaConsumer
i=0
j=0
k=0
array=np.zeros((100000, 4))
sums=np.zeros(100000)
consumer = KafkaConsumer('005', group_id='my-group',bootstrap_servers=['localhost:9092'])
for message in consumer:
a=message.value
a=a.decode("utf-8")
a = a.split(',')
for j in range(0,4):
array[i,j]=a[j]
#print(array)
if i%60==0 and i>60:
b= array[i-60:i,3]
total=np.sum(b)
sums[k]=total
k=k+1
l=np.arange(0, k, 24)
ortalama=np.mean(sums[l])
print(ortalama)
if ortalama>=219000:
print("1")
i=i+1
答案 0 :(得分:0)
首先要了解此代码的问题,我们继续进行重构:
根据需要自定义此类,以模拟来自您的Kafka的平均消息。
class Message:
"""Class to simulate expected Kafka message."""
def __init__(self):
self.value = "10,20,30,40".encode()
自定义此生成器,以模拟来自Kafka的合理消息。
import random
import time
def message_generator(n):
"""Yield a generated Kafka message."""
for i in range(n):
time.sleep(random.uniform(0, 0.001))
yield Message()
在进行任何代码剖析之前,让我们稍微重构一下此代码,使用numpy的vstack
和append
扩展数组,而不是定义一些常量。我也将array
重命名为my_array
。
import numpy as np
my_array, sums = np.empty((0, 4)), np.empty((1))
STEP = 60
MESSAGES = 100000
MAX_MEAN = 219000
for i, message in enumerate(message_generator(MESSAGES)):
values = np.array(message.value.decode("utf-8").split(',')).astype(float)
my_array = np.vstack([my_array, values])
if i % STEP == 0 and i > STEP:
sums = np.append(sums, np.sum(my_array[i - STEP:i, 3]))
l = np.arange(0, len(sums), 24)
if np.mean(sums[l]) >= MAX_MEAN:
print("Large ortalama")
np.arange
的说法现在,您的代码创建了一个l
值列表,从0
到len(sums)
,并带有一个步骤24
。 np.arange
没什么问题。
您有一个数组sums
,每60次迭代将数组my_array
第三列的最后60次迭代的总和相加。
然后,您继续生成l
,然后根据索引为sums
的{{1}}的值创建平均值。 这仅取决于您收到的消息。
当该平均值大于或等于给定的l
时,您将打印一条消息。
让我们假设每个窗口的总和为常数MAX_MEAN
。我们称这些常数为constant_sum
。显然,您的平均elements
值等于ortalama
。
如您所见,constant_sum
在功能上得到了简化,并且仅在输入消息的功能中被考虑。
elements_step