Список словарей в pandas фрейме данных с записью для каждой пространственной области для каждой даты в python - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь перебрать зональную статистику климатической переменной для нескольких регионов за несколько месяцев данных (каждая полоса в многоканальном растре - это отдельный временной шаг) на python. У меня 659 регионов (region_polys) и 72 временных шага данных (msla_tif_data). Я следовал: https://github.com/perrygeo/python-rasterstats/issues/175, чтобы затем добавить зональные сводки в список списков (2 измерения-полосы и фигуры), а затем сжать их в список словарей.

Затем я хочу иметь возможность преобразовать это в pandas фрейм данных (предварительно GeoDataFrame, но в настоящий момент все будет работать). К сожалению, на данный момент я могу создать только:

  1. 659 x 21 массив данных; имеет запись всех регионов, но только за один временной шаг

  2. A 72 x 92 кадра данных; каждая запись - одна и та же область, но 92 поля - каждая полоса; каждая запись имеет данные для одного из этих диапазонов, в то время как другие - Nan, например, первая запись имеет первый диапазон данных, вторая - второй et c.

Может ли кто-нибудь посоветовать, как в конечном итоге я могу получить в своем фрейме данных 47,448 записей (659 x 72), поэтому по одной записи для каждого региона для каждой полосы?

#Import multiband raster and generate band indexes 
multiband_raster="/multilayer.tif"
with rio.open("/multilayer.tif") as msla_tif:
    band_indexes= msla_tif.indexes  
    msla_tif_data = msla_tif.read(1)
    msla_tif_meta = msla_tif.profile

#import region polygons 
region_polys = gpd.read_file('/GADM2_coast_regions.shp') 

#Iterate zonal statistics within each region along band indexes
all_band_summaries=[]
for b in band_indexes:
    band_summary=zonal_stats(region_polys, msla_tif_data, nodata=-999, affine=msla_tif_meta['transform'], prefix=f"band{b}_", band=b, geojson_out=True, copy_properties=True, stats="mean")
    all_band_summaries.append(band_summary) 

#seperate these into the regions and dates (from https://github.com/perrygeo/python-rasterstats/issues/175)
shape_summaries=list(zip(*all_band_summaries))



#workflow for issue 1
final=[{k: v for d in s for k, v in d.items()} for s in shape_summaries]

def flatten(kv, prefix=[]):
    for k, v in kv.items():
        if isinstance(v, dict):
            yield from flatten(v, prefix+[str(k)])
        else:
            if prefix:
                yield '_'.join(prefix+[str(k)]), v
            else:
                yield str(k), v

dataframe=pd.DataFrame({k:v for k, v in flatten(kv)} for kv in final)





#workflow for issue 2
final2=[{k: v for d in s for k, v in d.items()} for s in all_band_summaries]
dataframe2=pd.DataFrame({k:v for k, v in flatten(kv)} for kv in final2)

dataframe предварительный просмотр вывода:

предварительный просмотр вывода данных

dataframe2 предварительный просмотр вывода:

введите описание изображения здесь -Также похоже, он дает одинаковое значение для всех полос здесь

...