Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 22nd, 2010 | Syntax: XML | Size: 13.69 KB | Hits: 101 | Expires: Never
Copy text to clipboard
  1. package jpp.marketanalysis.exploration;
  2.  
  3.  
  4. import java.math.BigDecimal;
  5. import java.util.Collections;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Set;
  9. import java.util.Vector;
  10.  
  11. import jpp.marketanalysis.data.ShareCSVReader;
  12. import jpp.marketanalysis.data.DataStorage;
  13. import jpp.marketanalysis.data.Dataset;;
  14.  
  15. /**Klasse zur Analyse der Daten auf
  16.  * Lokale/Globale "Extrema" und Durch-
  17.  * schnitte.
  18.  *
  19.  * @author Hendrik Herschlein
  20.  *
  21.  */
  22. public class ShareExploration {
  23.  
  24.     private static DataStorage db;
  25.  
  26.  
  27.     /**
  28.      * Der Konstruktor der Klasse, welcher als Argument den Pfad und Dateinamen
  29.      * der CSV-Datei enthaelt. Im Konstruktor wird zunaechst die Datei fileName
  30.      * gelesen (verweneden Sie den in Teil 1 implementierten ShareCSVReader).
  31.      * Anschliessend wird die DataStorage Instanz mit deren getInstance()
  32.      * Methode geholt und in ein privates Attribut der Klasse ShareExploration
  33.      * geschrieben.
  34.      *
  35.      * @param fileName
  36.      *            name der einzulesenden Datei
  37.      */
  38.     public ShareExploration(String fileName) {
  39.         // Datei die uerbergeben wird einlesen mit ShareCSVReader
  40.         ShareCSVReader.readData(fileName);
  41.         db = DataStorage.getInstance();
  42.  
  43.     }
  44.  
  45.     /**
  46.      * Gibt die DataStorage-Instanz zurueck.
  47.      *
  48.      * @return db
  49.      */
  50.     public DataStorage getDB() {
  51.         return db;
  52.  
  53.     }
  54.  
  55.     /**
  56.      * Liefert alle zur Aktie mit dem Namen stockName gespeicherten Daten
  57.      * zurueck, und zwar als Vector von Dataset-Objekten.
  58.      *
  59.      * @param stockName
  60.      *            Name der Aktie
  61.      * @return alleDaten alle Daten, die zu der Aktie vorhanden sind
  62.      */
  63.     public Vector<Dataset> getAllData(String stockName) {
  64.  
  65.         Vector<Dataset> alleDaten = db.getEntry(stockName);
  66.         return alleDaten;
  67.  
  68.     }
  69.  
  70.     /**
  71.      * Liefert dasjenige Dataset der Aktie mit Namen stockName zurueck, welches
  72.      * den hoechsten Wert der Aktie enthaelt. Dabei ist zu pruefen ob s ein
  73.      * gueltiger Aktienname ist: ist stockName null oder der leere String "", so
  74.      * soll eine NullPointerException bzw. eine IllegalArgumentException mit
  75.      * aussagekraeftiger Meldung geworfen werden. Weiter ist zu pruefen, ob die
  76.      * abgefragte Aktie in der Datenbank vorhanden ist. Ist dies nicht der Fall,
  77.      * soll die Methode null zurueckgeben. Verwenden Sie zum finden des Maximums
  78.      * die Collections.sort() Methode und den geeigneten Comparator (s.o.)
  79.      *
  80.      * @param stockName
  81.      *            Aktienname
  82.      * @return temp.get(0) Eintrag in temp an der Stelle 0 (Datensatz, der das
  83.      *         lokale Maximum der Aktie enthaelt
  84.      */
  85.     public Dataset getLocalMaximum(String stockName) {
  86.  
  87.         if (stockName == null) {
  88.             throw new NullPointerException("String nicht initialisiert");
  89.         }
  90.         if (stockName == "") {
  91.             throw new IllegalArgumentException("Leerer String");
  92.         }
  93.         if (!ShareExploration.db.getAllData().containsKey(stockName)) {
  94.             // enthaelt
  95.             // die
  96.             // Treemap
  97.             // die Aktie?
  98.             return null; // wenn sie die Aktie nicht enthaelt wird null
  99.             // zurueckgegeben
  100.         } else {
  101.             DatasetMaxValComparator s = new DatasetMaxValComparator();
  102.             List<Dataset> temp = db.getEntry(stockName);
  103.  
  104.             Collections.sort(temp, s);
  105.             int i = temp.size();
  106.             return temp.get(i - 1);
  107.  
  108.         }
  109.     }
  110.  
  111.     /**
  112.      * Liefert dasjenige Dataset der Aktie mit Namen stockName zurueck, welches
  113.      * den niedrigsten Wert der Aktie enthaelt. Dabei ist zu pruefen ob
  114.      * stockName ein gueltiger Aktienname ist: ist stockName null oder der leere
  115.      * String "", so soll eine NullPointerException bzw. eine
  116.      * IllegalArgumentException mit aussagekraeftiger Meldung geworfen werden.
  117.      * Weiter ist zu pruefen, ob die abgefragte Aktie in der Datenbank vorhanden
  118.      * ist. Ist dies nicht der Fall, soll die Methode null zurueckgeben.
  119.      * Verwenden Sie zum finden des Minimums die Collections.sort() Methode und
  120.      * den geeigneten Comparator (s.o.)
  121.      *
  122.      * @param stockName
  123.      *            Name der betrachteten Aktie
  124.      * @return temp.get(i-1) Der Datensatz, der das lokale Minimum der Aktie
  125.      *         enthaelt
  126.      */
  127.     public Dataset getLocalMinimum(String stockName) {
  128.  
  129.         if (stockName == null) {
  130.             throw new NullPointerException("String nicht initialisiert");
  131.         }
  132.         if (stockName == "") {
  133.             throw new IllegalArgumentException("Leerer String");
  134.         }
  135.         if (!ShareExploration.db.getAllData().containsKey(stockName)) {
  136.             // enthaelt
  137.             // die
  138.             // Treemap
  139.             // die Aktie?
  140.             return null; // wenn sie die Aktie nicht enthaelt wird null
  141.             // zurueckgegeben
  142.         } else {
  143.             DatasetMinValComparator s = new DatasetMinValComparator();
  144.             List<Dataset> temp = db.getEntry(stockName);
  145.  
  146.             Collections.sort(temp, s);
  147.             int i = temp.size();
  148.             return temp.get(i - 1); // denn der kleinste Wert steht immer auf
  149.             // letzter Position
  150.  
  151.         }
  152.     }
  153.  
  154.  
  155.  
  156.     /**
  157.      * Liefert den durchschnittlichen Tagesendwert (close) der Aktie mit Namen
  158.      * stockName zurueck, und zwar auf zwei Stellen nach dem Komma gerundet.
  159.      * Dabei ist zu pruefen ob stockName ein gueltiger Aktienname ist: ist
  160.      * stockName null oder der leere String "", so soll eine
  161.      * NullPointerException bzw. eine IllegalArgumentException mit
  162.      * aussagekraeftiger Meldung geworfen werden. Weiter ist zu pruefen, ob die
  163.      * abgefragte Aktie in der Datenbank vorhanden ist. Ist dies nicht der Fall,
  164.      * soll die Methode -1 zurueckgeben.
  165.      *
  166.      * @param s
  167.      *            Aktienname
  168.      * @return avgClose Durchschnitt der Close Werte einer bestimmten Aktie s
  169.      */
  170.     public double getLocalAverage(String s) {
  171.  
  172.         double summe = 0.0;
  173.         double avgClose = 0.0;
  174.         List<Dataset> avgTemp = db.getEntry(s);
  175.  
  176.         if (s == null) {
  177.             throw new NullPointerException("String nicht initialisiert");
  178.         }
  179.         if (s == "") {
  180.             throw new IllegalArgumentException("Leerer String");
  181.         }
  182.         if (!db.getAllData().containsKey(s)) {
  183.             return -1;
  184.         } else
  185.             for (int i = 0; i < avgTemp.size(); i++) {
  186.                summe = summe + avgTemp.get(i).getClose();
  187.  
  188.  
  189.            }
  190.         avgClose = summe / avgTemp.size();
  191.        
  192.         //Zweite Rundungsmoeglichkeit
  193. //         avgClose = new BigDecimal(avgClose).setScale(2,
  194. //         BigDecimal.ROUND_DOWN).doubleValue();
  195.        final double rundung = 100.0;
  196.        avgClose = Math.round(avgClose * rundung) / rundung;
  197.        return avgClose;
  198.    }
  199.  
  200.    /**
  201.     * Gibt einen Vector< Object > zurueck. Dieser hat an der Stelle 0 den Namen
  202.      * der Aktie mit dem hoechsten lokalen Maximum im DataStorage, an der Stelle
  203.      * 1 ist das betreffende Dataset abgelegt. Sollte es mehrere Aktien geben,
  204.      * welche das gleiche, lokale Maximum besitzen, so ist die Aktie, deren
  205.      * Anfangsbuchstabe am weitesten vorne im Alphabet auftaucht,
  206.      * zurueckzugeben.
  207.      *
  208.      * @return globMax globales Maximum
  209.      */
  210.     public Vector<Object> getGlobalMaximum() {
  211.  
  212.         Set<String> keys = db.getAllData().keySet();
  213.         Iterator<String> itGlobMax = keys.iterator();
  214.  
  215.         Dataset max = null;
  216.         String shareMax = null;
  217.         Vector<Object> globMax = new Vector<Object>();
  218.  
  219.         while (itGlobMax.hasNext()) {
  220.             String share = itGlobMax.next().toString();
  221.  
  222.             DatasetMaxValComparator s = new DatasetMaxValComparator();
  223.             List<Dataset> temp = db.getEntry(share);
  224.             Collections.sort(temp, s);
  225.             int i = temp.size();
  226.             Dataset lokalesMax = temp.get(i - 1);
  227.  
  228.             // Abfrage ob max == null ist, was wahr ist => max = erstes
  229.             // lokales_max, das gefunden wird
  230.             if (max == null) {
  231.                 max = lokalesMax;
  232.                 shareMax = share;
  233.                 // Abfrage, ob die Close werte von max (Jetzt eben erstes
  234.                 // gefundenes lokales_max groesser sind als
  235.                 // das neue lokale max. wenn ja: tauschen
  236.             } else if (max.getHigh() < lokalesMax.getHigh()) {
  237.                max = lokalesMax;
  238.                shareMax = share;
  239.            } else if (max.getHigh() == lokalesMax.getHigh()
  240.                    && shareMax.compareTo(share) > 0) {
  241.                 max = lokalesMax;
  242.                 shareMax = share;
  243.             }
  244.  
  245.         }
  246.         globMax.add(shareMax);
  247.         globMax.add(max);
  248.         return globMax;
  249.     }
  250.  
  251.     /**
  252.      * Gibt einen Vector< Object > zurueck. Dieser hat an der Stelle 0 den Namen
  253.      * der Aktie mit dem niedrigsten lokalen Minimum im DataStorage, an der
  254.      * Stelle 1 ist das betreffende Dataset abgelegt. Sollte es mehrere Aktien
  255.      * geben, welche das gleiche, lokale Minimum besitzen, so ist die Aktie,
  256.      * deren Anfangsbuchstabe am weitesten vorne im Alphabet auftaucht,
  257.      * zurueckzugeben.
  258.      *
  259.      * @return globMin globales Minimum
  260.      */
  261.     public Vector<Object> getGlobalMinimum() {
  262.  
  263.         Set<String> keys = db.getAllData().keySet();
  264.         Iterator<String> itGlobMin = keys.iterator();
  265.         Dataset min = null;
  266.         String shareMin = null;
  267.         Vector<Object> globMin = new Vector<Object>();
  268.         while (itGlobMin.hasNext()) {
  269.             String share = itGlobMin.next().toString();
  270.  
  271.             DatasetMinValComparator s = new DatasetMinValComparator();
  272.             List<Dataset> temp = db.getEntry(share);
  273.             Collections.sort(temp, s);
  274.             int i = temp.size();
  275.             Dataset lokalesMin = temp.get(i - 1);
  276.             // Abfrage ob min == null ist, was wahr ist => min = erstes
  277.             // lokalesMin, das gefunden wird
  278.             if (min == null) {
  279.                 min = lokalesMin;
  280.                 shareMin = share;
  281.                 // Abfrage, ob die Close werte von min (Jetzt eben erstes
  282.                 // gefundenes lokalesMin groesser sind als
  283.                 // das neue lokale min. wenn ja: tauschen
  284.             } else if (min.getLow() > lokalesMin.getLow()) {
  285.                 min = lokalesMin;
  286.                 shareMin = share;
  287.             } else if (min.getLow() == lokalesMin.getLow()
  288.                     && shareMin.compareTo(share) > 0) {
  289.                min = lokalesMin;
  290.                 shareMin = share;
  291.             }
  292.  
  293.         }
  294.         globMin.add(shareMin);
  295.         globMin.add(min);
  296.         return globMin;
  297.     }
  298.  
  299.     /**
  300.      * Berechnet ueber alle bekannten Daten im DataStorage den Durchschnitt der
  301.      * Tagesendwerte (close), und zwar auf zwei Stellen nach dem Komma gerundet.
  302.      *
  303.      * @return avgCloseGlob Globaler Durchschnitt der Close Werte
  304.      */
  305.     public double getGlobalAverage() {
  306.  
  307.         Set<String> keys = db.getAllData().keySet();
  308.         Iterator<String> it2 = keys.iterator();
  309.  
  310.         double avgCloseGlob = 0;
  311.         double summeAvgGlob = 0;
  312.  
  313.         while (it2.hasNext()) {
  314.             String share = it2.next().toString();
  315.  
  316.             // Testausgaben
  317.             // System.out.println(share);
  318.             // System.out.println(db.getEntry(share));
  319.  
  320.             Vector<Dataset> avgGlobTemp = db.getEntry(share); // neuer vector
  321.             // zu jedem
  322.             // eintrag im
  323.             // keyset share
  324.  
  325.             for (int i = 0; i < avgGlobTemp.size(); i++) {
  326.                summeAvgGlob = summeAvgGlob + avgGlobTemp.get(i).getClose();
  327.  
  328.            }
  329.            avgCloseGlob = summeAvgGlob
  330.                    / (avgGlobTemp.size() * db.getNumOfEntries());
  331.            //Hier wird IMMER aufgerundet
  332.             avgCloseGlob = new BigDecimal(avgCloseGlob).setScale(2,
  333.             BigDecimal.ROUND_UP).doubleValue();
  334.            
  335.             //Hier wird IMMER wie in der Schule gerundet
  336. //            final double rundung = 100.0;
  337. //            avgCloseGlob = Math.round(avgCloseGlob * rundung) / rundung;
  338.  
  339.        }
  340.        return avgCloseGlob;
  341.    }
  342.  
  343.  
  344.    /**
  345.     * Mainmethode mit Testaufrufen.
  346.     *
  347.     * @param args
  348.     *            ...
  349.     */
  350.    public static void main(String[] args) {
  351.        ShareExploration bla = new ShareExploration("example1.csv");
  352.        // ShareExploration bla2 = new ShareExploration("example2.csv");
  353.        String aktie = "Allianz N";
  354.        String s = "Adidas";
  355.  
  356.        System.out.println("Local Max: "
  357.                + bla.getLocalMaximum(aktie).toString());
  358.        System.out.println("Local Min: "
  359.                + bla.getLocalMinimum(aktie).toString());
  360.        System.out.println("Local AVG: " + bla.getLocalAverage(s));
  361.        System.out.println("db.getNumOfEntries: " + db.getNumOfEntries());
  362.        System.out.println("Global Avg: " + bla.getGlobalAverage());
  363.        System.out.println("Global Min: " + bla.getGlobalMinimum());
  364.        System.out.println("Global Max: " + bla.getGlobalMaximum());
  365.  
  366. //         System.out.println("gibt Anzahl der datasets im vector aus:"
  367. //         +spaeter.size()); // gibt Anzahl der datasets im vector aus
  368. //         System.out.println("holt sich das erste Dataset im vector: "+spaeter.
  369. //         get(0)); // holt sich das erste Dataset im vector
  370. //         Dataset index0 = spaeter.get(0); // holt sich das erste Dataset im
  371. //         vector
  372. //         System.out.println(
  373. //         "holt sich aus dem ersten Dataset das close element: "
  374. //         +index0.getClose()); // holt sich aus dem ersten Dataset das close
  375. //         element
  376.  
  377.    }
  378.  
  379. }