diff --git a/.gitignore b/.gitignore index f85356d..21399b0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.iml .idea -.project \ No newline at end of file +.project +target \ No newline at end of file diff --git a/src/main/java/de/hsel/spm/baudas/WekaBeispiel.java b/src/main/java/de/hsel/spm/baudas/WekaBeispiel.java deleted file mode 100644 index 47daa20..0000000 --- a/src/main/java/de/hsel/spm/baudas/WekaBeispiel.java +++ /dev/null @@ -1,116 +0,0 @@ -package de.hsel.spm.baudas; - -/* Beispielprogramm, um WeKa in eclipse zu verwenden. - - Die Rohdaten liegen im CSV-Format vor. - - Die Rohdaten enthalten die folgenden 26 Attribute, - 0..9 Kundendaten und Einkaufsverhalten - 10 Einkaufssumme - 11..25 gekaufte Waren - - Hier sind nur ein paar Beispiele zu sehen, wie man die Analysen verwenden kann. - Weitere Einstellungen (falls n�tig) selbst recherchieren! - */ - -import java.io.*; - -import weka.associations.Apriori; -import weka.clusterers.SimpleKMeans; -import weka.core.Instances; -import weka.core.converters.CSVLoader; -import weka.filters.Filter; -import weka.filters.unsupervised.attribute.NumericCleaner; -import weka.filters.unsupervised.attribute.NumericToNominal; - -public class WekaBeispiel { - - void findCluster(Instances daten, int anz) throws Exception { - - SimpleKMeans model = new SimpleKMeans(); - model.setNumClusters(anz); - - model.buildClusterer(daten); - System.out.println(model); - - } - - void makeApriori(Instances daten) throws Exception { - - // umwandeln in gekauft / nicht gekauft (0/1) - NumericCleaner nc = new NumericCleaner(); - nc.setMaxThreshold(1.0); // Schwellwert auf 1 setzen - nc.setMaxDefault(1.0); // alles ueber Schwellwert durch 1 ersetzen - nc.setInputFormat(daten); - daten = Filter.useFilter(daten, nc); // Filter anwenden. - - // Die Daten als nominale und nicht als numerische Daten setzen - NumericToNominal num2nom = new NumericToNominal(); - num2nom.setAttributeIndices("first-last"); - num2nom.setInputFormat(daten); - daten = Filter.useFilter(daten, num2nom); - - Apriori model = new Apriori(); - - model.buildAssociations(daten); - - System.out.println(model); - - } - - public static void main(String[] args) throws Exception { - - // Eigenen Dateipfad eintragen, nicht meinen nehmen ;-) - String path = "/home/julian/IntellijProjects/Softwareprojektmanagement/src/test/resources/"; - String roh = path + "kd100.csv"; - - Instances alleDaten, nurWaren, nurKunden; - - - WekaBeispiel dt = new WekaBeispiel(); - - - // CSV-Datei laden - CSVLoader loader = new CSVLoader(); - loader.setSource(new File(roh)); - alleDaten = loader.getDataSet(); - - // 0 durch ? ersetzen, um f�r die Auswertung nur die Waren zu - // ber�cksichtigen, die gekauft wurden - NumericCleaner nc = new NumericCleaner(); - nc.setMinThreshold(1.0); // Schwellwert auf 1 setzen - nc.setMinDefault(Double.NaN); // alles unter Schwellwert durch ? ersetzen - nc.setInputFormat(alleDaten); - alleDaten = Filter.useFilter(alleDaten, nc); // Filter anwenden. Wichtig: alleDaten = - - - - // Clusteranalyse mit 5 Clustern �ber alle Daten - dt.findCluster(alleDaten, 5); - - // Assoziationsanalyse �ber alle Daten - Sinn zweifelhaft ;) - dt.makeApriori(alleDaten); - - - // Kundendaten rausnehmen, nur Warenk�rbe stehen lassen - nurWaren = new Instances(alleDaten); - for (int i = 0; i < 11; i++) { - nurWaren.deleteAttributeAt(0); // ein einzelnes Attribut rausnehmen - } - // Assoziationsanalyse der gekauften Waren - dt.makeApriori(nurWaren); - - - - // Waren rausnehmen, nur Kundendaten stehen lassen - nurKunden = new Instances(alleDaten); - for (int i = 0; i < 16; i++) { - nurKunden.deleteAttributeAt(10); // ein einzelnes Attribut rausnehmen - } - - // Clusteranalyse mit 3 Clustern �ber die Kundendaten - dt.findCluster(nurKunden, 3); - - } - -} diff --git a/src/main/java/de/hsel/spm/baudas/analysis/Analysis.java b/src/main/java/de/hsel/spm/baudas/analysis/Analysis.java index b8bc054..3f8f86a 100644 --- a/src/main/java/de/hsel/spm/baudas/analysis/Analysis.java +++ b/src/main/java/de/hsel/spm/baudas/analysis/Analysis.java @@ -8,7 +8,7 @@ import java.io.File; import java.io.IOException; /** - * base interface for analysis + * base interface for analysis. * * @author Johannes Theiner * @version 0.1 @@ -19,7 +19,7 @@ public interface Analysis { /** - * loads data from csv file + * loads data from csv file. * * @param file File to analyze * @return loaded data in weka format @@ -37,7 +37,7 @@ public interface Analysis { } /** - * result of the analysis + * result of the analysis. * * @return result as T */ diff --git a/src/main/java/de/hsel/spm/baudas/analysis/WeekOverview.java b/src/main/java/de/hsel/spm/baudas/analysis/WeekOverview.java index 081f4f9..2499a39 100644 --- a/src/main/java/de/hsel/spm/baudas/analysis/WeekOverview.java +++ b/src/main/java/de/hsel/spm/baudas/analysis/WeekOverview.java @@ -1,73 +1,63 @@ package de.hsel.spm.baudas.analysis; -import org.jetbrains.annotations.Nullable; import weka.core.Instance; import weka.core.Instances; -import weka.filters.Filter; -import weka.filters.unsupervised.attribute.Remove; import java.io.File; +import java.util.AbstractMap; import java.util.HashMap; import java.util.Map; /** - * Week Overview Analysis + * Week Overview Analysis. * * @author Julian Hinxlage * @version 0.1 * @since 0.1 **/ -public class WeekOverview implements Analysis> { +public class WeekOverview implements Analysis>> { private Instances instances; - private Map result; + private Map> result; public WeekOverview(File file) { - result = new HashMap(); + result = new HashMap<>(); instances = load(file); } @Override - public Map getResult() { + public Map> getResult() { - int[] keepIndexes = new int[]{5, 10}; - int dayIndex = 0; - int amountIndex = 1; + int dayIndex = 5; + int amountIndex = 10; + + int startArticles = 11; + int endArticles = 25; - try { - //Remove all other attributes - Remove remove = new Remove(); - remove.setAttributeIndicesArray(keepIndexes); - remove.setInvertSelection(true); - remove.setInputFormat(instances); - instances = Filter.useFilter(instances, remove); - } catch (Exception ex) { - ex.printStackTrace(); - } + for (int i = 0; i < instances.numInstances(); i++) { + Instance instance = instances.get(i); + double amount = instance.value(amountIndex); + String day = instance.stringValue(dayIndex); - for (int i = 0; i < instances.attribute(dayIndex).numValues(); i++) { - String day = instances.attribute(dayIndex).value(i); - - System.out.println(day); - - - for (int j = 0; j < instances.attribute(amountIndex).numValues(); j++) { - String amount = instances.attribute(amountIndex).value(j); - - System.out.println(amount); - - int x = Integer.parseInt(amount); - - if(!result.containsKey(day)){ - result.put(day,0); - } - result.put(day,result.get(day) + x); - + int count = 0; + for (int j = startArticles; j < endArticles; j++) { + count += (int) instance.value(j); } + + if (!result.containsKey(day)) { + result.put(day, new AbstractMap.SimpleEntry<>(0.0, 0)); + } + result.put(day, + new AbstractMap.SimpleEntry<>( + result.get(day).getKey() + amount, + result.get(day).getValue() + count + ) + ); } + return result; } } diff --git a/src/test/java/de/hsel/spm/baudas/WeekOverviewTest.java b/src/test/java/de/hsel/spm/baudas/Analysis/WeekOverviewTest.java similarity index 63% rename from src/test/java/de/hsel/spm/baudas/WeekOverviewTest.java rename to src/test/java/de/hsel/spm/baudas/Analysis/WeekOverviewTest.java index 9e285f5..bc9265e 100644 --- a/src/test/java/de/hsel/spm/baudas/WeekOverviewTest.java +++ b/src/test/java/de/hsel/spm/baudas/Analysis/WeekOverviewTest.java @@ -1,4 +1,4 @@ -package de.hsel.spm.baudas; +package de.hsel.spm.baudas.Analysis; import de.hsel.spm.baudas.analysis.WeekOverview; import org.junit.jupiter.api.Test; @@ -17,13 +17,13 @@ import java.util.Map; public class WeekOverviewTest { @Test - public void test(){ + public void test() { WeekOverview overview = new WeekOverview(new File(getClass().getClassLoader().getResource("kd100.csv").getFile())); - Map result = overview.getResult(); + Map> result = overview.getResult(); - for(Map.Entry i : result.entrySet()){ - System.out.println(i.getKey() + " = " + i.getValue()); + for (Map.Entry> i : result.entrySet()) { + System.out.println(i.getKey() + " = " + i.getValue().getKey() + "€ " + i.getValue().getValue()); } } diff --git a/target/classes/de/hsel/spm/baudas/WekaBeispiel.class b/target/classes/de/hsel/spm/baudas/WekaBeispiel.class index f5ed3d5..f12d6da 100644 Binary files a/target/classes/de/hsel/spm/baudas/WekaBeispiel.class and b/target/classes/de/hsel/spm/baudas/WekaBeispiel.class differ diff --git a/target/classes/de/hsel/spm/baudas/analysis/Analysis.class b/target/classes/de/hsel/spm/baudas/analysis/Analysis.class index af682a2..698e12c 100644 Binary files a/target/classes/de/hsel/spm/baudas/analysis/Analysis.class and b/target/classes/de/hsel/spm/baudas/analysis/Analysis.class differ diff --git a/target/classes/de/hsel/spm/baudas/analysis/WeekOverview.class b/target/classes/de/hsel/spm/baudas/analysis/WeekOverview.class index 161304a..e2882cd 100644 Binary files a/target/classes/de/hsel/spm/baudas/analysis/WeekOverview.class and b/target/classes/de/hsel/spm/baudas/analysis/WeekOverview.class differ diff --git a/target/test-classes/de/hsel/spm/baudas/WeekOverviewTest.class b/target/test-classes/de/hsel/spm/baudas/WeekOverviewTest.class index c8b72a6..27d29b5 100644 Binary files a/target/test-classes/de/hsel/spm/baudas/WeekOverviewTest.class and b/target/test-classes/de/hsel/spm/baudas/WeekOverviewTest.class differ