Сумма базы данных по месту и времени - PullRequest
0 голосов
/ 29 февраля 2020

У меня проблема с для l oop в Python. Я хочу суммировать эти данные на основе времени и местоположения, без pandas. Эти данные находятся в базе данных MySQL (mysql верстак):

 Time     No_of_people      Location
----------------------------------------
07:00         20           Liberty City
07:15         25           Liberty City
07:30         20           Liberty City
07:45         30           Liberty City
08:00         21           Liberty City
...
07:00         10           San Andreas
07:15         15           San Andreas
07:30         20           San Andreas
07:45         25           San Andreas
08:00         30           San Andreas

Теперь я хочу, чтобы это было похоже на:

 Time     No_of_people      Location
----------------------------------------
07:00       116            Liberty City
08:00       120            Liberty City
...
07:00       100            San Andreas

Это то, что я сейчас сделал:

views.py:

def getData(request):

    api = 'http://localhost:8000/api/myData/'
    response = requests.get(api)
    myData = response.json()

    time = []
    no_of_people = []
    location = []    

    for hourly in myData:
        time.append(hourly['time'])
        no_of_people.append(hourly['no_of_people'])
        location.append(hourly['location'])

hour = []
    for x in range(7,24):
        hour.append(x)

uniqueLocation=[]

    for x in location:
        if x not in uniqueLocation:
            uniqueLocation.append(x)

    for uniqueIndex in uniqueLocation:
        for x in hour:
            sum =0
            for index, t in enumerate(time):
                x_time = t.split(":")[0]
                if int(x_time) == x and uniqueIndex == location[index]:
                    sum += no_of_people[index]
            print(str(sum))

    json_obj = {
        "time": time,
        "no_of_people": no_of_people,
        "location": location
    }
    return JsonResponse(data=json_obj)

1 Ответ

0 голосов
/ 29 февраля 2020

Вы хотите сгруппировать по местоположению, поэтому я предлагаю вам нацелиться на этот формат, который проще визуализировать, а затем попытаться построить вывод таблицы оттуда (для каждого города, для каждого времени, часа печати и людей / hr)

[
  {'location' : 'Liberty City', 'times': [{'hour' : '7:00', 'people' : 116}, ...]},
  ... 
] 

При работе практически с любой базой данных попытайтесь создать класс для объекта (строка, таблица, сегмент, отношение (вставьте здесь термин базы данных) и т. д. c). Затем вы можете изолировать logi c здесь, вместо того, чтобы загромождать основную функцию

class Location:
    def __init__(self, name):
        self.name = name 
        self.times = list()

    def __str__(self):
        s = ['{}\t{}\t{}'.format(k, t[k], self.name) for t in self.times for k in t.keys()] 
        return '\n'.join(s) 

    def add_time(self, hour, people):
        existing_people_for_hour = None
        for t in self.times:  # loop existing times, looking for the hour 
            existing_people_for_hour = t.get(hour) 
            if existing_people_for_hour is not None:
                t[hour] += people
                break  # found the hour to update, so break the loop
        if existing_people_for_hour is None:  # if the hour was never found, add to the times list 
            self.times.append({hour : people}) 

Имея это в наличии, используйте словарь для группировки значений местоположения, и вы сможете распечатать их в конце

locations = dict()
for d in myData:
    # parse each value out 
    hour = d['time'][:2] + ':00'
    p = int(d['no_of_people']) 
    loc = d['location']

    # get the location from the map, if exists, else create new one 
    l = locations.get(loc, Location(loc))
    l.add_time(hour, p)  # add the people for the time 

    locations[loc] = l  # upsert the new location 

for l in locations.values():
    print(l)

Выход

07:00   95  Liberty City
08:00   21  Liberty City
07:00   70  San Andreas
08:00   30  San Andreas
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...