Skip to content

Commit

Permalink
Make the linters happy
Browse files Browse the repository at this point in the history
  • Loading branch information
gnn committed Dec 12, 2018
1 parent 19909d1 commit 8656f02
Show file tree
Hide file tree
Showing 4 changed files with 516 additions and 388 deletions.
179 changes: 100 additions & 79 deletions src/oemof/tabular/tools/datapackage/aggregation.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,179 +5,200 @@
"""
import os
import re
import shutil

from datapackage import Package, Resource
import pandas as pd
import pyomo.environ as po

import tsam.timeseriesaggregation as tsam

from .processing import copy_datapackage
from .building import write_sequences
from .processing import copy_datapackage


def temporal_skip(datapackage, n, path='/tmp', name=None, *args):
def temporal_skip(datapackage, n, path="/tmp", name=None, *args):
"""
"""
p = Package(datapackage)

cwd = os.getcwd()

if name is None:
copied_package_name = p.descriptor['name'] + '__temporal_skip__' + str(n)
copied_package_name = (
p.descriptor["name"] + "__temporal_skip__" + str(n)
)
else:
copied_package_name = name

copy_path = os.path.join(
path,
p.descriptor['name'])
copy_path = os.path.join(path, p.descriptor["name"])

copied_root = copy_datapackage(datapackage, os.path.abspath(copy_path),
subset='data')
copied_root = copy_datapackage(
datapackage, os.path.abspath(copy_path), subset="data"
)

sequence_resources = [
r for r in p.resources
if re.match(r'^data/sequences/.*$', r.descriptor['path'])]
r
for r in p.resources
if re.match(r"^data/sequences/.*$", r.descriptor["path"])
]

dfs = {
r.name: pd.DataFrame(r.read(keyed='True')).\
set_index('timeindex').astype(float)
for r in sequence_resources}
r.name: pd.DataFrame(r.read(keyed="True"))
.set_index("timeindex")
.astype(float)
for r in sequence_resources
}
sequences = pd.concat(dfs.values(), axis=1)

skip_sequences = sequences.loc[::n]

temporal = pd.Series(data=n,
index=skip_sequences.index,
name='weighting')
temporal.index.name = 'timeindex'
temporal = pd.Series(data=n, index=skip_sequences.index, name="weighting")
temporal.index.name = "timeindex"

os.chdir(copied_root)

for r in sequence_resources:
write_sequences(r.name + '.csv',
dfs[r.name].loc[temporal.index],
replace=True)
write_sequences(
r.name + ".csv", dfs[r.name].loc[temporal.index], replace=True
)

# write temporal information from clustering
temporal.to_csv(
'data/temporal.csv',
header=True, sep=";", date_format='%Y-%m-%dT%H:%M:%SZ')
"data/temporal.csv",
header=True,
sep=";",
date_format="%Y-%m-%dT%H:%M:%SZ",
)
# add meta data for new temporal information
r = Resource({'path': 'data/temporal.csv'})
r = Resource({"path": "data/temporal.csv"})
r.infer()

r.descriptor['description'] = (
"Temporal selection based on skipped timesteps. Skipped n={}".format(n))
r.descriptor[
"description"
] = "Temporal selection based on skipped timesteps. Skipped n={}".format(n)

# Update meta-data of copied package
cp = Package('datapackage.json')
cp.descriptor['name'] = copied_package_name
cp.descriptor['resources'].append(r.descriptor)
cp = Package("datapackage.json")
cp.descriptor["name"] = copied_package_name
cp.descriptor["resources"].append(r.descriptor)
cp.commit()
cp.save('datapackage.json')
cp.save("datapackage.json")

# set back to 'old' workdirectory
os.chdir(cwd)

return copied_root

def temporal_clustering(datapackage, n, path='/tmp', how='daily'):

def temporal_clustering(datapackage, n, path="/tmp", how="daily"):
"""
"""
if how == 'weekly':
if how == "weekly":
raise NotImplementedError("Weekly clustering is not implemented!")

p = Package(datapackage)

cwd = os.getcwd()

copied_package_name = (
p.descriptor['name'] + '__temporal_cluster__' + how + '_'+ str(n))
p.descriptor["name"] + "__temporal_cluster__" + how + "_" + str(n)
)

copy_path = os.path.join(
path,
p.descriptor['name'],
copied_package_name)

copied_root = copy_datapackage(datapackage, os.path.abspath(copy_path),
subset='data')
copy_path = os.path.join(path, p.descriptor["name"], copied_package_name)

copied_root = copy_datapackage(
datapackage, os.path.abspath(copy_path), subset="data"
)

sequence_resources = [
r for r in p.resources
if re.match(r'^data/sequences/.*$', r.descriptor['path'])]
r
for r in p.resources
if re.match(r"^data/sequences/.*$", r.descriptor["path"])
]

dfs = {
r.name: pd.DataFrame(r.read(keyed='True')).\
set_index('timeindex').astype(float)
for r in sequence_resources}
r.name: pd.DataFrame(r.read(keyed="True"))
.set_index("timeindex")
.astype(float)
for r in sequence_resources
}
sequences = pd.concat(dfs.values(), axis=1)

if how == 'daily':
if how == "daily":
hoursPerPeriod = 24
elif how == 'hourly':
elif how == "hourly":
hoursPerPeriod = 1
elif how == 'weekly':
elif how == "weekly":
hoursPerPeriod = 24 * 7

aggregation = tsam.TimeSeriesAggregation(
sequences,
noTypicalPeriods=n,
rescaleClusterPeriods=False,
hoursPerPeriod=hoursPerPeriod,
clusterMethod='hierarchical')

clustered_sequences = aggregation.createTypicalPeriods()
clusterMethod="hierarchical",
)

cluster_weights = {
aggregation.clusterCenterIndices[n]: w
for n, w in aggregation.clusterPeriodNoOccur.items()}
if how == 'daily':
for n, w in aggregation.clusterPeriodNoOccur.items()
}
if how == "daily":
temporal = pd.Series(
{d:cluster_weights[d.dayofyear]
for d in sequences.index
if d.dayofyear in aggregation.clusterCenterIndices}, name='weighting')
temporal.index.name = 'timeindex'

elif how == 'hourly':
{
d: cluster_weights[d.dayofyear]
for d in sequences.index
if d.dayofyear in aggregation.clusterCenterIndices
},
name="weighting",
)
temporal.index.name = "timeindex"

elif how == "hourly":
temporal = pd.Series(
{h:cluster_weights[sequences.index.get_loc(h)]
for h in sequences.index
if sequences.index.get_loc(h)
in aggregation.clusterCenterIndices}, name='weighting')
temporal.index.name = 'timeindex'
{
h: cluster_weights[sequences.index.get_loc(h)]
for h in sequences.index
if sequences.index.get_loc(h)
in aggregation.clusterCenterIndices
},
name="weighting",
)
temporal.index.name = "timeindex"

# write resources to copied package (should not interfer with meta data)
# as columns are not removed and sorted when written.
os.chdir(copied_root)
for r in sequence_resources:
write_sequences(r.name + '.csv',
dfs[r.name].loc[temporal.index],
replace=True)
write_sequences(
r.name + ".csv", dfs[r.name].loc[temporal.index], replace=True
)

# write temporal information from clustering
temporal.to_csv(
'data/temporal.csv',
header=True, sep=";", date_format='%Y-%m-%dT%H:%M:%SZ')
"data/temporal.csv",
header=True,
sep=";",
date_format="%Y-%m-%dT%H:%M:%SZ",
)
# add meta data for new temporal information
r = Resource({'path': 'data/temporal.csv'})
r = Resource({"path": "data/temporal.csv"})
r.infer()
# TODO: Add meta-data description
r.descriptor['description'] = (
"Temporal selection based on hierachical clustering...")
r.descriptor[
"description"
] = "Temporal selection based on hierachical clustering..."

# Update meta-data of copied package
cp = Package('datapackage.json')
cp.descriptor['name'] = copied_package_name
cp.descriptor['resources'].append(r.descriptor)
cp = Package("datapackage.json")
cp.descriptor["name"] = copied_package_name
cp.descriptor["resources"].append(r.descriptor)
cp.commit()
cp.save('datapackage.json')
cp.save("datapackage.json")

# set back to 'old' workdirectory
os.chdir(cwd)

return copied_root

loop_temporal = lambda f, d, narray, *args: [f(d, n, *args) for n in narray]

def loop_temporal(f, d, narray, *args):
return [f(d, n, *args) for n in narray]

0 comments on commit 8656f02

Please sign in to comment.