Я пытаюсь перебрать зональную статистику климатической переменной для нескольких регионов за несколько месяцев данных (каждая полоса в многоканальном растре - это отдельный временной шаг) на python. У меня 659 регионов (region_polys) и 72 временных шага данных (msla_tif_data). Я следовал: https://github.com/perrygeo/python-rasterstats/issues/175, чтобы затем добавить зональные сводки в список списков (2 измерения-полосы и фигуры), а затем сжать их в список словарей.
Затем я хочу иметь возможность преобразовать это в pandas фрейм данных (предварительно GeoDataFrame, но в настоящий момент все будет работать). К сожалению, на данный момент я могу создать только:
659 x 21 массив данных; имеет запись всех регионов, но только за один временной шаг
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
предварительный просмотр вывода:
введите описание изображения здесь -Также похоже, он дает одинаковое значение для всех полос здесь