Чтобы понять, что не так с этим кодом, мы в первую очередь переходим к рефакторингу:
Настроить этот класс необходимо для симуляции среднего сообщения от вашего 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 итераций сумму последних 60 итераций третий столбец вашего массива my_array
.
Затем вы переходите к генерации l
, а затем создаете среднее значение из значений sums
с индексами из l
. Это зависит только от получаемых вами сообщений.
Когда такое значение больше или равно заданному MAX_MEAN
, вы печатаете сообщение.
Предположим, что сумма каждого окна является константой constant_sum
. Назовем множество этих констант elements
. Очевидно, что ваше среднее значение ortalama
равно constant_sum
.
Как вы можете видеть, elements_step
упрощается от функции и рассматривается только в функции входных сообщений.
elements = np.array([])
elements_step = 5
constant_sum = 1000
upper_limit = 10000
for i in range(1000):
elements = np.append(elements, constant_sum)
l = np.arange(0, len(elements), elements_step)
ortalama = np.mean(elements[l])
if ortalama >= upper_limit:
print("Large ortalama")
В вашем контексте приложения отсутствует ссылка на схему JPA.
В этой строке указано местоположение проблемы:
Строка 14 в документе XML из ресурса пути к классу [applicationContext.xml] недопустима; вложенным исключением является org.xml.sax.SAXParseException; номер строки: 14; номер столбца: 43; El prefijo "jpa" para el elemento "jpa: repositories" no está enlazado.
blockquote>И решение состоит в том, чтобы правильно ссылаться на схему jpa:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa" ... xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsd ... >
Обратите внимание, что ваш
context.xml
пропускает частьxmlns:jpa
.
Попробуйте упорядочить файлы, используя Maven Standard Directory Layout :
src/
main/
java/
(put your .java files here)
resources/
applicationContext.xml
Посмотрите на скомпилированные источники (папку target
или файл .jar
- обратите внимание, что вы можете открыть последний с помощью ZIP-совместимого архиватора (например, 7-ZIP) и убедиться, что ваш applicationContext.xml
действительно отсутствует, прежде чем изменять структуру папок и присутствует после его применения и компиляции проекта.
Обновление для читателей этого ответа: автор менял вопрос несколько раз. Каждый раз после исправления предыдущей ошибки сообщалось о совершенно новой ошибке. Этот ответ был одним из шагов в этом путешествии, он позволил системе фактически найти applicationContext.xml
во время выполнения.