From b2c461eb846e5f22f3ffca4b52c805cefe84544f Mon Sep 17 00:00:00 2001 From: DUCHATEAU FABIEN <fabien.duchateau@univ-lyon1.fr> Date: Mon, 15 Jul 2019 23:28:44 +0200 Subject: [PATCH] comments from ff --- README.md | 17 +++++++++-------- doc/index.html | 2 +- mongiris/tests/dummy.py | 6 ++++++ paper.bib | 8 +++++++- paper.md | 9 +++++---- paper.pdf | Bin 4328691 -> 4329063 bytes 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 6ca7990..eb50d6a 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ # mongiris package -This package is an interface for querying French administrative areas ([IRIS](https://www.insee.fr/fr/metadonnees/definition/c1523), similar to neighborhoods) stored as documents in MongoDB. +This Python package is an interface for querying French administrative areas ([IRIS](https://www.insee.fr/fr/metadonnees/definition/c1523), similar to neighborhoods) stored as documents in MongoDB. Each IRIS includes indicators (e.g., average income, types of housings, number of bakeries or schools) that are useful for social sciences studies, for house/neighborhood recommendation, etc. In this package, the ~50,000 IRIS and their 350-650 indicators have been integrated and stored in the [GeoJSON format](https://geojson.org/), and an API enables the manipulation of these data. -## Pré-requis +## Prerequisites - Python, version >=3 - [MongoDB](https://www.mongodb.com/), version >=4, in which it is necessary to import the IRIS database (see Installation). ## Installation -To install mongiris: +To install mongiris (and its dependencies): ``` python3 -m pip install git+https://fduchate@gitlab.liris.cnrs.fr/fduchate/mongiris.git#egg=mongiris @@ -30,7 +30,6 @@ mongorestore --archive=/path/to/dump-dbinsee.bin where `/path/to/` indicates the path to the downloaded dump database. <!--(provided with the source package mongiris in `mongiris/data/dump/dump-dbinsee.bin`).--> This restoration may take a few minutes as the geospatial indexes are rebuilt. - ## Usage In MongoDB, the database is named `dbinsee`. It contains three collections: @@ -41,10 +40,10 @@ In MongoDB, the database is named `dbinsee`. It contains three collections: To manipulate the database, simply connect to MongoDB by creating an object of the `Mongiris` class. Using this object, twenty methods are available for querying the data. -Below is a minimal example of connection and queries: +Below is a minimal example of connection and queries (from `tests/dummy.py` file): ``` -from mongiris.main import Mongiris +from mongiris.api import Mongiris db = Mongiris() @@ -53,12 +52,14 @@ counts = db.count_documents(db.collection_indic, {}) # get complete information about iris identified with code 593500203 iris = db.find_one_document(db.collection_iris, {"properties.CODE_IRIS": "593500203"}) +print(iris) # get iris which contains coordinates 3.685111, 46.514643 -iris = db.point_in_which_iris([3.685111, 46.514643]) +iris2 = db.point_in_which_iris([3.685111, 46.514643]) +print(iris2) ``` -More examples, including testing geospatial queries, are available in the `tests/mongiris_test.py` file. +More examples, including testing geospatial queries, are available in the `tests/api_tests.py` file. ## Contributors diff --git a/doc/index.html b/doc/index.html index ac31c6b..4e487a3 100644 --- a/doc/index.html +++ b/doc/index.html @@ -22,8 +22,8 @@ <section id="section-intro"> The package <code>mongiris</code> consists of two modules: <ul> + <li><a href="api.html">api</a>, for manipulating IRIS data.</li> <li><a href="integrator.html">integrator</a>, for integrating data sources. There should be no need to run this module since the MongoDB dumps are provided.</li> - <li><a href=""api.html>api</a>, for manipulating IRIS data.</li> </ul> </section> diff --git a/mongiris/tests/dummy.py b/mongiris/tests/dummy.py index 6e4a216..686ddcc 100644 --- a/mongiris/tests/dummy.py +++ b/mongiris/tests/dummy.py @@ -1,3 +1,9 @@ +#!/usr/bin/env python +# encoding: utf-8 +# ============================================================================= +# Dummy test for mongiris. +# ============================================================================= + from mongiris.api import Mongiris import json diff --git a/paper.bib b/paper.bib index ce33532..9f41b76 100644 --- a/paper.bib +++ b/paper.bib @@ -39,10 +39,16 @@ keywords = "Home buyer, Real estate website, Housing search behavior, Case-based @misc{datafrance, title={DataFrance}, howpublished={https://datafrance.info/}, - note = {https://datafrance.info/}, year=2018 } +@misc{insee-iris, + title={{Definition of IRIS}}, + author={INSEE}, + howpublished={http://www.insee.fr/en/metadonnees/definition/c1523}, + year=2016 +} + @inproceedings{airbnb2017, title={{Comment les h{\^o}tes et clients d'Airbnb parlent-ils des lieux ? Une analyse exploratoire {\`a} partir du cas parisien}}, booktitle={EXCES-EXtraction de Connaissances {\`a} partir de donn{\'e}Es Spatialis{\'e}es}, diff --git a/paper.md b/paper.md index 577dbe1..5b489de 100644 --- a/paper.md +++ b/paper.md @@ -11,7 +11,7 @@ authors: orcid: 0000-0001-6803-917X affiliation: 1 - name: Franck Favetta - orcid: 0000-0000-0000-0000 + orcid: 0000-0003-2039-3481 affiliation: 1 affiliations: - name: LIRIS, UMR5205 Université Claude Bernard Lyon 1, Lyon, France @@ -27,11 +27,12 @@ For instance, social science researchers study the relationship between citizens National institutions (e.g., Open Data initiatives, INSEE in France) may produce data about neighborhoods, but they are usually spread in heterogenous files (databases, spreadsheets). Initiatives such as DataFrance [@datafrance] enable their visualization on a map, but their authors do not share collected data. Thus, researchers have to manually collect and integrate raw data from national institutions, a challenging issue refered to as `data integration` [@christen2012data]. Although some tools such as OpenRefine or Talend facilitates this integration, they require expert knowledge and programming skills. -For these reasons, we propose the package Mongiris, which includes integrated data about French neighborhhods (IRIS) and an API for manipulating this data. +The French administration provides data about IRIS [@insee-iris], a small division unit of the national territory for statistical purposes (mostly with the same number of residents, thus mainly small-sized in cities and wider in rural areas). +To ease the exploitation of IRIS, we propose the package Mongiris, which includes integrated data about these neighborhoods (IRIS) and an API for manipulating them. # Summary -The package is composed of two modules: integration and API. +The Python package is composed of two modules: integration and API. The `integration module` is responsible for extracting information from data sources. The module currently supports spreadsheets produced by [INSEE](https://www.insee.fr/). Since data evolve (e.g., statistics from INSEE are updated every few years), the integration module may be run. Note that new data may be stored in different database or collections so that the evolution can be studied. @@ -39,7 +40,7 @@ For most users, there is no need to use the integration module since the dump of The current dump contains roughly 37,000 IRIS with 375 indicators and 12,800 IRIS with 640 indicators. <!-- {362: 36530, 650: 11738, 627: 1057, 385: 79} --> -The `API module` includes common operations such as searching an IRIS (by IRIS code or according any field value), inserting, updating or deleting an IRIS. +The `API module` includes common operations such as searching for an IRIS (by IRIS code or according to any field value), inserting, updating or deleting an IRIS. It also provides geospatial operations useful in a research context: get IRIS given coordinates, get all adjacent or close IRIS from a given IRIS, find all IRIS in a given area, etc. The Mongiris package is currently used in Mapiris, a tool for visualizing and searching for IRIS. diff --git a/paper.pdf b/paper.pdf index 20f5b8813ab1de37c236958805e47a3ac3ed92f0..e842848952959a356ffff863df8aa0a5d7e08b2d 100644 GIT binary patch delta 10948 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 Istm&a08cR(vH$=8 delta 10576 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 Gkp2gq3|0RC -- GitLab