Каков наилучший способ вычисления максимальных и минимальных значений для одного списка для каждого отдельного значения другого списка в Python? - PullRequest
0 голосов
/ 18 февраля 2020

Скажем, у меня есть три списка парных чисел c данных в Python. Списки для дня года (число от 1 до 365), часа дня (число от 0 до 24) и соответствующей температуры в это время. Ниже приведены примеры списков:

day_of_year = [1,1,1,1,1,1,1,1,1,1,1,1,1,1]      #day = Jan 1 in this example
hour_of_day = [2,4,6,8,10,12,14,16,18,20,22,24]
temperature =[23.1,22.0,24.1,26.5,23.8,40.1,32.7,41.3,29.4,36.4,22.0,24.1]

У меня есть эти почасовые парные данные для местоположения за весь год (я только что показал упрощенные списки выше). Таким образом, для каждого дня у меня есть 24 day_of_year значения (которые повторяют одно и то же число, в данном примере день = 1) и 24 temperature значения, поскольку они являются почасовыми данными. Я пытаюсь спроектировать для l oop, который позволяет мне перебирать эти данные для расчета и использования максимальной и минимальной температуры для каждого дня года, поскольку другая функция, которую использует мой код, должна вызывать эти значения. Что было бы лучшим способом для ссылки на все значения температуры, где day_of_year одинаковы для расчета максимальной и минимальной температуры для каждого дня.

У меня есть функция, которая принимает следующие входные данные:

minimum_temp_today, minimum_temp_tomorrow, maximum_temp_today, maximum_temp_yesterday

Мне нужно выяснить, как получить эти значения для каждого дня года. Я ищу предложения о наилучшем способе сделать это. Любые предложения / советы будут очень признательны!

Ответы [ 2 ]

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

Вы можете использовать pandas, что делает это довольно эффективно. Я использую pandas 1.0.1. В итоге мы используем именованное агрегирование для этой задачи.

import pandas as pd

df = pd.DataFrame({'day_of_year': day_of_year, 'hour_of_day': hour_of_day, 'temperature': temperature})

print(df)

    day_of_year  hour_of_day  temperature
0             1            2         23.1
1             1            4         22.0
2             1            6         24.1
3             1            8         26.5
4             1           10         23.8
5             1           12         40.1
6             1           14         32.7
7             1           16         41.3
8             1           18         29.4
9             1           20         36.4
10            1           22         22.0
11            1           24         24.1


df.groupby('day_of_year').agg( \
    min_temp=('temperature', 'min'),
    max_temp=('temperature', 'max')) \
  .reset_index() \
  .to_dict('records')

[{'day_of_year': 1, 'min_temp': 22.0, 'max_temp': 41.3}]

Теперь предположим, что у нас есть данные более чем за один день.

   day_of_year  min_temp  max_temp
0          1.0      22.0      41.3
1          2.0      24.0      26.0
2          3.0      24.5      42.3


grouped = df.groupby('day_of_year') \
            .agg(min_temp=('temperature', 'min'),
                 max_temp=('temperature', 'max')) \
            .reset_index()


tmrw = grouped.shift(-1) \
              .rename( \
                columns={'min_temp': 'min_temp_tmrw', 
                         'max_temp': 'max_temp_tmrw'}) \
              .drop('day_of_year', axis=1)

pd.concat([grouped, tmrw], axis=1).to_dict('records')

[{'day_of_year': 1.0,
  'min_temp': 22.0,
  'max_temp': 41.3,
  'min_temp_tmrw': 24.0,
  'max_temp_tmrw': 26.0},
 {'day_of_year': 2.0,
  'min_temp': 24.0,
  'max_temp': 26.0,
  'min_temp_tmrw': 24.5,
  'max_temp_tmrw': 42.3},
 {'day_of_year': 3.0,
  'min_temp': 24.5,
  'max_temp': 42.3,
  'min_temp_tmrw': nan,
  'max_temp_tmrw': nan}]
0 голосов
/ 18 февраля 2020

Существует множество способов приблизиться к этому, в зависимости от того, какие структуры данных вы хотите использовать. Если вас не волнует, когда происходят минимальное и максимальное значения, то лично я бы сделал что-то вроде этого.

from collections import defaultdict

daily_temps = defaultdict(list)
for day, value in zip(day_of_year, temperature):
     daily_temps[day].append(value)

ranges = dict()
for day, values in temps.items():
    ranges[day] = (min(values), max(values))

По сути, вы создаете промежуточное значение dict, которое отображает каждый день год к списку всех измерений за этот день. Затем на втором шаге вы используете это dict для создания вашего окончательного dict, который отображает каждый день года в tuple, который является минимальным и максимальным значением, записанным для этого дня.

...