Retentioneering: product analytics, data-driven customer journey map optimization, marketing analytics, web analytics, transaction analytics, graph visualization, and behavioral segmentation with customer segments in Python.

Overview

Rete logo

Pipi version Telegram Python version Downloads Travis Build Status

Language grade: JavaScript Language grade: Python

What is Retentioneering?

Retentioneering is a Python framework and library to assist product analysts and marketing analysts as it makes it easier to process and analyze clickstreams, event streams, trajectories, and event logs. You can segment users, clients (agents), build ML pipelines to predict agent category or probability of target event based on historical data.

In a common scenario you can use raw data from Google Analytics BigQuery stream or any other silimal streams in form of events and their timestamps for users, and Retentioneering is all you need to explore the user behavior from that data, it can reveal much more isights than funnel analytics, as it will automatically build the behavioral segments and their patterns, highlighting what events and pattern impact your conversion rates, retention and revenue.

Retentioneering extends Pandas, NetworkX, Scikit-learn for in-depth processing of event sequences data, specifically Retentioneering provides a powerful environment to perform an in-depth analysis of customer journey maps, bringing behavior-driven segmentation of users and machine learning pipelines to product analytics.

Most recent is Retentioneering 2.0.0, this version has major updates from 1.0.x and it is not reverse compatible with previous releases due to major syntax changes. With significant improvements we now provided architecture and the solid ground for farther updates and rapid development of analytical tools. Please update, leave your feedback and stay tuned.

intro 0

Changelog

This is new major release Retentioneering 2.0. Change log is available here.

Complete documentation is available here.

Installation

Option 1. Run directly from google.colab. Open google.colab and click File-> “new notebook”. In the code cell run following to install Retentioneering (same command will install directly from Jupyter notebook):

!pip3 install retentioneering

Option 2. Install Retentioneering from PyPI:

pip3 install retentioneering

Option 3. Install Retentioneering directly from the source:

git clone https://github.com/retentioneering/retentioneering-tools
cd retentioneering-tools
python3 setup.py install

Quick start

Start using Retentioneering for clickstream analysis

Or directly open this notebook in Google Colab to run with sample data.

Suggested first steps:

import retentioneering

# load sample user behavior data as a pandas dataframe: 
data = retentioneering.datasets.load_simple_shop()

# update config to pass columns names:
retentioneering.config.update({
    'user_col': 'user_id',
    'event_col':'event',
    'event_time_col':'timestamp',
})

Above we imported sample dataset, which is regular pandas dataframe containing raw user behavior data from hypothetical web-site or app in form of sequence of records {'user_id', 'event', 'timestamp'}, and pass those column names to retentioneering.config. Now, let's plot the graph to visualize user behaviour from the dataset (read more about graphs here):

data.rete.plot_graph(norm_type='node',
                     weight_col='user_id',
                     thresh=0.2,
                     targets = {'payment_done':'green',
                                'lost':'red'})

intro 1

Here we obtain the high-level graph of user activity where edge A --> B weight shows percent of users transitioning to event B from all users reached event A (note, edges with small weighs are thresholded to avoid visual clutter, read more in the documentation)

To automatically find distinct behavioral patterns we can cluster users from the dataset based on their behavior (read more about behavioral clustering here):

data.rete.get_clusters(method='kmeans',
                       n_clusters=8,
                       ngram_range=(1,2),
                       plot_type='cluster_bar',
                       targets=['payment_done','cart']);

intro 1

Users with similar behavior grouped in the same cluster. Clusters with low conversion rate can represent systematic problem in the product: specific behavior pattern which does not lead to product goals. Obtained user segments can be explored deeper to understand problematic behavior pattern. In the example above for instance, cluster 4 has low conversion rate to purchase but high conversion rate to cart visit.

clus_4 = data.rete.filter_cluster(4)
clus_4.rete.plot_graph(thresh=0.1,
                        weight_col='user_id',
                        targets = {'lost':'red',
                                   'payment_done':'green'})

intro 1

To explore more features please see the documentation

Step-by-step guides

Contributing

This is community-driven open source project in active development. Any contributions, new ideas, bug reports, bug fixes, documentation improvements are very welcome.

Retentioneering now provides several opensource solutions for data-driven product analytics and web analytics. Please checkout this repository for JS library to track the mutations of the website elements: https://github.com/retentioneering/retentioneering-dom-observer

Apps are better with math!:) Retentioneering is a research laboratory, analytics methodology and opensource tools founded by Maxim Godzi and Anatoly Zaytsev in 2015. Please feel free to contact us at [email protected] if you have any questions regarding this repo.

Comments
  • ImportError: cannot import name 'img_as_float32'

    ImportError: cannot import name 'img_as_float32'

    Hi guys

    I tried to get through your "first steps" guide but it raised an error on the start

    from retentioneering import init_config
    import pandas as pd
    
    ---------------------------------------------------------------------------
    ImportError                               Traceback (most recent call last)
    <ipython-input-21-fe4dd999c90a> in <module>()
    ----> 1 from retentioneering import init_config
          2 import pandas as pd
    
    /anaconda3/lib/python3.6/site-packages/retentioneering/__init__.py in <module>()
    ----> 1 from retentioneering.core.utils import init_config
          2 from retentioneering.core.simulator import Simulator
    
    /anaconda3/lib/python3.6/site-packages/retentioneering/core/utils.py in <module>()
         14 from retentioneering.visualization import plot
         15 from sklearn.linear_model import LogisticRegression
    ---> 16 from retentioneering.core.model import ModelDescriptor
         17 from retentioneering.core import node_metrics
         18 from retentioneering.core import preprocessing
    
    /anaconda3/lib/python3.6/site-packages/retentioneering/core/model.py in <module>()
          5 
          6 
    ----> 7 import shap
          8 import eli5
          9 from eli5.sklearn import PermutationImportance
    
    /anaconda3/lib/python3.6/site-packages/shap/__init__.py in <module>()
         10 from .explainers.linear import LinearExplainer
         11 from .explainers.partition import PartitionExplainer
    ---> 12 from .plots.summary import summary_plot
         13 from .plots.decision import decision_plot, multioutput_decision_plot
         14 from .plots.dependence import dependence_plot
    
    /anaconda3/lib/python3.6/site-packages/shap/plots/summary.py in <module>()
         13     pass
         14 from . import labels
    ---> 15 from . import colors
         16 
         17 # TODO: remove unused title argument / use title argument
    
    /anaconda3/lib/python3.6/site-packages/shap/plots/colors.py in <module>()
          5 
          6 import numpy as np
    ----> 7 import skimage.color
          8 
          9 try:
    
    /anaconda3/lib/python3.6/site-packages/skimage/color/__init__.py in <module>()
    ----> 1 from .colorconv import (convert_colorspace,
          2                         guess_spatial_dimensions,
          3                         rgba2rgb,
          4                         rgb2hsv,
          5                         hsv2rgb,
    
    /anaconda3/lib/python3.6/site-packages/skimage/color/colorconv.py in <module>()
         54 import numpy as np
         55 from scipy import linalg
    ---> 56 from ..util import dtype, dtype_limits
         57 
         58 
    
    /anaconda3/lib/python3.6/site-packages/skimage/util/__init__.py in <module>()
    ----> 1 from .dtype import (img_as_float32, img_as_float64, img_as_float,
          2                     img_as_int, img_as_uint, img_as_ubyte,
          3                     img_as_bool, dtype_limits)
          4 from .shape import view_as_blocks, view_as_windows
          5 from .noise import random_noise
    
    ImportError: cannot import name 'img_as_float32'
    

    skimage version: 0.15.0

    opened by mingghan 5
  • 'ValueError: too many values to unpack (expected 2)' in early steps tutorial

    'ValueError: too many values to unpack (expected 2)' in early steps tutorial

    I am getting this error on

    data.retention.get_clusters(plot_type='cluster_heatmap')

    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-47-ea4770463931> in <module>()
    ----> 1 data.retention.get_clusters(plot_type='cluster_heatmap')
    
    /anaconda3/lib/python3.6/site-packages/retentioneering/core/utils.py in get_clusters(self, plot_type, refit_cluster, method, **kwargs)
        450         if not hasattr(self, 'clusters') or refit_cluster:
        451             clusterer = getattr(clustering, method)
    --> 452             self.clusters, self._metrics = clusterer(features, **kwargs)
        453             self._create_cluster_mapping(features.index.values)
        454 
    
    ValueError: too many values to unpack (expected 2)
    

    Same on

    data.retention.get_clusters(n_clusters=8, plot_type='cluster_tsne', refit_cluster=True);

    opened by mingghan 4
  • Dev2

    Dev2

    Update to 2.0.3 Minor technical pre-release before the major update in October 2021

    New in this minor version:

    • updated lib dependencies
    • added support for another config init

    Upcoming in 2.1 in October 2021:

    • Important: Deep redesign of graph editor, including interactive node list editing (excluding and merging nodes by deleting or grouping), live recalculation of raw clickstream from the graph view
    • New preprocessing tools
    • More tools to work with cohorts and segments
    • Sequence exploration tools: search for loops, cycles, n-grams, and their product metrics influence
    • New prediction pipeline
    • Important: new norms for graph, edgelists, and adjacency matrix based of group-averaged user transition probabilities
    • Tools for automated sampling by users and event filtering based on event importance
    • New clustering and vectorizing techniques specific for product science
    opened by godzi 2
  • Error after installing via miniconda3

    Error after installing via miniconda3

    1. Created new enviroment using miniconda3
    2. pip3 install retentioneering
    3. Got an error while starting python3 kernel «ImportError: DLL load failed while importing win32api»

    Fixed it by:

    pip install pywin32
    python path\to\python\Scripts\pywin32_postinstall.py -install
    
    opened by ivan-toriya 2
  • Your starred Github rep for analytics is moved

    Your starred Github rep for analytics is moved

    Hi,

    Python tools for user trajectories analysis Retentioneering are now moved. Previously started in App in the Air (https://github.com/appintheair/retentioneering-framework) it is now rebuilt, redeveloped and actively maintained by independent Retentioneering team at https://github.com/retentioneering/retentioneering-tools

    Please join for best latest updates and new features, like better graph visualization in Python.

    Watch, Star, Fork

    Thanks, Retentioneering team

    opened by danlenny 1
  • ModuleNotFoundError: No module named 'itermplot'

    ModuleNotFoundError: No module named 'itermplot'

    Hi,

    importing retentioneering causes this error:

    Python 3.8.12 (default, Mar 15 2022, 12:23:51)
    [Clang 12.0.5 (clang-1205.0.22.11)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import retentioneering
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/retentioneering/__init__.py", line 30, in <module>
        from retentioneering.core.config import config, init_config
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/retentioneering/core/config.py", line 9, in <module>
        from .core_functions.base_dataset import BaseDataset
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/retentioneering/core/core_functions/__init__.py", line 10, in <module>
        from .step_matrix import step_matrix
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/retentioneering/core/core_functions/step_matrix.py", line 9, in <module>
        from retentioneering.visualization import plot_step_matrix
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/retentioneering/visualization/plot_step_matrix.py", line 10, in <module>
        import matplotlib.pyplot as plt
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/matplotlib/pyplot.py", line 2230, in <module>
        switch_backend(rcParams["backend"])
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/matplotlib/pyplot.py", line 267, in switch_backend
        class backend_mod(matplotlib.backend_bases._Backend):
      File "/Users/katya/.pyenv/versions/rete/lib/python3.8/site-packages/matplotlib/pyplot.py", line 268, in backend_mod
        locals().update(vars(importlib.import_module(backend_name)))
      File "/Users/katya/.pyenv/versions/3.8.12/lib/python3.8/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
    ModuleNotFoundError: No module named 'itermplot'
    >>>
    
    opened by demidovakatya 0
  • Origin/loops&cycles

    Origin/loops&cycles

    Added a new functional to the utils.py, fixed some minor bugs.

    List of changes: Fixed _make_target Fixed insert_sleep_events Added matplotlib import

    New functions: get_negative_users import matplotlib Is_cycle Is_loop get_fraction sequence_search Find_sequences Loop_search Find_loops Find_cycles

    opened by SynthaxWarrior 0
  • ValueError on seaborn==0.11.2

    ValueError on seaborn==0.11.2

    Cell

    data.rete.compare(groups=(test, control),
                      function=conversion,
                      test='mannwhitneyu',
                      group_names=('test','control'))'
    

    in tutorial doesn't work and fails with ValueError: cannot reindex on an axis with duplicate labels error. After downgrading to seaborn==0.11.1 error dissapear.

    opened by SvetoforColumb 0
  • The telegram link on the official website is broken

    The telegram link on the official website is broken

    Hey folks, Sorry if that is not the right place for raising such kinds of issues. I was trying to navigate the community in telegram but noticed the link https://t.me/retentioneering_meetups is no longer active. Can you navigate me to the right one, please?

    opened by zkid18 0
  • ERROR: Could not build wheels for numpy

    ERROR: Could not build wheels for numpy

    Got troubles with installation on macbook air m1.

    python -V
    Python 3.9.5
    

    Part of the trace:

    Building wheels for collected packages: numpy, llvmlite
      Building wheel for numpy (pyproject.toml) ... error
      error: subprocess-exited-with-error
      
      × Building wheel for numpy (pyproject.toml) did not run successfully.
      │ exit code: 1
      ╰─> [893 lines of output]
          Running from numpy source directory.
          numpy/random/_bounded_integers.pxd.in has not changed
          numpy/random/_philox.pyx has not changed
          numpy/random/_bounded_integers.pyx.in has not changed
          numpy/random/_sfc64.pyx has not changed
          numpy/random/_mt19937.pyx has not changed
          numpy/random/bit_generator.pyx has not changed
          Processing numpy/random/_bounded_integers.pyx
          numpy/random/mtrand.pyx has not changed
          numpy/random/_generator.pyx has not changed
          numpy/random/_pcg64.pyx has not changed
          numpy/random/_common.pyx has not changed
          Cythonizing sources
          blas_opt_info:
          blas_mkl_info:
          customize UnixCCompiler
            libraries mkl_rt not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          blis_info:
            libraries blis not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          openblas_info:
            libraries openblas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          atlas_3_10_blas_threads_info:
          Setting PTATLAS=ATLAS
            libraries tatlas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          atlas_3_10_blas_info:
            libraries satlas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          atlas_blas_threads_info:
          Setting PTATLAS=ATLAS
            libraries ptf77blas,ptcblas,atlas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          atlas_blas_info:
            libraries f77blas,cblas,atlas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          accelerate_info:
            libraries accelerate not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
          Library accelerate was not found. Ignoring
            libraries veclib not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
          Library veclib was not found. Ignoring
            FOUND:
              extra_compile_args = ['-faltivec', '-I/System/Library/Frameworks/vecLib.framework/Headers']
              extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
              define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
          
            FOUND:
              extra_compile_args = ['-faltivec', '-I/System/Library/Frameworks/vecLib.framework/Headers']
              extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
              define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
          
          non-existing path in 'numpy/distutils': 'site.cfg'
          lapack_opt_info:
          lapack_mkl_info:
            libraries mkl_rt not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          openblas_lapack_info:
            libraries openblas not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          openblas_clapack_info:
            libraries openblas,lapack not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          flame_info:
            libraries flame not found in ['/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib', '/usr/local/lib', '/usr/lib']
            NOT AVAILABLE
          
          atlas_3_10_threads_info:
          Setting PTATLAS=ATLAS
            libraries lapack_atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries tatlas,tatlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries lapack_atlas not found in /usr/local/lib
            libraries tatlas,tatlas not found in /usr/local/lib
            libraries lapack_atlas not found in /usr/lib
            libraries tatlas,tatlas not found in /usr/lib
          <class 'numpy.distutils.system_info.atlas_3_10_threads_info'>
            NOT AVAILABLE
          
          atlas_3_10_info:
            libraries lapack_atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries satlas,satlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries lapack_atlas not found in /usr/local/lib
            libraries satlas,satlas not found in /usr/local/lib
            libraries lapack_atlas not found in /usr/lib
            libraries satlas,satlas not found in /usr/lib
          <class 'numpy.distutils.system_info.atlas_3_10_info'>
            NOT AVAILABLE
          
          atlas_threads_info:
          Setting PTATLAS=ATLAS
            libraries lapack_atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries ptf77blas,ptcblas,atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries lapack_atlas not found in /usr/local/lib
            libraries ptf77blas,ptcblas,atlas not found in /usr/local/lib
            libraries lapack_atlas not found in /usr/lib
            libraries ptf77blas,ptcblas,atlas not found in /usr/lib
          <class 'numpy.distutils.system_info.atlas_threads_info'>
            NOT AVAILABLE
          
          atlas_info:
            libraries lapack_atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries f77blas,cblas,atlas not found in /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/lib
            libraries lapack_atlas not found in /usr/local/lib
            libraries f77blas,cblas,atlas not found in /usr/local/lib
            libraries lapack_atlas not found in /usr/lib
            libraries f77blas,cblas,atlas not found in /usr/lib
          <class 'numpy.distutils.system_info.atlas_info'>
            NOT AVAILABLE
          
            FOUND:
              extra_compile_args = ['-faltivec', '-I/System/Library/Frameworks/vecLib.framework/Headers']
              extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
              define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
          
          /private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-build-env-cxkr50mv/overlay/lib/python3.9/site-packages/setuptools/_distutils/dist.py:275: UserWarning: Unknown distribution option: 'define_macros'
            warnings.warn(msg)
          running bdist_wheel
          running build
          running config_cc
          unifing config_cc, config, build_clib, build_ext, build commands --compiler options
          running config_fc
          unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options
          running build_src
          build_src
          building py_modules sources
          building library "npymath" sources
          Could not locate executable gfortran
          Could not locate executable f95
          Could not locate executable f90
          Could not locate executable f77
          Could not locate executable xlf90
          Could not locate executable xlf
          Could not locate executable ifort
          Could not locate executable ifc
          Could not locate executable g77
          Could not locate executable g95
          Could not locate executable pgfortran
          don't know how to compile Fortran code on platform 'posix'
            adding 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath' to include_dirs.
          None - nothing done with h_files = ['build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath/npy_math_internal.h']
          building library "npysort" sources
            adding 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/common' to include_dirs.
          None - nothing done with h_files = ['build/src.macosx-12.1-arm64-3.9/numpy/core/src/common/npy_sort.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/common/npy_partition.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/common/npy_binsearch.h']
          building library "npyrandom" sources
          building extension "numpy.core._multiarray_tests" sources
          building extension "numpy.core._multiarray_umath" sources
            adding 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath' to include_dirs.
            adding 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath' to include_dirs.
            adding 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/common' to include_dirs.
          numpy.core - nothing done with h_files = ['build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/funcs.inc', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/simd.inc', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/loops.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/matmul.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/clip.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath/npy_math_internal.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/src/common/templ_common.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy/config.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy/_numpyconfig.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy/__multiarray_api.h', 'build/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy/__ufunc_api.h']
          
         ...
    
    
          copying numpy/tests/test_scripts.py -> build/lib.macosx-12.1-arm64-3.9/numpy/tests
          running build_clib
          customize UnixCCompiler
          customize UnixCCompiler using new_build_clib
          building 'npymath' library
          compiling C sources
          C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include
          
          creating build/temp.macosx-12.1-arm64-3.9
          creating build/temp.macosx-12.1-arm64-3.9/numpy
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core/src
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core/src/npymath
          creating build/temp.macosx-12.1-arm64-3.9/build
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath
          compile options: '-Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c'
          clang: numpy/core/src/npymath/npy_math.c
          clang: numpy/core/src/npymath/halffloat.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath/ieee754.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath/npy_math_complex.c
          In file included from numpy/core/src/npymath/npy_math.c:9:
          numpy/core/src/npymath/npy_math_internal.h.src:490:21: warning: incompatible pointer types passing 'npy_longdouble *' (aka 'double *') to parameter of type 'long double *' [-Wincompatible-pointer-types]
              return modfl(x, iptr);
                              ^~~~
          /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include/math.h:394:52: note: passing argument to parameter here
          extern long double modfl(long double, long double *);
                                                             ^
          1 warning generated.
          ar: adding 4 object files to build/temp.macosx-12.1-arm64-3.9/libnpymath.a
          ranlib:@ build/temp.macosx-12.1-arm64-3.9/libnpymath.a
          building 'npysort' library
          compiling C sources
          C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include
          
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort
          compile options: '-Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c'
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/quicksort.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/mergesort.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/timsort.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/heapsort.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/radixsort.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/selection.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npysort/binsearch.c
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                  npy_intp k;
                  ^~~~~~~~~~~
          numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
              else if (0 && kth == num - 1) {
                       ^
                       /* DISABLES CODE */ ( )
          22 warnings generated.
          ar: adding 7 object files to build/temp.macosx-12.1-arm64-3.9/libnpysort.a
          ranlib:@ build/temp.macosx-12.1-arm64-3.9/libnpysort.a
          building 'npyrandom' library
          compiling C sources
          C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include
          
          creating build/temp.macosx-12.1-arm64-3.9/numpy/random
          creating build/temp.macosx-12.1-arm64-3.9/numpy/random/src
          creating build/temp.macosx-12.1-arm64-3.9/numpy/random/src/distributions
          compile options: '-Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c'
          clang: numpy/random/src/distributions/logfactorial.c
          clang: numpy/random/src/distributions/distributions.c
          clang: numpy/random/src/distributions/random_mvhg_marginals.c
          clang: numpy/random/src/distributions/random_mvhg_count.c
          clang: numpy/random/src/distributions/random_hypergeometric.c
          ar: adding 5 object files to build/temp.macosx-12.1-arm64-3.9/libnpyrandom.a
          ranlib:@ build/temp.macosx-12.1-arm64-3.9/libnpyrandom.a
          running build_ext
          customize UnixCCompiler
          customize UnixCCompiler using new_build_ext
          building 'numpy.core._multiarray_tests' extension
          compiling C sources
          C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include
          
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/multiarray
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core/src/common
          compile options: '-DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c'
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/_multiarray_tests.c
          clang: numpy/core/src/common/mem_overlap.c
          In file included from numpy/core/src/multiarray/_multiarray_tests.c.src:7:
          In file included from numpy/core/include/numpy/npy_math.h:596:
          numpy/core/src/npymath/npy_math_internal.h.src:490:21: warning: incompatible pointer types passing 'npy_longdouble *' (aka 'double *') to parameter of type 'long double *' [-Wincompatible-pointer-types]
              return modfl(x, iptr);
                              ^~~~
          /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include/math.h:394:52: note: passing argument to parameter here
          extern long double modfl(long double, long double *);
                                                             ^
          numpy/core/src/multiarray/_multiarray_tests.c.src:1895:61: warning: format specifies type 'long double' but the argument has type 'npy_longdouble' (aka 'double') [-Wformat]
                  PyOS_snprintf(str, sizeof(str), "%.*Lg", precision, x);
                                                   ~~~~~              ^
                                                   %.*g
          2 warnings generated.
          clang -bundle -undefined dynamic_lookup -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/knodl/.pyenv/versions/3.9.5/lib -L/opt/homebrew/lib -L/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/knodl/.pyenv/versions/3.9.5/lib -L/opt/homebrew/lib -L/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/lib build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/_multiarray_tests.o build/temp.macosx-12.1-arm64-3.9/numpy/core/src/common/mem_overlap.o -Lbuild/temp.macosx-12.1-arm64-3.9 -lnpymath -o build/lib.macosx-12.1-arm64-3.9/numpy/core/_multiarray_tests.cpython-39-darwin.so
          building 'numpy.core._multiarray_umath' extension
          compiling C sources
          C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include
          
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core/src/multiarray
          creating build/temp.macosx-12.1-arm64-3.9/numpy/core/src/umath
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath
          creating build/temp.macosx-12.1-arm64-3.9/build/src.macosx-12.1-arm64-3.9/numpy/core/src/common
          creating build/temp.macosx-12.1-arm64-3.9/private
          creating build/temp.macosx-12.1-arm64-3.9/private/var
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/numpy_dafcb5869e1446f08f52deba357fec3d
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/numpy_dafcb5869e1446f08f52deba357fec3d/numpy
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/numpy_dafcb5869e1446f08f52deba357fec3d/numpy/_build_utils
          creating build/temp.macosx-12.1-arm64-3.9/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/numpy_dafcb5869e1446f08f52deba357fec3d/numpy/_build_utils/src
          compile options: '-DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -DNO_ATLAS_INFO=3 -DHAVE_CBLAS -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/umath -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c'
          extra options: '-faltivec -I/System/Library/Frameworks/vecLib.framework/Headers'
          clang: numpy/core/src/multiarray/alloc.c
          clang: numpy/core/src/multiarray/array_assign_scalar.c
          clang: numpy/core/src/multiarray/buffer.c
          clang: numpy/core/src/multiarray/datetime_strings.c
          clang: numpy/core/src/multiarray/conversion_utils.c
          clang: numpy/core/src/multiarray/common.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/einsum.c
          clang: numpy/core/src/multiarray/descriptor.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/multiarray/hashdescr.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/lowlevel_strided_loops.c
          clang: numpy/core/src/multiarray/multiarraymodule.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/multiarray/nditer_constr.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/multiarray/refcount.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/multiarray/temp_elide.c
          clang: numpy/core/src/multiarray/vdot.c
          clang: numpy/core/src/multiarray/scalarapi.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/umath/loops.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/umath/ufunc_type_resolution.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/umath/ufunc_object.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: numpy/core/src/common/array_assign.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath/ieee754.c
          clang: build/src.macosx-12.1-arm64-3.9/numpy/core/src/common/npy_cpu_features.c
          clang: numpy/core/src/common/ucsnarrow.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: /private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/numpy_dafcb5869e1446f08f52deba357fec3d/numpy/_build_utils/src/apple_sgemv_fix.c
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
          error: Command "clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/usr/include -DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -DNO_ATLAS_INFO=3 -DHAVE_CBLAS -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/umath -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Inumpy/core/include -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/include -I/Users/knodl/.pyenv/versions/3.9.5/include/python3.9 -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/common -Ibuild/src.macosx-12.1-arm64-3.9/numpy/core/src/npymath -c numpy/core/src/multiarray/alloc.c -o build/temp.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/alloc.o -MMD -MF build/temp.macosx-12.1-arm64-3.9/numpy/core/src/multiarray/alloc.o.d -faltivec -I/System/Library/Frameworks/vecLib.framework/Headers" failed with exit status 1
          [end of output]
      
      note: This error originates from a subprocess, and is likely not a problem with pip.
      ERROR: Failed building wheel for numpy
    
      Building wheel for llvmlite (setup.py) ... error
      error: subprocess-exited-with-error
      
      × python setup.py bdist_wheel did not run successfully.
      │ exit code: 1
      ╰─> [11 lines of output]
          running bdist_wheel
          /Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/bin/python3.9 /private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/llvmlite_008ed1517dfb4868be790fe2deeb4363/ffi/build.py
          LLVM version... Traceback (most recent call last):
            File "/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/llvmlite_008ed1517dfb4868be790fe2deeb4363/ffi/build.py", line 220, in <module>
              main()
            File "/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/llvmlite_008ed1517dfb4868be790fe2deeb4363/ffi/build.py", line 214, in main
              main_posix('osx', '.dylib')
            File "/private/var/folders/ws/ql7_7p_s7gbf_77z0hvwfw9w0000gn/T/pip-install-4fdbvhnd/llvmlite_008ed1517dfb4868be790fe2deeb4363/ffi/build.py", line 134, in main_posix
              raise RuntimeError(msg) from None
          RuntimeError: Could not find a `llvm-config` binary. There are a number of reasons this could occur, please see: https://llvmlite.readthedocs.io/en/latest/admin-guide/install.html#using-pip for help.
          error: command '/Users/knodl/.pyenv/versions/3.9.5/envs/retentioneering/bin/python3.9' failed with exit code 1
          [end of output]
      
      note: This error originates from a subprocess, and is likely not a problem with pip.
      ERROR: Failed building wheel for llvmlite
      Running setup.py clean for llvmlite
    Failed to build numpy llvmlite
    ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects
    
    opened by knodl 0
  • AttributeError: 'RetentioneeringDataset' object has no attribute 'plot_graph'

    AttributeError: 'RetentioneeringDataset' object has no attribute 'plot_graph'

    The tutorial notebook (Google Colab) returns the error above when running the following code:

    data.rete.plot_graph(norm_type=None,
                         weight_col=None,
                         thresh=250)
    
    opened by StijnVanRijssel 6
Releases(2.0.1)
  • 2.0.1(Oct 8, 2020)

    Completely reworked Retentioneering workflow: functions init_config() and retention.prepare() are removed. In 2.0 it is not required to initialize “positive” and “negative” events before the analysis. You can start exploring your user behavior data first and define targets when needed as optional parameters. To access all Retentioneering tools attribute “.retention” was renamed to “.rete”. To get started with an updated workflow refer to this guide.

    plot_step_matrix() function was significantly reworked and renamed to step_matrix(). To read more about new step_matrix() functionality refer to this description

    get_edgelist(), get_adjacency() and plot_graph() functions now have customizable weighting options (total nuber of events, normalized by full dataset, normalized by nodes, etc.). To learn more please fere to this description

    new function compare() was added to compare two segments of users or test/control groups in AB test based on defined metrics. Read more about compare function in this description

    Users' behavior segmentation was reworked and now works significantly faster and updated with new functionality. For more information refer to this description

    Tools to plot user conversion funnels were reworked and improved. To learn more about new features read this description

    Source code(tar.gz)
    Source code(zip)
Owner
Retentioneering
Retentioneering RnD: Python and JS Tools to Automate Web, Mobile and other Event-based Analytics and Online Business Optimal Control
Retentioneering
General Assembly's 2015 Data Science course in Washington, DC

DAT8 Course Repository Course materials for General Assembly's Data Science course in Washington, DC (8/18/15 - 10/29/15). Instructor: Kevin Markham (

Kevin Markham 1.6k Jan 07, 2023
A real data analysis and modeling project - restaurant inspections

A real data analysis and modeling project - restaurant inspections Jafar Pourbemany 9/27/2021 This project represents data analysis and modeling of re

Jafar Pourbemany 2 Aug 21, 2022
A Pythonic introduction to methods for scaling your data science and machine learning work to larger datasets and larger models, using the tools and APIs you know and love from the PyData stack (such as numpy, pandas, and scikit-learn).

This tutorial's purpose is to introduce Pythonistas to methods for scaling their data science and machine learning work to larger datasets and larger models, using the tools and APIs they know and lo

Coiled 102 Nov 10, 2022
A script to "SHUA" H1-2 map of Mercenaries mode of Hearthstone

lushi_script Introduction This script is to "SHUA" H1-2 map of Mercenaries mode of Hearthstone Installation Make sure you installed python=3.6. To in

210 Jan 02, 2023
A CLI tool to reduce the friction between data scientists by reducing git conflicts removing notebook metadata and gracefully resolving git conflicts.

databooks is a package for reducing the friction data scientists while using Jupyter notebooks, by reducing the number of git conflicts between different notebooks and assisting in the resolution of

dataroots 86 Dec 25, 2022
A python package which can be pip installed to perform statistics and visualize binomial and gaussian distributions of the dataset

GBiStat package A python package to assist programmers with data analysis. This package could be used to plot : Binomial Distribution of the dataset p

Rishikesh S 4 Oct 17, 2022
Creating a statistical model to predict 10 year treasury yields

Predicting 10-Year Treasury Yields Intitially, I wanted to see if the volatility in the stock market, represented by the VIX index (data source), had

10 Oct 27, 2021
NFCDS Workshop Beginners Guide Bioinformatics Data Analysis

Genomics Workshop FIXME: overview of workshop Code of Conduct All participants s

Elizabeth Brooks 2 Jun 13, 2022
BigDL - Evaluate the performance of BigDL (Distributed Deep Learning on Apache Spark) in big data analysis problems

Evaluate the performance of BigDL (Distributed Deep Learning on Apache Spark) in big data analysis problems.

Vo Cong Thanh 1 Jan 06, 2022
a tool that compiles a csv of all h1 program stats

h1stats - h1 Program Stats Scraper This python3 script will call out to HackerOne's graphql API and scrape all currently active programs for informati

Evan 40 Oct 27, 2022
Full automated data pipeline using docker images

Create postgres tables from CSV files This first section is only relate to creating tables from CSV files using postgres container alone. Just one of

1 Nov 21, 2021
Pandas and Spark DataFrame comparison for humans

DataComPy DataComPy is a package to compare two Pandas DataFrames. Originally started to be something of a replacement for SAS's PROC COMPARE for Pand

Capital One 259 Dec 24, 2022
Get mutations in cluster by querying from LAPIS API

Cluster Mutation Script Get mutations appearing within user-defined clusters. Usage Clusters are defined in the clusters dict in main.py: clusters = {

neherlab 1 Oct 22, 2021
Python ELT Studio, an application for building ELT (and ETL) data flows.

The Python Extract, Load, Transform Studio is an application for performing ELT (and ETL) tasks. Under the hood the application consists of a two parts.

Schlerp 55 Nov 18, 2022
Demonstrate the breadth and depth of your data science skills by earning all of the Databricks Data Scientist credentials

Data Scientist Learning Plan Demonstrate the breadth and depth of your data science skills by earning all of the Databricks Data Scientist credentials

Trung-Duy Nguyen 27 Nov 01, 2022
BIGDATA SIMULATION ONE PIECE WORLD CENSUS

ONE PIECE is a Japanese manga of great international success. The story turns inhabited in a fictional world, tells the adventures of a young man whose body gained rubber properties after accidentall

Maycon Cypriano 3 Jun 30, 2022
Parses data out of your Google Takeout (History, Activity, Youtube, Locations, etc...)

google_takeout_parser parses both the Historical HTML and new JSON format for Google Takeouts caches individual takeout results behind cachew merge mu

Sean Breckenridge 27 Dec 28, 2022
Stream-Kafka-ELK-Stack - Weather data streaming using Apache Kafka and Elastic Stack.

Streaming Data Pipeline - Kafka + ELK Stack Streaming weather data using Apache Kafka and Elastic Stack. Data source: https://openweathermap.org/api O

Felipe Demenech Vasconcelos 2 Jan 20, 2022
Python package for analyzing behavioral data for Brain Observatory: Visual Behavior

Allen Institute Visual Behavior Analysis package This repository contains code for analyzing behavioral data from the Allen Brain Observatory: Visual

Allen Institute 16 Nov 04, 2022
Making the DAEN information accessible.

The purpose of this repository is to make the information on Australian COVID-19 adverse events accessible. The Therapeutics Goods Administration (TGA) keeps a database of adverse reactions to medica

10 May 10, 2022