Closed dunland closed 2 years ago
Aus unserem Gespräch mit David Sauss können wir zumindest auch nochmal die Nachricht mitbringen, dass unser Ansatz sehr gut ist und es ausreicht, wenn wir eine kleine Verschleierung mit ähnlichen Gebäuden vornehmen. Solange wir nicht die exakten Daten aus der Liste nehmen, ist alles gut.
Aus dem Grund würde ich übrigens auch keine extra Kategorisierung vornehmen, da es uns meines Verständnisses nach,
Die sehr kleinen Cluster sind natürlich tatsächlich problematisch. Dazu zwei Punkte:
bestandsgebaeude_export.shp
gearbeitet? Oder sind auch versehentlich Neubauten mit in die Cluster gerutscht?building 5.14b
)
buildings are clustered as follows:
def make_clusters(group_selection):
'''make groups of the selected buildings. group by standard deviation of energy consumption'''
cluster_list = []
for idx in range(len(group_selection.index)):
interval = 0.5 # standard deviation
cluster = pandas.DataFrame()
while len(cluster) < 2: # make sure no building is alone
cluster = session.buildings_df.loc[(
(session.buildings_df['energy_source'] == session.buildings_df.loc[
session.buildings_df.index[idx], 'energy_source'])
&
(session.buildings_df['spec_heat_consumption'] >= session.buildings_df.loc[session.buildings_df.index[idx],
'spec_heat_consumption'] - session.buildings_df['spec_heat_consumption'].std() * interval)
&
(session.buildings_df['spec_heat_consumption'] <= session.buildings_df.loc[session.buildings_df.index[idx],
'spec_heat_consumption'] + session.buildings_df['spec_heat_consumption'].std() * interval)
&
(session.buildings_df['spec_power_consumption'] >= session.buildings_df.loc[session.buildings_df.index[idx],
'spec_power_consumption'] - session.buildings_df['spec_power_consumption'].std() * interval)
&
(session.buildings_df['spec_power_consumption'] <= session.buildings_df.loc[session.buildings_df.index[idx],
'spec_power_consumption'] + session.buildings_df['spec_power_consumption'].std() * interval)
)]
interval += 0.1 # increase range, try again if necessary
cluster_list.append(cluster)
session.print_verbose(
"building {0} is in a group of to {1} buildings with similar specs:".format(group_selection.index[idx], len(cluster)))
# session.print_verbose(cluster[['spec_heat_consumption', 'spec_power_consumption']].describe())
return cluster_list
buildings_cluster = api.make_clusters(buildings_df)
# update building with average data:
for j in range(len(buildings_df)):
buildings_df.at[buildings_df.index[j], 'avg_spec_heat_consumption'] = buildings_cluster[j]['spec_heat_consumption'].mean()
buildings_df.at[buildings_df.index[j], 'avg_spec_power_consumption'] = buildings_cluster[j]['spec_power_consumption'].mean()
buildings_df.at[buildings_df.index[j], 'cluster_size'] = int(len(buildings_cluster[j]))
Um die Gebäudedaten durch einen Proxy zu schützen, können wir die ausgewählten Gebäude mit ähnlichen (also ähnliche Verbrauchsdaten!) verbinden, diese Gruppe dann mitteln und ein generisches Durchschnittsgebäude erzeugen. Das klappt so weit ganz gut.
Ich habe für jedes Gebäude einmal alle anderen ermittelt, deren Wärmeverbrauch und Stromverbrauch innerhalb der Standardabweichung des gesamten Datensatzes sind.
Dabei ist folgendes heraus gekommen:
Gesamtanzahl Gebäude: 164 Clustergrößen im Mittel: 14.35 Clustergrößen, Standardabweichung: 11.11 kleinstes Cluster: 0 25% 4 50% 12 75% 23 max 36
Ein Problem haben wir mit sehr kleinen Clustern, da sich deren Daten nicht durch ihre "Peergroup" verschleiern lassen. Da müsste ich nochmal schauen, woran das eigentlich liegt. (ggf. haben diese Gebäude keinen hinterlegten Energieverbrauch o.ä.) Eine Kategorisierung nach Energieverbrauch könnte auch abhilfe schaffen...