Scikit Learn: Projetando o futuro de suas APIs e aplicativos usando machine learning
O FutureCast é um script em Python que utiliza regressão linear do Scikit-Learn para projetar valores futuros de APIs e aplicativos a partir de um banco de dados SQLite, permitindo uma melhor tomada de decisões e planejamento de operações.
[ Hits: 4.432 ]
Por: Leonardo Berbert Gomes em 16/04/2023 | Blog: https://www.linkedin.com/in/leoberbert
import warnings,sqlite3,os,datetime,logging,sys
warnings.filterwarnings('ignore', message='X does not have valid feature names')
import pandas as pd
from sklearn.linear_model import LinearRegression
from logging.handlers import TimedRotatingFileHandler
# Configurar o logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# Criar a pasta de logs, caso ela não exista
if not os.path.exists('logs'):
os.mkdir('logs')
# Definir o nome do arquivo de log, baseado no nome do script
log_file = os.path.join('logs', os.path.splitext(os.path.basename(__file__))[0] + '.log')
# Configurar o manipulador de arquivos rotativos por dia
file_handler = TimedRotatingFileHandler(log_file, when='d', interval=1, backupCount=30, encoding='utf-8')
file_handler.setLevel(logging.INFO)
# Configurar o formato da mensagem de log
formatter = logging.Formatter('%(asctime)s - PID=%(process)d - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
# Adicionar o manipulador de arquivos ao logger
logger.addHandler(file_handler)
# Conectar-se ao banco de dados
try:
conn = sqlite3.connect('api_data.db')
logger.info(f'Iniciando a conexão com o banco de dados ...')
# Criar tabela api_projection
conn.execute('''CREATE TABLE IF NOT EXISTS api_projection (
data TEXT,
application TEXT,
api TEXT,
total INTEGER
)''')
conn.execute('''
CREATE INDEX IF NOT EXISTS idx_data_projection ON api_projection (data)
''')
conn.execute('''
CREATE INDEX IF NOT EXISTS idx_api_projection ON api_projection (api)
''')
conn.execute('''
CREATE INDEX IF NOT EXISTS idx_application_projection ON api_projection (application)
''')
cursor = conn.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='api_projection';")
table_exists = cursor.fetchone() is not None
if not table_exists:
logger.error("Não foi possível criar a tabela api_projection.")
sys.exit(1)
# Iterar sobre todas as horas do dia
logger.info("Realizando busca na tabela api_summary para realizar a projeção...")
for hour in range(24):
# Selecionar os dados da tabela de transações para a próxima hora
query = f"""SELECT strftime('%Y-%m-%d %H:%M', data) as data, application, api, total
FROM api_summary
WHERE strftime('%H', data) = '{hour:02}'"""
df = pd.read_sql_query(query, conn)
# Verificar se o DataFrame está vazio
if df.empty:
logger.warning(f'Não existem dados para realizar a projeção para a hora {hour:02}:00:00.')
continue
# Converter a coluna "data" em um objeto datetime e criar uma coluna "valor" para armazenar o valor numérico do "total"
df['data'] = pd.to_datetime(df['data'], format='%Y-%m-%d %H:%M')
df['valor'] = pd.to_numeric(df['total'])
# Agrupar os dados por API, aplicação e calcular a média horária dos valores para cada API e aplicação
df_por_api_e_aplicacao = df.groupby(['api', 'application', 'data'])['valor'].mean().reset_index()
# Criar colunas para o dia da semana e hora do dia
df_por_api_e_aplicacao['dia_da_semana'] = df_por_api_e_aplicacao['data'].dt.dayofweek
df_por_api_e_aplicacao['hora_do_dia'] = df_por_api_e_aplicacao['data'].dt.hour
# Ajustar um modelo de regressão linear para cada API e aplicação e prever os valores futuros para cada API e aplicação
projecoes = {}
for api in df_por_api_e_aplicacao['api'].unique():
for application in df_por_api_e_aplicacao['application'].unique():
df_api_e_aplicacao = df_por_api_e_aplicacao[(df_por_api_e_aplicacao['api'] == api) & (df_por_api_e_aplicacao['application'] == application)]
if not df_api_e_aplicacao.empty:
regressor = LinearRegression()
X = df_api_e_aplicacao[['hora_do_dia', 'dia_da_semana']]
y = df_api_e_aplicacao['valor']
regressor.fit(X, y, sample_weight=None)
valor_projetado = regressor.predict([[hour, datetime.datetime.now().weekday()]])
projecoes[(api, application)] = valor_projetado[0]
# Inserir as projeções na tabela api_projection do banco de dados
logger.info(f'Inserindo informações na tabela api_projection para a hora: {hour}')
cursor = conn.cursor()
for api, application in projecoes.keys():
valor_projetado_int = int(round(projecoes[(api, application)]))
data_projecao = datetime.datetime.now().replace(hour=hour, minute=0, second=0, microsecond=0).strftime('%Y-%m-%d %H:%M')
cursor.execute("INSERT INTO api_projection (data, application, api, total) VALUES (?, ?, ?, ?)", (data_projecao, application, api, valor_projetado_int))
conn.commit()
# Fechar a conexão com o banco de dados
conn.close()
logger.info(f'Aplicação finalizada com sucesso!!!')
except sqlite3.Error:
logger.error("Não foi possível estabelecer a conexão com o banco de dados.")
sys.exit(1)
SuperDNS: Solução definitiva para DNS dinâmico
Centralizando logs com Promtail + Loki + Grafana
Rundeck - Um Poderoso Agendador de Tarefas
Instalando Apache, PHP e PostgreSQL no Slackware 12 (compilando)
Arduino com Bluetooth e pySerial
Download de Arquivos com Verificação do Hash SHA 256
Como isolar seus projetos Python com virtualenv (ambiente virtual)
tux-gpt - Assistente de IA para o Terminal
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Instalação dualboot Windows 11 e Debian 13 (8)
Preciso recuperar videos *.mp4 corrompidos (11)
É normal não gostar de KDE? (11)









