Commit f794c993 authored by Myriam Begel's avatar Myriam Begel

Finalisation du rendu

parent 2e7e6107
Pipeline #149 failed with stages
in 9 seconds
# Projet pour le cours Web Data Managment
Le projet va s'enrichir en fonctionalités au fur et à mesure
## Installation
Pour mettre en place le virtualenv, la base de données et peupler la base de données, exécuter le fichier init.sh.
Dans le dossier cloné, créer un fichier secret.py contenant un champ SECRET_KEY puis exécuter :
~~~~~
virtualenv .env --python=python3
source .env/bin/activate
pip install django
~~~~~
Ensuite, créez un fichier secret.py à la racine du projet, contenant la ligne:
~~~~~
SECRET_KEY='CE QUE VOUS VOULEZ'
~~~~~
Commentez les lignes 17 à 20 de generators/admin.py. QUi devraient ressembler à:
>try:
User.objects.get_by_natural_key('admin')
except User.DoesNotExist:
User.objects.create_superuser('admin', 'admin@example.io', '123456')
Dans le terminal qui vous a servi a créer l'environement virtuel (avec virtualenv):
~~~~~
./manage.py migrate
~~~~~
Décommentez les lignes 17 à 20 de generatos/admin.py.
Enfin, dans le terminal qui vous a servi a créer l'environement virtuel (avec virtualenv):
~~~~~
./manage.py runserver
~~~~~
Pour quitter l'environnement de production, `deactivate`. Il faut activer la source à chaque fois qu'on travaille dans le dossier.
Avant chaque utilisation du projet, activer le virtualenv `source .env/bin/activate` à la racine.
Pour quitter l'environnement de production, `deactivate`.
Pour lancer le serveur en local : `./manage.py runserver`
## But
Générer aléatoirement des données. Ces données seront une liste de dépenses mensuelles.
## Concrètement
En paramètre, il nous faut:
* le salaire du foyer
* (la composition du foyer)
* (le profil du foyer)
TODO
Le profil du foyer permettra d'orienter les dépenses. On propose une échelle de 1 à 3 pour chaque caractéristique. Est-ce que le foyer est fan de:
* voyage
* technologie
* voiture
* shopping
* sortie
Les dépenses seront distribuées dans les domaines suivants:
Générer une liste de dépenses annuelles à partir d'un profil de foyer.
* alimentation (courses + restaurants)
* habitat (loyer, prêt ou 0 si déjà propriétaire)
* factures (eau, gaz, électricité, Internet, TV, assurance, téléphone)
* transport (essence, train, avion, ...)
* loisirs
* économies
* extra (selon paramètres)
## Utilisation
L'initialisation de la base de données crée suffisamment d'Organization et de GeoCoordinates pour lancer les générations. Mais vous pouvez en rajouter dans l'interface web.
## Site web
On crée un Profile dans la version du générateur que l'on souhaite tester. Pour la v2, il faut renseigner les Person du foyer que l'on veut utiliser (au moins 1 adulte).
Pour le projet, nous avons choisi de faire une interface Web en Django. Le backend est donc en python.
A partir de la page d'accueil, on pourra récupérer la personalisation du profil. On pourra ensuite calculer les dépenses et les afficher en HTML en utilisant des Microdata. On pourra aussi télécharger un fichier récapitulant les dépenses au format RDFa.
On coche ensuite le Profile et le menu déroulant propose l'option "Generate new spendings".
{% extends 'base.html' %}
{% extends 'common/base.html' %}
{% block title %} Générateur de dépenses {% endblock %}
{% block body %}
<h1> Tableau des dépenses pour l'année 2017 </h1>
......
{% extends 'base.html' %}
{% block title %} Accueil - Générateur de dépenses {% endblock %}
{% block body %}
<h1> Générateur de budget </h1>
<p> Bienvenue sur la page du projet du cours Web Data Managment du MPRI, fait par Myriam Bégel et Thomas Dupriez.</p>
<p> Donnez en entrée un revenu annuel et nous allons générer un historique de dépenses sur un an. </p>
<form action="{% url 'generate' %}" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Générer" />
</form>
{% endblock %}
;;Ensemble;Décile 1;Décile 2;Décile 3;Décile 4;Décile 5;Décile 6;Décile 7;Décile 8;Décile 9;Décile 10
;;26 562;16 169;17 754;19 652;22 142;23 692;26 078;28 225;31 497;34 882;45 506
;ENSEMBLE;100,000;100,000;100,000;100,000;100,000;100,000;100,000;100,000;100,000;100,000;100,000
GroceryStore;01 - PRODUITS ALIMENTAIRES ET BOISSONS NON-ALCOOLISEES;16,418;17,818;18,486;18,527;17,781;17,770;17,179;16,510;16,192;15,131;13,480
BarOrPub;02 - BOISSONS ALCOOLISEES ET TABAC;2,989;3,680;3,740;3,343;3,491;3,423;2,999;2,749;2,546;2,827;2,393
;03 - ARTICLES D’HABILLEMENT ET CHAUSSURES;5,037;6,030;5,069;4,514;4,729;4,732;4,709;4,833;5,096;5,516;5,118
ClothingStore;031 - Tissus et vêtements yc services;3,674;4,472;3,774;3,348;3,437;3,491;3,417;3,458;3,667;4,097;3,661
ShoeStore;032 - Chaussures, yc location et réparation;0,919;1,175;1,048;0,875;0,863;0,861;0,920;0,893;0,940;0,886;0,868
;04 - LOGEMENT, EAU, GAZ, ELECTRICITE ET AUTRES COMBUSTIBLES;15,710;20,632;20,514;20,313;18,372;17,664;16,224;15,136;13,033;12,949;11,834
RealEstateAgent;041 - Loyers d habitation (nets des aides au logement) pour la résidence principale;6,972;10,768;9,710;10,248;9,118;8,543;7,405;6,852;5,499;4,937;3,698
HomeAndConstructionBusiness;043 - Travaux courants d’entretien et de réparation du logement (hors gros travaux);0,591;0,204;0,501;0,524;0,443;0,684;0,771;0,641;0,625;0,760;0,541
;044 - Autres services relatifs au logement (ordures, assainissement, eau, charges);3,012;4,057;3,977;3,628;3,369;2,963;2,799;2,668;2,581;2,457;2,910
WaterSupplier;0443 - Factures d’eau;0,806;0,798;0,969;0,946;0,840;0,869;0,878;0,797;0,784;0,748;0,650
RealEstateAgent;0444 - Charges collectives;2,210;3,259;3,013;2,682;2,529;2,094;1,921;1,871;1,800;1,711;2,259
EnergySupplier;045 - Electricité, gaz et autres combustibles;4,830;5,412;6,246;5,755;5,293;5,230;4,931;4,804;4,115;4,363;4,050
FurnitureRetailer;05 - MEUBLES, ARTICLES DE MENAGE ET ENTRETIEN COURANT DE LA MAISON;5,899;4,249;4,551;5,017;4,891;5,073;4,870;5,375;6,283;6,717;8,342
;06 - SANTE;1,818;1,756;1,943;2,020;2,208;1,887;1,860;1,733;1,838;1,603;1,664
Pharmacy;061 - Produits et appareils thérapeutiques, matériel médical;0,847;0,934;1,031;0,987;0,939;0,878;0,817;0,748;0,825;0,757;0,782
MedicalBusiness;062 - Services de consultation externe;0,832;0,674;0,811;0,911;1,143;0,865;0,901;0,818;0,908;0,714;0,697
Dentist;0622 - Soins dentaires;0,218;0,148;0,146;0,224;0,384;0,232;0,226;0,202;0,225;0,163;0,218
MedicalBusiness;0623 - Services paramédicaux (labo, radio, soins des auxiliaires médicaux et paramédicaux…);0,230;0,179;0,248;0,234;0,312;0,177;0,242;0,234;0,295;0,155;0,229
Hospital;063 - Services et soins hospitaliers;0,102;0,049;0,096;0,107;0,099;0,135;0,050;0,142;0,083;0,095;0,134
;07 - TRANSPORTS;17,356;13,705;14,059;14,833;16,674;16,904;18,487;18,806;18,722;18,399;18,292
;071 - Achats de véhicules;7,537;3,055;4,737;5,745;7,077;7,133;8,053;8,843;8,210;8,555;9,082
AutoRental;0711 - Achats d automobiles;7,142;2,932;4,500;5,541;6,684;6,834;7,493;8,457;7,715;8,001;8,665
MotorcycleDealer;0712 - Achats de motocycles;0,309;0,056;0,186;0,158;0,303;0,181;0,456;0,276;0,378;0,473;0,341
BikeStore;0713 - Achats de cycles;0,090;0,074;0,045;0,046;0,090;0,118;0,104;0,110;0,121;0,080;0,075
;072 - Frais d utilisation de véhicules personnels (entretien, essence, garagiste, parking, péage);6,829;5,981;6,759;6,783;7,136;7,745;8,030;7,118;7,578;6,743;5,239
AutoPartsStore;0721 - Pièces détachées et accessoires pour les véhicules personnels (hors ceux installés par un professionnel);0,572;0,192;0,389;0,417;0,790;0,772;1,039;0,383;0,978;0,568;0,213
GasStation;0722 - Carburants et lubrifiants, antigel…;4,793;4,527;4,912;4,926;4,927;5,555;5,472;5,244;5,080;4,707;3,518
AutoRepair;0723 - Services d’entretien et réparation des véhicules personnels;1,039;0,841;1,115;1,109;1,070;0,992;1,104;1,155;1,124;0,969;0,934
TransportOrganization;073 - Services de transport;1,822;3,321;1,718;1,501;1,513;1,207;1,288;1,701;1,737;1,835;2,365
;08 - COMMUNICATIONS;3,290;4,564;4,179;3,933;3,676;3,503;3,386;3,313;3,067;2,738;2,430
;081 - Communications et services postaux;3,290;4,564;4,179;3,933;3,676;3,503;3,386;3,313;3,067;2,738;2,430
PostOffice;0811 - Services postaux;0,102;0,068;0,101;0,219;0,072;0,076;0,077;0,089;0,095;0,097;0,112
InternetProvider;0813 - Services de téléphone, télégraphe et télécopie, internet, recharges téléphoniques;3,102;4,373;3,960;3,638;3,509;3,339;3,233;3,143;2,886;2,560;2,237
SportsClub/ ComputerStore/ BookStore/ MobilePhoneStore/ ToyStore;09 - LOISIRS ET CULTURE;9,611;7,725;8,021;7,429;8,098;8,307;8,992;9,609;9,896;10,682;12,601
;10 - ENSEIGNEMENT;0,663;1,682;0,755;0,402;0,565;0,460;0,487;0,528;0,543;0,674;0,778
;101 - Frais d enseignement, services éducatifs;0,663;1,682;0,755;0,402;0,565;0,460;0,487;0,528;0,543;0,674;0,778
ElementarySchool;1011 - Enseignement maternel et primaire;0,049;0,043;0,034;0,031;0,045;0,042;0,061;0,050;0,038;0,043;0,079
HighSchool;1012 - Enseignement secondaire;0,143;0,198;0,152;0,148;0,230;0,144;0,111;0,074;0,137;0,118;0,156
CollegeOrUniversity;1013 - Enseignement supérieur;0,294;1,317;0,428;0,107;0,167;0,198;0,161;0,283;0,251;0,267;0,207
School;1014 - Enseignement ne correspondant à aucun niveau particulier;0,109;0,118;0,045;0,081;0,090;0,046;0,130;0,103;0,079;0,129;0,176
;11 - RESTAURATION ET HÔTELS;6,551;6,036;4,286;4,712;5,081;5,255;5,825;6,498;6,807;7,978;8,981
;111 - Restauration;5,463;5,214;3,847;4,122;4,408;4,478;4,924;5,456;5,664;6,273;7,344
Restaurant;11111 - Repas pris dans un restaurant;1,897;1,416;0,958;1,262;1,066;1,342;1,407;1,679;2,003;2,500;3,294
BarOrPub / FastFoodRestaurant;11112 - Repas pris dans un café, bars ou assimilé;1,446;1,645;1,312;1,267;1,373;1,313;1,388;1,555;1,486;1,482;1,523
FoodEstablishment;1112 - Cantines;1,291;1,552;1,188;1,140;1,409;1,275;1,476;1,378;1,321;1,256;1,101
Hotel;112 - Services d hébergement;1,088;0,823;0,445;0,590;0,673;0,772;0,905;1,042;1,143;1,706;1,637
;12 - BIENS ET SERVICES DIVERS;14,656;12,122;14,402;14,955;14,430;15,026;14,982;14,916;15,979;14,784;14,088
BeautySalon;121 - Services et produits de soins personnels;2,763;2,573;2,788;2,850;2,809;2,765;2,638;2,792;2,918;2,669;2,786
JewelryStore;1231 - Articles de bijouterie de joaillerie et d’horlogerie;0,226;0,124;0,107;0,397;0,190;0,156;0,127;0,170;0,371;0,224;0,275
LeatherGoods;1232 - Autres effets personnels : maroquinerie, accessoires (briquet, parapluie, lunettes de soleil…), équipements pour bébés, articles funéraires;0,248;0,284;0,304;0,285;0,176;0,211;0,219;0,202;0,241;0,330;0,251
Store;1233 - Autres biens et services : cadeau offert (à des personnes extérieures au ménage);0,192;0,198;0,141;0,173;0,217;0,186;0,138;0,174;0,178;0,221;0,251
InsuranceAgency;124 - Protection sociale;0,998;0,291;0,580;0,595;0,709;1,034;1,219;1,261;1,483;1,049;1,042
InsuranceAgency;125 - Assurances;7,605;6,822;8,421;8,732;8,644;8,480;7,949;7,887;7,505;7,092;6,197
FinancialService;126 - Services financiers;0,474;0,532;0,552;0,509;0,506;0,490;0,491;0,503;0,483;0,427;0,389
;13 - HORS CHAMP DE LA CONSOMMATION FINALE (IMPOTS ET TAXES, GROS TRAVAUX, REMBOURSEMENT PRET, CADEAUX, PRELEVEMENT EMPLOYEUR, EPARGNE);32,814;36,663;14,988;15,927;19,027;21,497;26,743;31,345;33,543;36,188;59,564
GovernmentOrganization;131 - Impôts et taxes;10,564;2,400;3,070;3,175;4,263;5,103;6,645;7,894;9,861;12,835;28,128
GovernmentOrganization;1314 - Impôts sur le revenu;6,615;0,155;0,507;0,616;0,939;1,401;2,669;3,731;5,667;8,182;22,859
GovernmentOrganization;131A - Impôts et taxes du logement;3,750;2,035;2,197;2,437;3,121;3,529;3,831;4,004;4,105;4,444;4,975
BankOrCreditUnion;132 - Remboursements de prêts immobiliers;8,486;3,810;4,236;4,483;5,596;5,719;9,034;9,570;9,604;10,002;13,451
Store;133 - Aides et dons en argent offerts par le ménage et pensions;2,937;1,453;1,780;2,117;2,511;2,756;1,971;2,668;3,048;3,500;4,777
HomeAndConstructionBusiness;134 - Gros travaux dans le logement;7,112;26,823;2,805;2,687;3,085;4,347;4,609;6,895;6,870;6,522;9,300
BankOrCreditUnion;135 - Remboursements de crédits à la consommation;3,712;2,177;3,092;3,470;3,572;3,571;4,483;4,315;4,162;3,328;3,907
# Feuille de route
Le but est d'avoir le plus rapidement possible quelque chose de fonctionnel avec lequel on a définit le formalisme, au moins au minimum. Ensuite, on pourra enrichir le modèle.
## Programme
- [x] Générer des dépenses avec un nombre très restreint de possibilités en prenant un pourcentage fixe -> fixer le formalisme
- [x] Répartir selon les catégories de revenue
- [x] Ajouter de l'aléatoire
- [ ] Répartir avec aléas périodiques (Noël, soldes hiver-été, vacances scolaires)
- [x] Certaines choses pas tous les mois
- [x] Etendre le modèle avec plus de postes de dépenses
- [x] Etendre avec plus de magasins
- [x] Etendre avec des paramètres personalisés
- [ ] Intégrer les données d'un calendrier (avec le groupe qui génère des rendez-vous)
## Phase 1
### Postes de dépenses
* Produits alimentaires (20%)
* Habillement (5%)
* Loyer ou prêt immobilier (25%)
* Factures (8%)
* Carburant (5%)
* Epargne (37%)
### Formalisme
On peut s'intéresser aux items suivant de http://schema.org
* TradeAction (BuyAction and PayAction)
* PaymentMethod
* PriceSpecification
* LocalBusiness (trop de sous-items :/)
* Person
* Product
### Schéma/propriétés à utiliser pour BuyAction (resp. PayAction)
BuyAction (resp. PayAction)
* seller (resp. recipient) : Organization (the specific supermarket building for example, not the whole company, that could own multiple supermarkets)
* name: Text
* description: Text
* location: Place
* geo: GeoCoordinates
*latitude: Number
* longitude: Number
* priceSpecification: PriceSpecification
* price: Number (just the value, not the currency)
* priceCurrency: Text (the currency (in 3-letter ISO 4217 format))
* agent : Person (la personne à qui on génère le profil, peut-être pas le préciser à chaque fois)
* name: Text
* object : Product
* category (l'un des "Postes de Dépenses"?)
* name: Text
* startTime : DateTime
"Name","IsBuyAction","1DayYear","1DayMonth","1DayDay","1DayHour","PeriodDay","TimeRandomDay","TriggerRandom","Subcategory"
"Food","True",2017,1,3,19,7,1,5,"GroceryStore"
import csv
from common.models import GeoCoordinates, Organization
with open('organizations.csv') as f:
r = csv.DictReader(f, delimiter=',')
print("before")
for p in r:
g = GeoCoordinates(latitude=p['Latitude'], longitude=p['Longitude'])
g.save()
print("Geo saved")
o = Organization(name=p['Name'], subcategory=p['Subcategory'], location=g)
o.save()
print("Orga saved")
print("after")
#!/bin/bash
echo '### Initialisation du projet'
echo '### Mise en place du virtualenv'
virtualenv .env --python=python3
. .env/bin/activate
pip install django
pip install django-extensions
echo '### Initialisation de la base de données'
sed -i -e ' 16,19 s/^/# /g' common/admin.py
./manage.py migrate
sed -i -e ' 16,19 s/^# //g' common/admin.py
echo '### Remplissage de la base de données'
./manage.py runscript dummy_organizations
./manage.py runscript import_organizations
import csv
import datetime as d
from generator.models import *
def save_needs():
''' A partir de bases de données csv, on importe des GeneralNeed
et des SingularNeed.
Le séparateur est une virgule.
On suppose que les champs sont ceux du code suivant
'''
with open('general_needs.csv') as f:
r = csv.DictReader(f, delimiter=',')
for p in r:
gn = GeneralNeed(name=p['Name'])
gn.is_buy_action = (p['IsBuyAction']=='True')
gn.firstDay = d.datetime(year=int(p['1DayYear']), month=int(p['1DayMonth']), day=int(p['1DayDay']), hour=int(p['1DayHour']))
gn.period = int(p['PeriodDay'])
gn.timeRandomness = int(p['TimeRandomDay'])
gn.triggerRandomness = int(p['TriggerRandom'])
gn.subcategory = p['Subcategory']
gn.save()
with open('singular_needs.csv') as fi:
re = csv.DictReader(fi, delimiter=',')
for p in re:
SingularNeed(setting=p['Setting'], amount=int(p['Amount']), hazard=int(p['Hazard'])).save()
save_needs()
# Organization
g = GeoCoordinates(latitude=48.70594, longitude=2.25371)
g.save()
o = Organization(name="Auchan", description='Supermarché', subcategory='GroceryStore', location=g)
o.save()
# Gens
a = Person(name='Alice')
a.save()
#Profile
p = Profile(salary=10000)
p.save()
p.people.add(a)
p.save()
......@@ -2,12 +2,12 @@ import csv
import datetime as d
from common.models import GeoCoordinates, Organization
def from_insee():
def run():
g = GeoCoordinates()
g.longitude = 45.2
g.latitude = 2.0
g.longitude = 2.2935088
g.latitude = 48.8583513
g.save()
with open('data.csv') as f:
with open('from_insee.csv') as f:
r = csv.reader(f, delimiter=',')
for p in r:
o = Organization()
......@@ -15,4 +15,3 @@ def from_insee():
o.subcategory = p[0]
o.name = p[0]
o.save()
import csv
from common.models import GeoCoordinates, Organization
def run():
with open('organizations_palaiseau.csv') as f:
r = csv.DictReader(f, delimiter=',')
for p in r:
g = GeoCoordinates(latitude=p['Latitude'], longitude=p['Longitude'])
g.save()
o = Organization(name=p['Name'], subcategory=p['Subcategory'], location=g)
o.save()
"Setting","Amount","Hazard"
"FoodM",15,5
"FoodF",13,4
"FoodElementary",17,4
"FoodMiddle",15,4
"FoodHigh",16,5
"FoodCollege",17,6
......@@ -26,7 +26,7 @@ SECRET_KEY = secret.SECRET_KEY
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['perso.crans.org', 'localhost']
ALLOWED_HOSTS = ['perso.crans.org', 'localhost', '127.0.0.1']
# Application definition
......@@ -38,6 +38,7 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_extensions',
'common',
'v1',
'v2',
......
This diff is collapsed.
# -*- coding: utf-8 -*-
# Generated by Django 1.10.6 on 2017-03-02 14:39
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('v1', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='profile',
name='people',
),
]
from __future__ import unicode_literals
from django.db import models
from common.models import Person
class Profile(models.Model):
name = models.CharField(max_length=50, default='Default')
......
......@@ -4,7 +4,7 @@ from common.models import *
import datetime as d
import csv
dataCSV = 'data.csv'
dataCSV = 'from_insee.csv'
def web_page(request, profile):
""" Just render the HTML and call the generate function """
......@@ -59,7 +59,7 @@ def purchase(price, person, organization, trade, **kwargs):
category = extract(kwargs, 'category', organization.subcategory)
if weeks ==0:
raise Exception('You must define the frequency')
timesAYear = extract(kwargs, 'timesAYear', int(52/(weeks+4*months)))
timesAYear = extract(kwargs, 'timesAYear', int(52/(weeks)))
priceOnce = price / timesAYear
is_buy_action = trade == 'BuyAction'
for i in range(timesAYear):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment