Skip to main content

A Python library to simplify Hasura, GraphQL and Machine Learning

Project description

PyHasura

A library for conveniently working with Hasura, GraphQL, File Formats, and some basic Machine Learning.

Getting Started

HasuraClient

# Create Hasura Client
import os
from dotenv import load_dotenv
from pyhasura import gql_client, HasuraClient, ExportFormat
from pprint import pprint

load_dotenv()  # Load environment variables from .env

hasura_client = HasuraClient(uri=os.environ.get("HASURA_URI"), admin_secret=os.environ.get("HASURA_ADMIN_SECRET"))

Query for a Result

result = hasura_client.execute("""
        query findCarts {
            carts {
                is_complete
                cart_items {
                    quantity
                    product {
                        price
                    }
                }
            }
            cart_items {
                id
            }
        }
    """)

pprint(result)

Convert Results to a Dictionary of Alternate Formats

result = hasura_client.convert_output_format(ExportFormat.ARROW)
pprint(result)
result = hasura_client.convert_output_format(ExportFormat.CSV)
pprint(result)
result = hasura_client.convert_output_format(ExportFormat.PARQUET)
pprint(result)
result = hasura_client.convert_output_format(ExportFormat.DATAFRAME)
pprint(result)
result = hasura_client.convert_output_format(ExportFormat.FLAT)
pprint(result)

Write Results, one file for each root entry in the query

result = hasura_client.write_to_file(output_format=ExportFormat.ARROW)
pprint(result)
result = hasura_client.write_to_file(output_format=ExportFormat.CSV)
pprint(result)
result = hasura_client.write_to_file(output_format=ExportFormat.PARQUET)
pprint(result)
result = hasura_client.write_to_file(output_format=ExportFormat.FLAT)
pprint(result)
result = hasura_client.write_to_file(output_format=ExportFormat.NATURAL)
pprint(result)

Detect Anomalies

Uses Doc2Vec to facilitate deeper semantic analysis, but also works fine with categorical string fields.

result = hasura_client.anomalies()
pprint(result)
result = hasura_client.anomalies(threshold=.03)
pprint(result)

Train and Serialize then Re-Use for Anomaly Detection

Typically, do this to train on some historical dataset and then search for anomalies in an alternate (maybe current) dataset.

result = hasura_client.anomalies_training()
pprint(result)
result = hasura_client.anomalies(training_files=result, threshold=0)
pprint(result)

Clustering

Uses KMedoids clustering. You are always working on a dictionary of datasets. You need to define the number of clusters for each dataset in a corresponding input dictionary. You can auto-generate the optimal number of clusters and use that as the input.

result = hasura_client.optimal_number_of_clusters(1,8)
pprint(result)
result = hasura_client.clusters(result)
pprint(result)

Model First Design using DBML

Build models using DB Diagram then generate Hasura metadata.

Click here for an example

metadata = hasura_client.add_dbml_model_as_source(
    'global-retail-sales.dbml',
    kind='postgres',
    configuration=configuration,
    output_file='new-metadata.json'
)

Auto-Generated/Discovery of Relationships

Wire up as many data sources as you want to analyze to a Hasura instance and automatically generate relationships (across data sources).

old_metadata = hasura_client.get_metadata()

# generate relationships
new_metadata = hasura_client.relationship_analysis('new-metadata.json', entity_synonyms={"Stores": ["warehouse"]})

# update hasura with new relationships
hasura_client.replace_metadata(metadata=new_metadata)

Upload a folder of CSVs to PostgreSQL

Create a datasource from a schema from PostgreSQL. Point a folder of CSVs to same PostgreSQL instance and schema. Then automatically track them in Hasura.

# upload data to database
tables = hasura_client.upload_csv_folder('retailer', uri=_uri, casing=Casing.camel)

# track all the tables we uploaded
result = hasura_client.track_pg_tables(tables, schema="public")

Convert SDL into nodes and relationships

Take a Hasura graphql endpoint and converts the metadata it into nodes and edges for graph analysis (e.g. finding the optimal path between 2 types).

nodes, relationships = hasura_client.get_schema_relationships()
pp(nodes)
pp(relationships)

hasura_client.metadata_to_neo4j(
    os.environ.get("NEO4J_URI"),
    os.environ.get("NEO4J_USERNAME"),
    os.environ.get("NEO4J_PASSWORD"))

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyhasura-1.0.35.tar.gz (26.9 kB view details)

Uploaded Source

Built Distribution

pyhasura-1.0.35-py3-none-any.whl (30.1 kB view details)

Uploaded Python 3

File details

Details for the file pyhasura-1.0.35.tar.gz.

File metadata

  • Download URL: pyhasura-1.0.35.tar.gz
  • Upload date:
  • Size: 26.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.9.6

File hashes

Hashes for pyhasura-1.0.35.tar.gz
Algorithm Hash digest
SHA256 6f60d12cfa81785ff86d2d545f13a95216b8851abd445dccbc4abd4fca0258e6
MD5 0de8bac519818f768af492e8ac1c3259
BLAKE2b-256 18a26e6adef1d4589ad245800b6875227ea894b0989cc2df5e377aa02a417cb0

See more details on using hashes here.

File details

Details for the file pyhasura-1.0.35-py3-none-any.whl.

File metadata

  • Download URL: pyhasura-1.0.35-py3-none-any.whl
  • Upload date:
  • Size: 30.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.9.6

File hashes

Hashes for pyhasura-1.0.35-py3-none-any.whl
Algorithm Hash digest
SHA256 147c2b86d4136f9701b2fe6f1b823638c5d5bff0eb9c4e5e8cd7e8cd03e05129
MD5 2959be10b64708781a314b8c28b525a9
BLAKE2b-256 9166c2c1fbf73c86b88240aed4ebf1d1136430bfdbaa2b87f1943fb3e8672618

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page