Giter VIP home page Giter VIP logo

opensearch_ethereum's Introduction

Ethereum et ses données

Pour reproduire le contenu du rendu, il vous faut obligatoirement Opensearch et Docker d'installés.

Introduction

J'ai utilisé ce CSV contenant donc des données numériques sur la cryptomonnaie Ethereum. Nous y trouvons :

  • (Date) Une date
  • (Open) Le prix d'ouverture de l'Ethereum le jour indiqué
  • (High) Le prix le plus élevé de l'Ethereum le jour indiqué
  • (Low) Le prix le plus bas de l'Ethereum le jour indiqué
  • (Close) Le prix de fermeture de l'Ethereum le jour indiqué
  • (Volume) Le volume de transactions en dollars pour l'Ethereum le jour indiqué
  • (Market Cap) La capitalisation en dollars pour l'Ethereum le jour indiqué

Les informations que nous avons commencent le 7 Aout 2015, proche de la date de création d'Ethereum (30 Juillet 2015) et se terminent le 27 Juin 2021. Comme un document correspond à un jour et que nous avons 2152 valeurs, nous avons donc 2152 jours de données.

Intégration du dataset

Pour pouvoir intégrer le dataset il a fallu convertir et modifier son contenu permettant ainsi d'obtenir la syntaxe recherchée par Opensearch. Pour cela j'ai trouvé et adapté un script Python à mon dataset qui va me générer un nouveau fichier json:

import json
import pandas

#le fichier que je veux modifier
in_file = "/home/tpuser/Documents/OpenSarchEthereumData/Ethereum.csv"

#le fichier généré avec les modifications
out_file = "/home/tpuser/Documents/OpenSarchEthereumData/dataEthereum.json"

cols = ['Date','Open', 'High', 'Low', 'Close','Volume','Market Cap']

input = pandas.read_csv(in_file)

#convertion des données en format numeric
input.Open = pandas.to_numeric(input['Open'])
input.High = pandas.to_numeric(input['High'])
input.Low = pandas.to_numeric(input['Low'])
input.Close = pandas.to_numeric(input['Close'])
input.Volume = pandas.to_numeric(input['Volume'])
input.Market_cap = pandas.to_numeric(input['Market Cap'])

i = 1

#permet d'écrire et de remplacer le contenu
with open(out_file, 'w+') as outfile:
    for row in input.to_dict('records'):

        #modification du format date EU en EN
        split = row['Date'].split("-")
        print(row['Date'] + " --- "+split[2]+'-'+split[1]+'-'+split[0])
        row['Date'] = split[2]+'-'+split[1]+'-'+split[0]

        #adaptation de la syntaxe
        index_line = '{"index": {"_index": "eth", "_id": %s }}\n' %(i)
        i += 1
        data = json.dumps(dict(list(zip(cols,
        row.values())))) + '\n'
        outfile.write(index_line+data)

Index et import du dataset

Pour importer le dataset, il faut au préalable créer un index

curl -u admin:admin --insecure -XPUT "https://localhost:9200/<nom_de_votre_index>?pretty"

Dans un second temps, il faut mapper les données pour vérifier leurs compatibilités

contenu du fichier de mapping (mapping_refactored.json) :

{
  "properties": {
    "Date": {
      "type": "date"
    },"Open": {
      "type": "float"
    },"High": {
      "type": "float"
    },"Low": {
      "type": "float"
    },"Close": {
      "type": "float"
    },"Volume": {
      "type": "float"
    },"Market Cap": {
      "type": "float"
    }
  }
}

curl -u admin:admin --insecure -XPUT "https://localhost:9200/<nom_de_votre_index>/_mapping?pretty" -H 'Content-Type: application/json' -d @<nom_de_votre_fichier_de_mapping>.json

Nous allons donc maintenant pouvoir indexer nos données dans Opensearch grâce à la méthode bulk :

curl -u admin:admin --insecure -XPUT https://localhost:9200/_bulk -H "Content-Type: application/json" --data-binary @<nom_de_votre_fichier_contenant_les_donnees>.json

Requêtes et Aggrégations

Je précise que je me sers du logiciel Insomnia pour utiliser mes queries

Pour introduire le dataset, nous allons commencer par récupérer les données du jour du listing d'Ethereum sur le marché financier de la cryptomonnaie, c'est à dire la date la plus éloignée.

INPUT

{
  "query": {
    "match": {
      "Date": "2015-08-07"
    }
  }
}

OUTPUT

{
	"_index": "eth",
	"_type": "_doc",
	"_id": "2152",
	"_score": 1.0,
	"_source": {
		"Date": "2015-08-07",
		"Open": 2.83161997795105,
		"High": 3.5366098880767822,
		"Low": 2.521120071411133,
		"Close": 2.7721199989318848,
		"Volume": 164329.0,
		"Market Cap": 1.66610555018E8
	}
}

Et la plus récente du dataset :

INPUT

{
  "query": {
    "match": {
      "Date": "2021-06-27"
    }
  }
}

OUTPUT

{
	"_index": "eth",
	"_type": "_doc",
	"_id": "1",
	"_score": 1.0,
	"_source": {
		"Date": "2021-06-27",
		"Open": 1830.99691808,
		"High": 1979.95812503,
		"Low": 1811.24586446,
		"Close": 1978.89466209,
		"Volume": 1.988547474215E10,
		"Market Cap": 2.3047355611835E11
	}
}

Une manière plus rapide d'obtenir ces informations :

INPUT

{
  "query": {
    "terms": {
      "Date": [
        "2015-08-07",
        "2021-06-27"
      ]
    }
  }
}

Nous pouvons donc apercevoir une grande différence entre les grandeurs des données des deux dates.

Connaître la moyenne de prix sur une période donnée permet premièrement de voir à un instant t si la valeur évolue mais permet surtout de savoir où sont placés les supports et résistances dans les marchés financiers :

Pour la moyenne depuis 2015 :
INPUT

{
   "aggs":{
      "calcul":{
         "avg":{
	    "field":"Close"
	 }
      }
   }
}

OUTPUT

{
    "aggregations": {
       "calcul": {
          "value": 376.1153092069974
	}
    }
}

Pour la moyenne entre les 20 jours qui précédent une date (date comprise dans la moyenne) :

INPUT

{
    "size": 0,
    "query": {
        "range": {
          "Date": {
            "gte": "2021-06-27||-20d"
          }
        }
    },
    "aggs":{
        "moyenne":{
	    "avg": {
                "field": "Close"
            }
	}
    }
}

OUTPUT

{
    "aggregations": {
	"moyenne": {
	    "value": 2253.8173246837796
	}
    }
}

Il est aussi assez intéressant de voir que la valeur minimale par an de l'Ethereum augmente chaque année (à une exception) :

INPUT

{
  "size": 0,
  "aggs": {
    "logs_per_month": {
      "date_histogram": {
        "field": "Date",
        "interval": "year"
      },
      "aggs":{
          "calcul":{
	      "min":{
	          "field":"Low"
	      }
	   }
       }
      }
   }
}

OUTPUT

{
"aggregations": {
	"logs_per_month": {
		"buckets": [
			{
			    "key_as_string": "2015-01-01T00:00:00.000Z",
			    "key": 1420070400000,
			    "doc_count": 147,
			    "calcul": {
				"value": 0.4208970069885254
			    }
			},
			{
			    "key_as_string": "2016-01-01T00:00:00.000Z",
			    "key": 1451606400000,
			    "doc_count": 366,
			    "calcul": {
				"value": 0.9298350214958191
			    }
			},
			...
}

Le doc_count correspond au nombre de jours. Normalement la valeur doit se rapprocher du nombre de jours dans une année mais la première et dernière itération possède des nombres éloignés de ce qu'on voulait avoir car le dataset commence et se finit en milieu d'année.

tous les résultats :

Année Prix minimal
2015 $0.42
2016 $0.92
2017 $7.98
2018 $82.82
2019 $102.93
2020 $95.18
2021 $718.10

Même si l'Ethereum a pris énormément de valeurs durant ces dernières années, je me suis demandé combien de jours il a perdu ou gagné. Nous pouvons trouver cela en regardant si son prix a été supérieur entre le début (Open) et fin de journée (Close) :

INPUT

{
    "size" : 0,
    "query": {
        "bool": {
            "must": [{
                "script": {
                    "script": "doc['Close'].value > doc['Open'].value"
                }
            }]
        }
    }
}

OUTPUT

"hits": {
   "total": {
      "value": 1079,
         "relation": "eq"
      }

Nous en avons 1079, ce qui veut dire qu'il y a 50,14% (1079/2152*100) de jours qui se terminent positifs et 49,86 qui se terminent négatifs.

En général une baisse du prix fait diminuer la capitalisation du marché. Pour vérifier cela, je vais faire la moyenne du prix et la moyenne de la capitalisation du marché par mois pour minimiser le nombre d'exeptions.

INPUT

{
  "size": 0,
  "aggs": {
    "logs_per_month": {
      "date_histogram": {
        "field": "Date",
        "interval": "month"
      },
      "aggs":{
          "prix_moyen":{
              "avg":{
	          "field":"Close"
	      }		
	  },
	  "capitalisation_moyenne":{
	      "avg":{
	          "field":"Market Cap"
	      }
	  }
      }
    }
  }
}

OUTPUT

{
    "key_as_string": "2018-11-01T00:00:00.000Z",
    "key": 1541030400000,
    "doc_count": 30,
    "prix_moyen": {
        "value": 169.04776992797852
    },
    "capitalisation_moyenne": {
	"value": 1.7442884608E10
    }
},
    {
    "key_as_string": "2018-12-01T00:00:00.000Z",
    "key": 1543622400000,
    "doc_count": 31,
    "prix_moyen": {
        "value": 108.99809732744771
    },
    "capitalisation_moyenne": {
        "value": 1.1320000115612904E10
    }
}
...

Maintenant, pour touver le nombre d'Ethereum en circulation sur le marché par jour, il suffit de diviser la capitalisation du marché par son prix :

INPUT

{
  "size": 0,
  "aggs": {
    "logs_per_day": {
      "date_histogram": {
        "field": "Date",
        "interval": "day"
      },
      "aggs":{
          "prix_moyen":{
              "avg":{
	          "field":"Close"
	      }		
	  },
	  "capitalisation_moyenne":{
	      "avg":{
	          "field":"Market Cap"
	      }
	  },
	  "nombre_ethereum":{
	      "bucket_script": {
	          "buckets_path": {
		      "my_var1": "prix_moyen",
		      "my_var2": "capitalisation_moyenne"
		  },
	          "script":"params.my_var2 / params.my_var1"
	      }
	  }
      }
    }
  }
}

OUTPUT

{
    "key_as_string": "2018-04-02T00:00:00.000Z",
    "key": 1522627200000,
    "doc_count": 1,
    "prix_moyen": {
        "value": 386.42498779296875
    },
    "capitalisation_moyenne": {
	"value": 3.8093279232E10
    },
    "nombre_ethereum": {
	"value": 9.857871627185991E7
    }
},
...

OpenSearch nous propose des fonctionnalités permettant directement d'obtenir des statistiques sur les fields de notre choix, comme par exemple :

INPUT

{
  "size": 0,
  "aggs": {
    "extended_stats_taxful_total_price": {
      "extended_stats": {
        "field": "Close"
      }
    }
  }
}

OUTPUT

{
    "aggregations": {
        "extended_stats_taxful_total_price": {
	    "count": 2152,
	    "min": 0.4348289966583252,
	    "max": 4168.701171875,
	    "avg": 376.1153092069974,
	    "sum": 809400.1454134583,
	    "sum_of_squares": 1.0545528611111829E9,
	    "variance": 348571.13157379715,
	    "variance_population": 348571.13157379715,
	    "variance_sampling": 348733.1823090709,
	    "std_deviation": 590.3991290422075,
	    "std_deviation_population": 590.3991290422075,
	    "std_deviation_sampling": 590.5363513866617,
	    "std_deviation_bounds": {
	        "upper": 1556.9135672914124,
	        "lower": -804.6829488774176,
	        "upper_population": 1556.9135672914124,
	        "lower_population": -804.6829488774176,
	        "upper_sampling": 1557.1880119803209,
	        "lower_sampling": -804.9573935663261
	    }
        }
    }
}

opensearch_ethereum's People

Contributors

baptistr avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.