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.
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
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)
# 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')bf.plot('Longitude', sort=0, marker='-')# 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
# 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 bfTrue
# 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
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]
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
# Retorna o nome da serie
serie.name'Latitude'
# Tamanho
serie.size4
# 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
# 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 serieTrue
# 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]
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