Я работаю над моделью региональной электроэнергетической системы
в настоящее время у меня есть два кадра данных: один содержит информацию о муниципалитете и энергетическом узле, другой - энергию спрос с течением времени в муниципалитете, как показано ниже (а не фактический df, который я использую)
Код: Выделить всё
municip = {
"muni_id": [1401, 1402, 1407, 1415, 1419, 1480, 1480, 1427, 1484],
"muni_name": ["Har", "Par", "Ock", "Ste", "Tjo", "Gbg", "Gbg", "Sot", "Lys"],
"new_muni_id": [1401, 1402, 1480, 1415, 1415, 1480, 1480, 1484, 1484],
"new_muni_name": ["Har", "Har", "Gbg", "Ste", "Ste", "Gbg", "Gbg", "Lys", "Lys"],
"new_node_id": ["HAR1", "PAR1", "GBG2", "STE1", "STE1", "GBG1", "GBG2", "LYS1", "LYS1"]
}
df_1 = pd.DataFrame(municip)
demand = {
"period": [1, 2, 3, 4, 5],
1401: [2, 4, 4, 1, 2],
1402: [1, 1, 3, 3, 5],
1407: [2, 4, 4, 1, 2],
1415: [1, 1, 3, 3, 5],
1419: [1, 1, 3, 3, 5],
1480: [1, 1, 3, 3, 5],
1427: [2, 4, 4, 1, 2],
1484: [1, 2, 3, 4, 5]
}
df_2 = pd.DataFrame(demand)
Мое намерение состоит в том, чтобы назначить муниципальный спрос на энергетический узел единым способом распределения (в качестве начала для простоты).
Я попробовал следующее:
- создать новый фрейм данных со столбцами периода и списком узлы
- назначают спрос на муниципалитет с одинаковым старым и новым идентификатором/названием, разделенный на количество узлов в этом же муниципалитете, для В приведенном выше примере Gbg имеет 2 узла (GBG1 и GBG2), поэтому спрос на GBG1 и GBG2 будет равен 1480 (Gbg), разделенному на два.
- Для муниципалитетов, которые имеют разные старый и новый идентификатор/название, требование старого идентификатора муниципалитета будет добавлено к требованию назначенного узла на основе предыдущего шага. например, в df_1 muni_id 1407 (Ock) назначен узлу GBG2, поэтому потребность GBG2 в первом периоде будет равна 2,5, где 0,5 — это предыдущий шаг (потребность Gbg / 2), 2 — текущий шаг (потребность Ок)
Код: Выделить всё
import pandas as pd
def profiling(df_1, df_2):
# create empty df
nodes = df_1["new_node_id"].unique()
node_df = pd.DataFrame(columns=["period"] + list(nodes))
node_df["period"] = df_2["period"]
# loop based on node id
for node in nodes:
node_info = df_1[df_1["new_node_id"] == node]
muni_id = node_info["muni_id"].values[0]
new_muni_id = node_info["new_muni_id"].values[0]
# assign demand to all nodes that has same old/new id
if muni_id == new_muni_id :
cumul_node = len(df_1[df_1["muni_id"] == muni_id])
node_df[node] = df_2[muni_id] / cumul_node
# assign demand to node for muni that has different old/new id
else:
cumul_node = len(df_1[df_1["new_muni_id"] == new_muni_id])
add_demand = df_2[muni_id] / cumul_node
if node in node_df:
node_df[node] += add_demand
else:
node_df[node] = add_demand
return node_df
период
HAR1
PAR1
GBG2
STE1
GBG1
LYS1
1
2
1
Нет
1
0,5
Нет
2
4
1
Нет
1< /td>
0,5
Нет
3
4
3
Нет
3
1,5
Нет
4< /td>
1
3
Нет
3
1,5
Нет
5
2
5
Нет
5
2,5
Нет
по моей логике, почасовая потребность GBG2 должна составлять половину от 1480 (Gbg muni) + 1407 (Ock muni), поскольку Ock назначается GBG2 как новый узел, т.е. 2,5 в первом периоде. То же самое касается узла LYS1, где общая потребность составит 1427 (Sot) и 1484 (Lys).
Поэтому я ожидаю получить что-то вроде этого
период
HAR1
PAR1
GBG2
STE1
GBG1
LYS1
1
2
1
2,5
1
0,5
< td>3
2
4< /td>
1
4,5
1
0,5
6
3
4
3
5,5
3
1,5
7
4
1
3
2,5
3
1,5
5< /td>
5
2
5
4,5
5
2,5
7
Может ли кто-нибудь улучшить мою функцию, или, возможно, в моей логике добавления значений есть ошибка?
Извините за длинный вопрос и заранее спасибо за помощь!
Подробнее здесь: https://stackoverflow.com/questions/786 ... row-values