Boa tarde, queridos leitores! O material é de natureza teórica e é dirigido exclusivamente a analistas novatos que encontraram pela primeira vez a análise de BI.
O que é tradicionalmente entendido por este conceito? Em termos simples, trata-se de um sistema complexo (como, por exemplo, o orçamento) de coleta, processamento e análise de dados, apresentando os resultados finais na forma de gráficos, quadros, tabelas.
Isso requer o trabalho bem coordenado de vários especialistas ao mesmo tempo. O engenheiro de dados é responsável pelos processos de armazenamento e ETL / ELT, o analista de dados auxilia no preenchimento do banco de dados, o analista de BI desenvolve dashboards, o analista de negócios simplifica a comunicação com os clientes do relatório. Mas essa opção só é possível se a empresa estiver disposta a pagar pelo trabalho da equipe. Na maioria dos casos, as pequenas empresas contam com uma pessoa para minimizar os custos, que muitas vezes não tem uma visão ampla no campo de BI, mas tem apenas um familiarizado com a plataforma de relatórios.
Nesse caso, acontece o seguinte: a coleta, o processamento e a análise dos dados ocorrem pelas forças de uma única ferramenta - a própria plataforma de BI. Nesse caso, os dados não são eliminados preliminarmente de nenhuma forma, não passam pelos compostos. A coleta de informações vem de fontes primárias sem a participação de um armazenamento intermediário. Os resultados dessa abordagem podem ser facilmente vistos em fóruns temáticos. Se você tentar resumir todas as perguntas sobre ferramentas de BI, o seguinte provavelmente cairá entre as 3 principais: como carregar dados mal estruturados no sistema, como calcular as métricas necessárias a partir deles, o que fazer se o relatório estiver sendo executado muito devagar. Surpreendentemente, nesses fóruns você dificilmente encontrará qualquer discussão sobre ferramentas ETL, experiências de data warehouse, melhores práticas de programação e consultas SQL. Além disso, tenho repetidamente encontrado o fatoque experientes analistas de BI não falaram de forma lisonjeira sobre o uso de R / Python / Scala, citando o fato de que todos os problemas só podem ser resolvidos por meio da plataforma de BI. Ao mesmo tempo, todos entendem que a engenharia de data competente permite que você feche muitos problemas ao construir relatórios de BI.
-. , . -, , , -, .
«Data – BI» . . (-) (csv, txt, xlsx . .).
. . , . , , . BI .
. (, 1). , . ( , , . .). BI-, . .
«Data – DB – BI» , , . , , .
. , . . SQL ( ), BI-. .
. , . . . SQL.
«Data – ETL – DB – BI» . ETL- , R/Python/Scala . . . .
. , . . BI-.
. ETL- SQL. . , .
. «» SQLite. , (). E-Commerce Data Kaggle.
#
import pandas as pd
#
pd.set_option('display.max_columns', 10)
pd.set_option('display.expand_frame_repr', False)
path_dataset = 'dataset/ecommerce_data.csv'
#
def func_main(path_dataset: str):
#
df = pd.read_csv(path_dataset, sep=',')
#
list_col = list(map(str.lower, df.columns))
df.columns = list_col
# -
df['invoicedate'] = df['invoicedate'].apply(lambda x: x.split(' ')[0])
df['invoicedate'] = pd.to_datetime(df['invoicedate'], format='%m/%d/%Y')
#
df['amount'] = df['quantity'] * df['unitprice']
#
df_result = df.drop(['invoiceno', 'quantity', 'unitprice', 'customerid'], axis=1)
#
df_result = df_result[['invoicedate', 'country', 'stockcode', 'description', 'amount']]
return df_result
#
def func_sale():
tbl = func_main(path_dataset)
df_sale = tbl.groupby(['invoicedate', 'country', 'stockcode'])['amount'].sum().reset_index()
return df_sale
#
def func_country():
tbl = func_main(path_dataset)
df_country = pd.DataFrame(sorted(pd.unique(tbl['country'])), columns=['country'])
return df_country
#
def func_product():
tbl = func_main(path_dataset)
df_product = tbl[['stockcode','description']].\
drop_duplicates(subset=['stockcode'], keep='first').reset_index(drop=True)
return df_product
Extract Transform. , . . , , .
#
import pandas as pd
import sqlite3 as sq
from etl1 import func_country,func_product,func_sale
con = sq.connect('sale.db')
cur = con.cursor()
##
# cur.executescript('''DROP TABLE IF EXISTS country;
# CREATE TABLE IF NOT EXISTS country (
# country_id INTEGER PRIMARY KEY AUTOINCREMENT,
# country TEXT NOT NULL UNIQUE);''')
# func_country().to_sql('country',con,index=False,if_exists='append')
##
# cur.executescript('''DROP TABLE IF EXISTS product;
# CREATE TABLE IF NOT EXISTS product (
# product_id INTEGER PRIMARY KEY AUTOINCREMENT,
# stockcode TEXT NOT NULL UNIQUE,
# description TEXT);''')
# func_product().to_sql('product',con,index=False,if_exists='append')
## ()
# cur.executescript('''DROP TABLE IF EXISTS sale;
# CREATE TABLE IF NOT EXISTS sale (
# sale_id INTEGER PRIMARY KEY AUTOINCREMENT,
# invoicedate TEXT NOT NULL,
# country_id INTEGER NOT NULL,
# product_id INTEGER NOT NULL,
# amount REAL NOT NULL,
# FOREIGN KEY(country_id) REFERENCES country(country_id),
# FOREIGN KEY(product_id) REFERENCES product(product_id));''')
## ()
# cur.executescript('''DROP TABLE IF EXISTS sale_data_lake;
# CREATE TABLE IF NOT EXISTS sale_data_lake (
# sale_id INTEGER PRIMARY KEY AUTOINCREMENT,
# invoicedate TEXT NOT NULL,
# country TEXT NOT NULL,
# stockcode TEXT NOT NULL,
# amount REAL NOT NULL);''')
# func_sale().to_sql('sale_data_lake',con,index=False,if_exists='append')
## (sale_data_lake) (sale)
# cur.executescript('''INSERT INTO sale (invoicedate, country_id, product_id, amount)
# SELECT sdl.invoicedate, c.country_id, pr.product_id, sdl.amount
# FROM sale_data_lake as sdl LEFT JOIN country as c ON sdl.country = c.country
# LEFT JOIN product as pr ON sdl.stockcode = pr.stockcode
# ''')
##
# cur.executescript('''DELETE FROM sale_data_lake''')
def select(sql):
return pd.read_sql(sql,con)
sql = '''select *
from (select s.invoicedate,
c.country,
pr.description,
round(s.amount,1) as amount
from sale as s left join country as c on s.country_id = c.country_id
left join product as pr on s.product_id = pr.product_id)'''
print(select(sql))
cur.close()
con.close()
(Load) . . . , . .
SQL, . , BI-.
BI- SQLite Python.
import pandas as pd
import sqlite3 as sq
con = sq.connect('C:/Users/Pavel/PycharmProjects/test/sale.db')
cur = con.cursor()
def select(sql):
return pd.read_sql(sql,con)
sql = '''select *
from (select s.invoicedate,
c.country,
pr.description,
replace(round(s.amount,1),'.',',') as amount
from sale as s left join country as c on s.country_id = c.country_id
left join product as pr on s.product_id = pr.product_id)'''
tbl = select(sql)
print(tbl)
.
«Data – Workflow management platform + ETL – DB – BI» . .
. . .
. . BI. .
«Data – Workflow management platform + ELT – Data Lake – Workflow management platform + ETL – DB – BI» , : (Data Lake), (DB), .
. . , Data Lake.
. . Data Lake – , .
.
BI- .
BI , .
, SQL, - , , , .
Isso é tudo. Toda saúde, boa sorte e sucesso profissional!