A fim de testar a capacidade do dBASE II para o MSX, iremos utilizar uma base de dados grandes, obtida do repositório de dados da UCI [1]. Trata-se de dados de transações de vendas online de uma loja do reino unido, ocorridas entre 1/12/2010 e 9/12/2011.
Os campos da tabela são os seguintes:
A tabela possui 541909 registros (linhas) e o arquivo 23 MB. O dBASE II possui um limite de 65535 registros. Exite ainda outra limitação para o MSX que é o tamanho do disquete, que é de 720 Kb, onde este ainda deve possuir o MSX-DOS e os arquivos do dBASE.
Esta tabela foi otimizada para análise e data science. Ela foi desnormalizada e possui uma série de replicações, como por exemplo, o nome dos produtos. Para uma venda, é necessário somente o código do produto e não sua descrição.
O primeiro passo é desmembrar a tabela em duas: produto e venda.
A tabela produto irá ter os valores únicos de código com sua respectiva descrição. Os campos são:
A tabela venda terá o campo "Description" removido, o campo "InvoiceDate" desmembrado em dois novos campos: "Date" e "Hour".
Foram removidos desta tabela as vendas canceladas (InvoiceNo começando com "C") e também os valores faltantes e atípicos. Com isso tudo, reduzimos bastante o tamanho da tabela. Entretanto, para caber em um disquete do MSX, selecionamos apenas as vendas do dia 1/12/2010 a 5/12/2010. O arquivo final ficou com 5045 registros e 331 KB.
Os arquivos no formato CSV foram convertidos para DBF através da ferramenta JavaScript dBASE II.
Tabela produto:
. use produto . display structure Estrutura para o arquivo :PRODUTO .DBF Número de registros :03916 Data da última atualização :09/02/24 Uso primário do banco de dados. Cpo Nome Tipo Tam. Dec. 001 STOCKCODE C 012 002 DESCRIPTIO C 035 ** TOTAL ** 00048
Tabela venda:
. use b:venda . display structure Estrutura para o arquivo :VENDA .DBF Número de registros :05045 Data da última atualização :09/02/24 Uso primário do banco de dados. Cpo Nome Tipo Tam. Dec. 001 INVOICENO C 006 002 STOCKCODE C 012 003 QUANTITY N 004 004 UNITPRICE N 006 002 005 CUSTOMERID C 005 006 COUNTRY C 015 007 DATE C 010 008 HOUR C 008 ** TOTAL ** 00067
Download:
Tabelas produto e venda: base_vendas.zip
Por maior que seja a tabela, ela não é carregada toda na memória do MSX. São carregados blocos de registros na memória, conforme a necessidade. O cabeçalho do arquivo DBF contém todas as informações necessárias para se obter um determinado registro diretamente no arquivo. Por isso é que podemos ter um arquivo DBF tão grande para os padrões do MSX.
O teste a seguir irá listar as cinco primeiras linhas da tabela venda e a última linha.
. use venda . display next 5 00001 536365 85123A 6 2.55 17850 United Kingdom 2010-12-01 08:26:00 00002 536365 71053 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 00003 536365 84406B 8 2.75 17850 United Kingdom 2010-12-01 08:26:00 00004 536365 84029G 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 00005 536365 84029E 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 . go bottom . display 05045 537036 85135C 1 7.95 15545 United Kingdom 2010-12-03 17:28:00
Agora vamos comparar com a listagem do arquivo CVS correspondente no PC:
InvoiceNo StockCode Quantity UnitPrice CustomerID Country Date Hour 0 536365 85123A 6 2.55 17850 United Kingdom 2010-12-01 08:26:00 1 536365 71053 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 2 536365 84406B 8 2.75 17850 United Kingdom 2010-12-01 08:26:00 3 536365 84029G 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 4 536365 84029E 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 ... ... ... ... ... ... ... ... ... 5040 537036 84879 8 1.69 15545 United Kingdom 2010-12-03 17:28:00 5041 537036 22943 1 4.95 15545 United Kingdom 2010-12-03 17:28:00 5042 537036 22837 5 4.65 15545 United Kingdom 2010-12-03 17:28:00 5043 537036 35004C 1 5.45 15545 United Kingdom 2010-12-03 17:28:00 5044 537036 85135C 1 7.95 15545 United Kingdom 2010-12-03 17:28:00
Uma venda é composta de diversos itens que o cliente compra. Cada item pode ter n unidades. Cada venda é identificada com um InvoiceNo único.
Um bom teste é ver se o dBASE II do MSX é capaz de retornar corretamente todos os itens de uma compra.
. display for InvoiceNo="536365" 00001 536365 85123A 6 2.55 17850 United Kingdom 2010-12-01 08:26:00 00002 536365 71053 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 00003 536365 84406B 8 2.75 17850 United Kingdom 2010-12-01 08:26:00 00004 536365 84029G 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 00005 536365 84029E 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 00006 536365 22752 2 7.65 17850 United Kingdom 2010-12-01 08:26:00 00007 536365 21730 6 4.25 17850 United Kingdom 2010-12-01 08:26:00
O resultado no PC:
InvoiceNo StockCode Quantity UnitPrice CustomerID Country Date Hour 0 536365 85123A 6 2.55 17850 United Kingdom 2010-12-01 08:26:00 1 536365 71053 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 2 536365 84406B 8 2.75 17850 United Kingdom 2010-12-01 08:26:00 3 536365 84029G 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 4 536365 84029E 6 3.39 17850 United Kingdom 2010-12-01 08:26:00 5 536365 22752 2 7.65 17850 United Kingdom 2010-12-01 08:26:00 6 536365 21730 6 4.25 17850 United Kingdom 2010-12-01 08:26:00
Vamos calcular agora o total de cada item.
. display Quantity * UnitPrice for InvoiceNo="536365" 00001 15.30 00002 20.34 00003 22.00 00004 20.34 00005 20.34 00006 15.30 00007 25.50
No PC:
0 15.30 1 20.34 2 22.00 3 20.34 4 20.34 5 15.30 6 25.50
Por fim, vamos calcular o total da venda.
. sum Quantity * UnitPrice for InvoiceNo="536365" 139.12
No PC:
139.12
1. Calcular o total de vendas para franceses durante o período avaliado.
. sum Quantity * UnitPrice for Country="France" 1281.24
2. Calcular o total de vendas para cada país
. copy to tabpais field Quantity,UnitPrice,Country . use tabpais . copy structure to tabpais2
Edita a nova tabela:
. use tabpais2 . modify structure Nome Tip.Tam. Dec Campo 01 :QUANTITY N 004 000 Campo 02 :UNITPRICE N 006 002 Campo 03 :COUNTRY C 015 000 Campo 04 :TOTAL N 010 002
. append from tabpais . replace all total with Quantity * UnitPrice . index on Country to idxcou . total on Country to tabtotal field total . use tabtotal . display all 00001 6 8.50 Australia 358.25 00002 12 2.10 Belgium 346.10 00003 4 9.95 EIRE 2605.73 00004 24 3.75 France 1281.24 00005 6 2.95 Germany 972.36 00006 12 1.25 Italy 427.80 00007 96 1.85 Netherlands 192.60 00008 50 0.42 Norway 1919.14 00009 32 2.55 Poland 248.16 00010 6 2.95 Portugal 131.80 00011 70 1.65 Spain 620.00 00012 30 2.95 Switzerland 303.40 00013 6 2.55 United Kingdom 108208.15
No PC:
Country Total Australia 358.25 Belgium 346.10 EIRE 2605.73 France 1281.24 Germany 972.36 Italy 427.80 Netherlands 192.60 Norway 1919.14 Poland 248.16 Portugal 131.80 Spain 620.00 Switzerland 303.40 United Kingdom 108208.15
O dBASE II mostrou-se bastante robusto para o processamento de dados no arquivo testado. Entretanto, cada operação leva bastante tempo para ser completada. Os testes foram feitos em um emulador com velocidade aumentada em 5X.
Para análises mais detalhadas, à vezes são necessários diversos passos, como no exercício 2. Além disso, no exercício foi necessário mover os arquivos temporários para um outro disco, devido ao fato de encher o disco em uso.
Há uma outra opção para análises que é através do modo programado, que será visto em outro curso. No modo programado, podemos calcular média, valor mínimo, valor máximo etc.
Referências:
[1]- Chen,Daqing. (2015). Online Retail. UCI Machine Learning Repository. Em: https://archive.ics.uci.edu/dataset/352/online+retail.
<< Anterior | dBASE II | Próxima >> |