Premiers pas dans l'analyse BI. Rôle de l'ingénierie des données

Bonjour, chers lecteurs! Le matériel est de nature théorique et s'adresse exclusivement aux analystes novices qui ont d'abord rencontré l'analyse BI.





Qu'entend-on traditionnellement par ce concept? En termes simples, il s'agit d'un système complexe (comme, par exemple, la budgétisation) pour collecter, traiter et analyser des données, présentant les résultats finaux sous forme de graphiques, de graphiques, de tableaux.





Cela nécessite le travail bien coordonné de plusieurs spécialistes à la fois. L'ingénieur de données est responsable du stockage et des processus ETL / ELT, l'analyste de données aide au remplissage de la base de données, l'analyste BI développe des tableaux de bord, l'analyste commercial simplifie la communication avec les clients du rapport. Mais cette option n'est possible que si l'entreprise est prête à payer le travail de l'équipe. Dans la plupart des cas, les petites entreprises comptent sur une seule personne pour minimiser les coûts, qui n'a souvent pas du tout une vision globale du domaine de la BI, mais qui ne connaît que la plate-forme de reporting.





Dans ce cas, ce qui suit se produit: la collecte, le traitement et l'analyse des données se font sous l'action d'un seul outil - la plateforme de BI elle-même. Dans ce cas, les données ne sont en aucun cas effacées au préalable, ne passent pas par les composites. La collecte d'informations provient de sources primaires sans la participation d'un stockage intermédiaire. Les résultats de cette approche sont facilement visibles sur les forums thématiques. Si vous essayez de résumer toutes les questions concernant les outils de BI, alors les suivantes tomberont probablement dans le top 3: comment charger des données mal structurées dans le système, comment calculer les métriques requises à partir d'elles, que faire si le rapport est en cours d'exécution très lentement. Étonnamment, dans ces forums, vous ne trouverez pratiquement aucune discussion sur les outils ETL, les expériences d'entrepôt de données, les meilleures pratiques de programmation et les requêtes SQL. De plus, j'ai rencontré à plusieurs reprises le faitque les analystes BI expérimentés n'ont pas parlé de manière très flatteuse de l'utilisation de R / Python / Scala, citant le fait que tous les problèmes ne peuvent être résolus qu'au moyen de la plateforme de BI. En même temps, tout le monde comprend qu'une ingénierie de date compétente vous permet de résoudre de nombreux problèmes lors de la création de rapports 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, - , , , .





C'est tout. Toute la santé, bonne chance et réussite professionnelle!








All Articles