In [1]:
import sys
sys.path.append('C:\Users\Chrisi\Desktop\Studium\iv\Project\DirtyDrive')
sys.path.append('C:\Users\Chrisi\Desktop\Studium\iv\Project\DirtyDrive\DirtyDrive')
sys.path

import pandas as pd
import numpy as np
import django, os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DirtyDrive.settings')
#settings.configure()
django.setup()

from django.contrib.gis import gdal
gdal.HAS_GDAL

from DirtyDrive import db_saver
import datetime

from DirtyDrive.models import CityDistrict, DriveNowCarType, DriveNowCar, DriveNowChargingStation, DriveNowPetrolStation
from django.db import connection
from django.db.models import Count, Avg
from django.contrib.gis.geos import Point, Polygon

import db_controller
c = db_controller.db_controller()

In [2]:
c.get_available_dates()[0]


Out[2]:
{'available': 68023,
 'day': datetime.datetime(2016, 12, 1, 0, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)}

In [3]:
# prozentual Dirt Anteil in Zeit

clean_levels = ['VERY_CLEAN', 'CLEAN', 'REGULAR', 'POOR']

#todo nochmal drüber denken
for s in clean_levels:
    print(s, DriveNowCar.objects.filter(innerCleanliness=s).count()*5 /60 /350)


('VERY_CLEAN', 20)
('CLEAN', 44)
('REGULAR', 33)
('POOR', 7)

In [49]:
# % poor

def dictfetchall(cursor):
    "Return all rows from a cursor as a dict"
    columns = [col[0] for col in cursor.description]
    return [
        dict(zip(columns, row))
        for row in cursor.fetchall()
    ]

from django.db import connection

def getDayRangeOriginDF(fromDate,toDate):

    #count cars by citydistrict
    with connection.cursor() as cursor:
        cursor.execute(
                       'SELECT dis.id, dis.name, count(car.id) As counter \
    FROM public."DirtyDrive_citydistrict" as dis, public."DirtyDrive_drivenowcar" as car \
    WHERE ST_Contains(dis.polygon, car.point) AND \
    car.datetime BETWEEN to_date(\''+fromDate+'\',\'YYYY-MM-DD\') AND to_date(\''+toDate+'\',\'YYYY-MM-DD\') \
    GROUP BY dis.id;'
                       )
        #res = cursor.fetchall()
        df_citydistrict = pd.DataFrame(dictfetchall(cursor))


    with connection.cursor() as cursor:
        cursor.execute(
                       'SELECT dis.id, dis.name, car."innerCleanliness" as clean, count(car.id) As count \
    FROM public."DirtyDrive_citydistrict" as dis, "DirtyDrive_drivenowcar" as car \
    WHERE  ST_Contains(dis.polygon, car.point) AND \
    car.datetime BETWEEN to_date(\''+fromDate+'\',\'YYYY-MM-DD\') AND to_date(\''+toDate+'\',\'YYYY-MM-DD\') \
    GROUP BY dis.id , car."innerCleanliness" \
    ;'
                       )
        #res = cursor.fetchall()
        df_clean_group = pd.DataFrame(dictfetchall(cursor))

    #df_clean_group

    df = pd.merge(df_clean_group, df_citydistrict[['id', 'counter']], on='id')
    df['relative'] = df['count']/df['counter']

    #df[df['clean']=='POOR']
    df_to_save = df.sort_values(['relative'], ascending=False)
    
    return df_to_save

import json
    
def safeDateRangeOriginDF(df, filemane):
    
    #filemane = "origin_day1-day7.json"
    dic =[]
    for i, values in enumerate(df[df['clean'] == 'POOR'].values):
        #print values
        dic.append ({'clean':values[0], 'count': int(values[1]), 'id': int(values[2]), \
                               'name': values[3], 'counter': int(values[4]), \
                       'relative': float("%.4f" % round(values[5],4)) })
    dump = json.dumps(dic)
    with open(filemane, "w") as text_file:
            text_file.write(dump)
    return dic
        
def safemuenchengeojson():
    
    filemane = "gen/muenchen.geo.json"
    features = []
    for cd in CityDistrict.objects.order_by("id").raw('SELECT *, ST_AsGeoJSON(polygon) FROM public."DirtyDrive_citydistrict" ORDER BY id'):
        p = geojson.loads(cd.st_asgeojson)
        the_id = cd.id
        df = df_to_save[df_to_save['id'] == the_id]

        properties={"id": cd.id, "name": cd.name}

        print(properties)
        f = Feature(geometry=p, properties=properties)
        features.append(f)

    fc = FeatureCollection(features)
    dump = geojson.dumps(fc, sort_keys=False)

    print("falid: ", geojson.is_valid(geojson.loads(dump))['valid'])

    with open(filemane, "w") as text_file:
        text_file.write(dump)

In [51]:
fromDate = '2016-12-06'
toDate = '2016-12-08'
df_to_save = getDayRangeOriginDF('2016-12-06','2016-12-08')
bb = df_to_save.sort_values('id')
bb[bb['id'] == 23]
bb


Out[51]:
clean count id name counter relative
1 POOR 135 1 Altstadt-Lehel 2508.0 0.053828
0 CLEAN 1011 1 Altstadt-Lehel 2036.0 0.496562
3 VERY_CLEAN 412 1 Altstadt-Lehel 4808.0 0.085691
2 REGULAR 478 1 Altstadt-Lehel 3951.0 0.120982
5 POOR 125 2 Ludwigsvorstadt-Isarvorstadt 2531.0 0.049388
7 VERY_CLEAN 595 2 Ludwigsvorstadt-Isarvorstadt 1406.0 0.423186
4 CLEAN 1092 2 Ludwigsvorstadt-Isarvorstadt 3686.0 0.296256
6 REGULAR 696 2 Ludwigsvorstadt-Isarvorstadt 5254.0 0.132470
11 VERY_CLEAN 811 3 Maxvorstadt 10324.0 0.078555
9 POOR 386 3 Maxvorstadt 2476.0 0.155897
8 CLEAN 1763 3 Maxvorstadt 8979.0 0.196347
10 REGULAR 991 3 Maxvorstadt 5432.0 0.182437
13 POOR 238 4 Schwabing-West 2778.0 0.085673
14 REGULAR 1324 4 Schwabing-West 271.0 4.885609
12 CLEAN 1986 4 Schwabing-West 8379.0 0.237021
15 VERY_CLEAN 1260 4 Schwabing-West 6993.0 0.180180
18 REGULAR 1162 5 Au-Haidhausen 5453.0 0.213094
16 CLEAN 1565 5 Au-Haidhausen 3339.0 0.468703
19 VERY_CLEAN 751 5 Au-Haidhausen 1584.0 0.474116
17 POOR 208 5 Au-Haidhausen 6066.0 0.034289
22 REGULAR 630 6 Sendling 3068.0 0.205346
20 CLEAN 1189 6 Sendling 2097.0 0.567000
21 POOR 136 6 Sendling 73.0 1.863014
23 VERY_CLEAN 576 6 Sendling NaN NaN
26 REGULAR 1259 7 Sendling-Westpark NaN NaN
27 VERY_CLEAN 1748 7 Sendling-Westpark NaN NaN
24 CLEAN 1917 7 Sendling-Westpark NaN NaN
25 POOR 330 7 Sendling-Westpark NaN NaN
28 CLEAN 579 8 Schwanthalerhoehe NaN NaN
29 POOR 155 8 Schwanthalerhoehe NaN NaN
... ... ... ... ... ... ...
58 REGULAR 141 15 Trudering-Riem NaN NaN
59 CLEAN 2705 16 Ramersdorf NaN NaN
60 POOR 840 16 Ramersdorf NaN NaN
61 REGULAR 2408 16 Ramersdorf NaN NaN
62 VERY_CLEAN 1040 16 Ramersdorf NaN NaN
66 VERY_CLEAN 666 17 Obergiesing-Fasangarten NaN NaN
65 REGULAR 756 17 Obergiesing-Fasangarten NaN NaN
64 POOR 130 17 Obergiesing-Fasangarten NaN NaN
63 CLEAN 1787 17 Obergiesing-Fasangarten NaN NaN
67 CLEAN 2895 18 Untergiesing-Harlaching NaN NaN
68 POOR 359 18 Untergiesing-Harlaching NaN NaN
69 REGULAR 1758 18 Untergiesing-Harlaching NaN NaN
70 VERY_CLEAN 1054 18 Untergiesing-Harlaching NaN NaN
71 CLEAN 2687 19 Thalkirchen-Obersendling-Forstenried-Fuerstenr... NaN NaN
72 POOR 253 19 Thalkirchen-Obersendling-Forstenried-Fuerstenr... NaN NaN
73 REGULAR 1556 19 Thalkirchen-Obersendling-Forstenried-Fuerstenr... NaN NaN
74 VERY_CLEAN 957 19 Thalkirchen-Obersendling-Forstenried-Fuerstenr... NaN NaN
76 POOR 18 20 Hadern NaN NaN
78 VERY_CLEAN 235 20 Hadern NaN NaN
75 CLEAN 691 20 Hadern NaN NaN
77 REGULAR 640 20 Hadern NaN NaN
79 CLEAN 1064 21 Pasing-Obermenzing NaN NaN
80 POOR 103 21 Pasing-Obermenzing NaN NaN
81 REGULAR 686 21 Pasing-Obermenzing NaN NaN
82 VERY_CLEAN 244 21 Pasing-Obermenzing NaN NaN
83 CLEAN 73 23 Allach-Untermenzing NaN NaN
85 POOR 99 25 Laim NaN NaN
86 REGULAR 660 25 Laim NaN NaN
84 CLEAN 1410 25 Laim NaN NaN
87 VERY_CLEAN 899 25 Laim NaN NaN

88 rows × 6 columns


In [21]:
with connection.cursor() as cursor:
    cursor.execute(
                   'SELECT dis.id, dis.name, count(car.id) As counter \
FROM public."DirtyDrive_citydistrict" as dis, public."DirtyDrive_drivenowcar" as car \
WHERE ST_Contains(dis.polygon, car.point) AND \
car.datetime BETWEEN to_date(\''+fromDate+'\',\'YYYY-MM-DD\') AND to_date(\''+toDate+'\',\'YYYY-MM-DD\') \
GROUP BY dis.id;'
                   )
    aa =pd.DataFrame(dictfetchall(cursor))
    
aa


Out[21]:
counter id name
0 2036 1 Altstadt-Lehel
1 2508 2 Ludwigsvorstadt-Isarvorstadt
2 3951 3 Maxvorstadt
3 4808 4 Schwabing-West
4 3686 5 Au-Haidhausen
5 2531 6 Sendling
6 5254 7 Sendling-Westpark
7 1406 8 Schwanthalerhoehe
8 8979 9 Neuhausen-Nymphenburg
9 2476 10 Moosach
10 5432 11 Milbertshofen-Am
11 10324 12 Schwabing-Freimann
12 8379 13 Bogenhausen
13 2778 14 Berg
14 271 15 Trudering-Riem
15 6993 16 Ramersdorf
16 3339 17 Obergiesing-Fasangarten
17 6066 18 Untergiesing-Harlaching
18 5453 19 Thalkirchen-Obersendling-Forstenried-Fuerstenr...
19 1584 20 Hadern
20 2097 21 Pasing-Obermenzing
21 73 23 Allach-Untermenzing
22 3068 25 Laim

In [11]:
pd.DataFrame(safeDateRangeOriginDF(df_to_save, 'filemane'))


Out[11]:
clean count counter id name relative
0 POOR 79 271 15 Trudering-Riem 0.2915
1 POOR 840 6993 16 Ramersdorf 0.1201
2 POOR 155 1406 8 Schwanthalerhoehe 0.1102
3 POOR 263 2476 10 Moosach 0.1062
4 POOR 386 3951 3 Maxvorstadt 0.0977
5 POOR 977 10324 12 Schwabing-Freimann 0.0946
6 POOR 447 5432 11 Milbertshofen-Am 0.0823
7 POOR 708 8979 9 Neuhausen-Nymphenburg 0.0789
8 POOR 562 8379 13 Bogenhausen 0.0671
9 POOR 135 2036 1 Altstadt-Lehel 0.0663
10 POOR 330 5254 7 Sendling-Westpark 0.0628
11 POOR 359 6066 18 Untergiesing-Harlaching 0.0592
12 POOR 208 3686 5 Au-Haidhausen 0.0564
13 POOR 136 2531 6 Sendling 0.0537
14 POOR 125 2508 2 Ludwigsvorstadt-Isarvorstadt 0.0498
15 POOR 138 2778 14 Berg 0.0497
16 POOR 238 4808 4 Schwabing-West 0.0495
17 POOR 103 2097 21 Pasing-Obermenzing 0.0491
18 POOR 253 5453 19 Thalkirchen-Obersendling-Forstenried-Fuerstenr... 0.0464
19 POOR 130 3339 17 Obergiesing-Fasangarten 0.0389
20 POOR 99 3068 25 Laim 0.0323
21 POOR 18 1584 20 Hadern 0.0114

In [13]:
# clean 2 geojson
import geojson
from geojson import FeatureCollection, Feature


#safemuenchengeojson();

for a in range(1,9):
    for b in range(a+1,9):
        fromDate = '2016-12-0'+str(a)
        toDate = '2016-12-0'+str(b)
        filename = "gen/origin_"+str(a)+"-"+str(b-1)+".json"
        print filename
        df_to_save = getDayRangeOriginDF(fromDate,toDate)

        safeDateRangeOriginDF(df_to_save, filename)


gen/origin_1-1.json
gen/origin_1-2.json
gen/origin_1-3.json
gen/origin_1-4.json
gen/origin_1-5.json
gen/origin_1-6.json
gen/origin_1-7.json
gen/origin_2-2.json
gen/origin_2-3.json
gen/origin_2-4.json
gen/origin_2-5.json
gen/origin_2-6.json
gen/origin_2-7.json
gen/origin_3-3.json
gen/origin_3-4.json
gen/origin_3-5.json
gen/origin_3-6.json
gen/origin_3-7.json
gen/origin_4-4.json
gen/origin_4-5.json
gen/origin_4-6.json
gen/origin_4-7.json
gen/origin_5-5.json
gen/origin_5-6.json
gen/origin_5-7.json
gen/origin_6-6.json
gen/origin_6-7.json
gen/origin_7-7.json