weka.classifiers.timeseries.gui.CustomPeriodicTestEditor Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of timeseriesForecasting Show documentation
Show all versions of timeseriesForecasting Show documentation
Provides a time series forecasting environment for Weka. Includes a wrapper for Weka regression schemes that automates the process of creating lagged variables and date-derived periodic variables and provides the ability to do closed-loop forecasting. New evaluation routines are provided by a special evaluation module and graphing of predictions/forecasts are provided via the JFreeChart library. Includes both command-line and GUI user interfaces. Sample time series data can be found in ${WEKA_HOME}/packages/timeseriesForecasting/sample-data.
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
/*
* CustomPeriodicTestEditor.java
* Copyright (C) 2010-2016 University of Waikato, Hamilton, New Zealand
*/
package weka.classifiers.timeseries.gui;
import weka.classifiers.timeseries.core.CustomPeriodicTest;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Vector;
/**
* Provides an editor for a single interval from a custom periodic test. See
* the javadoc for CustomPeriodicTest for information on the format that a
* single test interval takes.
*
* @author Mark Hall (mhall{[at]}pentaho{[dot]}com)
* @version $Revision: 45163 $
*/
public class CustomPeriodicTestEditor extends JPanel {
/** For serialization */
private static final long serialVersionUID = 8515802184515862677L;
/** Combo box for the operator */
protected JComboBox m_operator = new JComboBox();
/** Combo box for the year field */
protected JComboBox m_year = new JComboBox();
/** Combo box for the month field */
protected JComboBox m_month = new JComboBox();
/** Combo box for the week of the year field */
protected JComboBox m_week_of_yr = new JComboBox();
/** Combo box for the week of the month field */
protected JComboBox m_week_of_month = new JComboBox();
/** Combo box for the day of the year field */
protected JComboBox m_day_of_yr = new JComboBox();
/** Combo box for the day of the month field */
protected JComboBox m_day_of_month = new JComboBox();
/** Combo box for the day of the week field */
protected JComboBox m_day_of_week = new JComboBox();
/** Combo box for the hour of the day field */
protected JComboBox m_hour_of_day = new JComboBox();
/** Combo box for the minute field */
protected JComboBox m_min_of_hour = new JComboBox();
/** Combo box for the second field */
protected JComboBox m_second = new JComboBox();
/** true if we are editing the upper bound */
protected boolean m_right;
/** The test to edit */
protected CustomPeriodicTest m_testToEdit =
new CustomPeriodicTest(">*:*:*:*:*:*:*:*:*:*");
/** The bound that we are editing */
protected CustomPeriodicTest.TestPart m_partToEdit;
/** Support for property change events */
protected PropertyChangeSupport m_support = new PropertyChangeSupport(this);
/**
* Constructor
*
* @param right true if we should edit the upper bound of the test
*/
public CustomPeriodicTestEditor(boolean right) {
setLayout(new GridLayout(1,10));
/*SpinnerNumberModel snm = new SpinnerNumberModel();
snm.setValue(1); snm.setMinimum(1); snm.setMaximum(52);
m_week_of_yr = new JSpinner(snm);
snm = new SpinnerNumberModel();
snm.setValue(1); snm.setMinimum(1); snm.setMaximum(5);
m_week_of_month = new JSpinner(snm);
snm = new SpinnerNumberModel();
snm.setValue(1); snm.setMinimum(1); snm.setMaximum(365);
m_day_of_yr = new JSpinner(snm);
snm.setValue(1); snm.setMinimum(1); snm.setMaximum(31);
m_day_of_month = new JSpinner(snm);
snm = new SpinnerNumberModel();
snm.setValue(1); snm.setMinimum(1); snm.setMaximum(23);
m_hour_of_day = new JSpinner(snm);
snm = new SpinnerNumberModel();
snm.setValue(1); snm.setMinimum(1); snm.setMaximum(59);
m_min_of_hour = new JSpinner(snm);
snm = new SpinnerNumberModel();
snm.setValue(1); snm.setMinimum(1); snm.setMaximum(59);
m_second = new JSpinner(snm);*/
add(m_operator);
add(m_year); add(m_month); add(m_week_of_yr); add(m_week_of_month);
add(m_day_of_yr); add(m_day_of_month); add(m_day_of_week);
add(m_hour_of_day); add(m_min_of_hour); add(m_second);
m_right = right;
if (m_right) {
m_testToEdit = new CustomPeriodicTest("<*:*:*:*:*:*:*:*:*:*");
}
m_partToEdit = (m_right) ? m_testToEdit.getUpperTest() : m_testToEdit.getLowerTest();
setupCombos();
m_operator.setToolTipText("Operator");
m_operator.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setOperator(m_operator.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_year.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setYear(m_year.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_year.setToolTipText("Year");
m_month.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setMonth(m_month.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_month.setToolTipText("Month");
m_week_of_yr.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setWeekOfYear(m_week_of_yr.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_week_of_yr.setToolTipText("Week of the year");
m_week_of_month.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setWeekOfMonth(m_week_of_month.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_week_of_month.setToolTipText("Week of the month");
m_day_of_yr.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setDayOfYear(m_day_of_yr.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_day_of_yr.setToolTipText("Day of the year");
m_day_of_month.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setDayOfMonth(m_day_of_month.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_day_of_month.setToolTipText("Day of the month");
m_day_of_week.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setDayOfWeek(m_day_of_week.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_day_of_week.setToolTipText("Day of the week");
m_hour_of_day.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setHourOfDay(m_hour_of_day.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_hour_of_day.setToolTipText("Hour of the day");
m_min_of_hour.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setMinuteOfHour(m_min_of_hour.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_min_of_hour.setToolTipText("Minute of the hour");
m_second.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_partToEdit != null){
m_partToEdit.setSecond(m_second.getSelectedItem().toString());
m_support.firePropertyChange("", null, null);
}
}
});
m_second.setToolTipText("Second");
}
/**
* Set the test to edit
*
* @param t the CustomPeriodicTest to edit
*/
public void setTestToEdit(CustomPeriodicTest t) {
m_testToEdit = t;
m_partToEdit = (m_right) ? m_testToEdit.getUpperTest() : m_testToEdit.getLowerTest();
fillGUIElements();
}
/**
* Get the test being edited
*
* @return the CustomPeriodicTest being edited
*/
public CustomPeriodicTest getTestBeingEdited() {
return m_testToEdit;
}
/**
* Initialize GUI elements from the test being edited
*/
protected void fillGUIElements() {
if (m_partToEdit == null) {
setEnabled(false);
return;
}
m_operator.setSelectedItem(m_partToEdit.m_boundOperator.toString());
m_year.setSelectedItem(numericValueToString(m_partToEdit.m_year));
m_month.setSelectedItem(m_partToEdit.getMonthString());
m_week_of_yr.setSelectedItem(numericValueToString(m_partToEdit.m_week_of_yr));
m_week_of_month.setSelectedItem(numericValueToString(m_partToEdit.m_week_of_month));
m_day_of_yr.setSelectedItem(numericValueToString(m_partToEdit.m_day_of_yr));
m_day_of_month.setSelectedItem(numericValueToString(m_partToEdit.m_day_of_month));
m_day_of_week.setSelectedItem(m_partToEdit.getDayString());
m_hour_of_day.setSelectedItem(numericValueToString(m_partToEdit.m_hour_of_day));
m_min_of_hour.setSelectedItem(numericValueToString(m_partToEdit.m_min_of_hour));
m_second.setSelectedItem(numericValueToString(m_partToEdit.m_second));
/*((SpinnerNumberModel)m_week_of_yr.getModel()).setValue(partToEdit.m_week_of_yr);
((SpinnerNumberModel)m_week_of_month.getModel()).setValue(partToEdit.m_week_of_month);
((SpinnerNumberModel)m_day_of_yr.getModel()).setValue(partToEdit.m_day_of_yr);
((SpinnerNumberModel)m_day_of_month.getModel()).setValue(partToEdit.m_day_of_month); */
/*((SpinnerNumberModel)m_hour_of_day.getModel()).setValue(partToEdit.m_hour_of_day);
((SpinnerNumberModel)m_min_of_hour.getModel()).setValue(partToEdit.m_min_of_hour);
((SpinnerNumberModel)m_second.getModel()).setValue(partToEdit.m_second); */
}
/**
* Converts an integer field value to a string. Values equal to -100
* indicate match anything "wildcards", represented as "*"
*
* @param val the integer value to convert to a string
* @return the value converted to a string.
*/
protected String numericValueToString(int val) {
if (val == -100) {
return "*";
}
return "" + val;
}
/**
* Set up combo boxes
*/
protected void setupCombos() {
Vector inequalities = new Vector();
if (!m_right) {
inequalities.add(">"); inequalities.add(">="); inequalities.add("=");
} else {
inequalities.add("<");
inequalities.add("<=");
}
m_operator.setModel(new DefaultComboBoxModel(inequalities));
Vector years = new Vector();
years.add("*");
for (int i = 1900; i <=2100; i++) {
years.add("" + i);
}
m_year.setModel(new DefaultComboBoxModel(years));
Vector months = new Vector();
months.add("*");
months.add("jan"); months.add("feb"); months.add("mar"); months.add("apr");
months.add("may"); months.add("jun"); months.add("jul"); months.add("aug");
months.add("sep"); months.add("oct"); months.add("nov"); months.add("dec");
m_month.setModel(new DefaultComboBoxModel(months));
Vector days = new Vector();
days.add("*");
days.add("sun"); days.add("mon"); days.add("tue"); days.add("wed");
days.add("thu"); days.add("fri"); days.add("sat");
m_day_of_week.setModel(new DefaultComboBoxModel(days));
Vector week = new Vector();
week.add("*");
for (int i = 1; i <= 52; i++) {
week.add("" + i);
}
m_week_of_yr.setModel(new DefaultComboBoxModel(week));
week = new Vector();
week.add("*");
for (int i = 0; i <= 6; i++) {
week.add("" + i);
}
m_week_of_month.setModel(new DefaultComboBoxModel(week));
days = new Vector();
days.add("*");
for (int i = 1; i <= 365; i++) {
days.add("" + i);
}
m_day_of_yr.setModel(new DefaultComboBoxModel(days));
days = new Vector();
days.add("*");
for (int i = 1; i <= 31; i++) {
days.add("" + i);
}
m_day_of_month.setModel(new DefaultComboBoxModel(days));
Vector hour = new Vector();
hour.add("*");
for (int i = 0; i < 24; i++) {
hour.add("" + i);
}
m_hour_of_day.setModel(new DefaultComboBoxModel(hour));
Vector minute = new Vector();
minute.add("*");
for (int i = 0; i < 60; i++) {
minute.add("" + i);
}
m_min_of_hour.setModel(new DefaultComboBoxModel(minute));
Vector second = new Vector();
second.add("*");
for (int i = 0; i < 60; i++) {
second.add("" + i);
}
m_second.setModel(new DefaultComboBoxModel(second));
}
/**
* Set the enabled status of all the GUI elements
*
* @param enabled true if all elements should be enabled
*/
public void setEnabled(boolean enabled) {
m_operator.setEnabled(enabled);
m_year.setEnabled(enabled);
m_month.setEnabled(enabled);
m_week_of_yr.setEnabled(enabled);
m_week_of_month.setEnabled(enabled);
m_day_of_yr.setEnabled(enabled);
m_day_of_month.setEnabled(enabled);
m_day_of_week.setEnabled(enabled);
m_hour_of_day.setEnabled(enabled);
m_min_of_hour.setEnabled(enabled);
m_second.setEnabled(enabled);
}
/**
* Adds a PropertyChangeListener who will be notified of value changes.
*
* @param l a value of type 'PropertyChangeListener'
*/
@Override
public void addPropertyChangeListener(PropertyChangeListener l) {
if (m_support != null && l != null) {
m_support.addPropertyChangeListener(l);
}
}
/**
* Removes a PropertyChangeListener.
*
* @param l a value of type 'PropertyChangeListener'
*/
@Override
public void removePropertyChangeListener(PropertyChangeListener l) {
if (m_support != null && l != null) {
m_support.removePropertyChangeListener(l);
}
}
/**
* Main method for testing this class. Expects a single quoted argument containing
* the textual definition of one bound of a periodic test.
*
* @param args
*/
public static void main(String[] args) {
try {
CustomPeriodicTestEditor ed = new CustomPeriodicTestEditor(false);
final CustomPeriodicTest test = new CustomPeriodicTest(">1965:aug:*:*:*:28:*:*:*:*");
ed.setTestToEdit(test);
final javax.swing.JFrame jf =
new javax.swing.JFrame("Periodic test editor");
jf.getContentPane().setLayout(new BorderLayout());
jf.getContentPane().add(ed, BorderLayout.CENTER);
jf.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.out.println(test.toString());
jf.dispose();
System.exit(0);
}
});
jf.pack();
jf.setVisible(true);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}