Last active
September 20, 2022 01:24
-
-
Save CoutinhoElias/3935f11f9ad3c5d4257d893d3de36760 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' 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