Skip to content

Latest commit

Β 

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Macaco

DependΓͺncias

Arquivos deste repositΓ³rio: structure.cpp, integration.cpp, checks_and_error_handling.py e macaco.py.

MΓ³dulos de C++(17): boost/python.hpp, iostream, vector e variant e stdlib.h.

MΓ³dulos de Python(3): matplotlib, tabulate, copy e functools.

Compile

g++ -fpic -c -o integration.o integration.cpp -std=c++17 -I/path/to/python/include -I/path/to/boost/include -L/path/to/python/lib -L/path/to/boost/lib

Exemplo:

-I/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/Headers

-I/usr/local/Cellar/boost/1.71.0/include/ 

-L/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/

-L/usr/local/Cellar/boost/1.71.0/lib/ 

g++ -o integration.so -shared integration.o -lboost_python37 -lpython3.7 -std=c++17

Instanciando um objeto da classe BananaFrame

import macaco as mc

# A partir de um arquivo csv
bf = mc.read_csv('iris.csv')

# A partir de um dicionΓ‘rio
bf = mc.BananaFrame({
    'City': ['Buenos Aires', 'Brasilia', 'Santiago', 'Bogota', 'Caracas'],
    'Country': ['Argentina', 'Brazil', 'Chile', 'Colombia', 'Venezuela'],
    'Latitude': [-34.58, -15.78, -33.45, 4.60, 10.48],
    'Longitude': [-58.66, -47.91, -70.66, -74.08, -66.86]
})

No alto nΓ­vel (Python) Γ© feito a checagem da consistΓͺncia do dicionΓ‘rio (consistΓͺncia de tipos, keys e tamanho de values. Caso haja inconsistΓͺncia, o devido erro Γ© acionado.

Obs: Tipos aceitos: string, float e int. Cada coluna sΓ³ pode haver um tipo de dado

VariΓ‘veis privadas sΓ£o criadas como o formato que o BananaFrame terΓ‘, os tipos, e um dicionΓ‘rios para traduzir o nome das colunas para o nΓΊmero da sua posiΓ§Γ£o (essa informaΓ§Γ£o Γ© passada para o baixo nΓ­vel para poder retornar uma determinada coluna).

MΓ©todos sΓ£o criados com os nomes das colunas para que possa utilizar como:

bf.City
╒══════════╀════════════╀══════════╀══════════╀════════╀═════════╕
β”‚ City(s): β”‚ Buenos Air β”‚ Brasilia β”‚ Santiago β”‚ Bogota β”‚ Caracas β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame.__serie

Finalmente Γ© instanciado e armazenado como atributo privado um objeto integration.BananaFrame. O objeto Γ© inicializado no baixo nΓ­vel (C++) com o tamanho do BananaFrame e os tipos das colunas.

Obs: Foram utilizadas as bibliotecas, em C++, <boost/python.hpp> para a conexΓ£o Python-C++ e <variant> para poder existir colunas de tipos diferentes em um BananaFrame.

Novamente em Python, o dicionΓ‘rio do parΓ’metro Γ© enviado coluna por coluna para o objeto integration.BananaFrame, onde cada um Γ© indexado e armazenado no baixo nΓ­vel.

Todas as colunas jΓ‘ estΓ£o automaticamente indexadas para melhor desempenho, como custo a ocupaΓ§Γ£o da estrutura na memΓ³ria Γ© triplicado.

A indexaΓ§Γ£o Γ© realizada armazenando um vetor ordenado com os valores da coluna, um vetor de inteiros para restaurar a posiΓ§Γ£o original destes valores e adicionando os dados para os vetores de linhas, que sΓ£o utilizados para retornar os dados do BananaFrame.

Obs: Foi cogitado utilizar Red Black Tree para indexar as colunas, mas a complexidade de uma slice (remover linhas do BananaFrame) Γ© O(nlogn) (buscar, no mΓ‘ximo, n linhas e remove-las (logn)), enquanto de um vetor ordenado a complexidade Γ© O(n) (armazenar, no mΓ‘ximo, n linhas que nΓ£o serΓ£o removidas)

MΓ©todos e atributos de um BananaFrame

- Vizualizar os dados:

# bf.display (n = 5, l = 10) -> no mΓ‘ximo n colunas e l caracteres por cΓ©lula
bf.display(3, 6) 
╒═════╀════════╀═══════════╀════════════╀═════════════╕
β”‚     β”‚ City   β”‚ Country   β”‚ Latitude   β”‚ Longitude   β”‚
β•žβ•β•β•β•β•β•ͺ════════β•ͺ═══════════β•ͺ════════════β•ͺ═════════════║
β”‚ 0   β”‚ Buenos β”‚ Argent    β”‚ -34.58     β”‚ -58.65      β”‚
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 1   β”‚ Brasil β”‚ Brazil    β”‚ -15.77     β”‚ -47.90      β”‚
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 2   β”‚ Santia β”‚ Chile     β”‚ -33.45     β”‚ -70.66      β”‚
β”œβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ ... β”‚ ...    β”‚ ...       β”‚ ...        β”‚ ...         β”‚
β•˜β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame
# bf.plot(xlabel, ylabel = False, sort = False, marker='o')
# -> se ylabel = False, utiliza os indexes no eixo y
# -> especificar qual eixo ordenar (0 ou 1) em 'sort
bf.plot('Country', 'Latitude', sort=1, marker='o')

GitHub Logo

bf.plot('Longitude', sort=0, marker='-')

GitHub Logo

- Atributos pΓΊblicos:

# Retorna formato do BananaFrame -> [axis0, axis1] (linhas, colunas)
bf.size 
[5, 4]
# Retorna os nomes das colunas
bf.column_names
['City', 'Country', 'Latitude', 'Longitude']
# Retorna os indexes
bf.indexes
[0, 1, 2, 3, 4]
# Retorna os tipos das colunas
bf.types
[str, str, float, float]
# bf.'nome_da_coluna' -> Retorna a coluna como uma serie (logo as series serΓ£o explicadas) 
serie = bf.City # Equivalente a bf['City']
print(serie)
╒══════════╀════════════╀══════════╀══════════╀════════╀═════════╕
β”‚ City(s): β”‚ Buenos Air β”‚ Brasilia β”‚ Santiago β”‚ Bogota β”‚ Caracas β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame.__serie
# Retorna uma cΓ³pia identica do BananaFrame
# AlteraΓ§Γ΅es na cΓ³pia ou no original nΓ£o afetarΓ‘ o outro objeto 
bf2 = bf.copy
bf2.display()
╒════╀════════════╀═══════════╀════════════╀═════════════╕
β”‚    β”‚ City       β”‚ Country   β”‚   Latitude β”‚   Longitude β”‚
β•žβ•β•β•β•β•ͺ════════════β•ͺ═══════════β•ͺ════════════β•ͺ═════════════║
β”‚  0 β”‚ Buenos Air β”‚ Argentina β”‚     -34.58 β”‚      -58.66 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  1 β”‚ Brasilia   β”‚ Brazil    β”‚     -15.78 β”‚      -47.91 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  2 β”‚ Santiago   β”‚ Chile     β”‚     -33.45 β”‚      -70.66 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  3 β”‚ Bogota     β”‚ Colombia  β”‚       4.6  β”‚      -74.08 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  4 β”‚ Caracas    β”‚ Venezuela β”‚      10.48 β”‚      -66.86 β”‚
β•˜β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame
 

- Operadores:

# Retorna uma lista com os valores de uma determinada linha
# key do tipo int
bf[0] # linha de index 0
['Buenos Aires', 'Argentina', -34.58000183105469, -58.65999984741211, 44]
# Equivalente a bf.Latitude
# key do tipo string
bf['Latitude']
╒══════════════╀════════╀════════╀════════╀═════╀═══════╕
β”‚ Latitude(s): β”‚ -34.58 β”‚ -15.78 β”‚ -33.45 β”‚ 4.6 β”‚ 10.48 β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•§β•β•β•β•β•β•β•β•›
 macaco.BananaFrame.__serie
# Retorna uma cΓ³pia do BananaFrame somentre com determindas linhas
# key do tipo lista de int
bf2 = bf[[0, 1, 4]]
bf2.display()
╒════╀════════════╀═══════════╀════════════╀═════════════╕
β”‚    β”‚ City       β”‚ Country   β”‚   Latitude β”‚   Longitude β”‚
β•žβ•β•β•β•β•ͺ════════════β•ͺ═══════════β•ͺ════════════β•ͺ═════════════║
β”‚  0 β”‚ Buenos Air β”‚ Argentina β”‚     -34.58 β”‚      -58.66 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  1 β”‚ Brasilia   β”‚ Brazil    β”‚     -15.78 β”‚      -47.91 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  2 β”‚ Caracas    β”‚ Venezuela β”‚      10.48 β”‚      -66.86 β”‚
β•˜β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame
# Equivalente a bf[[0, 2]], mas Γ© retornado a intercessΓ£o das listas
# key do tipo list de lists de int
bf2 = bf[[0, 2, 4], [0, 1, 2], [0, 2, 3, 4]]
bf2.display()
╒════╀════════════╀═══════════╀════════════╀═════════════╕
β”‚    β”‚ City       β”‚ Country   β”‚   Latitude β”‚   Longitude β”‚
β•žβ•β•β•β•β•ͺ════════════β•ͺ═══════════β•ͺ════════════β•ͺ═════════════║
β”‚  0 β”‚ Buenos Air β”‚ Argentina β”‚     -34.58 β”‚      -58.66 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  1 β”‚ Santiago   β”‚ Chile     β”‚     -33.45 β”‚      -70.66 β”‚
β•˜β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame
# Retorna a quantidade de colunas (axis1)
len(bf)
4
# quivalente a bf.display(5, 10)
bf  # ou print(bf)
╒════╀════════════╀═══════════╀════════════╀═════════════╕
β”‚    β”‚ City       β”‚ Country   β”‚   Latitude β”‚   Longitude β”‚
β•žβ•β•β•β•β•ͺ════════════β•ͺ═══════════β•ͺ════════════β•ͺ═════════════║
β”‚  0 β”‚ Buenos Air β”‚ Argentina β”‚     -34.58 β”‚      -58.66 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  1 β”‚ Brasilia   β”‚ Brazil    β”‚     -15.78 β”‚      -47.91 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  2 β”‚ Santiago   β”‚ Chile     β”‚     -33.45 β”‚      -70.66 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  3 β”‚ Bogota     β”‚ Colombia  β”‚       4.6  β”‚      -74.08 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  4 β”‚ Caracas    β”‚ Venezuela β”‚      10.48 β”‚      -66.86 β”‚
β•˜β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame
# Iterar sobre um bf retorna as series (colunas)
for serie in bf:
    print(serie)
╒══════════╀════════════╀══════════╀══════════╀════════╀═════════╕
β”‚ City(s): β”‚ Buenos Air β”‚ Brasilia β”‚ Santiago β”‚ Bogota β”‚ Caracas β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame.__serie

╒═════════════╀═══════════╀════════╀═══════╀══════════╀═══════════╕
β”‚ Country(s): β”‚ Argentina β”‚ Brazil β”‚ Chile β”‚ Colombia β”‚ Venezuela β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame.__serie

╒══════════════╀════════╀════════╀════════╀═════╀═══════╕
β”‚ Latitude(s): β”‚ -34.58 β”‚ -15.78 β”‚ -33.45 β”‚ 4.6 β”‚ 10.48 β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•§β•β•β•β•β•β•β•β•›
 macaco.BananaFrame.__serie

╒═══════════════╀════════╀════════╀════════╀════════╀════════╕
β”‚ Longitude(s): β”‚ -58.66 β”‚ -47.91 β”‚ -70.66 β”‚ -74.08 β”‚ -66.86 β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame.__serie
# Checa se alguma coluna possui o nome dado
'City' in bf
True

- MΓ©todos pΓΊblicos:

# Adicionar colunas a patir de um dicionΓ‘rio
dic = {'PopulationSize':[44, 209, 18, 49, 32]}
bf.add_columns(dic)
bf
╒════╀════════════╀═══════════╀════════════╀═════════════╀══════════════════╕
β”‚    β”‚ City       β”‚ Country   β”‚   Latitude β”‚   Longitude β”‚   PopulationSize β”‚
β•žβ•β•β•β•β•ͺ════════════β•ͺ═══════════β•ͺ════════════β•ͺ═════════════β•ͺ══════════════════║
β”‚  0 β”‚ Buenos Air β”‚ Argentina β”‚     -34.58 β”‚      -58.66 β”‚               44 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  1 β”‚ Brasilia   β”‚ Brazil    β”‚     -15.78 β”‚      -47.91 β”‚              209 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  2 β”‚ Santiago   β”‚ Chile     β”‚     -33.45 β”‚      -70.66 β”‚               18 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  3 β”‚ Bogota     β”‚ Colombia  β”‚       4.6  β”‚      -74.08 β”‚               49 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  4 β”‚ Caracas    β”‚ Venezuela β”‚      10.48 β”‚      -66.86 β”‚               32 β”‚
β•˜β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame
# Retorna a coluna como uma lista (nΓ£o serie)
bf.take_column('Country')
['Argentina', 'Brazil', 'Chile', 'Colombia', 'Venezuela']
# Equivalente a bf['PopulationSize']
serie = bf.column('PopulationSize')
print(serie)
╒════════════════════╀════╀═════╀════╀════╀════╕
β”‚ PopulationSize(s): β”‚ 44 β”‚ 209 β”‚ 18 β”‚ 49 β”‚ 32 β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•§β•β•β•β•β•β•§β•β•β•β•β•§β•β•β•β•β•§β•β•β•β•β•›
 macaco.BananaFrame.__serie
# Equivalente a bf[1]
bf.row(1) # linha de index 0
['Brasilia', 'Brazil', -15.779999732971191, -47.90999984741211, 209]
# Equivalente a bf[[1,2,3]]
bf2 = bf.slices([1,2,3])
bf2
╒════╀══════════╀═══════════╀════════════╀═════════════╀══════════════════╕
β”‚    β”‚ City     β”‚ Country   β”‚   Latitude β”‚   Longitude β”‚   PopulationSize β”‚
β•žβ•β•β•β•β•ͺ══════════β•ͺ═══════════β•ͺ════════════β•ͺ═════════════β•ͺ══════════════════║
β”‚  0 β”‚ Brasilia β”‚ Brazil    β”‚     -15.78 β”‚      -47.91 β”‚              209 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  1 β”‚ Santiago β”‚ Chile     β”‚     -33.45 β”‚      -70.66 β”‚               18 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  2 β”‚ Bogota   β”‚ Colombia  β”‚       4.6  β”‚      -74.08 β”‚               49 β”‚
β•˜β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame
# Equivalente a bf = bf.slices([0,1,3,4]), o objeto Γ© alterado
bf.cut([0,1,3,4])
bf
╒════╀════════════╀═══════════╀════════════╀═════════════╀══════════════════╕
β”‚    β”‚ City       β”‚ Country   β”‚   Latitude β”‚   Longitude β”‚   PopulationSize β”‚
β•žβ•β•β•β•β•ͺ════════════β•ͺ═══════════β•ͺ════════════β•ͺ═════════════β•ͺ══════════════════║
β”‚  0 β”‚ Buenos Air β”‚ Argentina β”‚     -34.58 β”‚      -58.66 β”‚               44 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  1 β”‚ Brasilia   β”‚ Brazil    β”‚     -15.78 β”‚      -47.91 β”‚              209 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  2 β”‚ Bogota     β”‚ Colombia  β”‚       4.6  β”‚      -74.08 β”‚               49 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  3 β”‚ Caracas    β”‚ Venezuela β”‚      10.48 β”‚      -66.86 β”‚               32 β”‚
β•˜β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame

- Buscas

Complexidades: O(logn) (busca binΓ‘ria no vetor ordenado)

# Dado o nome de uma coluna e uma key (do tipo dos dados da coluna), 
# Γ© retornado uma lista com os Γ­ndices de todas as linhas em que
# o valor naquela coluna Γ© igual a key.
bf.query('Latitude', -15.78)
[1]
# Dado o nome de uma coluna, um min e um max (estes do tipo dos dados da coluna), 
# Γ© retornado uma  lista com os Γ­ndices de todas as linhas em que
# o valor naquela coluna Γ© igual ou estΓ‘ entre o min e o max dados
bf.between('Longitude', -74.08, -58.66)
[0, 2, 3]

Series

Serie Γ© uma classe interna do BananaFrame, tal possui seus prΓ³prios atributos, mΓ©todos e operadores.

# Objeto da classe serie
serie = bf.Latitude
print(serie)
╒══════════════╀════════╀════════╀═════╀═══════╕
β”‚ Latitude(s): β”‚ -34.58 β”‚ -15.78 β”‚ 4.6 β”‚ 10.48 β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•§β•β•β•β•β•β•β•β•›
 macaco.BananaFrame.__serie

- Atributos e mΓ©todos pΓΊblicos:

# Retorna o nome da serie
serie.name
'Latitude'
# Tamanho
serie.size
4
# Lista com o valores da serie
serie.values
[-34.58, -15.78, 4.6, 10.48]
# serie.display (n = 5, l = 10) -> no mΓ‘ximo n colunas e l caracteres por cΓ©lula
bf.display(3, 6) 
╒══════════════╀════════╀════════╀═════╀═════╕
β”‚ Latitude(s): β”‚ -34.58 β”‚ -15.78 β”‚ 4.6 β”‚ ... β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•§β•β•β•β•β•β•›
 macaco.BananaFrame.__serie

- Operadores:

# Equivalente a serie.size
len(serie)
4
# Equivalente a serie.display()
serie # ou print(serie)
╒══════════════╀════════╀════════╀═════╀═══════╕
β”‚ Latitude(s): β”‚ -34.58 β”‚ -15.78 β”‚ 4.6 β”‚ 10.48 β”‚
β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•§β•β•β•β•β•β•β•β•›
 macaco.BananaFrame.__serie
# Retorna se o valor faz parte da serie
4.6 in serie
True
# Iterar sobre a serie retorna os valores
for value in serie:
    print(value)
-34.58
-15.78
4.6
10.48
# Equivalente a bf.query(serie.name, key), key = 4.6
serie == 4.6
[2]
# Equivalente a bf.between('Longitude', min, max), min, max = (-15.78, 4.6)
serie >> (-15.78, 4.6)
[1, 2]

ConclusΓ£o

Misturando os operadores de um BananaFrame e de suas series Γ© possΓ­vel:

# Uma ou mais query de forma elegante
bf[bf.Latitude == -33.45, 
   bf.Longitude >> (-71.0, 0.0),
   bf.Country == 'Chile']
╒════╀══════════╀═══════════╀════════════╀═════════════╕
β”‚    β”‚ City     β”‚ Country   β”‚   Latitude β”‚   Longitude β”‚
β•žβ•β•β•β•β•ͺ══════════β•ͺ═══════════β•ͺ════════════β•ͺ═════════════║
β”‚  0 β”‚ Santiago β”‚ Chile     β”‚     -33.45 β”‚      -70.66 β”‚
β•˜β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame

# Busca geometrica
bf[bf.Latitude >> (-15.78, 10.0), 
   bf.Longitude >> (-80.0, 0.0)]
╒════╀══════════╀═══════════╀════════════╀═════════════╕
β”‚    β”‚ City     β”‚ Country   β”‚   Latitude β”‚   Longitude β”‚
β•žβ•β•β•β•β•ͺ══════════β•ͺ═══════════β•ͺ════════════β•ͺ═════════════║
β”‚  0 β”‚ Brasilia β”‚ Brazil    β”‚     -15.78 β”‚      -47.91 β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  1 β”‚ Bogota   β”‚ Colombia  β”‚       4.6  β”‚      -74.08 β”‚
β•˜β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•§β•β•β•β•β•β•β•β•β•β•β•β•β•β•›
 macaco.BananaFrame

Feito por William Sena como trabalho do curso Estrutura de Dados e Algoritmos do Mestrado EMAp/FGV com o professor Jorge Poco

About

BananaFrames : Estrutura de dados utilizada para armazenar dados em tabelas com linhas e colunas. Destinado principalmente para um alto desempenho no acesso aos dados. Implementado em C++ e destinado para Python.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages