Skip to content

Instantly share code, notes, and snippets.

@CoutinhoElias
Last active September 20, 2022 01:24
Show Gist options
  • Save CoutinhoElias/3935f11f9ad3c5d4257d893d3de36760 to your computer and use it in GitHub Desktop.
Save CoutinhoElias/3935f11f9ad3c5d4257d893d3de36760 to your computer and use it in GitHub Desktop.
''' USO PEEWEE PARA GERAR MEUS DADOS DIRETAMENTE DO POSTGRES'''
''' MEUS MODELOS PODEM SER ABSTRAIDOS DO EXEMPLO '''
from ntpath import join
from peewee import fn, JOIN
from models import Detalhe, Produto, Grupo, Familia, Unidade, Pessoas, Estoque, Codigos, Docitem, Comitem
import pandas as pd
from datetime import datetime
''' ABAIXO CRIO MINHA CONSULTA PARA USAR NOS GRÁFICOS '''
# -------------------------------------------------------------------------------------------------------------
# Usarei as consultas 'subquery' e 'estoque' abaixo para unir com a consulta 'dados_gerais'
EstoqueAlias = Estoque.alias() # Faco referencia a tabela Estoque
# Criamos uma subconsulta para listar o alor máximo para cada iddetalhe, ou seja, sempre o último
subquery = (EstoqueAlias
.select(
EstoqueAlias.iddetalhe,
fn.MAX(EstoqueAlias.dtreferencia).alias('max_ts'))
.group_by(EstoqueAlias.iddetalhe)
.alias('post_max_subquery'))
# Consulta que unifica a subquery acima com estoque abaixo:
estoque = (Estoque
.select(
Estoque.qtestoque2,
Estoque.qtestoque,
Estoque.iddetalhe,
)
.switch(Estoque)
.join(subquery, on=(
(Estoque.dtreferencia == subquery.c.max_ts) &
(Estoque.iddetalhe == subquery.c.iddetalhe))))
# Crio um data frame para cada tabela para que no próximo passo possa unificar em um só.
# -------------------------------------------------------------------------------------------------------------
df_estoque_completo = pd.DataFrame(list(estoque.dicts()))
df_estoque = pd.DataFrame()
df_estoque['iddetalhe'] = df_estoque_completo.iddetalhe
df_estoque['qtestoque'] = df_estoque_completo.qtestoque
df_estoque['qtestoque2'] = df_estoque_completo.qtestoque2
# -------------------------------------------------------------------------------------------------------------
# Crio um dataframecom pessoas
pessoas = (Pessoas(Pessoas.idpessoa, Pessoas.nmpessoa).select())
df_pessoa_completo = pd.DataFrame(list(pessoas.dicts()))
df_pessoa = pd.DataFrame()
df_pessoa['idpessoa'] = df_pessoa_completo.idpessoa
df_pessoa['nmpessoa'] = df_pessoa_completo.nmpessoa
# -------------------------------------------------------------------------------------------------------------
# Base de dados relacionada inteiramente com LEFT_OUTER, ou seja, mostra os dados do produto e se tiver movimento ele lista.
# sem a quantidade em estoque
dados_gerais = (Detalhe().select(
Detalhe.iddetalhe, Detalhe.cdprincipal, Detalhe.dsdetalhe, Detalhe.vlprecocusto, Detalhe.vlprecovenda,
Docitem.dtreferencia, Docitem.qtitem, Docitem.tpoperacao, Docitem.tpdevolucao,
Produto.stativo,
Familia.dsfamilia,
Grupo.nmgrupo,
Unidade.dsunidade,
Pessoas.nmpessoa,
Comitem.idpessoa).
join(Produto, JOIN.LEFT_OUTER, on=(Detalhe.idproduto == Produto.idproduto)).
join(Unidade, JOIN.LEFT_OUTER, on=(Produto.idunidade == Unidade.idunidade)).
join(Pessoas, JOIN.LEFT_OUTER, on=(Produto.idfornecprincipal == Pessoas.idpessoa)).
join(Grupo, JOIN.LEFT_OUTER, on=(Produto.idgrupo == Grupo.idgrupo)).
join(Familia, JOIN.LEFT_OUTER, on=(Detalhe.idfamilia == Familia.idfamilia)).
join(Docitem, JOIN.LEFT_OUTER, on=(Detalhe.iddetalhe == Docitem.iddetalhe)).
join(Comitem, JOIN.LEFT_OUTER, on=(Docitem.iddocumentoitem == Comitem.iddocitem))
)
#######print(type(Grupo), '-----------')
# Transformando uma consulta peewee em uma lista, consequentemente em um datagrame do pandas.
df_dados_gerais = pd.DataFrame(
list(dados_gerais.dicts()))
# Unificando df_dados_gerais e df_estoque pelo campo 'iddetalhe' comum em ambos
# e solicito que mostre todo o conjunto de dados com 'outer'
df_dados_gerais = pd.merge(df_dados_gerais, df_estoque, on='iddetalhe', how='outer')
df_dados_gerais = pd.merge(df_dados_gerais, df_pessoa, on='idpessoa', how='left')
df_dados_gerais = df_dados_gerais.drop(columns=['iddetalhe', 'idpessoa'])
# Verificando nome das colunas para renomear.
#df_dados_gerais.info()
# Renomeando cada coluna.
df_dados_gerais.columns = ['CODIGO', 'DESCRICAO', 'CUSTO', 'VENDA', 'DTREFERENCIA', 'QUANTIDADE',
'OPERACAO', 'DEVOLUCAO','ATIVO', 'FAMILIA', 'GRUPO', 'UNIDADE', 'CLIENTE_FORNECEDOR',
'QT_PRATELEIRA', 'QT_DEPOSITO', 'VENDEDOR']
# -------------------------------------------------------------------------------------------------------------
# **** PREENCHENDO COLUNAS ****
# Aplicando valores a campos em branco ou com valores que não deveriam aparecer (Incluo ou substituo)
df_dados_gerais['OPERACAO'] = df_dados_gerais['OPERACAO'].fillna('X')
df_dados_gerais['FAMILIA'] = df_dados_gerais['FAMILIA'].fillna('NAO_PREENCHIDO')
df_dados_gerais['CLIENTE_FORNECEDOR'] = df_dados_gerais['CLIENTE_FORNECEDOR'].fillna('NAO_PREENCHIDO')
df_dados_gerais['DTREFERENCIA'] = df_dados_gerais['DTREFERENCIA'].fillna('1900-01-01 00:00:01')
df_dados_gerais['CODIGO'] = df_dados_gerais['CODIGO'].fillna('000000')
df_dados_gerais['DESCRICAO'] = df_dados_gerais['DESCRICAO'].fillna('DESCONSIDERE')
df_dados_gerais['QUANTIDADE'] = df_dados_gerais['QUANTIDADE'].fillna(0)
df_dados_gerais['CUSTO'] = df_dados_gerais['CUSTO'].fillna(0)
df_dados_gerais['VENDA'] = df_dados_gerais['VENDA'].fillna(0)
df_dados_gerais['ATIVO'] = df_dados_gerais['ATIVO'].fillna('N')
df_dados_gerais['GRUPO'] = df_dados_gerais['GRUPO'].fillna('NAO_PREENCHIDO')
df_dados_gerais['UNIDADE'] = df_dados_gerais['UNIDADE'].fillna('NAO_PREENCHIDO')
df_dados_gerais['QT_PRATELEIRA'] = df_dados_gerais['QT_PRATELEIRA'].fillna(0)
df_dados_gerais['QT_DEPOSITO'] = df_dados_gerais['QT_DEPOSITO'].fillna(0)
df_dados_gerais['VENDEDOR'] = df_dados_gerais['VENDEDOR'].fillna('NAO_PREENCHIDO')
# -------------------------------------------------------------------------------------------------------------
# Crio uma nova coluna em df e adiciono MesAno como string
df_dados_gerais['MES_ANO'] = df_dados_gerais.DTREFERENCIA.dt.to_period('M').astype(str)
# Crio a coluna 'ANO' para filtros futuros.
df_dados_gerais['ANO'] = df_dados_gerais.DTREFERENCIA.dt.to_period('Y').astype(str)
# Crio uma nova coluna 'MES' e faço a tradução simultanea.
df_dados_gerais['MES'] = df_dados_gerais.DTREFERENCIA.dt.month_name().map({
'January': 'JAN',
'February': 'FEV',
'March': 'MAR',
'April': 'ABR',
'May': 'MAI',
'June': 'JUN',
'July': 'JUL',
'August': 'AGO',
'September': 'SET',
'October': 'OUT',
'November': 'NOV',
'December': 'DEZ'},
na_action=None)
# Defino a coluna 'MES_ANO' cmo indice
df_dados_gerais.set_index('MES_ANO', inplace=True)
# Renomeio novamente as colunas.
df_dados_gerais.columns = ['CODIGO', 'DESCRICAO', 'CUSTO', 'VENDA', 'DTREFERENCIA', 'QUANTIDADE', 'OPERACAO',
'DEVOLUCAO', 'ATIVO', 'FAMILIA', 'GRUPO', 'UNIDADE', 'CLIENTE_FORNECEDOR', 'QT_PRATELEIRA',
'QT_DEPOSITO', 'VENDEDOR', 'ANO', 'MES']
# Removo dos meus dados toda linha que o código for igual a 000000
df_dados_gerais = df_dados_gerais[df_dados_gerais['CODIGO'] != '000000']
# Faço um cálculo com algumas colunas e crio uma nova 'TOTAL_OPERACAO' com o resultado..
df_dados_gerais['TOTAL_OPERACAO'] = df_dados_gerais['VENDA'] * df_dados_gerais['QUANTIDADE']
# Finalmente crio meu pivot_table para mostrar na minha tabela ou exportar para excel.
df_pivot = pd.pivot_table(
df_dados_gerais, index=['CODIGO', 'DESCRICAO', 'ATIVO',
'QT_PRATELEIRA', 'QT_DEPOSITO', 'GRUPO',
'FAMILIA', 'UNIDADE', 'CLIENTE_FORNECEDOR'],
values='QUANTIDADE',
columns='MES',
aggfunc=sum).reset_index().fillna(0)
# df_dados_gerais.to_excel('C:/Users/EliasPai/Desktop/df_dados_gerais.xlsx')
# df_pivot.to_excel('C:/Users/EliasPai/Desktop/df_pivot.xlsx')
# df_dados_gerais.info()
'''--------------------------------------------------------------------------------------------------------------------'''
# ABAIXO MEU APP DASH
from distutils.log import debug
import dash
from dash import html, dcc
import plotly.express as px
import pandas as pd
from movimento_geral import df_dados_gerais
df_dados_gerais.groupby(['CODIGO']).sum().reset_index()
df_dados_gerais
app = dash.Dash(__name__)
fig = px.bar(df_dados_gerais, x='TOTAL_OPERACAO', y='DTREFERENCIA', color='DESCRICAO')
#--------------------------------------------------------------------------------------------
app.layout = html.Div(id='div1',
children=[
html.H1('Hello Dash', id='h1'),
html.Div('Dash: Um framework web para python'),
dcc.Graph(figure=fig, id='graph')
]
)
if __name__ == '__main__':
app.run_server(debug=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment