我有来自16个不同地区的数据。我想找一天,我看到第5%和95%的面积是绿色的(NDVI)。
到目前为止,我已经手动完成了它,但是我想在每个区域,每年在一个for循环中这样做。首先,我提取不同的地区和年份。其次,我发现5%和95%的绿化点。第三,提取5%绿化和95 %绿化的最小日。第四,我收集所有这些数据在每个生态区,包含了所有的年和天之间的差异95 %绿化和数据5%绿化。
每个区域(16)和每年(19)都这样做。因此,对于使用长脚本的计算机来说,这是大量的体力劳动和繁重的工作,请参见下面的部分内容:
x = pd.read_csv('D:/data.csv')
x = x[x['means'] > 0]
x = x[x['diff'] > -1.5]
x = x[x['area'] > 9318]
x = x.sort_values(by = 'doy')
AKB = x[x['name'] == 'Region1'].drop_duplicates(subset=['ID', 'Year'], keep = 'first')
AKB['cummulative_area'] = AKB.groupby(['Year'])['area'].cumsum()
AKT = x[x['name'] == 'Region2'].drop_duplicates(subset=['ID', 'Year'], keep = 'first')
AKT['cummulative_area'] = AKT.groupby(['Year'])['area'].cumsum()
#Find 5% and 95 % of the burned area, the respective days and subtract them to see development in fire season
AKB01 = AKB[AKB['Year'] == 2001]
AKB01fifth = AKB01[AKB01['cumulative_area'] > AKB01['area'].sum() * 0.05]
AKB01ninefifth = AKB01[AKB01['cumulative_area'] > AKB01['area'].sum() * 0.95]
AKB01 = AKB01ninefifth.doy.min() - AKB01fifth.doy.min()
AKB02 = AKB[AKB['Year'] == 2002]
AKB02fifth = AKB02[AKB02['cumulative_area'] > AKB02['area'].sum() * 0.05]
AKB02ninefifth = AKB02[AKB02['cumulative_area'] > AKB02['area'].sum() * 0.95]
AKB02 = AKB02ninefifth.doy.min() - AKB02fifth.doy.min()
AKB03 = AKB[AKB['Year'] == 2003]
AKB03fifth = AKB03[AKB03['cumulative_area'] > AKB03['area'].sum() * 0.05]
AKB03ninefifth = AKB03[AKB03['cumulative_area'] > AKB03['area'].sum() * 0.95]
AKB03 = AKB03ninefifth.doy.min() - AKB03fifth.doy.min()
AKB04 = AKB[AKB['Year'] == 2004]
AKB04fifth = AKB04[AKB04['cumulative_area'] > AKB04['area'].sum() * 0.05]
AKB04ninefifth = AKB04[AKB04['cumulative_area'] > AKB04['area'].sum() * 0.95]
AKB04 = AKB04ninefifth.doy.min() - AKB04fifth.doy.min()
...
AKB18 = AKB[AKB['Year'] == 2018]
AKB18fifth = AKB18[AKB18['cumulative_area'] > AKB18['area'].sum() * 0.05]
AKB18ninefifth = AKB18[AKB18['cumulative_area'] > AKB18['area'].sum() * 0.95]
AKB18 = AKB18ninefifth.doy.min() - AKB18fifth.doy.min()
AKB19 = AKB[AKB['Year'] == 2019]
AKB19fifth = AKB19[AKB19['cumulative_area'] > AKB19['area'].sum() * 0.05]
AKB19ninefifth = AKB19[AKB19['cumulative_area'] > AKB19['area'].sum() * 0.95]
AKB19 = AKB19ninefifth.doy.min() - AKB19fifth.doy.min()
AKT01 = AKB[AKB['Year'] == 2001]
AKT01fifth = AKB01[AKB01['cumulative_area'] > AKB01['area'].sum() * 0.05]
AKT01ninefifth = AKB01[AKB01['cumulative_area'] > AKB01['area'].sum() * 0.95]
AKT01 = AKT01ninefifth.doy.min() - AKT01fifth.doy.min()
AKT02 = AKT[AKT['Year'] == 2002]
AKT02fifth = AKT02[AKT02['cumulative_area'] > AKT02['area'].sum() * 0.05]
AKT02ninefifth = AKT02[AKT02['cumulative_area'] > AKT02['area'].sum() * 0.95]
AKT02 = AKT02ninefifth.doy.min() - AKT02fifth.doy.min()
...
AKBign = pd.DataFrame()
AKBign['year'] = np.arange(2001,2020,1)
AKBign['difference'] = [AKB01,AKB02,AKB03,AKB04,AKB05,AKB06,AKB07,AKB08,AKB09,AKB10,AKB11,AKB12,AKB13,AKB14,AKB15,AKB16,AKB17,AKB18,AKB19]
我想把它变成一个for循环,每年为每个区域执行上述步骤,并将其收集到一个大数据帧中。如何用Python计算这个值?
发布于 2022-10-12 22:56:16
我认为你想要这样的东西,它会给你一个字典,它的键是区域,值是带有年度键和差值的字典:
from collections import defaultdict
regions = ['Region1', 'Region2'] # expand as required
years = range(2001,2020)
result = defaultdict(dict)
for region in regions:
xr = x[x['name'] == region].drop_duplicates(subset=['ID', 'Year'], keep = 'first')
xr['cumulative_area'] = xr.groupby(['Year'])['area'].cumsum()
for year in years:
xry = xr[xr['Year'] == year]
xryfifth = xry[xry['cumulative_area'] > xry['area'].sum() * 0.05]
xryninefifth = xry[xry['cumulative_area'] > xry['area'].sum() * 0.95]
result[region][year] = xryninefifth.doy.min() - xryfifth.doy.min()
https://stackoverflow.com/questions/74044432
复制相似问题