Aufgabe
TatsĂ€chlich ist die Aufgabe, ĂŒber die ich sprechen möchte, in ihrem Wortlaut einfach zu verdunkeln: Es war notwendig, die Verkaufsdaten der E-Commerce-Abteilung mit wenig Blut zu visualisieren, d. H. Fast umsonst zu lesen.
Was ist damit gemeint? Die Körbe unserer GeschĂ€fte generieren einen konstanten Datenstrom ĂŒber Online-VerkĂ€ufe in verschiedenen Regionen der Welt mit allen Konsequenzen: verschiedene WĂ€hrungen, Zeitzonen, Steuern, Kundentypen, Artikeltypen, Bestellungen usw. In der Tat wird das gleiche von jedem Online-Shop generiert, nur vielleicht unterscheiden sich die Optionen fĂŒr die Parameter von Bestellungen geringfĂŒgig.
In diesem Stream muss ein bestimmtes aggregiertes Dashboard erstellt werden, in dem das Unternehmen Online-SchlĂŒsselindikatoren fĂŒr den aktuellen Moment und fĂŒr lange ZeitrĂ€ume online (oder besser gesagt regelmĂ€Ăig) anzeigen kann. DarĂŒber hinaus ist es wĂŒnschenswert, dass diese Dashboards in unterschiedlichem Detaillierungsgrad und Spezialisierung etwas unterschiedlich waren.
Suche nach einer Lösung
ZunÀchst suchten wir nach einer vorgefertigten Lösung. Wir haben uns Datenvisualisierer wie beispielsweise Owox, BI-Lösungen von Microsoft, einige Unternehmenslösungen usw. angesehen.
All dies wird durch Werbung groĂartig bedient. Aber:
- nicht billig
- eine Sache fĂŒr sich (es ist nicht so einfach, die Mechanismen der Datenverarbeitung zu steuern, und manchmal muss man sich nur auf die Kompetenzen der Datenwissenschaftler des Entwicklungsunternehmens verlassen)
Zu diesem Zeitpunkt (2019) hatte ich bereits eine kleine Projektion zur Visualisierung von Taschendaten in Google Datastudio, die bereits seit mindestens einem Jahr existiert und darauf zurĂŒckzufĂŒhren ist, dass ich den Bericht manuell von 1C heruntergeladen und in die Google Storage Cloud hochgeladen habe (nicht zu verwechseln) GoogleDrive), von dort - zur BigQuery-Tabelle, und dann habe ich in DataStudio Daten-Slices und alles andere erstellt.
â , , , , .
, , , , . Data Studio , BigQuery , , , , .
, , SQL BigQuery, , .
BigQuery (https://console.cloud.google.com/bigquery), , .
, : 300 . , 2 BigQuery, , .
. , , BigQuery , , . , !
, SELECT, , BQ.
, BQ , . , , , .
: SQL ==> Python ==> BigQuery.
, â .
, SELECT csv- GoogleStorage BQ , Google Functions, Python ( ) . , 6 ( ) .
, ?
, , , SQL . , Orders, , , , , , , id, id .. , , .
, , SELECT pandas dataframe. :
import pandas as pd
import MySQLdb
import MySQLdb.cursors
def sql_query(date0, date1):
connection = MySQLdb.connect(host=âserverâ, user=âuserâ, passwd=âpassâ, db=âordersâ, charset=âcp1251â, cursorclass = MySQLdb.cursors.SSCursor)
query = âSELECT * FROM orders WHERE date>=ââ+date0+ââ and date<ââ+date1+ââ â
data = pd.read_sql_query(query, connection=connection)
data.payment_date = data.payment_date.apply(lambda x: x.tz_localize(âEurope/Moscowâ)).astype(str)
return data
, 5- , (90 , .. ) , sql_query(date) , BQ.
, , pandas dataframe .
: , BQ MERGE . BQ 1-2 . 20 70 , STRING FLOAT. 70000 .
, . BQ, .
from google.cloud import bigquery
from google.oauth2 import service_account
project_id = âMyBQprojectâ
dataset_id = âMyDataSetâ
credentials = service_account.Credentials.from_service_account_file(âacc.jsonâ)
client = bigquery.Client(project_id, credentials=credentials)
def upload_temp_table(df, table_id, schema):
job_config = bigquery.LoadJobConfig()
job_config.schema = schema
job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE
job = client.load_table_from_dataframe(df, table_id, job_config=job_config)
job.result()
def merge_tables(temp_table, base_table, schema, head, merge_param):
merge_query = âMERGE into â+base_table+â as T USING â+temp_table+â as S \
ON T.â+merge_param+â = S.â+merge_param+ \
â WHEN MATCHED then UPDATE SET â+ \
â,â.join([âT.â+item+â=S.â+item for item in head])+ \
â WHEN NOT MATCHED then INSERT \
(â+â,â.join(head)+â) VALUES (â+â,â.join([âS.â+item for item in head])+â);â
job_config = bigquery.LoadJobConfig()
job_config.schema = schema
job = client.query(merge_query, job_config=job_config)
job.result()
, â .
import datetime
for period in range(18):
date0 = (datetime.datetime.now() - datetime.timedelta(days = period*5 + 5)).strftime(â%Y%m%dâ)
date1 = (datetime.datetime.now() - datetime.timedelta(days = period*5)).strftime(â%Y%m%dâ)
df = sql_query(date0,date1)
upload_temp_table(df=df, table_id=âtemp_tableâ, schema)
merge_tables(temp_table=âtemp_tableâ, base_table = âordersâ, schema=schema, head=[,,,], merge_param=âidâ)
head â . . SQL , . MERGE- . BQ . - , Python , BQ.
.
import sys
log_file = open(âlog.txtâ, âaâ)
old_stdout = sys.stdout
sys.stdout = log_file
, print
:
sys.stdout = old_stdout
log_file.close()
print -. , .
, BigQuery , DataStudio (https://datastudio.google.com/) .
, DataStudio , BigQuery Python. , , , apply.
, DataStudio (, ), , , , Datastudio .
, Datastudio Blended Tables, LEFT JOIN - . , , , BigQuery. , , , SQL-, BigQuery . , , 6 , , 6 . 20 70 3-4 BigQuery. .
, . , . - BigQuery, - Python. , merge_tables â BQ . , .. â . , .
, BigQuery , Google Spreadsheets. - id . :
- Python pandas dataframe
- BQ JOIN BQ (-, ).
, . - , , , .
. - -, . , , ( , F5). : Data Studio Auto-Refresh. : , View, Data Studio Auto-Refresh, , SQL=>BQ.
, , , :-)