Перебор списка фреймов данных в функции - PullRequest
1 голос
/ 21 февраля 2020

У меня есть набор данных с более чем 4000 строками, которые соответствуют часам солнечного света в течение всего года.

Я разбил этот фрейм данных в списке по месяцам, поэтому у меня есть несколько часов солнечного света в список из 12 данных. Вот пример.

      index   YYYY  MM  DD     H  DOY      ANGLE      AZIMUTH        
        812   2020   3  21   6.0   81   0.570550    89.931404  
        813   2020   3  21   7.0   81  11.781984    99.975618  
        814   2020   3  21   8.0   81  22.634332   110.842581  
        815   2020   3  21   9.0   81  32.658711   123.478690  
        816   2020   3  21  10.0   81  41.147775   139.003890 

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

Теперь я хочу выполнить итерацию по месяцам в функции, которая вычисляет теневые проекции.

Первый шаг, определите мою функцию месяца:

def month(n_month):
        df_month = df.loc[df['MM'] == n_month]
        return df_month

Второй шаг - сохранить месяцы в списке:

month_list = []
    for i in range(1, 13):
        month_list.append(month(i))

Третий шаг, итерация month_list в предварительно заданной функции: Эта функция заключается в назначении азимута и угла места для каждого часа солнечного света каждого месяца:

def shade_array (index):
        azimut = df.AZIMUT[index]
        altitude = df.ANGLE[index]
        shade = hillshade_beta(elevation, azimuth = azimut, altitude = altitude)
        return shade

Выходные данные - это массив.

И вот где я застреваю при попытке чтобы перебрать эту функцию над кадром данных evary в списке месяцев и сохранить массивы в новом списке:

array_list = []

for i in month_list:
    array_list.append(shade_array(i))

Это приводит к следующему сообщению об ошибке:

TypeError: Indexing a Series with DataFrame is not supported, use the appropriate DataFrame column

Можно ли выполнить итерацию списка фреймов данных?

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

1 Ответ

1 голос
/ 21 февраля 2020

Подумайте об использовании groupby для разбивки по месяцам, а затем создайте список массивов с пониманием списка, где промежуточный объект month_list не нужен. Ваша основная проблема заключается в методе shade_array(), где индекс равен фрейму данных. Таким образом, вместо df.AZIMUT[index] это должно быть index.AZIMUT или более четко использовать df в качестве параметра:

def shade_array(df):
   azimut = df['AZIMUT']
   altitude = df['ANGLE']
   shade = hillshade_beta(elevation, azimuth = azimut, altitude = altitude)
   return shade

shade_arrays = [shade_array(g) for i, g in df.groupby(['MM'])]

Еще лучше, запускать словарь в течение нескольких месяцев как индексы:

import calendar

shade_arrays = {calendar.month_name[i]:shade_array(g) for i, g in df.groupby(['MM'])}

shade_arrays['January']
shade_arrays['February']
shade_arrays['March']
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...