Данные: Здесь
Вопрос: У меня есть несколько таблиц данных, которые я экспортирую в Python как кадры данных.Я хочу выполнить умножения для этих фреймов данных, которые сгенерируют другой фрейм данных, который будет иметь то же измерение, что и фреймы данных, которые я использую, и / или дополнить измерение (т. Е. Индекс) на основе комбинации из разных используемых фреймов данных.Тем не менее, я сталкиваюсь с некоторыми проблемами, решение которых не смог найти.Ниже приведен код.
Код:
#---------------------------------------------------------------------------------------------------
#Load the pandas library
#---------------------------------------------------------------------------------------------------
import numpy as np
import pandas as pd
#---------------------------------------------------------------------------------------------------
#Load the dataframes
#---------------------------------------------------------------------------------------------------
##Supply at the gridcell level (in Pj per year)
biosup = pd.read_excel('01EconMod_EU1.xlsx', sheet_name = 'biosup', skiprows = 5, index_col = 0, usecols = 'A:K')
##Cost at the gridcell level (in MEUR per Pj)
biocost = pd.read_excel('01EconMod_EU1.xlsx', sheet_name = 'biocost', skiprows = 5, index_col = 0, usecols = 'A:K')
##Demand at the gridcell level (in Pj per year)
biodem = pd.read_excel('01EconMod_EU1.xlsx', sheet_name = 'biodem', skiprows = 5, index_col = [0,1], usecols = 'A:L')
##Inter-gridcell distance matrix (in km)
dist = pd.read_excel('01EconMod_EU1.xlsx', sheet_name = 'distance', skiprows = 5, index_col = 0, usecols = 'A:AE')
#---------------------------------------------------------------------------------------------------
#Definition of model parameter
#---------------------------------------------------------------------------------------------------
##Power parameter for the distance-decay component (gamma)
gamma = pd.DataFrame({'sim1':[1.06],'sim2':[1.59],'sim3':[2.12]})
gamma = gamma.transpose()
gamma.columns = ['val']
##Inter-gridcell distance range for the supply curve determination (dmaxsup in km)
dmaxsup = pd.DataFrame({'dsup1':[390],'dsup2':[770],'dsup3':[1050]})
dmaxsup = dmaxsup.transpose()
dmaxsup.columns = ['dmax']
##Inter-gridcell distance range for the distance-decay (dmaxdem in km)
dmaxdem = pd.DataFrame({'ddem1':[750],'ddem2':[1000]})
dmaxdem = dmaxdem.transpose()
dmaxdem.columns = ['dmax']
#---------------------------------------------------------------------------------------------------
#New parameter calculation
#---------------------------------------------------------------------------------------------------
##The ratio of the inter-gridcell distance and the dmaxdem
dist1 = pd.DataFrame(np.concatenate(dist.values / dmaxdem.values[:, None]), pd.MultiIndex.from_product([dmaxdem.index, dist.index]), dist.columns)
##The decay coefficients
decay = pd.DataFrame(np.concatenate(2 * (1 / (1 + (np.exp(dist1.values)**gamma.values[:, None])))), pd.MultiIndex.from_product([gamma.index, dist1.index]), dist1.columns)
decay1 = pd.DataFrame(np.concatenate(2 * (1 / (1 + (np.exp(dist.values / dmaxdem.values[:, None])**gamma.values[:, None])))), pd.MultiIndex.from_product([dmaxdem.index, gamma.index, dist.index]), dist.columns)
Комментарии к коду:
1 / Параметр dist1 представляет деление кадра данных dist накаждый элемент элемента данных dmaxdem.Представьте, что значения фрейма данных dmaxdem являются сценариями расстояния.Другими словами, эта операция вычисляет отношение для каждого из полученных значений расстояния.
2 / Я пытаюсь вычислить коэффициенты затухания расстояния, то есть «данные затухания», как определено формулой в скобках.Тем не менее, я получаю следующее сообщение об ошибке
NotImplementedError: isna is not defined for MultiIndex
, которое, как мне кажется, имеет отношение к многоиндексной структуре фрейма данных dist1.Я попробовал прямой подход, внедрив предыдущую операцию, которая потребует использования 3-х различных фреймов данных, как показано кодом для «decay1».Я получаю следующую ошибку
ValueError: operands could not be broadcast together with shapes (2,30,30) (3,1,1)
Любая помощь будет оценена.