diff --git a/.gitignore b/.gitignore
index 3af2a9f..06848ef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -151,3 +151,4 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
.vscode/settings.json
+playground.ipynb
diff --git a/LICENSE b/LICENSE
index 52752da..c8535be 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2022 Taruma Sakti
+Copyright (c) 2022 Taruma Sakti Megariansyah
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 03c3faf..3f98449 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,55 @@
-# dash-hidrokit-rainfall
- dashboard for rainfall data exploration
+# Dashboard Rainfall Data Explorer
+
+
+
+__Rainfall Data Explorer__ (`hkrainfall`) adalah _dashboard_ untuk mengeksplorasi data hujan di setiap stasiunnya dan membandingkannya baik secara numerik maupun visual. `hkrainfall` dibuat menggunakan teknologi [Dash + Plotly](https://plotly.com/) dengan bahasa pemrograman Python. Proyek `hkrainfall` bersifat _open-source_ dengan lisensi MIT.
+
+## Cara Menjalankan Dashboard (Lokal)
+
+Sangat dianjurkan untuk menjalankan dashboard ini menggunakan mesin lokal.
+
+- Buat _virtual environment_ menggunakan `environment.yml` (untuk conda) atau `requirements.txt` (untuk venv).
+- Jalankan `app.py` di terminal.
+- Buka alamat `http://127.0.0.1:8050/` di browser.
+
+## Cara Penggunaan
+
+Dashboard ini bisa membaca berkas berformat '.csv' dengan:
+
+- Kolom pertama merupakan tanggal dengan format yang dapat dibaca oleh fitur `parse_dates` yang tersedia di `pandas`. Direkomendasikan mengubahnya menjadi format `YYYY-MM-DD`.
+- Kolom lainnya merupakan data hujan dengan header.
+- Baris pertama akan dibaca sebagai header tabel, sehingga dianjurkan menambahkan label untuk setiap kolomnya. Gunakan label `DATE` untuk kolom tanggal yang akan digunakan sebagai index.
+
+Navigasi dashboard ini antara lain:
+
+- _Drag and Drop_ berkas atau pilih berkas pada tombol "Drag and Drop or Select Files". Klik "Use Example Data" jika ingin melihat demonstrasi dashboard ini.
+- Jika prosesnya berhasil, akan muncul tabel dengan data yang di-_upload_ atau contoh data. Tabel ini _editable_ sehingga bisa menyesuaikan saat proses pengoreksian saat eksplorasi data. Bisa juga diubah nama tabelnya. Pastikan nama kolom berbeda dan nama kolom pertama (tanggal) selalu "DATE".
+- Klik "Visualize Data" untuk melihat visualisasi data. Pada tahap ini, Anda bisa kembali ke tabel jika ingin melakukan pengoreksian data. Anda juga bisa melakukan filter pada setiap kolom untuk eksplorasi selanjutnya.
+- Tabel yang telah diubah, bisa di-_download_ kembali dalam bentuk CSV.
+- Setelah tabel sudah dikoreksi. Bisa dilanjutkan ke tahapan analisis data. Perlu diingat, data yang dianalisis sesuai dengan tampilan/informasi tabel terkini. Jadi, jika masih ada filter, maka analisis hanya dilakukan pada data yang telah terfilter.
+- Klik "Analyze Data" untuk melakukan analisis data. Perlu diingat, proses ini akan memakan waktu jika memiliki dataset yang besar. Jadi, sangat disarankan menggunakan mesin lokal untuk proses ini. Karena yang dapat diakses di web hanya berupa demonstrasi saja dan menggunakan layanan gratis sehingga sangat terbatas kemampuannya.
+- Analisis data terbagi menjadi tiga periode yaitu 2 periode (biweekly), setiap bulanan (monthly), dan tahunan (yearly). Sebagai catatan, biweekly itu dibagi berdasarkan 16 hari pertama kemudian sisa harinya pada setiap bulan.
+- Analisis data yang dilakukan berupa:
+ - `days`: Jumlah hari pada setiap periodenya (16 hari untuk biweekly, 1 bulan untuk monthly, dan 1 tahun untuk yearly).
+ - `max`: Nilai maksimum pada setiap periode.
+ - `sum`: Total nilai pada setiap periode.
+ - `n_rain`: Jumlah hari hujan di setiap periode.
+ - `n_dry`: Jumlah hari kering di setiap periode. Catatan: Ini akan menghitung nilai `np.nan` sebagai hari kering.
+ - `max_date`: Tanggal kejadian hujan maksimum terjadi pada setiap periode.
+- Tabel analisis tidak dapat diubah dan hanya sebagai penyedia informasi saja.
+- Melihat tabel analisis rasanya cukup sulit untuk diceritakan atau diinterpretasikan, oleh karena itu disediakan tombol "Visualize it!" untuk melakuakn visualisasi tabel analisis.
+- Selain melakukan visualisasi, tabel analisis juga dapat di-_download_ dengan mengklik tombol "Download Results as CSV". Perlu dicatat, `dataframe` tabel analisis menggunakan `MultiIndex` sehingga pada format CSV akan perlu dilakukan pengolahan lagi.
+- Visualisasi dari tabel analisis berupa:
+ - Group Bar Chart untuk setiap periode dengan kolom `max` dan `sum`. Grafik ini bisa melihat secara langsung perbandingan nilai antar stasiun.
+ - Stack Bar Chart untuk setiap periode dengan kolom `n_rain` dan `n_dry`. Grafik ini bisa memberikan gambaran periode yang memiliki frekuensi hujan/kekeringan tinggi/rendah secara sekilas.
+ - Bubble Chart (Maximum Rainfall Events) memberikan gambaran besar terkait tanggal kejadian saat hujan maksimum terjadi di setiap stasiun. Ukuran lingkaran menunjukkan seberapa besar hujan maksimum yang terjadi.
+
+Navigasi dengan grafik interaktif plotly:
+
+- Pada setiap grafik plotly, dapat dilakukan interaksi langsung dengan grafik seperti mengatur stasiun/data mana saja yang ditampilkan, pembesaran pada periode tertentu. mengatur ukuran sumbu, dll.
+- Sangat dianjurkan untuk mengeksplorasi sendiri mengenai _mode bar_ yang ada di kanan atas setiap grafik plotly.
+- Setiap grafik bisa di-_download_ dalam bentuk `.png` untuk kepentingan menaruh di dokumen atau lainnya.
+
+## Catatan
+
+- Dashboard ini seharusnya bergantung pada paket hidrokit terutama pada modul `hidrokit.contrib.taruma.hk98` mengenai rekap data (tabel analisis). Akan tetapi ditemukan isu di hidrokit/hidrokit#219. Sehingga untuk sementara modul tersebut terpisah dengan dashboard ini.
diff --git a/app.py b/app.py
index 9f9d0f3..f09564d 100644
--- a/app.py
+++ b/app.py
@@ -2,10 +2,8 @@
import dash_bootstrap_components as dbc
import pandas as pd
import plotly.io as pio
-import pyfigure
-import pyfunc
-import pylayout
-from dash import dcc, Input, Output, State
+import pyfigure, pyfunc, pylayout, pylayoutfunc
+from dash import dcc, html, Input, Output, State
from pathlib import Path
from pyconfig import appConfig
from pytemplate import hktemplate
@@ -23,10 +21,8 @@
"https://cdn.jsdelivr.net/gh/AnnMarieW/dash-bootstrap-templates@V1.0.4/dbc.min.css"
)
-# GLOBAL DATASET
-DATAFRAME = None
-DF_FILENAME = None
-DF_FILEDATE = None
+# GLOBAL VARS
+SUMMARY_ALL = None
# APP
app = dash.Dash(
@@ -45,7 +41,7 @@
[
pylayout.HTML_TITLE,
pylayout.HTML_SUBTITLE,
- pylayout.HTML_ALERT,
+ pylayout.HTML_ALERT_README,
pylayout.HTML_ROW_BUTTON_UPLOAD,
pylayout.HTML_ROW_TABLE,
pylayout.HTML_ROW_BUTTON_VIZ,
@@ -53,7 +49,11 @@
pylayout.HTML_ROW_GRAPH_ONE,
pylayout.HTML_ROW_BUTTON_ANALYZE,
pylayout.HTML_ROW_TABLE_ANALYZE,
+ pylayout.HTML_ROW_BUTTON_VIZ_ANALYSIS,
+ pylayout.HTML_ROW_GRAPH_ANALYSIS,
+ pylayout.HTML_ALERT_CONTRIBUTION,
pylayout.HTML_MADEBY,
+ pylayout.HTML_OTHER_PROJECTS,
pylayout.HTML_FOOTER,
],
fluid=True,
@@ -63,141 +63,213 @@
@app.callback(
[
- Output("output-data-upload", "children"),
- Output("upload-data", "disabled"),
+ Output("row-table-uploaded", "children"),
+ Output("dcc-upload", "disabled"),
Output("button-upload", "disabled"),
Output("button-visualize", "disabled"),
Output("button-visualize", "outline"),
],
- Input("upload-data", "contents"),
- State("upload-data", "filename"),
- State("upload-data", "last_modified"),
+ Input("dcc-upload", "contents"),
+ State("dcc-upload", "filename"),
+ State("dcc-upload", "last_modified"),
Input("button-skip", "n_clicks"),
prevent_initial_call=True,
)
def callback_upload(content, filename, filedate, _):
- global DATAFRAME, DF_FILENAME, DF_FILEDATE
-
ctx = dash.callback_context
if content is not None:
- DF_FILENAME = filename
- DF_FILEDATE = filedate
- children, DATAFRAME = pyfunc.parse_upload_data(content, filename, filedate)
+ children, dataframe = pyfunc.parse_upload_data(content, filename, filedate)
if ctx.triggered[0]["prop_id"] == "button-skip.n_clicks":
- DATAFRAME = pd.read_csv(
- Path(r"./example_dataset.csv"), index_col=0, parse_dates=True
+ dataframe = pd.read_csv(
+ Path(r"./example_1Y7S.csv"), index_col=0, parse_dates=True
)
filename = None
filedate = None
- button_viz_disabled = True
- button_upload_disabled = False
upload_disabled = False
+ button_upload_disabled = False
+ button_viz_disabled = True
button_viz_outline = True
- if DATAFRAME is not None:
- children = pylayout.create_table_layout(
- DATAFRAME,
+ if dataframe is not None:
+ children = pylayoutfunc.create_table_layout(
+ dataframe,
"output-table",
filename=filename,
filedate=filedate,
editable=True,
renamable=True,
)
- button_viz_disabled = False
- button_upload_disabled = False
upload_disabled = False
+ button_upload_disabled = False
+ button_viz_disabled = False
button_viz_outline = False
return [
children,
- upload_disabled, # upload_disabled,
- button_upload_disabled, # button_upload_disabled,
- button_viz_disabled, # button_viz_disabled,
+ upload_disabled,
+ button_upload_disabled,
+ button_viz_disabled,
button_viz_outline,
]
@app.callback(
[
- Output("section-graph", "figure"),
- Output("visibility-download-button", "style"),
- Output("section-graph", "config"),
+ Output("graph-rainfall", "figure"),
+ Output("row-button-download-csv", "style"),
+ Output("graph-rainfall", "config"),
Output("container-graphbar-options", "style"),
Output("button-analyze", "disabled"),
- Output('button-analyze', 'outline')
+ Output("button-analyze", "outline"),
],
Input("button-visualize", "n_clicks"),
State("output-table", "derived_virtual_data"),
State("output-table", "columns"),
- State("graph-bar-options", "value"),
+ State("radio-graphbar-options", "value"),
prevent_initial_call=True,
)
def callback_visualize(_, table_data, table_columns, graphbar_opt):
- global DATAFRAME
-
- DATAFRAME = pyfunc.transform_to_dataframe(table_data, table_columns)
+ dataframe = pyfunc.transform_to_dataframe(table_data, table_columns)
- download_row_visible = {"visibility": "visible"}
- static_plot_enabled = {"staticPlot": False}
- row_graphbar_visibile = {"visibility": "hidden"}
+ row_download_table_style = {"visibility": "visible"}
+ row_graph_config = {"staticPlot": False}
+ row_graphbar_options_style = {"visibility": "hidden"}
button_analyze_disabled = False
button_analyze_outline = False
- if DATAFRAME.size > (366 * 8):
- fig = pyfigure.figure_scatter(DATAFRAME)
+ if dataframe.size > (366 * 8):
+ fig = pyfigure.figure_scatter(dataframe)
else:
- row_graphbar_visibile = {"visibility": "visible"}
+ row_graphbar_options_style = {"visibility": "visible"}
if graphbar_opt in ["group", "stack"]:
- fig = pyfigure.figure_bar(DATAFRAME, graphbar_opt)
+ fig = pyfigure.figure_bar(dataframe, graphbar_opt)
else:
- fig = pyfigure.figure_scatter(DATAFRAME)
+ fig = pyfigure.figure_scatter(dataframe)
return [
fig,
- download_row_visible,
- static_plot_enabled,
- row_graphbar_visibile,
+ row_download_table_style,
+ row_graph_config,
+ row_graphbar_options_style,
button_analyze_disabled,
- button_analyze_outline
+ button_analyze_outline,
]
@app.callback(
Output("download-csv", "data"),
Input("button-download-csv", "n_clicks"),
+ State("output-table", "derived_virtual_data"),
+ State("output-table", "columns"),
prevent_initial_call=True,
)
-def callback_download(_):
- return dcc.send_data_frame(DATAFRAME.to_csv, "derived_table.csv")
+def callback_download_table(_, table_data, table_columns):
+ dataframe = pyfunc.transform_to_dataframe(table_data, table_columns)
+ return dcc.send_data_frame(dataframe.to_csv, "derived_table.csv")
@app.callback(
- Output("col-table-analyze", "children"),
+ [
+ Output("tab-analysis", "children"),
+ Output("button-viz-analysis", "disabled"),
+ Output("button-viz-analysis", "outline"),
+ Output("row-button-download-analysis-csv", "style"),
+ ],
Input("button-analyze", "n_clicks"),
State("output-table", "derived_virtual_data"),
State("output-table", "columns"),
prevent_initial_call=True,
)
-def callback_analyze(n_clicks, table_data, table_columns):
- global DATAFRAME
+def callback_analyze(_, table_data, table_columns):
+ global SUMMARY_ALL
+
+ button_viz_analysis_disabled = True
+ button_viz_analysis_outline = True
+ row_button_download_analysis_style = {"visibility": "hidden"}
+
+ try:
+ dataframe = pyfunc.transform_to_dataframe(table_data, table_columns)
+ SUMMARY_ALL = pyfunc.generate_summary_all(dataframe, n_days=["16D", "MS", "YS"])
+ tables = [
+ pylayoutfunc.create_table_summary(
+ summary, f"table-analyze-{counter}", deletable=False
+ )
+ for counter, summary in enumerate(SUMMARY_ALL)
+ ]
+
+ children = pylayoutfunc.create_tabcard_table_layout(tables)
+ button_viz_analysis_disabled = False
+ button_viz_analysis_outline = False
+ row_button_download_analysis_style = {"visibility": "visible"}
+ except Exception as e:
+ children = html.Div(f"SOMETHING ERROR {e}")
+
+ return [
+ children,
+ button_viz_analysis_disabled,
+ button_viz_analysis_outline,
+ row_button_download_analysis_style,
+ ]
+
+
+@app.callback(
+ Output("download-analysis-csv", "data"),
+ Input("button-download-analysis-csv", "n_clicks"),
+ prevent_initial_call=True,
+)
+def callback_download_results(_):
+
+ dataframe = pd.concat(SUMMARY_ALL, axis=1, keys=["Biweekly", "Monthly", "Yearly"])
+ return dcc.send_data_frame(dataframe.to_csv, "results.csv")
+
+
+@app.callback(
+ Output("tab-graph-analysis", "children"),
+ Input("button-viz-analysis", "n_clicks"),
+ prevent_initial_call=True,
+)
+def callback_troubleshoot(_):
+ from itertools import product
- DATAFRAME = pyfunc.transform_to_dataframe(table_data, table_columns)
- summary_all = pyfunc.generate_summary_all(DATAFRAME, n_days=["16D", "MS", "YS"])
+ label_periods = ["Biweekly", "Monthly", "Yearly"]
+ label_maxsum = ["Max + Sum"]
+ label_raindry = ["Dry + Rain"]
+ label_ufunc = label_maxsum + label_raindry
- tables = [
- pylayout.create_table_summary(
- summary, f"table-analyze-{counter}", deletable=False
+ graphs_maxsum = [
+ pyfigure.figure_summary_maxsum(
+ summary, title=f"{period}: {title}", period=period
)
- for counter, summary in enumerate(summary_all)
+ for summary, title, period in zip(SUMMARY_ALL, label_maxsum * 3, label_periods)
]
+ graphs_raindry = [
+ pyfigure.figure_summary_raindry(
+ summary, title=f"{period}: {title}", period=period
+ )
+ for summary, title, period in zip(SUMMARY_ALL, label_raindry * 3, label_periods)
+ ]
+ graph_maxdate = [pyfigure.figure_summary_maxdate(SUMMARY_ALL)]
+
+ all_graphs = graphs_maxsum + graphs_raindry + graph_maxdate
+ labels = [": ".join(i) for i in product(label_ufunc, label_periods)]
+ labels += ["Maximum Rainfall Occurrence"]
- children = pylayout.create_tabcard_layout(tables)
+ children = pylayoutfunc.create_tabcard_graph_layout(all_graphs, labels)
return children
+@app.callback(
+ Output("row-troubleshoot", "children"),
+ Input("button-troubleshoot", "n_clicks"),
+ prevent_initial_call=True,
+)
+def _callback_troubleshoot(_):
+ return html.Div("troubleshoot")
+
+
if __name__ == "__main__":
app.run_server(debug=DEBUG)
diff --git a/app_config.yml b/app_config.yml
index 2ca04c2..26ddac4 100644
--- a/app_config.yml
+++ b/app_config.yml
@@ -4,7 +4,7 @@ DASH_APP:
DEBUG: False
DASH_THEME:
- THEME: SKETCHY
+ THEME: SIMPLEX
TEMPLATE:
LOGO_SOURCE: https://raw.githubusercontent.com/hidrokit/static-assets/main/logo_0.4.0-v1.1/hidrokit-hidrokit/50x50square.png
@@ -12,6 +12,6 @@ TEMPLATE:
SHOW_LEGEND_INSIDE: False
SHOW_RANGESELECTOR: False
-VERSION: v0.1.0
+VERSION: v1.0.0
GITHUB_LINK: https://github.com/taruma/dash-hidrokit-rainfall
GITHUB_REPO: taruma/dash-hidrokit-rainfall
\ No newline at end of file
diff --git a/example_dataset.csv b/example_1Y7S.csv
similarity index 100%
rename from example_dataset.csv
rename to example_1Y7S.csv
diff --git a/example_2Y4S.csv b/example_2Y4S.csv
new file mode 100644
index 0000000..c164d8e
--- /dev/null
+++ b/example_2Y4S.csv
@@ -0,0 +1,731 @@
+DATE,STA_A,STA_H,STA_I,STA_M
+2018-01-01,6.0,31.5,35,0.0
+2018-01-02,52.0,37.9,27,10.0
+2018-01-03,8.0,29.4,2,16.0
+2018-01-04,38.5,12.8,12,11.0
+2018-01-05,46.0,0.0,9,5.5
+2018-01-06,12.0,0.0,11,1.5
+2018-01-07,2.5,0.0,0,0.0
+2018-01-08,0.0,0.0,0,0.0
+2018-01-09,1.0,0.0,0,0.0
+2018-01-10,14.5,0.0,4,39.0
+2018-01-11,6.5,0.0,10,0.0
+2018-01-12,3.5,0.0,1,0.0
+2018-01-13,0.0,0.0,0,1.5
+2018-01-14,3.0,0.0,3,0.0
+2018-01-15,4.5,0.0,7,0.0
+2018-01-16,2.0,0.0,0,0.0
+2018-01-17,0.0,0.0,0,0.0
+2018-01-18,0.0,0.0,0,0.0
+2018-01-19,1.5,0.0,5,0.0
+2018-01-20,2.5,0.0,0,0.0
+2018-01-21,1.0,0.0,0,9.0
+2018-01-22,38.5,0.0,8,0.0
+2018-01-23,0.0,3.8,0,0.0
+2018-01-24,0.0,0.0,0,1.0
+2018-01-25,0.0,7.6,0,0.0
+2018-01-26,6.0,0.0,2,3.5
+2018-01-27,18.5,0.0,14,0.0
+2018-01-28,3.0,0.0,0,0.0
+2018-01-29,7.5,0.0,11,0.0
+2018-01-30,5.0,0.0,25,1.5
+2018-01-31,2.0,0.0,13,0.0
+2018-02-01,0.0,0.0,9,0.0
+2018-02-02,0.0,0.0,0,4.0
+2018-02-03,23.0,0.0,14,1.5
+2018-02-04,2.5,0.0,7,0.0
+2018-02-05,3.5,0.0,11,9.3
+2018-02-06,7.0,0.0,15,3.5
+2018-02-07,14.0,0.0,21,0.0
+2018-02-08,4.0,0.0,20,0.0
+2018-02-09,6.0,0.0,0,0.0
+2018-02-10,0.0,0.0,0,0.0
+2018-02-11,0.0,0.0,0,0.0
+2018-02-12,0.0,0.0,6,4.5
+2018-02-13,2.0,0.0,1,0.0
+2018-02-14,9.5,0.0,4,0.0
+2018-02-15,1.0,0.0,3,4.5
+2018-02-16,5.0,0.0,0,0.0
+2018-02-17,0.0,0.0,15,0.0
+2018-02-18,3.0,0.0,0,5.5
+2018-02-19,0.0,0.0,0,46.5
+2018-02-20,8.0,0.0,10,15.0
+2018-02-21,2.5,0.0,9,9.5
+2018-02-22,11.0,0.0,17,13.5
+2018-02-23,18.5,0.0,49,0.0
+2018-02-24,6.5,0.0,0,8.0
+2018-02-25,9.0,0.0,4,7.5
+2018-02-26,34.5,0.0,35,39.0
+2018-02-27,13.0,0.0,29,22.0
+2018-02-28,29.0,0.0,31,3.0
+2018-03-01,2.0,0.0,25,6.0
+2018-03-02,7.5,0.0,37,4.0
+2018-03-03,6.0,0.0,19,9.0
+2018-03-04,9.0,0.0,14,21.0
+2018-03-05,13.5,0.0,7,12.5
+2018-03-06,11.0,0.0,13,0.0
+2018-03-07,21.0,0.0,25,1.0
+2018-03-08,31.0,0.0,35,40.5
+2018-03-09,29.5,0.0,51,4.0
+2018-03-10,1.0,0.0,11,10.3
+2018-03-11,2.5,0.0,0,17.0
+2018-03-12,25.0,0.0,7,31.5
+2018-03-13,4.0,0.0,0,0.0
+2018-03-14,0.0,0.0,0,2.2
+2018-03-15,0.0,0.0,0,25.0
+2018-03-16,0.0,0.0,39,23.0
+2018-03-17,18.0,0.0,0,45.3
+2018-03-18,6.0,0.0,0,37.0
+2018-03-19,4.5,0.0,0,14.0
+2018-03-20,28.0,0.0,36,33.0
+2018-03-21,59.0,0.0,53,0.0
+2018-03-22,1.0,0.0,0,0.0
+2018-03-23,4.0,0.0,2,2.0
+2018-03-24,21.0,0.0,11,5.0
+2018-03-25,6.5,0.0,0,0.0
+2018-03-26,2.0,0.0,0,0.0
+2018-03-27,0.0,0.0,0,1.0
+2018-03-28,44.0,0.0,13,7.5
+2018-03-29,0.0,0.0,2,17.5
+2018-03-30,1.0,0.0,0,0.0
+2018-03-31,0.0,0.0,0,0.0
+2018-04-01,1.5,10.5,0,0.0
+2018-04-02,0.0,0.0,0,6.0
+2018-04-03,0.0,0.0,0,27.5
+2018-04-04,3.0,0.0,7,2.0
+2018-04-05,4.0,2.5,0,7.0
+2018-04-06,11.5,0.0,0,0.0
+2018-04-07,0.0,7.0,0,40.0
+2018-04-08,18.0,9.5,16,0.0
+2018-04-09,10.5,5.0,0,2.5
+2018-04-10,1.5,0.0,3,0.0
+2018-04-11,3.5,0.0,0,0.0
+2018-04-12,0.0,0.0,0,6.5
+2018-04-13,1.0,0.0,0,23.0
+2018-04-14,0.5,9.0,0,0.0
+2018-04-15,17.5,7.5,0,0.0
+2018-04-16,0.0,1.0,7,0.0
+2018-04-17,1.0,0.0,0,0.0
+2018-04-18,8.0,0.0,0,1.5
+2018-04-19,2.0,8.0,2,17.0
+2018-04-20,12.0,1.5,0,2.0
+2018-04-21,6.0,0.0,21,4.5
+2018-04-22,8.5,0.0,35,2.5
+2018-04-23,32.0,0.0,47,2.5
+2018-04-24,4.5,2.5,12,0.0
+2018-04-25,0.0,0.0,0,9.5
+2018-04-26,2.5,0.0,0,8.5
+2018-04-27,9.5,0.0,0,0.0
+2018-04-28,5.0,6.5,0,0.0
+2018-04-29,7.5,0.0,0,0.0
+2018-04-30,0.0,0.0,0,0.0
+2018-05-01,0.0,0.0,0,0.0
+2018-05-02,0.0,0.0,0,0.0
+2018-05-03,0.0,0.0,0,0.0
+2018-05-04,0.0,0.0,0,0.0
+2018-05-05,0.5,4.5,3,0.0
+2018-05-06,0.0,0.0,0,0.0
+2018-05-07,0.0,3.0,0,0.0
+2018-05-08,0.0,7.0,0,15.0
+2018-05-09,3.0,2.5,23,0.0
+2018-05-10,0.0,0.0,0,0.0
+2018-05-11,0.0,3.5,0,0.0
+2018-05-12,0.0,0.0,0,0.0
+2018-05-13,0.0,3.0,2,0.0
+2018-05-14,0.0,0.0,0,0.0
+2018-05-15,0.0,0.0,0,7.0
+2018-05-16,1.0,0.0,0,18.0
+2018-05-17,0.0,0.0,0,0.0
+2018-05-18,2.0,9.5,0,26.0
+2018-05-19,4.0,4.0,0,2.0
+2018-05-20,8.0,0.0,7,0.0
+2018-05-21,6.5,0.0,3,1.0
+2018-05-22,3.0,0.0,18,1.5
+2018-05-23,5.0,1.5,1,3.0
+2018-05-24,9.5,0.0,0,6.0
+2018-05-25,11.0,0.0,0,3.0
+2018-05-26,2.5,3.5,2,0.0
+2018-05-27,7.5,4.0,0,0.0
+2018-05-28,0.0,0.0,0,0.0
+2018-05-29,0.0,0.0,0,0.0
+2018-05-30,0.0,0.0,0,0.0
+2018-05-31,0.0,0.0,0,0.0
+2018-06-01,0.0,0.0,0,0.0
+2018-06-02,0.0,0.0,0,0.0
+2018-06-03,0.0,0.0,0,0.0
+2018-06-04,0.0,0.0,0,0.0
+2018-06-05,0.0,2.5,0,0.0
+2018-06-06,0.0,0.0,0,0.0
+2018-06-07,0.0,0.0,0,0.0
+2018-06-08,0.0,0.0,0,0.0
+2018-06-09,0.0,1.5,0,0.0
+2018-06-10,0.0,14.0,0,0.0
+2018-06-11,0.0,17.0,0,0.0
+2018-06-12,0.0,0.0,0,0.0
+2018-06-13,0.0,3.5,0,0.0
+2018-06-14,0.0,1.0,0,0.0
+2018-06-15,0.0,0.0,0,0.0
+2018-06-16,0.0,0.0,11,0.0
+2018-06-17,0.0,0.0,0,0.0
+2018-06-18,0.0,2.5,0,0.0
+2018-06-19,0.0,0.0,0,0.0
+2018-06-20,0.0,8.0,0,0.0
+2018-06-21,0.0,0.0,0,0.0
+2018-06-22,0.0,1.5,0,0.0
+2018-06-23,5.0,2.5,4,0.0
+2018-06-24,7.5,0.0,0,0.0
+2018-06-25,4.0,0.0,0,0.0
+2018-06-26,10.5,0.0,0,13.0
+2018-06-27,15.0,0.0,32,0.0
+2018-06-28,0.0,3.0,0,0.0
+2018-06-29,0.0,0.0,0,0.0
+2018-06-30,0.0,0.0,0,0.0
+2018-07-01,0.0,0.0,0,0.0
+2018-07-02,0.0,0.0,0,0.0
+2018-07-03,0.0,1.0,0,0.0
+2018-07-04,0.0,9.0,0,0.0
+2018-07-05,0.0,2.0,0,0.0
+2018-07-06,0.0,0.0,0,0.0
+2018-07-07,0.0,0.0,0,0.0
+2018-07-08,0.0,2.0,0,0.0
+2018-07-09,0.0,3.5,0,0.0
+2018-07-10,0.0,0.0,0,0.0
+2018-07-11,0.0,0.0,0,0.0
+2018-07-12,0.0,6.0,0,0.0
+2018-07-13,0.0,9.0,0,0.0
+2018-07-14,0.0,0.0,0,0.0
+2018-07-15,0.0,0.0,0,0.0
+2018-07-16,0.0,0.0,0,0.0
+2018-07-17,0.0,0.0,0,0.0
+2018-07-18,0.0,3.0,0,0.0
+2018-07-19,0.0,0.0,0,0.0
+2018-07-20,0.0,0.0,0,0.0
+2018-07-21,0.0,0.0,0,0.0
+2018-07-22,0.0,0.0,0,0.0
+2018-07-23,0.0,11.5,0,0.0
+2018-07-24,0.0,3.0,0,0.0
+2018-07-25,0.0,0.0,0,0.0
+2018-07-26,0.0,1.5,0,0.0
+2018-07-27,0.0,0.0,0,0.0
+2018-07-28,0.0,0.0,0,0.0
+2018-07-29,0.0,6.5,0,0.0
+2018-07-30,0.0,0.0,0,0.0
+2018-07-31,0.0,0.0,0,0.0
+2018-08-01,0.0,1.5,0,0.0
+2018-08-02,0.0,0.0,25,0.0
+2018-08-03,0.0,0.0,0,0.0
+2018-08-04,0.0,0.0,0,0.0
+2018-08-05,0.0,0.0,0,0.0
+2018-08-06,0.0,6.5,0,0.0
+2018-08-07,0.0,0.0,0,0.0
+2018-08-08,0.0,0.0,0,0.0
+2018-08-09,0.0,0.0,0,0.0
+2018-08-10,3.0,0.0,2,0.0
+2018-08-11,0.0,2.5,13,0.0
+2018-08-12,0.0,0.0,0,0.0
+2018-08-13,0.0,0.0,0,0.0
+2018-08-14,0.0,0.0,0,0.0
+2018-08-15,0.0,0.0,0,0.0
+2018-08-16,0.0,0.0,0,0.0
+2018-08-17,0.0,0.0,0,0.0
+2018-08-18,0.0,0.0,0,0.0
+2018-08-19,0.0,0.0,0,0.0
+2018-08-20,0.0,0.0,0,0.0
+2018-08-21,0.0,0.0,0,0.0
+2018-08-22,0.0,0.0,0,0.0
+2018-08-23,0.0,0.0,0,0.0
+2018-08-24,0.0,0.0,0,0.0
+2018-08-25,0.0,0.0,0,0.0
+2018-08-26,0.0,0.0,0,0.0
+2018-08-27,0.0,11.5,0,0.0
+2018-08-28,0.0,14.0,0,0.0
+2018-08-29,0.0,3.0,0,0.0
+2018-08-30,7.5,6.0,0,1.5
+2018-08-31,0.0,10.5,0,0.0
+2018-09-01,3.0,3.0,2,0.0
+2018-09-02,6.0,6.0,11,0.0
+2018-09-03,4.5,0.0,0,0.0
+2018-09-04,0.0,0.0,0,0.0
+2018-09-05,0.0,0.0,0,0.0
+2018-09-06,0.0,0.0,0,0.0
+2018-09-07,0.0,4.0,0,0.0
+2018-09-08,3.5,0.0,0,0.0
+2018-09-09,0.0,0.0,0,0.0
+2018-09-10,0.0,0.0,0,0.0
+2018-09-11,0.0,0.0,0,0.0
+2018-09-12,0.0,0.0,0,0.0
+2018-09-13,0.0,0.0,0,0.0
+2018-09-14,0.0,5.0,0,0.0
+2018-09-15,0.0,0.0,0,0.0
+2018-09-16,0.0,0.0,0,0.0
+2018-09-17,0.0,0.0,0,0.0
+2018-09-18,0.0,0.0,0,0.0
+2018-09-19,0.0,0.0,0,0.0
+2018-09-20,0.0,0.0,0,0.0
+2018-09-21,1.0,0.0,0,0.0
+2018-09-22,0.0,18.5,0,0.0
+2018-09-23,0.0,0.0,0,0.0
+2018-09-24,0.0,0.0,0,0.0
+2018-09-25,0.0,0.0,0,0.0
+2018-09-26,0.0,0.0,0,0.0
+2018-09-27,0.0,0.0,0,0.0
+2018-09-28,0.0,0.0,0,0.0
+2018-09-29,0.0,0.0,0,0.0
+2018-09-30,0.0,0.0,0,0.0
+2018-10-01,0.0,0.0,0,0.0
+2018-10-02,0.0,0.0,0,0.0
+2018-10-03,0.0,0.0,0,4.0
+2018-10-04,0.0,0.0,0,0.0
+2018-10-05,0.0,0.0,0,0.0
+2018-10-06,0.0,0.0,0,0.0
+2018-10-07,0.0,0.0,0,0.0
+2018-10-08,0.0,0.0,0,0.0
+2018-10-09,0.0,0.0,0,0.0
+2018-10-10,0.0,0.0,0,0.0
+2018-10-11,0.0,0.0,0,0.0
+2018-10-12,0.0,0.0,0,0.0
+2018-10-13,0.0,0.0,0,0.0
+2018-10-14,0.0,0.0,4,0.0
+2018-10-15,0.0,0.0,0,0.0
+2018-10-16,0.0,0.0,0,0.0
+2018-10-17,0.0,0.0,0,1.0
+2018-10-18,0.0,0.0,0,2.5
+2018-10-19,0.0,0.0,0,0.0
+2018-10-20,0.0,2.0,0,0.0
+2018-10-21,0.0,8.5,0,0.0
+2018-10-22,0.0,6.0,0,0.0
+2018-10-23,1.0,3.0,0,19.5
+2018-10-24,13.0,0.0,21,0.0
+2018-10-25,1.5,9.5,9,1.5
+2018-10-26,2.0,12.0,14,0.0
+2018-10-27,15.0,3.5,29,0.0
+2018-10-28,11.0,0.0,0,2.0
+2018-10-29,18.0,4.0,31,0.0
+2018-10-30,27.5,2.5,42,7.5
+2018-10-31,16.5,4.5,27,46.0
+2018-11-01,24.0,0.0,3,0.0
+2018-11-02,9.0,0.0,58,0.0
+2018-11-03,2.5,0.0,6,0.0
+2018-11-04,7.0,0.0,4,0.0
+2018-11-05,0.0,3.0,0,5.5
+2018-11-06,3.5,0.0,9,36.0
+2018-11-07,1.0,0.0,2,0.5
+2018-11-08,30.0,0.0,0,3.0
+2018-11-09,6.0,3.0,26,0.0
+2018-11-10,21.5,0.0,0,0.0
+2018-11-11,46.0,0.0,10,0.0
+2018-11-12,5.0,10.0,10,8.5
+2018-11-13,0.0,2.0,0,0.0
+2018-11-14,0.0,30.0,1,4.5
+2018-11-15,23.5,29.0,0,11.0
+2018-11-16,0.0,24.0,7,5.0
+2018-11-17,0.0,14.0,49,0.0
+2018-11-18,0.0,6.0,30,0.0
+2018-11-19,0.0,3.0,0,0.0
+2018-11-20,0.0,0.0,5,91.0
+2018-11-21,19.0,0.0,40,8.0
+2018-11-22,12.0,0.0,3,3.0
+2018-11-23,24.0,9.0,30,0.0
+2018-11-24,44.5,0.0,3,16.0
+2018-11-25,23.0,1.0,20,76.0
+2018-11-26,15.5,0.0,32,0.0
+2018-11-27,26.0,10.0,28,0.0
+2018-11-28,21.0,1.5,11,0.0
+2018-11-29,41.0,22.0,0,2.5
+2018-11-30,34.0,0.0,7,0.0
+2018-12-01,9.0,0.0,0,47.0
+2018-12-02,26.0,0.0,1,32.5
+2018-12-03,17.5,15.0,0,0.0
+2018-12-04,36.5,41.0,8,0.0
+2018-12-05,31.0,11.0,0,3.0
+2018-12-06,7.0,27.0,0,1.0
+2018-12-07,11.0,3.0,0,9.0
+2018-12-08,4.0,12.0,0,14.5
+2018-12-09,0.0,7.5,0,0.0
+2018-12-10,3.0,70.0,0,6.0
+2018-12-11,5.5,1.0,1,6.5
+2018-12-12,8.5,34.0,10,0.0
+2018-12-13,16.0,2.0,8,0.0
+2018-12-14,67.0,4.0,17,0.0
+2018-12-15,28.5,10.5,9,0.0
+2018-12-16,46.0,15.0,0,0.0
+2018-12-17,24.0,23.0,0,0.0
+2018-12-18,19.5,13.0,8,0.0
+2018-12-19,9.0,1.0,0,11.5
+2018-12-20,0.0,1.0,0,0.0
+2018-12-21,0.0,6.0,18,15.0
+2018-12-22,0.0,6.0,0,2.0
+2018-12-23,0.5,1.5,0,45.0
+2018-12-24,2.0,0.0,1,3.0
+2018-12-25,0.0,0.0,3,0.0
+2018-12-26,4.0,0.0,20,12.5
+2018-12-27,2.5,0.0,0,0.0
+2018-12-28,6.0,0.0,10,8.0
+2018-12-29,7.5,37.0,0,0.0
+2018-12-30,0.0,12.0,0,0.0
+2018-12-31,0.0,18.5,15,0.0
+2019-01-01,0.0,0.0,0,0.0
+2019-01-02,7.0,3.5,2,0.0
+2019-01-03,9.0,19.0,0,0.0
+2019-01-04,0.0,21.5,0,0.0
+2019-01-05,0.0,8.0,0,21.5
+2019-01-06,0.0,0.0,0,0.0
+2019-01-07,0.0,0.0,0,2.0
+2019-01-08,3.5,0.0,1,20.0
+2019-01-09,0.0,0.0,11,2.5
+2019-01-10,0.0,0.0,3,2.7
+2019-01-11,17.5,0.0,1,15.0
+2019-01-12,7.0,0.0,2,7.0
+2019-01-13,14.0,0.0,5,60.5
+2019-01-14,32.0,0.0,46,0.0
+2019-01-15,0.0,6.0,1,0.0
+2019-01-16,6.0,9.5,0,0.0
+2019-01-17,0.0,2.0,0,4.5
+2019-01-18,8.5,11.5,0,2.0
+2019-01-19,1.0,15.0,1,0.0
+2019-01-20,0.0,9.0,0,4.0
+2019-01-21,3.5,0.0,0,1.0
+2019-01-22,8.0,0.0,0,2.0
+2019-01-23,7.0,0.0,1,0.0
+2019-01-24,0.0,0.0,0,0.0
+2019-01-25,2.0,0.0,1,0.0
+2019-01-26,0.0,6.5,0,5.0
+2019-01-27,0.0,2.5,3,0.0
+2019-01-28,11.0,3.0,5,0.0
+2019-01-29,0.0,7.5,0,0.0
+2019-01-30,24.0,12.0,1,0.0
+2019-01-31,5.0,0.0,0,0.0
+2019-02-01,3.0,6.0,0,25.0
+2019-02-02,5.0,0.0,3,19.0
+2019-02-03,6.5,9.0,0,5.0
+2019-02-04,17.0,32.0,0,16.0
+2019-02-05,0.0,15.0,0,1.5
+2019-02-06,0.0,0.0,0,9.0
+2019-02-07,19.0,0.0,2,4.5
+2019-02-08,14.5,0.0,39,13.5
+2019-02-09,26.0,0.0,5,79.5
+2019-02-10,11.0,0.0,51,33.8
+2019-02-11,9.0,0.0,36,31.0
+2019-02-12,18.0,0.0,29,1.0
+2019-02-13,22.0,0.0,17,0.5
+2019-02-14,0.0,0.0,0,20.5
+2019-02-15,41.0,9.0,23,0.0
+2019-02-16,4.0,0.0,0,22.0
+2019-02-17,29.0,0.0,7,8.0
+2019-02-18,27.0,3.0,26,3.5
+2019-02-19,2.5,5.0,19,0.0
+2019-02-20,21.0,5.5,17,95.5
+2019-02-21,6.0,3.0,15,5.5
+2019-02-22,8.0,1.5,8,5.0
+2019-02-23,23.0,0.0,33,28.5
+2019-02-24,19.0,0.0,41,1.0
+2019-02-25,12.0,16.0,1,0.0
+2019-02-26,32.0,0.0,0,0.0
+2019-02-27,1.5,0.0,0,0.0
+2019-02-28,0.0,0.0,0,2.0
+2019-03-01,2.5,2.5,0,4.5
+2019-03-02,28.5,0.0,31,43.5
+2019-03-03,12.5,3.0,5,1.0
+2019-03-04,8.0,0.0,0,16.0
+2019-03-05,0.0,1.5,0,21.0
+2019-03-06,13.0,16.5,3,40.0
+2019-03-07,20.0,19.0,28,0.0
+2019-03-08,0.0,4.0,0,0.0
+2019-03-09,3.0,0.0,0,14.0
+2019-03-10,11.0,0.0,1,0.0
+2019-03-11,0.0,0.0,0,9.0
+2019-03-12,2.5,0.0,0,0.0
+2019-03-13,2.0,0.0,0,0.0
+2019-03-14,0.5,0.0,0,0.0
+2019-03-15,0.0,0.0,0,3.0
+2019-03-16,6.0,1.0,17,0.0
+2019-03-17,9.0,0.0,3,1.0
+2019-03-18,3.0,0.0,0,0.0
+2019-03-19,4.0,0.0,0,17.5
+2019-03-20,29.0,0.0,6,2.5
+2019-03-21,3.5,22.5,1,16.5
+2019-03-22,1.5,13.0,0,1.0
+2019-03-23,4.5,19.0,2,0.0
+2019-03-24,1.0,17.5,0,0.0
+2019-03-25,0.0,0.0,0,0.0
+2019-03-26,2.0,0.0,0,20.0
+2019-03-27,4.0,0.0,1,10.0
+2019-03-28,23.0,3.0,3,1.5
+2019-03-29,14.0,28.5,1,44.0
+2019-03-30,7.0,22.0,0,0.0
+2019-03-31,1.0,25.5,0,2.5
+2019-04-01,1.0,0.0,0,10.5
+2019-04-02,4.0,0.0,0,14.0
+2019-04-03,51.0,0.0,14,7.0
+2019-04-04,6.0,0.0,1,2.0
+2019-04-05,19.0,0.0,9,1.0
+2019-04-06,25.0,0.0,0,17.5
+2019-04-07,1.0,0.0,0,61.0
+2019-04-08,22.0,2.5,4,8.5
+2019-04-09,10.5,0.0,25,18.0
+2019-04-10,0.0,0.0,0,0.0
+2019-04-11,0.0,0.0,0,0.0
+2019-04-12,0.0,0.0,0,7.5
+2019-04-13,3.0,0.0,0,3.0
+2019-04-14,24.0,9.0,22,2.0
+2019-04-15,9.0,2.5,20,16.0
+2019-04-16,5.0,18.0,2,33.0
+2019-04-17,34.0,21.5,16,0.0
+2019-04-18,19.0,6.0,27,3.5
+2019-04-19,7.0,0.0,21,11.0
+2019-04-20,17.0,0.0,47,1.0
+2019-04-21,0.0,1.0,0,0.0
+2019-04-22,0.0,0.0,0,0.0
+2019-04-23,0.0,0.0,0,24.5
+2019-04-24,11.0,5.5,0,0.0
+2019-04-25,0.0,12.0,12,8.5
+2019-04-26,14.0,8.5,4,3.5
+2019-04-27,43.0,0.0,6,1.0
+2019-04-28,2.0,0.0,10,4.5
+2019-04-29,16.0,0.0,27,0.0
+2019-04-30,3.5,0.0,21,2.0
+2019-05-01,27.0,0.0,39,25.0
+2019-05-02,1.0,0.0,0,5.5
+2019-05-03,5.0,0.0,0,4.0
+2019-05-04,1.5,0.0,0,0.0
+2019-05-05,0.0,0.0,0,12.5
+2019-05-06,3.0,0.0,0,0.0
+2019-05-07,0.0,0.0,0,0.0
+2019-05-08,0.0,0.0,2,0.0
+2019-05-09,9.0,0.0,0,7.5
+2019-05-10,1.0,0.0,15,0.0
+2019-05-11,0.0,0.0,1,0.0
+2019-05-12,0.0,0.0,1,0.0
+2019-05-13,0.0,0.0,3,0.0
+2019-05-14,0.0,0.0,0,0.0
+2019-05-15,0.0,0.0,0,0.0
+2019-05-16,17.5,0.0,11,0.0
+2019-05-17,2.0,0.0,7,0.0
+2019-05-18,0.0,0.0,0,0.0
+2019-05-19,0.0,0.0,0,0.0
+2019-05-20,0.0,0.0,0,0.0
+2019-05-21,2.5,0.0,0,0.0
+2019-05-22,0.0,0.0,0,0.0
+2019-05-23,0.0,0.0,0,0.0
+2019-05-24,0.0,0.0,0,0.0
+2019-05-25,0.0,0.0,0,0.0
+2019-05-26,0.0,0.0,0,0.0
+2019-05-27,0.0,0.0,0,0.0
+2019-05-28,0.0,0.0,0,0.0
+2019-05-29,0.0,0.0,0,0.0
+2019-05-30,0.0,0.0,0,0.0
+2019-05-31,0.0,0.0,0,0.0
+2019-06-01,0.0,0.0,0,0.0
+2019-06-02,0.0,0.0,0,0.0
+2019-06-03,0.0,3.5,2,0.0
+2019-06-04,0.0,0.0,0,0.0
+2019-06-05,0.0,0.0,0,0.0
+2019-06-06,0.0,0.0,0,0.0
+2019-06-07,0.0,0.0,0,0.0
+2019-06-08,0.0,0.0,0,0.0
+2019-06-09,0.0,1.5,0,0.0
+2019-06-10,0.0,0.0,0,0.0
+2019-06-11,0.0,0.0,0,0.0
+2019-06-12,0.0,0.0,0,0.0
+2019-06-13,0.0,0.0,0,0.0
+2019-06-14,0.0,0.0,0,0.0
+2019-06-15,0.0,0.0,0,0.0
+2019-06-16,0.0,0.0,0,0.0
+2019-06-17,0.0,0.0,3,0.0
+2019-06-18,0.0,0.0,0,0.0
+2019-06-19,0.0,0.0,0,0.0
+2019-06-20,0.0,0.0,0,0.0
+2019-06-21,0.0,0.0,0,0.0
+2019-06-22,0.0,0.0,0,0.0
+2019-06-23,0.0,0.0,0,0.0
+2019-06-24,0.0,0.0,0,0.0
+2019-06-25,0.0,0.0,0,0.0
+2019-06-26,0.0,0.0,0,0.0
+2019-06-27,0.0,0.0,0,0.0
+2019-06-28,0.0,0.0,0,0.0
+2019-06-29,0.0,0.0,0,0.0
+2019-06-30,0.0,0.0,0,0.0
+2019-07-01,0.0,0.0,0,0.0
+2019-07-02,0.0,0.0,0,0.0
+2019-07-03,0.0,0.0,0,0.0
+2019-07-04,0.0,0.0,0,0.0
+2019-07-05,0.0,0.0,2,0.0
+2019-07-06,0.0,0.0,0,0.0
+2019-07-07,0.0,0.0,0,0.0
+2019-07-08,0.0,0.0,0,0.0
+2019-07-09,0.0,0.0,0,0.0
+2019-07-10,0.0,0.0,0,0.0
+2019-07-11,0.0,0.0,0,0.0
+2019-07-12,0.0,0.0,0,0.0
+2019-07-13,0.0,0.0,0,0.0
+2019-07-14,0.0,0.0,0,0.0
+2019-07-15,0.0,0.0,0,0.0
+2019-07-16,0.0,0.0,0,0.0
+2019-07-17,0.0,0.0,0,0.0
+2019-07-18,0.0,0.0,0,0.0
+2019-07-19,0.0,0.0,0,0.0
+2019-07-20,0.0,0.0,0,0.0
+2019-07-21,0.0,0.0,0,0.0
+2019-07-22,0.0,0.0,0,0.0
+2019-07-23,0.0,0.0,0,0.0
+2019-07-24,0.0,0.0,0,0.0
+2019-07-25,0.0,0.0,0,0.0
+2019-07-26,0.0,0.0,0,0.0
+2019-07-27,0.0,0.0,0,0.0
+2019-07-28,0.0,0.0,0,0.0
+2019-07-29,0.0,0.0,0,0.0
+2019-07-30,0.0,0.0,0,0.0
+2019-07-31,0.0,0.0,0,0.0
+2019-08-01,0.0,0.0,0,0.0
+2019-08-02,0.0,0.0,0,0.0
+2019-08-03,0.0,0.0,0,0.0
+2019-08-04,0.0,0.0,0,0.0
+2019-08-05,0.0,0.0,0,0.0
+2019-08-06,0.0,0.0,0,0.0
+2019-08-07,0.0,0.0,0,0.0
+2019-08-08,0.0,0.0,0,0.0
+2019-08-09,0.0,0.0,0,0.0
+2019-08-10,0.0,0.0,0,0.0
+2019-08-11,0.0,0.0,0,0.0
+2019-08-12,0.0,0.0,0,0.0
+2019-08-13,0.0,0.0,0,0.0
+2019-08-14,0.0,0.0,0,0.0
+2019-08-15,0.0,0.0,0,0.0
+2019-08-16,0.0,0.0,0,0.0
+2019-08-17,0.0,0.0,0,0.0
+2019-08-18,0.0,0.0,0,0.0
+2019-08-19,0.0,0.0,0,0.0
+2019-08-20,0.0,0.0,0,0.0
+2019-08-21,0.0,0.0,0,0.0
+2019-08-22,0.0,0.0,0,0.0
+2019-08-23,0.0,0.0,0,0.0
+2019-08-24,0.0,0.0,0,0.0
+2019-08-25,0.0,0.0,0,0.0
+2019-08-26,0.0,0.0,0,0.0
+2019-08-27,0.0,0.0,0,0.0
+2019-08-28,0.0,0.0,0,0.0
+2019-08-29,0.0,0.0,0,0.0
+2019-08-30,0.0,0.0,0,0.0
+2019-08-31,0.0,0.0,0,0.0
+2019-09-01,0.0,0.0,0,0.0
+2019-09-02,0.0,0.0,0,0.0
+2019-09-03,0.0,0.0,0,0.0
+2019-09-04,0.0,1.0,0,0.0
+2019-09-05,2.0,0.0,0,0.0
+2019-09-06,0.0,0.0,0,0.0
+2019-09-07,0.0,0.0,0,0.0
+2019-09-08,0.0,0.0,0,0.0
+2019-09-09,0.0,0.0,0,0.0
+2019-09-10,0.0,0.0,0,0.0
+2019-09-11,0.0,0.0,0,0.0
+2019-09-12,0.0,0.0,0,0.0
+2019-09-13,0.0,0.0,0,0.0
+2019-09-14,0.0,0.0,0,0.0
+2019-09-15,0.0,0.0,0,0.0
+2019-09-16,0.0,0.0,0,0.0
+2019-09-17,0.0,0.0,0,0.0
+2019-09-18,0.0,0.0,0,0.0
+2019-09-19,0.0,0.0,0,0.0
+2019-09-20,0.0,0.0,0,0.0
+2019-09-21,0.0,0.0,0,0.0
+2019-09-22,0.0,0.0,0,0.0
+2019-09-23,0.0,0.0,0,0.0
+2019-09-24,0.0,0.0,0,0.0
+2019-09-25,0.0,0.0,0,0.0
+2019-09-26,0.0,0.0,0,0.0
+2019-09-27,0.0,0.0,0,0.0
+2019-09-28,0.0,0.0,0,0.0
+2019-09-29,0.0,0.0,0,0.0
+2019-09-30,0.0,0.0,0,0.0
+2019-10-01,0.0,0.0,0,0.0
+2019-10-02,0.0,0.0,0,0.0
+2019-10-03,0.0,0.0,0,0.0
+2019-10-04,0.0,0.0,0,0.0
+2019-10-05,0.0,0.0,0,0.0
+2019-10-06,0.0,0.0,0,0.0
+2019-10-07,0.0,0.0,0,0.0
+2019-10-08,0.0,0.0,0,0.0
+2019-10-09,1.0,0.0,2,0.0
+2019-10-10,0.0,0.0,0,0.0
+2019-10-11,0.0,0.0,0,0.0
+2019-10-12,0.0,0.0,0,3.5
+2019-10-13,0.0,0.0,0,0.0
+2019-10-14,0.0,0.0,0,0.0
+2019-10-15,0.0,0.0,0,0.0
+2019-10-16,15.0,0.0,0,0.0
+2019-10-17,0.0,0.0,0,0.0
+2019-10-18,0.0,0.0,0,0.0
+2019-10-19,0.0,0.0,0,0.0
+2019-10-20,0.0,0.0,0,0.0
+2019-10-21,0.0,0.0,0,0.0
+2019-10-22,0.0,0.0,0,0.0
+2019-10-23,0.0,0.0,0,0.0
+2019-10-24,0.0,0.0,0,0.0
+2019-10-25,0.0,0.0,0,0.0
+2019-10-26,0.0,0.0,0,0.0
+2019-10-27,0.0,0.0,22,0.0
+2019-10-28,0.0,0.0,0,0.0
+2019-10-29,0.0,0.0,10,6.0
+2019-10-30,16.0,0.0,0,0.0
+2019-10-31,0.0,0.0,0,0.0
+2019-11-01,2.0,0.0,1,35.5
+2019-11-02,0.0,0.0,34,0.0
+2019-11-03,9.0,0.0,0,3.5
+2019-11-04,39.0,0.0,47,4.0
+2019-11-05,1.0,0.0,0,14.5
+2019-11-06,15.0,0.0,0,0.0
+2019-11-07,9.5,0.0,1,0.0
+2019-11-08,0.0,3.5,0,19.0
+2019-11-09,1.5,0.0,1,0.0
+2019-11-10,33.0,0.0,3,0.0
+2019-11-11,0.0,0.0,0,0.0
+2019-11-12,0.5,0.0,0,0.0
+2019-11-13,0.0,0.0,0,0.0
+2019-11-14,1.0,0.0,0,0.0
+2019-11-15,0.0,0.0,0,0.0
+2019-11-16,0.0,0.0,0,0.0
+2019-11-17,0.0,0.0,0,0.0
+2019-11-18,0.0,0.0,0,0.0
+2019-11-19,0.0,0.0,0,0.0
+2019-11-20,0.0,0.0,0,0.0
+2019-11-21,7.5,0.0,3,1.5
+2019-11-22,0.0,0.0,0,0.0
+2019-11-23,1.0,0.0,3,0.0
+2019-11-24,0.5,0.0,1,1.0
+2019-11-25,0.0,0.0,0,18.0
+2019-11-26,0.0,0.0,6,0.0
+2019-11-27,0.0,0.0,1,0.0
+2019-11-28,0.0,0.0,0,0.0
+2019-11-29,0.0,2.5,0,0.0
+2019-11-30,0.0,0.0,0,0.0
+2019-12-01,1.5,11.0,0,10.5
+2019-12-02,0.0,0.0,0,0.0
+2019-12-03,1.0,4.0,0,0.0
+2019-12-04,2.0,17.0,8,2.5
+2019-12-05,0.5,19.0,1,2.0
+2019-12-06,0.0,83.0,0,1.5
+2019-12-07,8.0,4.0,55,1.5
+2019-12-08,4.0,0.0,0,0.0
+2019-12-09,0.0,0.0,0,0.0
+2019-12-10,0.0,3.0,0,0.0
+2019-12-11,0.0,0.0,0,0.0
+2019-12-12,1.0,0.0,0,0.0
+2019-12-13,0.0,13.0,0,0.0
+2019-12-14,4.5,37.0,7,6.5
+2019-12-15,10.0,0.0,4,1.0
+2019-12-16,12.0,77.0,0,42.0
+2019-12-17,5.0,40.0,3,20.5
+2019-12-18,41.0,6.0,47,6.0
+2019-12-19,20.0,5.0,2,11.5
+2019-12-20,14.0,0.0,1,0.0
+2019-12-21,0.0,0.0,0,0.0
+2019-12-22,0.0,5.0,0,0.0
+2019-12-23,6.0,0.0,3,0.0
+2019-12-24,0.0,13.0,0,0.0
+2019-12-25,16.0,10.0,0,1.0
+2019-12-26,29.0,23.0,2,5.5
+2019-12-27,7.0,6.0,11,2.0
+2019-12-28,43.0,8.0,27,2.5
+2019-12-29,3.0,14.0,1,0.0
+2019-12-30,0.0,0.0,0,0.0
+2019-12-31,4.5,25.0,0,9.0
diff --git a/example_9Y1S.csv b/example_9Y1S.csv
new file mode 100644
index 0000000..fe053a6
--- /dev/null
+++ b/example_9Y1S.csv
@@ -0,0 +1,2923 @@
+DATE,STA_P
+2012-01-01,1.0
+2012-01-02,22.0
+2012-01-03,0.5
+2012-01-04,11.5
+2012-01-05,21.0
+2012-01-06,5.5
+2012-01-07,2.0
+2012-01-08,2.5
+2012-01-09,0.0
+2012-01-10,0.5
+2012-01-11,2.5
+2012-01-12,0.0
+2012-01-13,6.5
+2012-01-14,1.0
+2012-01-15,2.0
+2012-01-16,5.0
+2012-01-17,42.5
+2012-01-18,1.5
+2012-01-19,6.5
+2012-01-20,4.5
+2012-01-21,1.0
+2012-01-22,0.5
+2012-01-23,0.0
+2012-01-24,0.5
+2012-01-25,0.0
+2012-01-26,1.5
+2012-01-27,0.5
+2012-01-28,0.0
+2012-01-29,0.5
+2012-01-30,4.5
+2012-01-31,1.5
+2012-02-01,0.0
+2012-02-02,13.0
+2012-02-03,2.5
+2012-02-04,3.0
+2012-02-05,0.5
+2012-02-06,4.0
+2012-02-07,0.0
+2012-02-08,5.5
+2012-02-09,41.5
+2012-02-10,0.0
+2012-02-11,6.0
+2012-02-12,5.5
+2012-02-13,15.0
+2012-02-14,0.5
+2012-02-15,0.0
+2012-02-16,0.0
+2012-02-17,33.5
+2012-02-18,10.5
+2012-02-19,0.0
+2012-02-20,0.0
+2012-02-21,21.0
+2012-02-22,2.5
+2012-02-23,0.0
+2012-02-24,0.5
+2012-02-25,0.0
+2012-02-26,63.5
+2012-02-27,48.5
+2012-02-28,0.5
+2012-02-29,10.0
+2012-03-01,11.5
+2012-03-02,1.5
+2012-03-03,15.0
+2012-03-04,0.5
+2012-03-05,51.0
+2012-03-06,3.5
+2012-03-07,1.0
+2012-03-08,22.0
+2012-03-09,2.0
+2012-03-10,2.5
+2012-03-11,0.5
+2012-03-12,0.0
+2012-03-13,0.0
+2012-03-14,0.0
+2012-03-15,0.0
+2012-03-16,0.0
+2012-03-17,0.0
+2012-03-18,1.5
+2012-03-19,0.0
+2012-03-20,0.0
+2012-03-21,1.5
+2012-03-22,0.0
+2012-03-23,0.0
+2012-03-24,0.0
+2012-03-25,18.5
+2012-03-26,9.0
+2012-03-27,2.5
+2012-03-28,39.0
+2012-03-29,13.5
+2012-03-30,7.0
+2012-03-31,1.5
+2012-04-01,0.0
+2012-04-02,6.0
+2012-04-03,11.0
+2012-04-04,5.5
+2012-04-05,0.0
+2012-04-06,49.5
+2012-04-07,8.0
+2012-04-08,0.0
+2012-04-09,33.5
+2012-04-10,5.5
+2012-04-11,0.0
+2012-04-12,26.0
+2012-04-13,0.0
+2012-04-14,0.0
+2012-04-15,0.0
+2012-04-16,0.0
+2012-04-17,0.0
+2012-04-18,0.0
+2012-04-19,5.0
+2012-04-20,0.0
+2012-04-21,0.5
+2012-04-22,0.0
+2012-04-23,0.0
+2012-04-24,0.0
+2012-04-25,0.0
+2012-04-26,0.0
+2012-04-27,0.5
+2012-04-28,0.0
+2012-04-29,15.0
+2012-04-30,0.0
+2012-05-01,11.0
+2012-05-02,0.0
+2012-05-03,0.0
+2012-05-04,0.0
+2012-05-05,0.0
+2012-05-06,0.0
+2012-05-07,0.0
+2012-05-08,4.0
+2012-05-09,5.0
+2012-05-10,0.0
+2012-05-11,0.0
+2012-05-12,0.0
+2012-05-13,0.0
+2012-05-14,2.0
+2012-05-15,40.0
+2012-05-16,6.0
+2012-05-17,6.5
+2012-05-18,0.0
+2012-05-19,11.0
+2012-05-20,0.0
+2012-05-21,10.0
+2012-05-22,0.0
+2012-05-23,0.0
+2012-05-24,0.0
+2012-05-25,0.0
+2012-05-26,0.0
+2012-05-27,0.0
+2012-05-28,0.0
+2012-05-29,0.0
+2012-05-30,3.0
+2012-05-31,0.0
+2012-06-01,20.5
+2012-06-02,6.0
+2012-06-03,0.5
+2012-06-04,0.0
+2012-06-05,0.0
+2012-06-06,0.0
+2012-06-07,8.5
+2012-06-08,0.0
+2012-06-09,1.0
+2012-06-10,3.5
+2012-06-11,0.0
+2012-06-12,0.0
+2012-06-13,0.0
+2012-06-14,0.0
+2012-06-15,0.0
+2012-06-16,0.0
+2012-06-17,0.0
+2012-06-18,0.0
+2012-06-19,0.0
+2012-06-20,0.0
+2012-06-21,0.0
+2012-06-22,0.0
+2012-06-23,0.0
+2012-06-24,0.0
+2012-06-25,0.0
+2012-06-26,0.0
+2012-06-27,0.0
+2012-06-28,0.0
+2012-06-29,0.0
+2012-06-30,0.0
+2012-07-01,0.0
+2012-07-02,0.0
+2012-07-03,0.0
+2012-07-04,0.0
+2012-07-05,0.0
+2012-07-06,0.0
+2012-07-07,0.0
+2012-07-08,0.0
+2012-07-09,0.0
+2012-07-10,0.0
+2012-07-11,0.0
+2012-07-12,0.0
+2012-07-13,0.0
+2012-07-14,0.0
+2012-07-15,0.0
+2012-07-16,0.0
+2012-07-17,0.0
+2012-07-18,0.0
+2012-07-19,0.0
+2012-07-20,0.0
+2012-07-21,0.0
+2012-07-22,0.0
+2012-07-23,0.0
+2012-07-24,0.0
+2012-07-25,0.0
+2012-07-26,0.0
+2012-07-27,0.0
+2012-07-28,0.0
+2012-07-29,0.0
+2012-07-30,0.0
+2012-07-31,0.0
+2012-08-01,0.0
+2012-08-02,0.0
+2012-08-03,0.0
+2012-08-04,0.0
+2012-08-05,0.0
+2012-08-06,0.0
+2012-08-07,0.0
+2012-08-08,0.0
+2012-08-09,0.0
+2012-08-10,0.0
+2012-08-11,0.0
+2012-08-12,0.0
+2012-08-13,0.0
+2012-08-14,0.0
+2012-08-15,0.0
+2012-08-16,0.0
+2012-08-17,0.0
+2012-08-18,0.0
+2012-08-19,0.0
+2012-08-20,0.0
+2012-08-21,0.0
+2012-08-22,0.0
+2012-08-23,0.0
+2012-08-24,0.0
+2012-08-25,0.0
+2012-08-26,0.0
+2012-08-27,0.0
+2012-08-28,0.0
+2012-08-29,0.0
+2012-08-30,0.0
+2012-08-31,0.0
+2012-09-01,0.0
+2012-09-02,0.0
+2012-09-03,0.0
+2012-09-04,0.0
+2012-09-05,0.0
+2012-09-06,0.0
+2012-09-07,0.5
+2012-09-08,0.0
+2012-09-09,0.0
+2012-09-10,0.0
+2012-09-11,0.0
+2012-09-12,0.0
+2012-09-13,0.0
+2012-09-14,0.0
+2012-09-15,0.0
+2012-09-16,0.0
+2012-09-17,0.0
+2012-09-18,0.0
+2012-09-19,0.0
+2012-09-20,0.0
+2012-09-21,0.0
+2012-09-22,0.0
+2012-09-23,0.0
+2012-09-24,0.0
+2012-09-25,0.0
+2012-09-26,0.0
+2012-09-27,0.0
+2012-09-28,24.5
+2012-09-29,0.0
+2012-09-30,0.0
+2012-10-01,0.0
+2012-10-02,0.0
+2012-10-03,0.0
+2012-10-04,0.0
+2012-10-05,0.0
+2012-10-06,5.0
+2012-10-07,0.0
+2012-10-08,0.0
+2012-10-09,0.0
+2012-10-10,0.0
+2012-10-11,0.0
+2012-10-12,0.0
+2012-10-13,0.0
+2012-10-14,0.0
+2012-10-15,0.0
+2012-10-16,20.0
+2012-10-17,0.0
+2012-10-18,0.5
+2012-10-19,2.0
+2012-10-20,6.0
+2012-10-21,0.0
+2012-10-22,0.0
+2012-10-23,0.0
+2012-10-24,0.0
+2012-10-25,0.0
+2012-10-26,0.0
+2012-10-27,14.0
+2012-10-28,0.5
+2012-10-29,0.0
+2012-10-30,0.5
+2012-10-31,0.5
+2012-11-01,8.0
+2012-11-02,0.5
+2012-11-03,0.0
+2012-11-04,0.0
+2012-11-05,0.0
+2012-11-06,8.0
+2012-11-07,0.0
+2012-11-08,0.0
+2012-11-09,14.0
+2012-11-10,0.0
+2012-11-11,0.5
+2012-11-12,0.0
+2012-11-13,0.0
+2012-11-14,0.0
+2012-11-15,0.0
+2012-11-16,16.0
+2012-11-17,0.0
+2012-11-18,37.0
+2012-11-19,63.0
+2012-11-20,29.0
+2012-11-21,19.0
+2012-11-22,0.0
+2012-11-23,27.0
+2012-11-24,5.0
+2012-11-25,14.5
+2012-11-26,1.0
+2012-11-27,0.5
+2012-11-28,0.0
+2012-11-29,0.0
+2012-11-30,0.0
+2012-12-01,43.5
+2012-12-02,10.5
+2012-12-03,1.0
+2012-12-04,24.0
+2012-12-05,29.0
+2012-12-06,4.0
+2012-12-07,39.5
+2012-12-08,0.0
+2012-12-09,18.5
+2012-12-10,0.0
+2012-12-11,39.5
+2012-12-12,11.5
+2012-12-13,1.0
+2012-12-14,34.5
+2012-12-15,15.5
+2012-12-16,3.5
+2012-12-17,10.5
+2012-12-18,33.0
+2012-12-19,11.5
+2012-12-20,24.0
+2012-12-21,10.0
+2012-12-22,3.0
+2012-12-23,36.5
+2012-12-24,101.5
+2012-12-25,11.5
+2012-12-26,23.0
+2012-12-27,17.5
+2012-12-28,35.5
+2012-12-29,2.5
+2012-12-30,0.5
+2012-12-31,2.0
+2013-01-01,11.5
+2013-01-02,104.5
+2013-01-03,1.5
+2013-01-04,21.5
+2013-01-05,3.0
+2013-01-06,0.0
+2013-01-07,2.5
+2013-01-08,26.0
+2013-01-09,27.0
+2013-01-10,3.5
+2013-01-11,0.0
+2013-01-12,0.0
+2013-01-13,0.0
+2013-01-14,6.5
+2013-01-15,8.5
+2013-01-16,29.0
+2013-01-17,4.0
+2013-01-18,17.5
+2013-01-19,26.5
+2013-01-20,9.0
+2013-01-21,0.5
+2013-01-22,0.0
+2013-01-23,5.5
+2013-01-24,2.5
+2013-01-25,0.0
+2013-01-26,1.0
+2013-01-27,9.5
+2013-01-28,7.0
+2013-01-29,62.0
+2013-01-30,52.0
+2013-01-31,4.0
+2013-02-01,3.0
+2013-02-02,0.0
+2013-02-03,0.0
+2013-02-04,3.0
+2013-02-05,57.5
+2013-02-06,34.5
+2013-02-07,6.5
+2013-02-08,9.0
+2013-02-09,0.0
+2013-02-10,5.5
+2013-02-11,50.0
+2013-02-12,1.0
+2013-02-13,18.0
+2013-02-14,22.5
+2013-02-15,24.5
+2013-02-16,24.5
+2013-02-17,8.5
+2013-02-18,0.0
+2013-02-19,0.0
+2013-02-20,3.5
+2013-02-21,0.0
+2013-02-22,1.5
+2013-02-23,7.0
+2013-02-24,0.0
+2013-02-25,0.0
+2013-02-26,0.0
+2013-02-27,0.5
+2013-02-28,0.0
+2013-03-01,0.0
+2013-03-02,1.5
+2013-03-03,0.0
+2013-03-04,20.0
+2013-03-05,4.0
+2013-03-06,0.0
+2013-03-07,18.0
+2013-03-08,23.0
+2013-03-09,14.5
+2013-03-10,5.0
+2013-03-11,30.5
+2013-03-12,6.5
+2013-03-13,14.0
+2013-03-14,5.5
+2013-03-15,8.5
+2013-03-16,4.0
+2013-03-17,23.5
+2013-03-18,36.0
+2013-03-19,23.0
+2013-03-20,12.5
+2013-03-21,0.0
+2013-03-22,0.5
+2013-03-23,0.0
+2013-03-24,43.5
+2013-03-25,0.0
+2013-03-26,7.5
+2013-03-27,37.0
+2013-03-28,0.0
+2013-03-29,1.0
+2013-03-30,35.0
+2013-03-31,30.0
+2013-04-01,28.0
+2013-04-02,12.5
+2013-04-03,11.0
+2013-04-04,63.0
+2013-04-05,34.5
+2013-04-06,21.0
+2013-04-07,33.5
+2013-04-08,24.5
+2013-04-09,1.5
+2013-04-10,0.0
+2013-04-11,0.0
+2013-04-12,16.5
+2013-04-13,14.0
+2013-04-14,0.0
+2013-04-15,14.0
+2013-04-16,48.0
+2013-04-17,44.0
+2013-04-18,19.0
+2013-04-19,63.0
+2013-04-20,77.0
+2013-04-21,0.0
+2013-04-22,40.0
+2013-04-23,3.0
+2013-04-24,8.0
+2013-04-25,2.0
+2013-04-26,1.5
+2013-04-27,0.0
+2013-04-28,0.0
+2013-04-29,0.0
+2013-04-30,0.0
+2013-05-01,0.0
+2013-05-02,0.0
+2013-05-03,0.0
+2013-05-04,0.0
+2013-05-05,0.0
+2013-05-06,0.0
+2013-05-07,15.5
+2013-05-08,10.5
+2013-05-09,6.0
+2013-05-10,25.5
+2013-05-11,10.5
+2013-05-12,0.0
+2013-05-13,0.0
+2013-05-14,0.0
+2013-05-15,1.5
+2013-05-16,0.0
+2013-05-17,0.0
+2013-05-18,0.5
+2013-05-19,7.0
+2013-05-20,1.0
+2013-05-21,32.0
+2013-05-22,0.5
+2013-05-23,0.5
+2013-05-24,27.0
+2013-05-25,58.5
+2013-05-26,0.0
+2013-05-27,20.0
+2013-05-28,0.5
+2013-05-29,0.5
+2013-05-30,6.0
+2013-05-31,0.5
+2013-06-01,0.0
+2013-06-02,0.0
+2013-06-03,0.5
+2013-06-04,0.0
+2013-06-05,0.0
+2013-06-06,0.0
+2013-06-07,3.5
+2013-06-08,0.0
+2013-06-09,44.0
+2013-06-10,0.0
+2013-06-11,0.0
+2013-06-12,33.5
+2013-06-13,44.0
+2013-06-14,10.0
+2013-06-15,0.0
+2013-06-16,1.0
+2013-06-17,28.5
+2013-06-18,9.5
+2013-06-19,0.0
+2013-06-20,0.0
+2013-06-21,0.0
+2013-06-22,1.0
+2013-06-23,0.0
+2013-06-24,0.0
+2013-06-25,0.0
+2013-06-26,0.0
+2013-06-27,2.5
+2013-06-28,14.5
+2013-06-29,0.0
+2013-06-30,1.0
+2013-07-01,0.5
+2013-07-02,0.0
+2013-07-03,0.0
+2013-07-04,40.0
+2013-07-05,12.5
+2013-07-06,0.5
+2013-07-07,0.0
+2013-07-08,0.0
+2013-07-09,0.0
+2013-07-10,1.5
+2013-07-11,0.0
+2013-07-12,1.0
+2013-07-13,7.0
+2013-07-14,11.0
+2013-07-15,0.0
+2013-07-16,1.0
+2013-07-17,0.0
+2013-07-18,0.0
+2013-07-19,0.0
+2013-07-20,0.0
+2013-07-21,0.0
+2013-07-22,60.0
+2013-07-23,4.0
+2013-07-24,2.5
+2013-07-25,2.0
+2013-07-26,45.5
+2013-07-27,0.0
+2013-07-28,0.0
+2013-07-29,0.0
+2013-07-30,0.0
+2013-07-31,0.0
+2013-08-01,0.0
+2013-08-02,2.5
+2013-08-03,0.0
+2013-08-04,0.0
+2013-08-05,0.0
+2013-08-06,0.0
+2013-08-07,0.0
+2013-08-08,0.0
+2013-08-09,0.5
+2013-08-10,0.5
+2013-08-11,0.0
+2013-08-12,0.0
+2013-08-13,0.0
+2013-08-14,0.0
+2013-08-15,0.0
+2013-08-16,0.0
+2013-08-17,0.0
+2013-08-18,0.0
+2013-08-19,0.0
+2013-08-20,0.0
+2013-08-21,0.0
+2013-08-22,0.0
+2013-08-23,0.0
+2013-08-24,0.0
+2013-08-25,0.0
+2013-08-26,0.0
+2013-08-27,0.0
+2013-08-28,0.0
+2013-08-29,0.0
+2013-08-30,0.0
+2013-08-31,0.0
+2013-09-01,0.0
+2013-09-02,0.0
+2013-09-03,0.0
+2013-09-04,0.0
+2013-09-05,0.0
+2013-09-06,0.0
+2013-09-07,0.0
+2013-09-08,0.0
+2013-09-09,0.0
+2013-09-10,0.0
+2013-09-11,0.0
+2013-09-12,0.0
+2013-09-13,0.0
+2013-09-14,0.0
+2013-09-15,0.0
+2013-09-16,0.0
+2013-09-17,0.0
+2013-09-18,0.0
+2013-09-19,0.5
+2013-09-20,0.0
+2013-09-21,0.0
+2013-09-22,0.0
+2013-09-23,0.0
+2013-09-24,0.0
+2013-09-25,0.0
+2013-09-26,0.0
+2013-09-27,0.0
+2013-09-28,0.0
+2013-09-29,0.0
+2013-09-30,6.5
+2013-10-01,0.5
+2013-10-02,0.0
+2013-10-03,0.0
+2013-10-04,0.0
+2013-10-05,0.0
+2013-10-06,0.0
+2013-10-07,0.0
+2013-10-08,0.0
+2013-10-09,0.0
+2013-10-10,0.0
+2013-10-11,0.0
+2013-10-12,0.0
+2013-10-13,0.0
+2013-10-14,3.5
+2013-10-15,0.0
+2013-10-16,0.0
+2013-10-17,0.0
+2013-10-18,0.0
+2013-10-19,0.0
+2013-10-20,0.0
+2013-10-21,0.0
+2013-10-22,0.0
+2013-10-23,0.0
+2013-10-24,0.0
+2013-10-25,0.0
+2013-10-26,0.0
+2013-10-27,2.0
+2013-10-28,0.0
+2013-10-29,0.0
+2013-10-30,5.5
+2013-10-31,4.5
+2013-11-01,0.0
+2013-11-02,0.0
+2013-11-03,1.0
+2013-11-04,0.0
+2013-11-05,0.0
+2013-11-06,0.0
+2013-11-07,0.0
+2013-11-08,0.0
+2013-11-09,14.5
+2013-11-10,0.0
+2013-11-11,0.0
+2013-11-12,10.5
+2013-11-13,4.0
+2013-11-14,55.5
+2013-11-15,30.5
+2013-11-16,23.5
+2013-11-17,11.0
+2013-11-18,5.5
+2013-11-19,0.0
+2013-11-20,0.0
+2013-11-21,0.0
+2013-11-22,0.0
+2013-11-23,0.0
+2013-11-24,0.0
+2013-11-25,0.5
+2013-11-26,3.5
+2013-11-27,10.0
+2013-11-28,3.5
+2013-11-29,2.0
+2013-11-30,18.5
+2013-12-01,0.0
+2013-12-02,26.0
+2013-12-03,5.5
+2013-12-04,2.5
+2013-12-05,5.5
+2013-12-06,1.0
+2013-12-07,12.5
+2013-12-08,37.5
+2013-12-09,2.5
+2013-12-10,35.5
+2013-12-11,29.0
+2013-12-12,11.0
+2013-12-13,0.0
+2013-12-14,0.0
+2013-12-15,12.0
+2013-12-16,22.0
+2013-12-17,0.0
+2013-12-18,0.0
+2013-12-19,0.0
+2013-12-20,4.0
+2013-12-21,33.0
+2013-12-22,26.0
+2013-12-23,0.0
+2013-12-24,0.0
+2013-12-25,42.0
+2013-12-26,11.0
+2013-12-27,0.0
+2013-12-28,0.0
+2013-12-29,0.0
+2013-12-30,15.0
+2013-12-31,20.0
+2014-01-01,0.0
+2014-01-02,0.0
+2014-01-03,0.0
+2014-01-04,3.5
+2014-01-05,10.5
+2014-01-06,9.0
+2014-01-07,11.0
+2014-01-08,6.5
+2014-01-09,10.0
+2014-01-10,11.0
+2014-01-11,10.5
+2014-01-12,17.0
+2014-01-13,16.0
+2014-01-14,2.5
+2014-01-15,7.0
+2014-01-16,4.0
+2014-01-17,5.0
+2014-01-18,22.0
+2014-01-19,11.5
+2014-01-20,10.0
+2014-01-21,5.0
+2014-01-22,0.0
+2014-01-23,3.0
+2014-01-24,2.0
+2014-01-25,2.5
+2014-01-26,5.0
+2014-01-27,4.0
+2014-01-28,2.5
+2014-01-29,2.0
+2014-01-30,0.0
+2014-01-31,0.0
+2014-02-01,0.0
+2014-02-02,7.5
+2014-02-03,10.0
+2014-02-04,0.0
+2014-02-05,0.0
+2014-02-06,23.5
+2014-02-07,0.0
+2014-02-08,0.0
+2014-02-09,0.0
+2014-02-10,0.0
+2014-02-11,0.0
+2014-02-12,0.0
+2014-02-13,0.0
+2014-02-14,0.0
+2014-02-15,7.0
+2014-02-16,25.5
+2014-02-17,14.0
+2014-02-18,8.0
+2014-02-19,7.5
+2014-02-20,16.0
+2014-02-21,8.5
+2014-02-22,11.0
+2014-02-23,14.5
+2014-02-24,6.0
+2014-02-25,7.0
+2014-02-26,13.0
+2014-02-27,11.0
+2014-02-28,6.5
+2014-03-01,7.0
+2014-03-02,9.5
+2014-03-03,10.0
+2014-03-04,6.0
+2014-03-05,14.0
+2014-03-06,15.5
+2014-03-07,7.0
+2014-03-08,13.0
+2014-03-09,15.0
+2014-03-10,14.0
+2014-03-11,7.0
+2014-03-12,10.5
+2014-03-13,19.0
+2014-03-14,0.0
+2014-03-15,12.0
+2014-03-16,6.0
+2014-03-17,40.0
+2014-03-18,21.0
+2014-03-19,8.0
+2014-03-20,0.0
+2014-03-21,0.0
+2014-03-22,0.0
+2014-03-23,18.0
+2014-03-24,17.0
+2014-03-25,5.5
+2014-03-26,8.0
+2014-03-27,6.5
+2014-03-28,11.0
+2014-03-29,14.0
+2014-03-30,4.5
+2014-03-31,0.0
+2014-04-01,0.0
+2014-04-02,0.0
+2014-04-03,0.0
+2014-04-04,0.0
+2014-04-05,4.5
+2014-04-06,17.5
+2014-04-07,43.5
+2014-04-08,0.0
+2014-04-09,5.5
+2014-04-10,7.5
+2014-04-11,3.5
+2014-04-12,69.5
+2014-04-13,0.0
+2014-04-14,17.5
+2014-04-15,13.0
+2014-04-16,1.0
+2014-04-17,78.5
+2014-04-18,0.0
+2014-04-19,7.0
+2014-04-20,24.5
+2014-04-21,3.5
+2014-04-22,5.5
+2014-04-23,6.5
+2014-04-24,2.0
+2014-04-25,3.5
+2014-04-26,39.5
+2014-04-27,0.0
+2014-04-28,12.0
+2014-04-29,0.0
+2014-04-30,0.0
+2014-05-01,0.0
+2014-05-02,0.0
+2014-05-03,0.0
+2014-05-04,0.0
+2014-05-05,0.0
+2014-05-06,0.0
+2014-05-07,1.0
+2014-05-08,2.5
+2014-05-09,0.0
+2014-05-10,0.0
+2014-05-11,0.0
+2014-05-12,0.0
+2014-05-13,4.5
+2014-05-14,0.0
+2014-05-15,0.0
+2014-05-16,0.0
+2014-05-17,0.0
+2014-05-18,8.5
+2014-05-19,0.0
+2014-05-20,0.0
+2014-05-21,7.5
+2014-05-22,0.0
+2014-05-23,0.0
+2014-05-24,0.0
+2014-05-25,0.0
+2014-05-26,6.5
+2014-05-27,0.0
+2014-05-28,0.0
+2014-05-29,0.0
+2014-05-30,0.0
+2014-05-31,14.5
+2014-06-01,0.0
+2014-06-02,0.0
+2014-06-03,0.0
+2014-06-04,0.0
+2014-06-05,0.0
+2014-06-06,0.0
+2014-06-07,0.0
+2014-06-08,0.0
+2014-06-09,0.0
+2014-06-10,0.0
+2014-06-11,15.5
+2014-06-12,13.5
+2014-06-13,0.0
+2014-06-14,17.5
+2014-06-15,0.0
+2014-06-16,0.0
+2014-06-17,14.5
+2014-06-18,6.5
+2014-06-19,125.5
+2014-06-20,3.5
+2014-06-21,0.0
+2014-06-22,0.0
+2014-06-23,16.5
+2014-06-24,1.5
+2014-06-25,0.0
+2014-06-26,0.0
+2014-06-27,13.0
+2014-06-28,0.0
+2014-06-29,0.0
+2014-06-30,0.0
+2014-07-01,0.0
+2014-07-02,0.0
+2014-07-03,0.0
+2014-07-04,0.0
+2014-07-05,0.0
+2014-07-06,0.0
+2014-07-07,0.0
+2014-07-08,0.0
+2014-07-09,0.0
+2014-07-10,0.0
+2014-07-11,0.0
+2014-07-12,0.0
+2014-07-13,0.0
+2014-07-14,0.0
+2014-07-15,0.0
+2014-07-16,0.0
+2014-07-17,0.0
+2014-07-18,0.0
+2014-07-19,0.0
+2014-07-20,0.0
+2014-07-21,0.0
+2014-07-22,0.0
+2014-07-23,0.0
+2014-07-24,0.0
+2014-07-25,0.0
+2014-07-26,0.0
+2014-07-27,0.0
+2014-07-28,0.0
+2014-07-29,0.0
+2014-07-30,0.0
+2014-07-31,0.0
+2014-08-01,0.0
+2014-08-02,0.0
+2014-08-03,0.0
+2014-08-04,0.0
+2014-08-05,0.0
+2014-08-06,0.0
+2014-08-07,0.0
+2014-08-08,0.0
+2014-08-09,0.0
+2014-08-10,0.0
+2014-08-11,0.0
+2014-08-12,0.0
+2014-08-13,0.0
+2014-08-14,0.0
+2014-08-15,0.0
+2014-08-16,0.0
+2014-08-17,0.0
+2014-08-18,0.0
+2014-08-19,0.0
+2014-08-20,0.0
+2014-08-21,0.0
+2014-08-22,0.0
+2014-08-23,0.0
+2014-08-24,0.0
+2014-08-25,0.0
+2014-08-26,0.0
+2014-08-27,0.0
+2014-08-28,0.0
+2014-08-29,0.0
+2014-08-30,0.0
+2014-08-31,0.0
+2014-09-01,0.0
+2014-09-02,0.0
+2014-09-03,0.0
+2014-09-04,0.0
+2014-09-05,0.0
+2014-09-06,0.0
+2014-09-07,0.0
+2014-09-08,0.0
+2014-09-09,0.0
+2014-09-10,0.0
+2014-09-11,0.0
+2014-09-12,0.0
+2014-09-13,0.0
+2014-09-14,0.0
+2014-09-15,0.0
+2014-09-16,0.0
+2014-09-17,0.0
+2014-09-18,0.0
+2014-09-19,0.0
+2014-09-20,0.0
+2014-09-21,0.0
+2014-09-22,0.0
+2014-09-23,0.0
+2014-09-24,0.0
+2014-09-25,0.0
+2014-09-26,0.0
+2014-09-27,0.0
+2014-09-28,0.0
+2014-09-29,0.0
+2014-09-30,0.0
+2014-10-01,0.0
+2014-10-02,0.0
+2014-10-03,0.0
+2014-10-04,0.0
+2014-10-05,0.0
+2014-10-06,0.0
+2014-10-07,0.0
+2014-10-08,0.0
+2014-10-09,0.0
+2014-10-10,0.0
+2014-10-11,0.0
+2014-10-12,0.0
+2014-10-13,1.0
+2014-10-14,15.0
+2014-10-15,0.0
+2014-10-16,0.0
+2014-10-17,0.0
+2014-10-18,0.0
+2014-10-19,0.0
+2014-10-20,0.0
+2014-10-21,0.0
+2014-10-22,0.0
+2014-10-23,0.0
+2014-10-24,0.0
+2014-10-25,0.0
+2014-10-26,0.0
+2014-10-27,0.0
+2014-10-28,0.0
+2014-10-29,42.5
+2014-10-30,0.0
+2014-10-31,0.0
+2014-11-01,0.0
+2014-11-02,0.0
+2014-11-03,0.0
+2014-11-04,0.0
+2014-11-05,0.0
+2014-11-06,0.0
+2014-11-07,0.0
+2014-11-08,25.5
+2014-11-09,8.0
+2014-11-10,0.0
+2014-11-11,0.0
+2014-11-12,79.0
+2014-11-13,21.5
+2014-11-14,10.5
+2014-11-15,16.0
+2014-11-16,0.0
+2014-11-17,0.0
+2014-11-18,1.0
+2014-11-19,15.0
+2014-11-20,5.0
+2014-11-21,0.0
+2014-11-22,18.5
+2014-11-23,1.5
+2014-11-24,0.0
+2014-11-25,0.0
+2014-11-26,3.5
+2014-11-27,0.0
+2014-11-28,0.0
+2014-11-29,15.5
+2014-11-30,6.5
+2014-12-01,0.0
+2014-12-02,0.0
+2014-12-03,0.0
+2014-12-04,117.0
+2014-12-05,62.5
+2014-12-06,19.5
+2014-12-07,5.0
+2014-12-08,0.0
+2014-12-09,4.5
+2014-12-10,18.5
+2014-12-11,16.5
+2014-12-12,5.5
+2014-12-13,62.0
+2014-12-14,0.0
+2014-12-15,0.0
+2014-12-16,8.5
+2014-12-17,13.5
+2014-12-18,17.5
+2014-12-19,126.0
+2014-12-20,86.0
+2014-12-21,18.5
+2014-12-22,63.5
+2014-12-23,17.5
+2014-12-24,10.5
+2014-12-25,30.0
+2014-12-26,5.0
+2014-12-27,19.0
+2014-12-28,99.0
+2014-12-29,15.5
+2014-12-30,0.0
+2014-12-31,0.0
+2015-01-01,26.5
+2015-01-02,7.5
+2015-01-03,1.5
+2015-01-04,12.5
+2015-01-05,5.0
+2015-01-06,0.0
+2015-01-07,0.0
+2015-01-08,0.0
+2015-01-09,0.0
+2015-01-10,0.0
+2015-01-11,0.0
+2015-01-12,0.0
+2015-01-13,2.5
+2015-01-14,24.0
+2015-01-15,2.0
+2015-01-16,0.0
+2015-01-17,0.0
+2015-01-18,0.0
+2015-01-19,0.0
+2015-01-20,4.0
+2015-01-21,80.0
+2015-01-22,1.5
+2015-01-23,8.0
+2015-01-24,23.0
+2015-01-25,49.5
+2015-01-26,9.0
+2015-01-27,0.0
+2015-01-28,10.5
+2015-01-29,78.0
+2015-01-30,2.0
+2015-01-31,0.0
+2015-02-01,109.5
+2015-02-02,15.5
+2015-02-03,0.0
+2015-02-04,61.0
+2015-02-05,122.0
+2015-02-06,20.0
+2015-02-07,10.5
+2015-02-08,14.5
+2015-02-09,1.5
+2015-02-10,22.5
+2015-02-11,5.5
+2015-02-12,17.5
+2015-02-13,30.0
+2015-02-14,0.0
+2015-02-15,0.0
+2015-02-16,3.0
+2015-02-17,14.5
+2015-02-18,43.5
+2015-02-19,78.0
+2015-02-20,4.0
+2015-02-21,0.0
+2015-02-22,0.0
+2015-02-23,0.0
+2015-02-24,1.5
+2015-02-25,10.5
+2015-02-26,0.0
+2015-02-27,18.0
+2015-02-28,0.0
+2015-03-01,10.0
+2015-03-02,32.5
+2015-03-03,29.5
+2015-03-04,0.0
+2015-03-05,1.0
+2015-03-06,0.0
+2015-03-07,0.0
+2015-03-08,0.0
+2015-03-09,0.0
+2015-03-10,0.0
+2015-03-11,0.0
+2015-03-12,9.0
+2015-03-13,6.0
+2015-03-14,1.0
+2015-03-15,96.0
+2015-03-16,45.0
+2015-03-17,48.0
+2015-03-18,1.5
+2015-03-19,14.0
+2015-03-20,16.5
+2015-03-21,9.5
+2015-03-22,1.0
+2015-03-23,16.0
+2015-03-24,21.0
+2015-03-25,0.0
+2015-03-26,25.0
+2015-03-27,1.0
+2015-03-28,8.5
+2015-03-29,0.0
+2015-03-30,0.0
+2015-03-31,1.0
+2015-04-01,5.0
+2015-04-02,34.5
+2015-04-03,1.0
+2015-04-04,0.0
+2015-04-05,94.0
+2015-04-06,0.0
+2015-04-07,6.5
+2015-04-08,0.0
+2015-04-09,3.0
+2015-04-10,0.0
+2015-04-11,0.0
+2015-04-12,0.0
+2015-04-13,33.0
+2015-04-14,0.0
+2015-04-15,67.5
+2015-04-16,3.0
+2015-04-17,7.0
+2015-04-18,1.0
+2015-04-19,4.0
+2015-04-20,27.5
+2015-04-21,0.0
+2015-04-22,0.0
+2015-04-23,1.5
+2015-04-24,0.0
+2015-04-25,0.0
+2015-04-26,0.0
+2015-04-27,2.0
+2015-04-28,7.5
+2015-04-29,0.0
+2015-04-30,63.0
+2015-05-01,0.0
+2015-05-02,19.0
+2015-05-03,5.0
+2015-05-04,38.0
+2015-05-05,5.0
+2015-05-06,6.5
+2015-05-07,0.0
+2015-05-08,19.5
+2015-05-09,0.0
+2015-05-10,0.0
+2015-05-11,0.0
+2015-05-12,0.0
+2015-05-13,0.0
+2015-05-14,0.0
+2015-05-15,0.0
+2015-05-16,0.0
+2015-05-17,0.0
+2015-05-18,0.0
+2015-05-19,0.0
+2015-05-20,0.0
+2015-05-21,0.0
+2015-05-22,0.0
+2015-05-23,0.0
+2015-05-24,0.0
+2015-05-25,0.0
+2015-05-26,0.0
+2015-05-27,0.0
+2015-05-28,0.0
+2015-05-29,0.0
+2015-05-30,0.0
+2015-05-31,0.0
+2015-06-01,0.0
+2015-06-02,0.0
+2015-06-03,0.0
+2015-06-04,0.0
+2015-06-05,0.0
+2015-06-06,0.0
+2015-06-07,0.0
+2015-06-08,0.0
+2015-06-09,10.0
+2015-06-10,75.0
+2015-06-11,0.0
+2015-06-12,0.0
+2015-06-13,0.0
+2015-06-14,0.0
+2015-06-15,0.0
+2015-06-16,0.0
+2015-06-17,0.0
+2015-06-18,0.0
+2015-06-19,0.0
+2015-06-20,0.0
+2015-06-21,0.0
+2015-06-22,0.0
+2015-06-23,0.0
+2015-06-24,0.0
+2015-06-25,0.0
+2015-06-26,0.0
+2015-06-27,0.0
+2015-06-28,0.0
+2015-06-29,0.0
+2015-06-30,0.0
+2015-07-01,0.0
+2015-07-02,0.0
+2015-07-03,0.0
+2015-07-04,0.0
+2015-07-05,0.0
+2015-07-06,0.0
+2015-07-07,0.0
+2015-07-08,0.0
+2015-07-09,0.0
+2015-07-10,0.0
+2015-07-11,0.0
+2015-07-12,0.0
+2015-07-13,0.0
+2015-07-14,0.0
+2015-07-15,0.0
+2015-07-16,0.0
+2015-07-17,0.0
+2015-07-18,0.0
+2015-07-19,0.0
+2015-07-20,0.0
+2015-07-21,0.0
+2015-07-22,0.0
+2015-07-23,0.0
+2015-07-24,0.0
+2015-07-25,0.0
+2015-07-26,0.0
+2015-07-27,0.0
+2015-07-28,0.0
+2015-07-29,0.0
+2015-07-30,0.0
+2015-07-31,0.0
+2015-08-01,0.0
+2015-08-02,0.0
+2015-08-03,0.0
+2015-08-04,0.0
+2015-08-05,0.0
+2015-08-06,0.0
+2015-08-07,0.0
+2015-08-08,0.0
+2015-08-09,0.0
+2015-08-10,0.0
+2015-08-11,0.0
+2015-08-12,0.0
+2015-08-13,0.0
+2015-08-14,0.0
+2015-08-15,0.0
+2015-08-16,0.0
+2015-08-17,0.0
+2015-08-18,0.0
+2015-08-19,0.0
+2015-08-20,0.0
+2015-08-21,0.0
+2015-08-22,0.0
+2015-08-23,0.0
+2015-08-24,0.0
+2015-08-25,0.0
+2015-08-26,0.0
+2015-08-27,0.0
+2015-08-28,0.0
+2015-08-29,0.0
+2015-08-30,0.0
+2015-08-31,0.0
+2015-09-01,0.0
+2015-09-02,0.0
+2015-09-03,0.0
+2015-09-04,0.0
+2015-09-05,0.0
+2015-09-06,0.0
+2015-09-07,0.0
+2015-09-08,0.0
+2015-09-09,0.0
+2015-09-10,0.0
+2015-09-11,0.0
+2015-09-12,0.0
+2015-09-13,0.0
+2015-09-14,0.0
+2015-09-15,0.0
+2015-09-16,0.0
+2015-09-17,0.0
+2015-09-18,0.0
+2015-09-19,0.0
+2015-09-20,0.0
+2015-09-21,0.0
+2015-09-22,0.0
+2015-09-23,0.0
+2015-09-24,0.0
+2015-09-25,0.0
+2015-09-26,0.0
+2015-09-27,0.0
+2015-09-28,0.0
+2015-09-29,0.0
+2015-09-30,0.0
+2015-10-01,0.0
+2015-10-02,0.0
+2015-10-03,0.0
+2015-10-04,0.0
+2015-10-05,0.0
+2015-10-06,0.0
+2015-10-07,0.0
+2015-10-08,3.0
+2015-10-09,0.0
+2015-10-10,0.0
+2015-10-11,0.0
+2015-10-12,0.0
+2015-10-13,0.0
+2015-10-14,0.0
+2015-10-15,0.0
+2015-10-16,0.0
+2015-10-17,0.0
+2015-10-18,0.0
+2015-10-19,0.0
+2015-10-20,0.0
+2015-10-21,0.0
+2015-10-22,0.0
+2015-10-23,0.0
+2015-10-24,0.0
+2015-10-25,0.0
+2015-10-26,0.0
+2015-10-27,0.0
+2015-10-28,0.0
+2015-10-29,0.0
+2015-10-30,0.0
+2015-10-31,0.0
+2015-11-01,0.0
+2015-11-02,0.0
+2015-11-03,0.0
+2015-11-04,0.0
+2015-11-05,4.0
+2015-11-06,28.5
+2015-11-07,0.0
+2015-11-08,0.0
+2015-11-09,3.0
+2015-11-10,72.0
+2015-11-11,55.0
+2015-11-12,25.5
+2015-11-13,9.0
+2015-11-14,2.0
+2015-11-15,0.0
+2015-11-16,0.0
+2015-11-17,0.0
+2015-11-18,39.0
+2015-11-19,0.0
+2015-11-20,9.5
+2015-11-21,0.0
+2015-11-22,1.0
+2015-11-23,6.0
+2015-11-24,0.0
+2015-11-25,0.0
+2015-11-26,67.0
+2015-11-27,27.0
+2015-11-28,0.0
+2015-11-29,7.5
+2015-11-30,0.0
+2015-12-01,0.0
+2015-12-02,25.5
+2015-12-03,7.5
+2015-12-04,34.5
+2015-12-05,9.5
+2015-12-06,19.0
+2015-12-07,1.0
+2015-12-08,28.0
+2015-12-09,56.5
+2015-12-10,63.0
+2015-12-11,45.5
+2015-12-12,1.5
+2015-12-13,10.0
+2015-12-14,85.0
+2015-12-15,19.5
+2015-12-16,8.0
+2015-12-17,76.5
+2015-12-18,0.0
+2015-12-19,0.0
+2015-12-20,0.0
+2015-12-21,0.0
+2015-12-22,0.0
+2015-12-23,0.0
+2015-12-24,0.0
+2015-12-25,0.0
+2015-12-26,0.0
+2015-12-27,24.5
+2015-12-28,8.0
+2015-12-29,5.0
+2015-12-30,28.5
+2015-12-31,1.5
+2016-01-01,4.5
+2016-01-02,34.5
+2016-01-03,1.0
+2016-01-04,15.0
+2016-01-05,1.5
+2016-01-06,19.5
+2016-01-07,17.0
+2016-01-08,0.0
+2016-01-09,0.0
+2016-01-10,4.5
+2016-01-11,3.5
+2016-01-12,0.0
+2016-01-13,0.0
+2016-01-14,36.0
+2016-01-15,0.0
+2016-01-16,0.0
+2016-01-17,6.5
+2016-01-18,8.0
+2016-01-19,13.5
+2016-01-20,18.5
+2016-01-21,33.0
+2016-01-22,31.5
+2016-01-23,4.5
+2016-01-24,0.0
+2016-01-25,12.0
+2016-01-26,0.0
+2016-01-27,0.0
+2016-01-28,0.0
+2016-01-29,0.0
+2016-01-30,0.0
+2016-01-31,2.0
+2016-02-01,0.0
+2016-02-02,0.0
+2016-02-03,24.5
+2016-02-04,4.5
+2016-02-05,0.0
+2016-02-06,0.0
+2016-02-07,50.0
+2016-02-08,27.0
+2016-02-09,87.0
+2016-02-10,36.0
+2016-02-11,22.5
+2016-02-12,6.0
+2016-02-13,11.0
+2016-02-14,24.0
+2016-02-15,15.0
+2016-02-16,0.0
+2016-02-17,5.0
+2016-02-18,1.5
+2016-02-19,0.0
+2016-02-20,2.5
+2016-02-21,6.5
+2016-02-22,24.5
+2016-02-23,27.5
+2016-02-24,21.0
+2016-02-25,0.0
+2016-02-26,47.5
+2016-02-27,108.0
+2016-02-28,0.0
+2016-02-29,0.0
+2016-03-01,1.5
+2016-03-02,1.0
+2016-03-03,1.0
+2016-03-04,0.0
+2016-03-05,42.0
+2016-03-06,64.5
+2016-03-07,32.0
+2016-03-08,64.0
+2016-03-09,56.0
+2016-03-10,42.0
+2016-03-11,4.5
+2016-03-12,3.0
+2016-03-13,27.0
+2016-03-14,30.0
+2016-03-15,45.0
+2016-03-16,12.0
+2016-03-17,1.5
+2016-03-18,36.0
+2016-03-19,0.0
+2016-03-20,6.5
+2016-03-21,13.5
+2016-03-22,0.0
+2016-03-23,19.5
+2016-03-24,24.0
+2016-03-25,2.0
+2016-03-26,27.0
+2016-03-27,6.0
+2016-03-28,1.0
+2016-03-29,30.0
+2016-03-30,13.0
+2016-03-31,0.0
+2016-04-01,1.0
+2016-04-02,12.5
+2016-04-03,4.5
+2016-04-04,0.0
+2016-04-05,0.0
+2016-04-06,0.0
+2016-04-07,0.0
+2016-04-08,0.0
+2016-04-09,1.5
+2016-04-10,47.0
+2016-04-11,0.0
+2016-04-12,7.5
+2016-04-13,58.5
+2016-04-14,7.0
+2016-04-15,2.5
+2016-04-16,0.0
+2016-04-17,1.5
+2016-04-18,0.0
+2016-04-19,37.0
+2016-04-20,1.0
+2016-04-21,0.0
+2016-04-22,0.0
+2016-04-23,0.0
+2016-04-24,0.0
+2016-04-25,0.0
+2016-04-26,1.0
+2016-04-27,0.0
+2016-04-28,26.5
+2016-04-29,1.0
+2016-04-30,0.0
+2016-05-01,0.0
+2016-05-02,0.0
+2016-05-03,2.0
+2016-05-04,5.5
+2016-05-05,0.0
+2016-05-06,0.0
+2016-05-07,1.5
+2016-05-08,0.0
+2016-05-09,1.0
+2016-05-10,7.5
+2016-05-11,0.0
+2016-05-12,1.0
+2016-05-13,2.5
+2016-05-14,0.0
+2016-05-15,0.0
+2016-05-16,1.0
+2016-05-17,0.0
+2016-05-18,2.0
+2016-05-19,0.0
+2016-05-20,0.0
+2016-05-21,0.0
+2016-05-22,13.5
+2016-05-23,2.5
+2016-05-24,4.0
+2016-05-25,0.0
+2016-05-26,0.0
+2016-05-27,0.0
+2016-05-28,1.0
+2016-05-29,0.0
+2016-05-30,4.0
+2016-05-31,1.5
+2016-06-01,0.0
+2016-06-02,2.0
+2016-06-03,23.0
+2016-06-04,0.0
+2016-06-05,0.0
+2016-06-06,17.0
+2016-06-07,0.0
+2016-06-08,29.0
+2016-06-09,0.0
+2016-06-10,0.0
+2016-06-11,0.0
+2016-06-12,0.0
+2016-06-13,0.0
+2016-06-14,0.0
+2016-06-15,1.0
+2016-06-16,0.0
+2016-06-17,0.0
+2016-06-18,20.0
+2016-06-19,11.0
+2016-06-20,0.0
+2016-06-21,0.0
+2016-06-22,0.0
+2016-06-23,0.0
+2016-06-24,0.0
+2016-06-25,0.0
+2016-06-26,0.0
+2016-06-27,0.0
+2016-06-28,2.0
+2016-06-29,0.0
+2016-06-30,4.0
+2016-07-01,2.0
+2016-07-02,27.0
+2016-07-03,0.0
+2016-07-04,0.0
+2016-07-05,0.0
+2016-07-06,0.0
+2016-07-07,0.0
+2016-07-08,0.0
+2016-07-09,0.0
+2016-07-10,0.0
+2016-07-11,0.0
+2016-07-12,47.0
+2016-07-13,50.0
+2016-07-14,0.0
+2016-07-15,0.0
+2016-07-16,0.0
+2016-07-17,19.0
+2016-07-18,0.0
+2016-07-19,0.0
+2016-07-20,8.0
+2016-07-21,0.0
+2016-07-22,4.5
+2016-07-23,14.5
+2016-07-24,21.0
+2016-07-25,0.0
+2016-07-26,0.0
+2016-07-27,0.0
+2016-07-28,0.0
+2016-07-29,1.0
+2016-07-30,0.0
+2016-07-31,0.0
+2016-08-01,0.0
+2016-08-02,0.0
+2016-08-03,0.0
+2016-08-04,0.0
+2016-08-05,0.0
+2016-08-06,0.0
+2016-08-07,0.0
+2016-08-08,0.0
+2016-08-09,2.0
+2016-08-10,0.0
+2016-08-11,0.0
+2016-08-12,0.0
+2016-08-13,5.0
+2016-08-14,2.0
+2016-08-15,0.0
+2016-08-16,0.0
+2016-08-17,0.0
+2016-08-18,2.0
+2016-08-19,0.0
+2016-08-20,0.0
+2016-08-21,0.0
+2016-08-22,0.0
+2016-08-23,0.0
+2016-08-24,0.0
+2016-08-25,3.0
+2016-08-26,0.0
+2016-08-27,0.0
+2016-08-28,2.5
+2016-08-29,3.0
+2016-08-30,15.0
+2016-08-31,1.0
+2016-09-01,2.0
+2016-09-02,0.0
+2016-09-03,0.0
+2016-09-04,0.0
+2016-09-05,1.5
+2016-09-06,0.0
+2016-09-07,0.0
+2016-09-08,1.0
+2016-09-09,0.0
+2016-09-10,3.5
+2016-09-11,0.0
+2016-09-12,0.0
+2016-09-13,0.0
+2016-09-14,0.0
+2016-09-15,26.0
+2016-09-16,1.0
+2016-09-17,10.5
+2016-09-18,3.0
+2016-09-19,7.5
+2016-09-20,9.5
+2016-09-21,15.0
+2016-09-22,8.5
+2016-09-23,4.0
+2016-09-24,47.0
+2016-09-25,2.0
+2016-09-26,23.0
+2016-09-27,0.0
+2016-09-28,3.4
+2016-09-29,0.0
+2016-09-30,0.0
+2016-10-01,10.5
+2016-10-02,9.5
+2016-10-03,20.5
+2016-10-04,0.0
+2016-10-05,28.0
+2016-10-06,57.0
+2016-10-07,19.5
+2016-10-08,0.0
+2016-10-09,6.5
+2016-10-10,26.5
+2016-10-11,1.0
+2016-10-12,3.0
+2016-10-13,4.5
+2016-10-14,0.0
+2016-10-15,13.0
+2016-10-16,0.0
+2016-10-17,0.0
+2016-10-18,0.0
+2016-10-19,0.0
+2016-10-20,0.0
+2016-10-21,36.5
+2016-10-22,0.0
+2016-10-23,10.0
+2016-10-24,12.5
+2016-10-25,9.5
+2016-10-26,30.5
+2016-10-27,11.0
+2016-10-28,22.0
+2016-10-29,11.0
+2016-10-30,4.0
+2016-10-31,13.0
+2016-11-01,35.5
+2016-11-02,13.0
+2016-11-03,14.5
+2016-11-04,6.5
+2016-11-05,0.0
+2016-11-06,15.0
+2016-11-07,0.0
+2016-11-08,4.0
+2016-11-09,10.5
+2016-11-10,28.5
+2016-11-11,10.0
+2016-11-12,16.0
+2016-11-13,0.0
+2016-11-14,34.0
+2016-11-15,4.0
+2016-11-16,1.5
+2016-11-17,1.0
+2016-11-18,0.0
+2016-11-19,2.0
+2016-11-20,1.5
+2016-11-21,0.0
+2016-11-22,7.5
+2016-11-23,1.0
+2016-11-24,10.5
+2016-11-25,6.0
+2016-11-26,4.0
+2016-11-27,17.5
+2016-11-28,6.5
+2016-11-29,4.5
+2016-11-30,2.5
+2016-12-01,4.5
+2016-12-02,0.0
+2016-12-03,3.5
+2016-12-04,0.0
+2016-12-05,29.0
+2016-12-06,22.5
+2016-12-07,1.0
+2016-12-08,0.0
+2016-12-09,11.0
+2016-12-10,43.5
+2016-12-11,0.0
+2016-12-12,20.0
+2016-12-13,51.0
+2016-12-14,0.0
+2016-12-15,13.5
+2016-12-16,1.0
+2016-12-17,0.0
+2016-12-18,0.0
+2016-12-19,0.0
+2016-12-20,0.0
+2016-12-21,0.0
+2016-12-22,0.0
+2016-12-23,0.0
+2016-12-24,0.0
+2016-12-25,0.0
+2016-12-26,1.0
+2016-12-27,2.0
+2016-12-28,0.0
+2016-12-29,0.0
+2016-12-30,0.0
+2016-12-31,0.0
+2017-01-01,0.0
+2017-01-02,2.0
+2017-01-03,5.0
+2017-01-04,0.0
+2017-01-05,22.5
+2017-01-06,0.0
+2017-01-07,0.0
+2017-01-08,0.0
+2017-01-09,0.0
+2017-01-10,0.0
+2017-01-11,0.0
+2017-01-12,0.0
+2017-01-13,7.0
+2017-01-14,0.0
+2017-01-15,19.0
+2017-01-16,0.0
+2017-01-17,12.0
+2017-01-18,0.0
+2017-01-19,0.0
+2017-01-20,3.0
+2017-01-21,13.0
+2017-01-22,34.0
+2017-01-23,4.5
+2017-01-24,3.5
+2017-01-25,0.0
+2017-01-26,0.0
+2017-01-27,0.0
+2017-01-28,0.0
+2017-01-29,2.5
+2017-01-30,0.0
+2017-01-31,2.5
+2017-02-01,2.5
+2017-02-02,0.0
+2017-02-03,0.0
+2017-02-04,3.0
+2017-02-05,0.0
+2017-02-06,0.0
+2017-02-07,2.0
+2017-02-08,0.0
+2017-02-09,24.0
+2017-02-10,3.0
+2017-02-11,2.0
+2017-02-12,0.0
+2017-02-13,6.0
+2017-02-14,1.0
+2017-02-15,0.0
+2017-02-16,0.0
+2017-02-17,0.0
+2017-02-18,0.0
+2017-02-19,0.0
+2017-02-20,0.0
+2017-02-21,8.0
+2017-02-22,7.5
+2017-02-23,0.0
+2017-02-24,40.5
+2017-02-25,10.0
+2017-02-26,0.0
+2017-02-27,4.0
+2017-02-28,5.0
+2017-03-01,40.0
+2017-03-02,3.0
+2017-03-03,0.0
+2017-03-04,2.0
+2017-03-05,0.0
+2017-03-06,12.5
+2017-03-07,26.0
+2017-03-08,4.0
+2017-03-09,0.0
+2017-03-10,4.0
+2017-03-11,7.5
+2017-03-12,1.5
+2017-03-13,0.0
+2017-03-14,0.0
+2017-03-15,14.0
+2017-03-16,0.0
+2017-03-17,36.0
+2017-03-18,7.5
+2017-03-19,31.5
+2017-03-20,0.0
+2017-03-21,0.0
+2017-03-22,0.0
+2017-03-23,0.0
+2017-03-24,0.0
+2017-03-25,0.0
+2017-03-26,8.0
+2017-03-27,18.5
+2017-03-28,5.5
+2017-03-29,0.0
+2017-03-30,26.0
+2017-03-31,0.0
+2017-04-01,3.5
+2017-04-02,7.5
+2017-04-03,0.0
+2017-04-04,3.5
+2017-04-05,10.0
+2017-04-06,11.0
+2017-04-07,0.0
+2017-04-08,0.0
+2017-04-09,41.0
+2017-04-10,0.0
+2017-04-11,3.5
+2017-04-12,0.0
+2017-04-13,0.0
+2017-04-14,0.0
+2017-04-15,0.0
+2017-04-16,2.5
+2017-04-17,9.5
+2017-04-18,22.0
+2017-04-19,0.0
+2017-04-20,2.0
+2017-04-21,0.0
+2017-04-22,46.0
+2017-04-23,0.0
+2017-04-24,0.0
+2017-04-25,0.0
+2017-04-26,11.5
+2017-04-27,4.5
+2017-04-28,19.5
+2017-04-29,0.0
+2017-04-30,0.0
+2017-05-01,0.0
+2017-05-02,0.0
+2017-05-03,0.0
+2017-05-04,7.0
+2017-05-05,0.0
+2017-05-06,0.0
+2017-05-07,0.0
+2017-05-08,3.5
+2017-05-09,1.5
+2017-05-10,0.0
+2017-05-11,0.0
+2017-05-12,0.0
+2017-05-13,0.0
+2017-05-14,0.0
+2017-05-15,0.0
+2017-05-16,0.0
+2017-05-17,0.0
+2017-05-18,0.0
+2017-05-19,0.0
+2017-05-20,0.0
+2017-05-21,0.0
+2017-05-22,0.0
+2017-05-23,0.0
+2017-05-24,0.0
+2017-05-25,0.0
+2017-05-26,0.0
+2017-05-27,0.0
+2017-05-28,10.0
+2017-05-29,0.0
+2017-05-30,0.0
+2017-05-31,0.0
+2017-06-01,0.0
+2017-06-02,0.0
+2017-06-03,0.0
+2017-06-04,0.0
+2017-06-05,0.0
+2017-06-06,0.0
+2017-06-07,0.0
+2017-06-08,0.0
+2017-06-09,0.0
+2017-06-10,0.0
+2017-06-11,0.0
+2017-06-12,0.0
+2017-06-13,0.0
+2017-06-14,0.0
+2017-06-15,0.0
+2017-06-16,0.0
+2017-06-17,0.0
+2017-06-18,0.0
+2017-06-19,0.0
+2017-06-20,0.0
+2017-06-21,0.0
+2017-06-22,0.0
+2017-06-23,0.0
+2017-06-24,0.0
+2017-06-25,0.0
+2017-06-26,0.0
+2017-06-27,0.0
+2017-06-28,0.0
+2017-06-29,0.0
+2017-06-30,0.0
+2017-07-01,0.0
+2017-07-02,0.0
+2017-07-03,0.0
+2017-07-04,0.0
+2017-07-05,0.0
+2017-07-06,0.0
+2017-07-07,0.0
+2017-07-08,0.0
+2017-07-09,0.0
+2017-07-10,0.0
+2017-07-11,0.0
+2017-07-12,0.0
+2017-07-13,0.0
+2017-07-14,0.0
+2017-07-15,0.0
+2017-07-16,0.0
+2017-07-17,0.0
+2017-07-18,3.0
+2017-07-19,4.0
+2017-07-20,0.0
+2017-07-21,0.0
+2017-07-22,0.0
+2017-07-23,0.0
+2017-07-24,0.0
+2017-07-25,0.0
+2017-07-26,0.0
+2017-07-27,0.0
+2017-07-28,0.0
+2017-07-29,0.0
+2017-07-30,0.0
+2017-07-31,0.0
+2017-08-01,0.0
+2017-08-02,0.0
+2017-08-03,0.0
+2017-08-04,0.0
+2017-08-05,0.0
+2017-08-06,0.0
+2017-08-07,0.0
+2017-08-08,0.0
+2017-08-09,0.0
+2017-08-10,0.0
+2017-08-11,0.0
+2017-08-12,0.0
+2017-08-13,0.0
+2017-08-14,0.0
+2017-08-15,0.0
+2017-08-16,0.0
+2017-08-17,0.0
+2017-08-18,0.0
+2017-08-19,0.0
+2017-08-20,0.0
+2017-08-21,0.0
+2017-08-22,0.0
+2017-08-23,0.0
+2017-08-24,0.0
+2017-08-25,0.0
+2017-08-26,0.0
+2017-08-27,0.0
+2017-08-28,0.0
+2017-08-29,0.0
+2017-08-30,0.0
+2017-08-31,0.0
+2017-09-01,0.0
+2017-09-02,0.0
+2017-09-03,0.0
+2017-09-04,0.0
+2017-09-05,0.0
+2017-09-06,0.0
+2017-09-07,0.0
+2017-09-08,0.0
+2017-09-09,0.0
+2017-09-10,0.0
+2017-09-11,0.0
+2017-09-12,0.0
+2017-09-13,0.0
+2017-09-14,0.0
+2017-09-15,0.0
+2017-09-16,0.0
+2017-09-17,0.0
+2017-09-18,0.0
+2017-09-19,0.0
+2017-09-20,0.0
+2017-09-21,0.0
+2017-09-22,0.0
+2017-09-23,0.0
+2017-09-24,0.0
+2017-09-25,0.0
+2017-09-26,13.0
+2017-09-27,17.0
+2017-09-28,0.0
+2017-09-29,2.5
+2017-09-30,8.0
+2017-10-01,0.0
+2017-10-02,0.0
+2017-10-03,0.0
+2017-10-04,0.0
+2017-10-05,0.0
+2017-10-06,0.0
+2017-10-07,0.0
+2017-10-08,0.0
+2017-10-09,0.0
+2017-10-10,7.0
+2017-10-11,8.0
+2017-10-12,0.0
+2017-10-13,0.0
+2017-10-14,0.0
+2017-10-15,0.0
+2017-10-16,45.5
+2017-10-17,0.0
+2017-10-18,0.0
+2017-10-19,5.0
+2017-10-20,0.0
+2017-10-21,0.0
+2017-10-22,0.0
+2017-10-23,0.0
+2017-10-24,0.0
+2017-10-25,28.5
+2017-10-26,6.5
+2017-10-27,0.0
+2017-10-28,0.0
+2017-10-29,0.0
+2017-10-30,0.0
+2017-10-31,0.0
+2017-11-01,0.0
+2017-11-02,0.0
+2017-11-03,0.0
+2017-11-04,20.0
+2017-11-05,1.5
+2017-11-06,26.0
+2017-11-07,31.5
+2017-11-08,5.5
+2017-11-09,34.5
+2017-11-10,2.5
+2017-11-11,1.5
+2017-11-12,7.0
+2017-11-13,50.0
+2017-11-14,54.5
+2017-11-15,0.5
+2017-11-16,11.0
+2017-11-17,32.5
+2017-11-18,0.0
+2017-11-19,65.0
+2017-11-20,9.5
+2017-11-21,23.0
+2017-11-22,4.0
+2017-11-23,0.0
+2017-11-24,0.0
+2017-11-25,0.0
+2017-11-26,5.0
+2017-11-27,33.0
+2017-11-28,0.0
+2017-11-29,2.0
+2017-11-30,4.0
+2017-12-01,0.0
+2017-12-02,0.0
+2017-12-03,0.0
+2017-12-04,4.5
+2017-12-05,0.0
+2017-12-06,20.5
+2017-12-07,25.0
+2017-12-08,4.5
+2017-12-09,0.0
+2017-12-10,0.0
+2017-12-11,0.0
+2017-12-12,0.0
+2017-12-13,19.5
+2017-12-14,1.5
+2017-12-15,32.5
+2017-12-16,5.0
+2017-12-17,27.5
+2017-12-18,5.0
+2017-12-19,0.0
+2017-12-20,3.5
+2017-12-21,0.0
+2017-12-22,0.0
+2017-12-23,0.0
+2017-12-24,0.0
+2017-12-25,0.0
+2017-12-26,0.0
+2017-12-27,0.0
+2017-12-28,0.0
+2017-12-29,0.0
+2017-12-30,20.0
+2017-12-31,0.0
+2018-01-01,0.0
+2018-01-02,5.0
+2018-01-03,8.0
+2018-01-04,18.0
+2018-01-05,7.0
+2018-01-06,13.0
+2018-01-07,1.5
+2018-01-08,5.0
+2018-01-09,0.0
+2018-01-10,0.0
+2018-01-11,24.0
+2018-01-12,0.0
+2018-01-13,0.0
+2018-01-14,1.0
+2018-01-15,1.5
+2018-01-16,5.0
+2018-01-17,0.0
+2018-01-18,0.0
+2018-01-19,0.0
+2018-01-20,0.0
+2018-01-21,0.0
+2018-01-22,5.0
+2018-01-23,2.5
+2018-01-24,0.0
+2018-01-25,5.0
+2018-01-26,1.0
+2018-01-27,1.5
+2018-01-28,5.0
+2018-01-29,2.0
+2018-01-30,0.0
+2018-01-31,0.0
+2018-02-01,0.0
+2018-02-02,0.0
+2018-02-03,0.0
+2018-02-04,4.0
+2018-02-05,0.0
+2018-02-06,6.0
+2018-02-07,0.0
+2018-02-08,0.0
+2018-02-09,0.0
+2018-02-10,0.0
+2018-02-11,2.0
+2018-02-12,0.0
+2018-02-13,1.5
+2018-02-14,1.0
+2018-02-15,0.0
+2018-02-16,9.0
+2018-02-17,0.0
+2018-02-18,0.0
+2018-02-19,6.0
+2018-02-20,33.0
+2018-02-21,31.5
+2018-02-22,14.5
+2018-02-23,35.5
+2018-02-24,0.0
+2018-02-25,30.0
+2018-02-26,37.0
+2018-02-27,5.5
+2018-02-28,58.0
+2018-03-01,39.5
+2018-03-02,2.0
+2018-03-03,10.5
+2018-03-04,5.0
+2018-03-05,9.0
+2018-03-06,1.0
+2018-03-07,1.5
+2018-03-08,19.5
+2018-03-09,36.5
+2018-03-10,38.5
+2018-03-11,2.5
+2018-03-12,38.0
+2018-03-13,53.5
+2018-03-14,0.0
+2018-03-15,0.0
+2018-03-16,0.0
+2018-03-17,24.0
+2018-03-18,6.0
+2018-03-19,2.5
+2018-03-20,5.5
+2018-03-21,4.0
+2018-03-22,2.0
+2018-03-23,0.0
+2018-03-24,31.5
+2018-03-25,10.5
+2018-03-26,0.0
+2018-03-27,0.0
+2018-03-28,8.0
+2018-03-29,0.0
+2018-03-30,16.5
+2018-03-31,7.5
+2018-04-01,0.0
+2018-04-02,0.0
+2018-04-03,40.5
+2018-04-04,39.5
+2018-04-05,0.0
+2018-04-06,6.5
+2018-04-07,0.0
+2018-04-08,33.0
+2018-04-09,3.5
+2018-04-10,1.0
+2018-04-11,0.0
+2018-04-12,0.0
+2018-04-13,0.0
+2018-04-14,0.0
+2018-04-15,0.0
+2018-04-16,0.0
+2018-04-17,0.0
+2018-04-18,14.0
+2018-04-19,0.0
+2018-04-20,22.0
+2018-04-21,0.0
+2018-04-22,12.0
+2018-04-23,7.5
+2018-04-24,0.0
+2018-04-25,0.0
+2018-04-26,13.0
+2018-04-27,3.5
+2018-04-28,0.0
+2018-04-29,0.0
+2018-04-30,0.0
+2018-05-01,0.0
+2018-05-02,0.0
+2018-05-03,2.5
+2018-05-04,0.0
+2018-05-05,0.0
+2018-05-06,0.0
+2018-05-07,0.0
+2018-05-08,0.0
+2018-05-09,0.0
+2018-05-10,0.0
+2018-05-11,0.0
+2018-05-12,0.0
+2018-05-13,0.0
+2018-05-14,0.0
+2018-05-15,0.0
+2018-05-16,0.0
+2018-05-17,0.0
+2018-05-18,0.0
+2018-05-19,0.0
+2018-05-20,0.0
+2018-05-21,0.0
+2018-05-22,0.0
+2018-05-23,0.0
+2018-05-24,0.0
+2018-05-25,0.0
+2018-05-26,1.5
+2018-05-27,5.0
+2018-05-28,0.0
+2018-05-29,0.0
+2018-05-30,0.0
+2018-05-31,0.0
+2018-06-01,0.0
+2018-06-02,0.0
+2018-06-03,0.0
+2018-06-04,0.0
+2018-06-05,0.0
+2018-06-06,0.0
+2018-06-07,0.0
+2018-06-08,0.0
+2018-06-09,0.0
+2018-06-10,0.0
+2018-06-11,0.0
+2018-06-12,0.0
+2018-06-13,0.0
+2018-06-14,0.0
+2018-06-15,0.0
+2018-06-16,0.0
+2018-06-17,0.0
+2018-06-18,0.0
+2018-06-19,0.0
+2018-06-20,8.0
+2018-06-21,0.0
+2018-06-22,0.0
+2018-06-23,0.0
+2018-06-24,0.0
+2018-06-25,0.0
+2018-06-26,0.0
+2018-06-27,0.0
+2018-06-28,0.0
+2018-06-29,0.0
+2018-06-30,0.0
+2018-07-01,0.0
+2018-07-02,0.0
+2018-07-03,0.0
+2018-07-04,0.0
+2018-07-05,0.0
+2018-07-06,0.0
+2018-07-07,0.0
+2018-07-08,0.0
+2018-07-09,0.0
+2018-07-10,0.0
+2018-07-11,0.0
+2018-07-12,0.0
+2018-07-13,0.0
+2018-07-14,0.0
+2018-07-15,0.0
+2018-07-16,0.0
+2018-07-17,0.0
+2018-07-18,0.0
+2018-07-19,0.0
+2018-07-20,0.0
+2018-07-21,0.0
+2018-07-22,0.0
+2018-07-23,0.0
+2018-07-24,0.0
+2018-07-25,0.0
+2018-07-26,0.0
+2018-07-27,0.0
+2018-07-28,0.0
+2018-07-29,0.0
+2018-07-30,0.0
+2018-07-31,0.0
+2018-08-01,0.0
+2018-08-02,0.0
+2018-08-03,0.0
+2018-08-04,0.0
+2018-08-05,0.0
+2018-08-06,0.0
+2018-08-07,0.0
+2018-08-08,0.0
+2018-08-09,2.0
+2018-08-10,0.0
+2018-08-11,0.0
+2018-08-12,0.0
+2018-08-13,5.0
+2018-08-14,2.0
+2018-08-15,0.0
+2018-08-16,0.0
+2018-08-17,0.0
+2018-08-18,2.0
+2018-08-19,0.0
+2018-08-20,0.0
+2018-08-21,0.0
+2018-08-22,0.0
+2018-08-23,0.0
+2018-08-24,0.0
+2018-08-25,3.0
+2018-08-26,0.0
+2018-08-27,0.0
+2018-08-28,0.0
+2018-08-29,0.0
+2018-08-30,0.0
+2018-08-31,1.0
+2018-09-01,0.0
+2018-09-02,0.0
+2018-09-03,0.5
+2018-09-04,0.0
+2018-09-05,0.0
+2018-09-06,0.0
+2018-09-07,0.0
+2018-09-08,0.0
+2018-09-09,0.0
+2018-09-10,0.0
+2018-09-11,0.0
+2018-09-12,0.0
+2018-09-13,0.0
+2018-09-14,0.0
+2018-09-15,0.0
+2018-09-16,0.0
+2018-09-17,0.0
+2018-09-18,3.0
+2018-09-19,0.0
+2018-09-20,0.0
+2018-09-21,0.0
+2018-09-22,1.0
+2018-09-23,0.0
+2018-09-24,0.0
+2018-09-25,0.0
+2018-09-26,0.0
+2018-09-27,0.0
+2018-09-28,0.0
+2018-09-29,0.0
+2018-09-30,0.0
+2018-10-01,0.0
+2018-10-02,0.0
+2018-10-03,0.0
+2018-10-04,0.0
+2018-10-05,0.0
+2018-10-06,0.0
+2018-10-07,0.0
+2018-10-08,0.0
+2018-10-09,0.0
+2018-10-10,0.0
+2018-10-11,0.0
+2018-10-12,0.0
+2018-10-13,0.0
+2018-10-14,0.0
+2018-10-15,0.0
+2018-10-16,0.0
+2018-10-17,0.0
+2018-10-18,0.0
+2018-10-19,0.0
+2018-10-20,0.0
+2018-10-21,0.0
+2018-10-22,0.0
+2018-10-23,0.0
+2018-10-24,24.5
+2018-10-25,0.0
+2018-10-26,0.0
+2018-10-27,0.0
+2018-10-28,0.0
+2018-10-29,0.0
+2018-10-30,0.0
+2018-10-31,13.5
+2018-11-01,0.0
+2018-11-02,0.0
+2018-11-03,0.0
+2018-11-04,0.0
+2018-11-05,0.0
+2018-11-06,0.0
+2018-11-07,0.0
+2018-11-08,0.0
+2018-11-09,0.0
+2018-11-10,0.0
+2018-11-11,0.0
+2018-11-12,0.0
+2018-11-13,0.0
+2018-11-14,0.0
+2018-11-15,0.0
+2018-11-16,0.0
+2018-11-17,0.0
+2018-11-18,0.0
+2018-11-19,0.0
+2018-11-20,0.0
+2018-11-21,0.0
+2018-11-22,0.0
+2018-11-23,0.0
+2018-11-24,0.0
+2018-11-25,0.0
+2018-11-26,0.0
+2018-11-27,0.0
+2018-11-28,0.0
+2018-11-29,0.0
+2018-11-30,0.0
+2018-12-01,0.0
+2018-12-02,0.0
+2018-12-03,0.0
+2018-12-04,0.0
+2018-12-05,0.0
+2018-12-06,0.0
+2018-12-07,0.0
+2018-12-08,0.0
+2018-12-09,0.0
+2018-12-10,0.0
+2018-12-11,0.0
+2018-12-12,0.0
+2018-12-13,0.0
+2018-12-14,0.0
+2018-12-15,0.0
+2018-12-16,0.0
+2018-12-17,0.0
+2018-12-18,0.0
+2018-12-19,0.0
+2018-12-20,0.0
+2018-12-21,0.0
+2018-12-22,0.0
+2018-12-23,0.0
+2018-12-24,0.0
+2018-12-25,0.0
+2018-12-26,0.0
+2018-12-27,0.0
+2018-12-28,0.0
+2018-12-29,0.0
+2018-12-30,0.0
+2018-12-31,0.0
+2019-01-01,0.0
+2019-01-02,0.0
+2019-01-03,0.0
+2019-01-04,0.0
+2019-01-05,0.0
+2019-01-06,6.5
+2019-01-07,0.0
+2019-01-08,4.5
+2019-01-09,0.0
+2019-01-10,2.5
+2019-01-11,0.0
+2019-01-12,0.0
+2019-01-13,2.0
+2019-01-14,11.0
+2019-01-15,1.0
+2019-01-16,1.5
+2019-01-17,0.0
+2019-01-18,4.5
+2019-01-19,2.5
+2019-01-20,0.0
+2019-01-21,4.5
+2019-01-22,1.0
+2019-01-23,3.5
+2019-01-24,0.0
+2019-01-25,4.0
+2019-01-26,0.0
+2019-01-27,1.0
+2019-01-28,0.0
+2019-01-29,0.0
+2019-01-30,0.0
+2019-01-31,0.0
+2019-02-01,0.0
+2019-02-02,8.5
+2019-02-03,38.5
+2019-02-04,8.0
+2019-02-05,4.5
+2019-02-06,2.0
+2019-02-07,1.0
+2019-02-08,16.5
+2019-02-09,52.5
+2019-02-10,18.5
+2019-02-11,41.5
+2019-02-12,27.5
+2019-02-13,12.0
+2019-02-14,0.0
+2019-02-15,23.5
+2019-02-16,0.0
+2019-02-17,6.0
+2019-02-18,2.0
+2019-02-19,0.0
+2019-02-20,5.0
+2019-02-21,11.0
+2019-02-22,7.0
+2019-02-23,5.5
+2019-02-24,32.0
+2019-02-25,4.5
+2019-02-26,0.0
+2019-02-27,1.5
+2019-02-28,0.0
+2019-03-01,2.0
+2019-03-02,7.5
+2019-03-03,21.0
+2019-03-04,0.0
+2019-03-05,0.0
+2019-03-06,75.5
+2019-03-07,13.0
+2019-03-08,0.0
+2019-03-09,0.0
+2019-03-10,0.0
+2019-03-11,0.0
+2019-03-12,20.5
+2019-03-13,0.0
+2019-03-14,0.0
+2019-03-15,0.0
+2019-03-16,1.0
+2019-03-17,0.0
+2019-03-18,2.0
+2019-03-19,0.0
+2019-03-20,20.5
+2019-03-21,0.0
+2019-03-22,1.5
+2019-03-23,0.0
+2019-03-24,0.0
+2019-03-25,0.0
+2019-03-26,0.0
+2019-03-27,69.0
+2019-03-28,8.5
+2019-03-29,1.0
+2019-03-30,6.5
+2019-03-31,2.5
+2019-04-01,10.0
+2019-04-02,34.5
+2019-04-03,13.5
+2019-04-04,9.5
+2019-04-05,2.0
+2019-04-06,2.5
+2019-04-07,3.0
+2019-04-08,64.5
+2019-04-09,4.5
+2019-04-10,1.0
+2019-04-11,0.0
+2019-04-12,7.0
+2019-04-13,83.0
+2019-04-14,15.0
+2019-04-15,51.5
+2019-04-16,51.0
+2019-04-17,0.0
+2019-04-18,7.0
+2019-04-19,36.5
+2019-04-20,0.0
+2019-04-21,0.0
+2019-04-22,0.0
+2019-04-23,0.0
+2019-04-24,3.0
+2019-04-25,0.0
+2019-04-26,1.0
+2019-04-27,0.0
+2019-04-28,0.0
+2019-04-29,0.0
+2019-04-30,1.5
+2019-05-01,51.5
+2019-05-02,16.0
+2019-05-03,14.0
+2019-05-04,0.0
+2019-05-05,0.0
+2019-05-06,0.0
+2019-05-07,0.0
+2019-05-08,0.0
+2019-05-09,1.0
+2019-05-10,0.0
+2019-05-11,0.0
+2019-05-12,0.0
+2019-05-13,0.0
+2019-05-14,0.0
+2019-05-15,0.0
+2019-05-16,18.5
+2019-05-17,0.0
+2019-05-18,0.0
+2019-05-19,0.0
+2019-05-20,0.0
+2019-05-21,0.0
+2019-05-22,0.0
+2019-05-23,0.0
+2019-05-24,0.0
+2019-05-25,0.0
+2019-05-26,0.0
+2019-05-27,0.0
+2019-05-28,0.0
+2019-05-29,0.0
+2019-05-30,0.0
+2019-05-31,0.0
+2019-06-01,0.0
+2019-06-02,0.0
+2019-06-03,0.0
+2019-06-04,0.0
+2019-06-05,0.0
+2019-06-06,0.0
+2019-06-07,0.0
+2019-06-08,0.0
+2019-06-09,0.0
+2019-06-10,0.0
+2019-06-11,0.0
+2019-06-12,0.0
+2019-06-13,0.0
+2019-06-14,0.0
+2019-06-15,0.0
+2019-06-16,0.0
+2019-06-17,0.0
+2019-06-18,0.0
+2019-06-19,0.0
+2019-06-20,0.0
+2019-06-21,0.0
+2019-06-22,0.0
+2019-06-23,0.0
+2019-06-24,0.0
+2019-06-25,0.0
+2019-06-26,0.0
+2019-06-27,0.0
+2019-06-28,0.0
+2019-06-29,0.0
+2019-06-30,0.0
+2019-07-01,0.0
+2019-07-02,0.0
+2019-07-03,0.0
+2019-07-04,0.0
+2019-07-05,0.0
+2019-07-06,0.0
+2019-07-07,0.0
+2019-07-08,0.0
+2019-07-09,0.0
+2019-07-10,0.0
+2019-07-11,0.0
+2019-07-12,0.0
+2019-07-13,0.0
+2019-07-14,0.0
+2019-07-15,0.0
+2019-07-16,0.0
+2019-07-17,0.0
+2019-07-18,0.0
+2019-07-19,0.0
+2019-07-20,0.0
+2019-07-21,0.0
+2019-07-22,0.0
+2019-07-23,0.0
+2019-07-24,0.0
+2019-07-25,0.0
+2019-07-26,0.0
+2019-07-27,0.0
+2019-07-28,0.0
+2019-07-29,0.0
+2019-07-30,0.0
+2019-07-31,0.0
+2019-08-01,0.0
+2019-08-02,0.0
+2019-08-03,0.0
+2019-08-04,0.0
+2019-08-05,0.0
+2019-08-06,0.0
+2019-08-07,0.0
+2019-08-08,0.0
+2019-08-09,0.0
+2019-08-10,0.0
+2019-08-11,0.0
+2019-08-12,0.0
+2019-08-13,0.0
+2019-08-14,0.0
+2019-08-15,0.0
+2019-08-16,0.0
+2019-08-17,0.0
+2019-08-18,0.0
+2019-08-19,0.0
+2019-08-20,0.0
+2019-08-21,0.0
+2019-08-22,0.0
+2019-08-23,0.0
+2019-08-24,0.0
+2019-08-25,0.0
+2019-08-26,0.0
+2019-08-27,0.0
+2019-08-28,0.0
+2019-08-29,0.0
+2019-08-30,0.0
+2019-08-31,0.0
+2019-09-01,0.0
+2019-09-02,0.0
+2019-09-03,0.0
+2019-09-04,0.0
+2019-09-05,0.0
+2019-09-06,0.0
+2019-09-07,0.0
+2019-09-08,0.0
+2019-09-09,0.0
+2019-09-10,0.0
+2019-09-11,0.0
+2019-09-12,0.0
+2019-09-13,0.0
+2019-09-14,0.0
+2019-09-15,0.0
+2019-09-16,0.0
+2019-09-17,0.0
+2019-09-18,0.0
+2019-09-19,0.0
+2019-09-20,0.0
+2019-09-21,0.0
+2019-09-22,0.0
+2019-09-23,0.0
+2019-09-24,0.0
+2019-09-25,0.0
+2019-09-26,0.0
+2019-09-27,0.0
+2019-09-28,0.0
+2019-09-29,0.0
+2019-09-30,0.0
+2019-10-01,0.0
+2019-10-02,0.0
+2019-10-03,0.0
+2019-10-04,0.0
+2019-10-05,0.0
+2019-10-06,0.0
+2019-10-07,0.0
+2019-10-08,0.0
+2019-10-09,0.0
+2019-10-10,0.0
+2019-10-11,0.0
+2019-10-12,0.0
+2019-10-13,0.0
+2019-10-14,0.0
+2019-10-15,0.0
+2019-10-16,0.0
+2019-10-17,0.0
+2019-10-18,0.0
+2019-10-19,0.0
+2019-10-20,0.0
+2019-10-21,0.0
+2019-10-22,0.0
+2019-10-23,0.0
+2019-10-24,0.0
+2019-10-25,0.0
+2019-10-26,0.0
+2019-10-27,14.0
+2019-10-28,0.0
+2019-10-29,0.0
+2019-10-30,3.0
+2019-10-31,0.0
+2019-11-01,0.0
+2019-11-02,0.0
+2019-11-03,0.0
+2019-11-04,0.0
+2019-11-05,3.0
+2019-11-06,0.0
+2019-11-07,0.0
+2019-11-08,0.0
+2019-11-09,34.5
+2019-11-10,0.0
+2019-11-11,0.0
+2019-11-12,0.0
+2019-11-13,0.0
+2019-11-14,0.0
+2019-11-15,0.0
+2019-11-16,0.0
+2019-11-17,0.0
+2019-11-18,0.0
+2019-11-19,0.0
+2019-11-20,0.0
+2019-11-21,0.0
+2019-11-22,3.5
+2019-11-23,5.0
+2019-11-24,2.5
+2019-11-25,0.0
+2019-11-26,0.0
+2019-11-27,0.0
+2019-11-28,0.0
+2019-11-29,0.0
+2019-11-30,0.0
+2019-12-01,2.5
+2019-12-02,0.0
+2019-12-03,0.0
+2019-12-04,0.0
+2019-12-05,0.0
+2019-12-06,0.0
+2019-12-07,9.5
+2019-12-08,0.0
+2019-12-09,0.0
+2019-12-10,2.5
+2019-12-11,0.0
+2019-12-12,47.0
+2019-12-13,0.0
+2019-12-14,0.0
+2019-12-15,7.0
+2019-12-16,0.0
+2019-12-17,7.0
+2019-12-18,29.5
+2019-12-19,0.0
+2019-12-20,0.0
+2019-12-21,0.0
+2019-12-22,2.5
+2019-12-23,13.5
+2019-12-24,0.0
+2019-12-25,2.5
+2019-12-26,5.5
+2019-12-27,3.5
+2019-12-28,0.0
+2019-12-29,0.0
+2019-12-30,0.0
+2019-12-31,61.0
diff --git a/pyconfig.py b/pyconfig.py
index f6c1fce..cd879e7 100644
--- a/pyconfig.py
+++ b/pyconfig.py
@@ -2,4 +2,3 @@
_CONFIG_PATH = "app_config.yml"
appConfig = Box.from_yaml(filename=_CONFIG_PATH)
-# appConfig.DASH_THEME.THEME = "SKETCHY"
diff --git a/pyfigure.py b/pyfigure.py
index 657ae13..bd6368e 100644
--- a/pyfigure.py
+++ b/pyfigure.py
@@ -1,34 +1,40 @@
-import plotly.graph_objects as go
-import plotly.express as px
+from dash import dcc
+from plotly.subplots import make_subplots
+from pyconfig import appConfig
import numpy as np
+import plotly.express as px
+import plotly.graph_objects as go
+import pytemplate
+import pandas as pd
+from collections import defaultdict
+from itertools import cycle, islice
-
-def figure_test_scatter():
- data = [{"x": np.arange(1, 11), "y": np.random.randint(0, 10, 10)}]
- layout = go.Layout()
- return go.Figure(data, layout)
+THRESHOLD_SUMMARY = (367 * 8) // 2
+THRESHOLD_GRAPH_RAINFALL = 365 * 8
+THRESHOLD_XAXES = 12 * 2 * 5
+THRESHOLD_STATIONS = 8
-def figure_test_heatmap():
- data = [[1, np.nan, 30, 50, 1], [20, 1, np.nan, 80, 30], [30, 60, np.nan, 5, 20]]
- fig = px.imshow(
- data,
- labels=dict(x="Day of Week", y="Time of Day", color="Productivity"),
- x=["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
- y=["Morning", "Afternoon", "Evening"],
- aspect="auto",
+def _generate_dict_watermark(n: int = 1, source=appConfig.TEMPLATE.WATERMARK_SOURCE):
+ n = "" if n == 1 else n
+ return dict(
+ source=source,
+ xref=f"x{n} domain",
+ yref=f"y{n} domain",
+ x=0.5,
+ y=0.5,
+ sizex=0.5,
+ sizey=0.5,
+ xanchor="center",
+ yanchor="middle",
+ name="watermark-hidrokit",
+ layer="below",
+ opacity=0.2,
)
- return fig
-
-
-def figure_test_heatmap2():
- data = go.Heatmap(z=[[1, 20, 30], [20, np.nan, 60], [30, 60, 1]])
- layout = go.Layout()
- return go.Figure(data, layout)
-TEMPLATE_LABEL = dict(
- title="Rainfall Each Stations",
+LABEL_GRAPH_RAINFALL = dict(
+ title="Rainfall Each Station",
yaxis={"title": "Rainfall (mm)"},
xaxis={"title": "Date"},
legend={"title": "Stations"},
@@ -41,7 +47,7 @@ def figure_scatter(dataframe):
go.Scatter(x=dataframe.index, y=dataframe[col], mode="lines", name=col)
for col in dataframe.columns
]
- layout = go.Layout(hovermode="closest", **TEMPLATE_LABEL)
+ layout = go.Layout(hovermode="closest", **LABEL_GRAPH_RAINFALL)
fig = go.Figure(data, layout)
@@ -50,12 +56,12 @@ def figure_scatter(dataframe):
def figure_bar(dataframe, barmode="stack"):
- if barmode == 'stack':
+ if barmode == "stack":
col_df = dataframe.columns[::-1]
bargap = 0
else:
col_df = dataframe.columns
- bargap = 0.5
+ bargap = 0.2
data = [
go.Bar(
@@ -65,14 +71,16 @@ def figure_bar(dataframe, barmode="stack"):
)
for col in col_df
]
- layout = go.Layout(hovermode="x unified", barmode=barmode, bargap=bargap, **TEMPLATE_LABEL)
+ layout = go.Layout(
+ hovermode="x unified", barmode=barmode, bargap=bargap, **LABEL_GRAPH_RAINFALL
+ )
fig = go.Figure(data, layout)
return fig
-def figure_empty():
+def figure_empty(text: str = "", size: int = 40):
data = [{"x": [], "y": []}]
layout = go.Layout(
title={"text": "", "x": 0.5},
@@ -89,6 +97,395 @@ def figure_empty():
"zeroline": False,
},
margin=dict(t=55, l=55, r=55, b=55),
+ annotations=[
+ dict(
+ name="text",
+ text=f"{text}",
+ opacity=0.3,
+ font_size=size,
+ xref="x domain",
+ yref="y domain",
+ x=0.5,
+ y=0.05,
+ showarrow=False,
+ )
+ ],
+ height=450,
)
return go.Figure(data, layout)
+
+
+def figure_summary_maxsum(
+ summary,
+ ufunc_cols: list[str] = None,
+ rows: int = 2,
+ cols: int = 1,
+ subplot_titles: list[str] = None,
+ title: str = "Summary Rainfall",
+ period: str = None,
+) -> dcc.Graph:
+
+ ufunc_cols = ["max", "sum"] if ufunc_cols is None else ufunc_cols
+ subplot_titles = ufunc_cols if subplot_titles is None else subplot_titles
+
+ if summary.size > THRESHOLD_SUMMARY:
+ return dcc.Graph(
+ figure=figure_empty("dataset above threshold"), config={"staticPlot": True}
+ )
+
+ fig = make_subplots(
+ rows=rows,
+ cols=cols,
+ shared_xaxes=True,
+ vertical_spacing=0.05,
+ subplot_titles=subplot_titles,
+ )
+
+ fig.layout.images = [_generate_dict_watermark(n) for n in range(2, rows + 1)]
+
+ data_dict = defaultdict(list)
+
+ for station in summary.columns.levels[0]:
+ for ufcol, series in summary[station].items():
+ if ufcol in ufunc_cols:
+ _bar = go.Bar(
+ x=np.arange(series.index.size),
+ y=series,
+ name=f"{station} ({ufcol})",
+ legendgroup=station,
+ legendgrouptitle_text=station,
+ )
+ data_dict[ufcol].append(_bar)
+
+ for counter, (ufcol, data) in enumerate(data_dict.items(), 1):
+ fig.add_traces(data, rows=counter, cols=cols)
+
+ fig.update_layout(
+ title={"text": title, "pad": {"b": 20}},
+ barmode="group",
+ hovermode="x",
+ height=800,
+ xaxis2={"title": "Date"},
+ bargap=0.2,
+ dragmode="zoom",
+ legend={"title": "Stations"},
+ )
+
+ ticktext = series.index.strftime("%d %b %Y")
+
+ if period.lower() in ["monthly", "yearly"]:
+ if period.lower() == "monthly":
+ ticktext = series.index.strftime("%B %Y")
+ if period.lower() == "yearly":
+ ticktext = series.index.strftime("%Y")
+
+ if series.index.size <= THRESHOLD_XAXES:
+ xticktext = ticktext
+ xtickvals = np.arange(series.index.size)
+ else:
+ xticktext = ticktext[::2]
+ xtickvals = np.arange(series.index.size)[::2]
+
+ UPDATE_XAXES = {
+ "ticktext": xticktext,
+ "tickvals": xtickvals,
+ "gridcolor": pytemplate._FONT_COLOR_RGB_ALPHA.replace("0.4", "0.2"),
+ "gridwidth": 2,
+ }
+
+ UPDATE_YAXES = {
+ "gridcolor": pytemplate._FONT_COLOR_RGB_ALPHA.replace("0.4", "0.2"),
+ "gridwidth": 2,
+ "fixedrange": True,
+ "title": "Rainfall (mm)",
+ }
+
+ def update_axis(fig, update, n, axis: str = "x"):
+ n = "" if n == 1 else n
+ fig.update(layout={f"{axis}axis{n}": update})
+
+ for n_row in range(1, rows + 1):
+ for axis, update in zip(["x", "y"], [UPDATE_XAXES, UPDATE_YAXES]):
+ update_axis(fig, update, n_row, axis)
+
+ # ref: https://stackoverflow.com/questions/39863250
+
+ n_data = len(fig.data)
+ n_split = n_data // 2
+
+ if n_split < len(pytemplate.hktemplate.layout.colorway):
+ colors = list(pytemplate.hktemplate.layout.colorway[:n_split])
+ else:
+ colorway_list = pytemplate.hktemplate.layout.colorway
+ colors = list(islice(cycle(colorway_list), n_split))
+
+ for data, color in zip(fig.data, colors * 2):
+ data.marker.color = color
+
+ return dcc.Graph(figure=fig)
+
+
+def figure_summary_raindry(
+ summary: pd.DataFrame,
+ ufunc_cols: list[str] = None,
+ rows: int = None,
+ cols: int = 1,
+ subplot_titles: list[str] = None,
+ title: str = "Summary Rainfall",
+ period: str = None,
+) -> dcc.Graph:
+
+ rows = summary.columns.levels[0].size if rows is None else rows
+
+ ufunc_cols = ["n_rain", "n_dry"] if ufunc_cols is None else ufunc_cols
+ subplot_titles = (
+ summary.columns.levels[0] if subplot_titles is None else subplot_titles
+ )
+
+ if (summary.size > THRESHOLD_SUMMARY) or (summary.index.size > THRESHOLD_XAXES):
+ return dcc.Graph(
+ figure=figure_empty("dataset above threshold"), config={"staticPlot": True}
+ )
+
+ vertical_spacing = 0.2 / rows
+
+ fig = make_subplots(
+ rows=rows,
+ cols=cols,
+ shared_xaxes=True,
+ vertical_spacing=vertical_spacing,
+ subplot_titles=subplot_titles,
+ )
+
+ fig.layout.images = [_generate_dict_watermark(n) for n in range(2, rows + 1)]
+
+ for station in summary.columns.levels[0]:
+ summary[(station, "n_left")] = (
+ summary[(station, "days")].max()
+ - summary[(station, "n_rain")]
+ - summary[(station, "n_dry")]
+ )
+
+ data_dict = defaultdict(list)
+
+ for station in summary.columns.levels[0]:
+ for ufcol, series in summary[station].items():
+ if ufcol in ufunc_cols + ["n_left"]:
+ if ufcol in ufunc_cols:
+ _bar = go.Bar(
+ x=np.arange(series.index.size),
+ y=series,
+ name=f"{station} ({ufcol})",
+ legendgroup=station,
+ legendgrouptitle_text=station,
+ marker_line_width=0,
+ customdata=series.index,
+ hovertemplate=f"{station}
{ufcol}: %{{y}}",
+ )
+ data_dict[station].append(_bar)
+ if ufcol == "n_left":
+ _bar = go.Bar(
+ x=np.arange(series.index.size),
+ y=series,
+ name=f"{station} (border)",
+ legendgroup=station,
+ legendgrouptitle_text=station,
+ showlegend=True,
+ hoverinfo="skip",
+ marker_line_width=0,
+ marker_opacity=1,
+ legendrank=500,
+ )
+ data_dict[station].append(_bar)
+
+ for counter, (ufcol, data) in enumerate(data_dict.items(), 1):
+ fig.add_traces(data, rows=counter, cols=cols)
+
+ fig.update_layout(
+ title={"text": title, "pad": {"b": 20}},
+ barmode="stack",
+ hovermode="x",
+ height=max([600, 250 * rows]),
+ bargap=0,
+ dragmode="zoom",
+ legend={"title": "Stations"},
+ )
+
+ ticktext = series.index.strftime("%d %b %Y")
+
+ if period.lower() in ["monthly", "yearly"]:
+ if period.lower() == "monthly":
+ ticktext = series.index.strftime("%B %Y")
+ if period.lower() == "yearly":
+ ticktext = series.index.strftime("%Y")
+
+ if series.index.size <= THRESHOLD_XAXES:
+ xticktext = ticktext
+ xtickvals = np.arange(series.index.size)
+ else:
+ xticktext = ticktext[::2]
+ xtickvals = np.arange(series.index.size)[::2]
+
+ UPDATE_XAXES = {
+ "ticktext": xticktext,
+ "tickvals": xtickvals,
+ "gridcolor": pytemplate._FONT_COLOR_RGB_ALPHA.replace("0.4", "0.1"),
+ "gridwidth": 2,
+ # "nticks": 2,
+ "ticklabelstep": 2,
+ }
+
+ UPDATE_YAXES = {
+ "gridcolor": pytemplate._FONT_COLOR_RGB_ALPHA.replace("0.4", "0.1"),
+ "gridwidth": 2,
+ "fixedrange": True,
+ "title": "Days",
+ "range": [0, summary[(station, "days")].max()],
+ }
+
+ def update_axis(fig, update, n, axis: str = "x"):
+ n = "" if n == 1 else n
+ fig.update(layout={f"{axis}axis{n}": update})
+
+ fig.update(layout={f"xaxis{rows}": {"title": "Date"}})
+
+ for n_row in range(1, rows + 1):
+ for axis, update in zip(["x", "y"], [UPDATE_XAXES, UPDATE_YAXES]):
+ update_axis(fig, update, n_row, axis)
+
+ color_list = list(pytemplate.hktemplate.layout.colorway[:2]) + ["DarkGray"]
+
+ for data, color in zip(fig.data, color_list * rows):
+ data.marker.color = color
+
+ return dcc.Graph(figure=fig)
+
+
+def figure_summary_maxdate(
+ summary_all: pd.DataFrame,
+ ufunc_col: list[str] = None,
+ rows: int = 3,
+ cols: int = 1,
+ subplot_titles: list[str] = None,
+ title: str = "Maximum Rainfall Events",
+ periods: list[str] = None,
+ bubble_sizes: list[int] = None,
+):
+
+ if summary_all[0].size > THRESHOLD_SUMMARY:
+ return dcc.Graph(
+ figure=figure_empty("dataset above threshold"), config={"staticPlot": True}
+ )
+
+ ufunc_col = ["max_date"] if ufunc_col is None else ufunc_col
+ subplot_titles = (
+ ["Biweekly", "Monthly", "Yearly"] if subplot_titles is None else subplot_titles
+ )
+ periods = ["biweekly", "monthly", "yearly"] if periods is None else periods
+
+ fig = make_subplots(
+ rows=rows,
+ cols=cols,
+ shared_xaxes=True,
+ vertical_spacing=0.05,
+ subplot_titles=subplot_titles,
+ )
+
+ fig.layout.images = [_generate_dict_watermark(n) for n in range(2, rows + 1)]
+
+ # Create new DF
+
+ all_stat = []
+ for summary, period in zip(summary_all, periods):
+ for station in summary.columns.levels[0]:
+ _max = summary[station].dropna(subset=ufunc_col)
+ _max["max_date"] = pd.to_datetime(_max["max_date"])
+ _max = _max.set_index("max_date")[["max"]]
+ _max.columns = pd.MultiIndex.from_tuples([(period, station)])
+ all_stat.append(_max)
+
+ all_df = pd.concat(all_stat, axis=1)
+
+ bubble_sizes = [8, 9, 10] if bubble_sizes is None else bubble_sizes
+
+ data_dict = defaultdict(list)
+ for period, bubble_size in zip(all_df.columns.levels[0], bubble_sizes):
+ sizeref = 2.0 * all_df[period].max().max() / (bubble_size**2)
+ for station, series in all_df[period].items():
+ yvals = series.where(~series.notna(), station)
+ _scatter = go.Scatter(
+ x=series.index,
+ y=yvals,
+ mode="markers",
+ marker_size=series.fillna(0),
+ marker_sizeref=sizeref,
+ legendgroup=station,
+ legendgrouptitle_text=station,
+ name=f"{period}",
+ hovertemplate="%{y}
%{customdata[0]}
%{marker.size} mm",
+ customdata=np.stack(
+ [
+ series.index.strftime("%d %B %Y"),
+ series.to_numpy(),
+ ],
+ axis=-1,
+ ),
+ )
+ data_dict[period].append(_scatter)
+
+ for counter, (period, data) in enumerate(data_dict.items(), 1):
+ fig.add_traces(data, rows=counter, cols=cols)
+
+ fig.update_layout(
+ title_text=title,
+ title_pad_b=20,
+ height=800,
+ dragmode="zoom",
+ legend_title="Stations",
+ legend_itemsizing="constant",
+ hovermode="x",
+ hoverdistance=50,
+ )
+
+ def update_axis(fig, update, n, axis: str = "x"):
+ n = "" if n == 1 else n
+ fig.update(layout={f"{axis}axis{n}": update})
+
+ # XAXES
+
+ fig.update(layout={f"xaxis{rows}": {"title": "Date"}})
+
+ # GENERAL UPDATE
+ UPDATE_XAXES = {
+ "gridcolor": pytemplate._FONT_COLOR_RGB_ALPHA.replace("0.4", "0.1"),
+ "gridwidth": 2,
+ "showspikes": True,
+ "spikesnap": "cursor",
+ "spikemode": "across",
+ "spikethickness": 1,
+ }
+ UPDATE_YAXES = {
+ "gridcolor": pytemplate._FONT_COLOR_RGB_ALPHA.replace("0.4", "0.1"),
+ "gridwidth": 2,
+ "fixedrange": True,
+ "title": "Station",
+ }
+
+ for n_row in range(1, rows + 1):
+ for axis, update in zip(["x", "y"], [UPDATE_XAXES, UPDATE_YAXES]):
+ update_axis(fig, update, n_row, axis)
+
+ n_data = len(fig.data)
+ n_split = n_data // 3
+
+ if n_split < len(pytemplate.hktemplate.layout.colorway):
+ colors = list(pytemplate.hktemplate.layout.colorway[:n_split])
+ else:
+ colorway_list = pytemplate.hktemplate.layout.colorway
+ colors = list(islice(cycle(colorway_list), n_split))
+
+ for data, color in zip(fig.data, colors * 3):
+ data.marker.color = color
+
+ return dcc.Graph(figure=fig)
diff --git a/pyfunc.py b/pyfunc.py
index 4f2fcfd..e1eb153 100644
--- a/pyfunc.py
+++ b/pyfunc.py
@@ -55,13 +55,16 @@ def n_dry(vector):
return np.logical_or(vector.isna(), vector == 0).sum()
def max_date(vector):
- return vector.idxmax().strftime("%d %B %Y")
+ if vector.any():
+ return vector.idxmax().date()
+ else:
+ return np.nan
- def n_max(vector):
+ def max(vector):
return vector.max()
- ufunc = [days, n_max, sum, n_rain, n_dry, max_date]
- ufunc_col = ["days", "n_max", "sum", "n_rain", "n_dry", "max_date"]
+ ufunc = [days, max, sum, n_rain, n_dry, max_date]
+ ufunc_col = ["days", "max", "sum", "n_rain", "n_dry", "max_date"]
summary = hk98.summary_all(
dataframe, ufunc=ufunc, ufunc_col=ufunc_col, n_days=n_days
@@ -80,12 +83,24 @@ def generate_summary_all(dataframe, n_days: list = None):
return summary_all
-def transform_to_dataframe(table_data, table_columns):
+def transform_to_dataframe(
+ table_data, table_columns, multiindex: bool = False, apply_numeric: bool = True
+):
dataframe = pd.DataFrame(table_data)
- dataframe.columns = [i["name"] for i in table_columns]
+ if multiindex is True:
+ dataframe.columns = pd.MultiIndex.from_tuples(
+ [item["name"] for item in table_columns]
+ )
+ else:
+ dataframe.columns = [item["name"] for item in table_columns]
+
dataframe["DATE"] = pd.to_datetime(dataframe.DATE)
dataframe = dataframe.set_index("DATE").sort_index()
- dataframe = dataframe.apply(pd.to_numeric, errors="coerce")
+
+ if apply_numeric is True:
+ dataframe = dataframe.apply(pd.to_numeric, errors="coerce")
+ else:
+ dataframe = dataframe.infer_objects()
return dataframe
diff --git a/pylayout.py b/pylayout.py
index 1e71fa1..54a3958 100644
--- a/pylayout.py
+++ b/pylayout.py
@@ -1,95 +1,12 @@
-from dash import html, dcc, dash_table
+from dash import html, dcc
import dash_bootstrap_components as dbc
from pyconfig import appConfig
+import plotly.io as pio
from pytemplate import hktemplate
-from datetime import datetime
import pyfigure
+import pylayoutfunc
-
-def create_table_layout(
- dataframe,
- idtable,
- filename=None,
- filedate=None,
- editable=False,
- deletable=True,
- renamable=False,
-):
- new_dataframe = dataframe.reset_index()
- new_dataframe.DATE = new_dataframe.DATE.dt.date
- table = dash_table.DataTable(
- id=idtable,
- columns=[
- {"name": i, "id": i, "deletable": deletable, "renamable": renamable}
- for i in new_dataframe.columns
- ],
- data=new_dataframe.to_dict("records"),
- page_size=20,
- editable=editable,
- cell_selectable=True,
- filter_action="native",
- sort_action="native",
- style_table={"overflowX": "auto"},
- style_cell={"font-family": hktemplate.layout.font.family},
- style_header={"font-size": 20, "textAlign": "center", "font-weight": "bold"},
- )
- add_title = (
- f' ({filename}:{datetime.fromtimestamp(filedate).strftime("%Y-%m-%d")})'
- if (filename is not None) and (filedate is not None)
- else ""
- )
- title_table = f"TABEL DATA" + add_title
- return html.H2(title_table, className="text-center"), table
-
-
-def create_table_summary(
- summary,
- idtable,
- editable=False,
- deletable=True,
- renamable=False,
-):
- new_summary = summary.reset_index()
- new_summary.DATE = new_summary.DATE.dt.date
-
- flatten_index = new_summary.columns.to_flat_index()
- new_id = ["_".join(colx) if colx[1] != "" else colx[0] for colx in flatten_index]
- new_summary.columns = new_id
-
- table = dash_table.DataTable(
- id=idtable,
- columns=[
- {"name": name, "id": id, "deletable": deletable, "renamable": renamable}
- for name, id in zip(flatten_index, new_id)
- ],
- data=new_summary.to_dict("records"),
- page_size=20,
- editable=editable,
- cell_selectable=True,
- filter_action="native",
- sort_action="native",
- style_table={"overflowX": "auto"},
- style_cell={"font-family": hktemplate.layout.font.family},
- style_header={"font-size": 20, "textAlign": "center", "font-weight": "bold"},
- merge_duplicate_headers=True,
- )
- return table
-
-
-def create_tabcard_layout(tables: list, tab_names: list = None, disabled: list = None):
-
- disabled = [False] * len(tables) if disabled is None else disabled
- tab_names = ["Biweekly", "Monthly", "Yearly"] if tab_names is None else tab_names
-
- tab = []
- for table, tab_name, active in zip(tables, tab_names, disabled):
- _tab = dbc.Tab(
- dbc.Card(dbc.CardBody([table]), class_name="my-3"), label=tab_name
- )
- tab.append(_tab)
-
- return dbc.Tabs(tab)
-
+pio.templates.default = hktemplate
HTML_TITLE = html.Div(
[
@@ -99,7 +16,6 @@ def create_tabcard_layout(tables: list, tab_names: list = None, disabled: list =
),
html.Span(
[appConfig.GITHUB_REPO, "@", appConfig.VERSION],
- # href=appConfig.GITHUB_LINK,
className="text-muted",
),
],
@@ -118,26 +34,33 @@ def create_tabcard_layout(tables: list, tab_names: list = None, disabled: list =
ALERT_CONTRIBUTION = dbc.Alert(
[
- "Tertarik untuk berkontribusi atau ikut bergabung untuk proyek seperti ini? Hubungi saya di ",
+ "Tertarik untuk berkontribusi? Ingin terlibat proyek hidrokit seperti ini? hubungi saya di ",
html.A("hi@taruma.info", href="mailto:hi@taruma.info", className="text-bold"),
- ". Atau kunjungi langsung repository proyek ini di ",
+ ". Langsung buat isu di ",
html.A("Github", href=appConfig.GITHUB_LINK),
- ".",
+ " jika memiliki pertanyaan/komentar/kritik/saran atau menemui kesalahan di proyek ini.",
]
)
-HTML_ALERT = html.Div(
- dbc.Container(
- dbc.Row([dbc.Col(ALERT_CONTRIBUTION, width="auto")], justify="center"),
- fluid=True,
- ),
- className="my-2",
+HTML_ALERT_CONTRIBUTION = pylayoutfunc.create_HTML_alert(ALERT_CONTRIBUTION)
+
+ALERT_README = dbc.Alert(
+ [
+ "Untuk petunjuk penggunaan bisa baca ",
+ html.A(
+ "README di github",
+ href="https://github.com/taruma/dash-hidrokit-rainfall#readme",
+ ),
+ ".",
+ ],
+ color="warning",
)
+HTML_ALERT_README = pylayoutfunc.create_HTML_alert(ALERT_README, className="")
DCC_UPLOAD = html.Div(
dcc.Upload(
- id="upload-data",
+ id="dcc-upload",
children=html.Div(
[
dbc.Button(
@@ -180,30 +103,20 @@ def create_tabcard_layout(tables: list, tab_names: list = None, disabled: list =
),
],
fluid=True,
- class_name="",
),
)
HTML_ROW_TABLE = html.Div(
dbc.Container(
[
- dbc.Row(
- [
- dbc.Col(
- html.Div(
- dbc.Card(
- dbc.CardBody(
- id="output-data-upload",
- children=dcc.Graph(
- figure=pyfigure.figure_empty(),
- config={"staticPlot": True},
- ),
- ),
- )
- ),
- class_name="",
+ dbc.Card(
+ dbc.CardBody(
+ id="row-table-uploaded",
+ children=dcc.Graph(
+ figure=pyfigure.figure_empty(),
+ config={"staticPlot": True},
),
- ],
+ ),
),
],
fluid=True,
@@ -217,40 +130,35 @@ def create_tabcard_layout(tables: list, tab_names: list = None, disabled: list =
dbc.Row(
[
dbc.Col(
- [
- dbc.Button(
- "Visualize Data",
- color="success",
- outline=True,
- class_name="fs-4 text-center fw-bold",
- id="button-visualize",
- disabled=True,
- ),
- ],
+ dbc.Button(
+ "Visualize Data",
+ color="success",
+ outline=True,
+ class_name="fs-4 fw-bold",
+ id="button-visualize",
+ disabled=True,
+ ),
width="auto",
),
dbc.Col(
[
dbc.Button(
- [
- "Download Table As CSV",
- ],
+ "Download Table as CSV",
color="primary",
- className="me-1 fs-4",
+ className="fs-4",
id="button-download-csv",
),
dcc.Download(id="download-csv"),
],
width="auto",
style={"visibility": "hidden"},
- id="visibility-download-button",
+ id="row-button-download-csv",
),
],
justify="center",
- class_name="m-3",
)
],
- class_name="mt-5",
+ class_name="my-4",
)
)
@@ -261,7 +169,7 @@ def create_tabcard_layout(tables: list, tab_names: list = None, disabled: list =
[
dbc.Col(
[
- dbc.Label("Small Dataset Options:"),
+ dbc.Label("Small Dataset (<= 2,920 data points) Options:"),
dbc.RadioItems(
options=[
{"label": "Stack", "value": "stack"},
@@ -269,7 +177,7 @@ def create_tabcard_layout(tables: list, tab_names: list = None, disabled: list =
{"label": "Line", "value": "line"},
],
value="stack",
- id="graph-bar-options",
+ id="radio-graphbar-options",
inline=True,
),
],
@@ -277,7 +185,6 @@ def create_tabcard_layout(tables: list, tab_names: list = None, disabled: list =
)
],
justify="center",
- class_name="",
)
],
fluid=True,
@@ -289,19 +196,12 @@ def create_tabcard_layout(tables: list, tab_names: list = None, disabled: list =
HTML_ROW_GRAPH_ONE = html.Div(
dbc.Container(
[
- dbc.Row(
- [
- dbc.Col(
- dcc.Loading(
- dcc.Graph(
- id="section-graph",
- figure=pyfigure.figure_empty(),
- config={"staticPlot": True},
- )
- )
- )
- ],
- justify="center",
+ dcc.Loading(
+ dcc.Graph(
+ id="graph-rainfall",
+ figure=pyfigure.figure_empty(),
+ config={"staticPlot": True},
+ )
)
],
fluid=True,
@@ -331,44 +231,113 @@ def create_tabcard_layout(tables: list, tab_names: list = None, disabled: list =
)
],
justify="center",
- class_name="m-4",
)
],
fluid=True,
- id="row-download",
+ class_name="my-5",
)
)
HTML_ROW_TABLE_ANALYZE = html.Div(
+ dbc.Container(
+ dcc.Loading(
+ children=dcc.Graph(
+ figure=pyfigure.figure_empty(),
+ config={"staticPlot": True},
+ ),
+ id="tab-analysis",
+ ),
+ fluid=True,
+ )
+)
+
+HTML_ROW_BUTTON_VIZ_ANALYSIS = html.Div(
dbc.Container(
[
dbc.Row(
[
dbc.Col(
- dcc.Loading(
- html.Div(
- children=dcc.Graph(
- figure=pyfigure.figure_empty(),
- config={"staticPlot": True},
- ),
- id="col-table-analyze",
+ [
+ dbc.Button(
+ [
+ "Visualize it!",
+ ],
+ color="danger",
+ className="me-1 fs-4",
+ outline=True,
+ id="button-viz-analysis",
+ disabled=True,
+ ),
+ ],
+ width="auto",
+ ),
+ dbc.Col(
+ [
+ dbc.Button(
+ "Download Results as CSV",
+ color="primary",
+ className="fs-4",
+ id="button-download-analysis-csv",
),
- ),
- )
+ dcc.Download(id="download-analysis-csv"),
+ ],
+ width="auto",
+ style={"visibility": "hidden"},
+ id="row-button-download-analysis-csv",
+ ),
],
justify="center",
)
],
fluid=True,
+ class_name="my-5",
+ )
+)
+
+HTML_ROW_GRAPH_ANALYSIS = html.Div(
+ dbc.Container(
+ dcc.Loading(
+ children=dcc.Graph(
+ figure=pyfigure.figure_empty(),
+ config={"staticPlot": True},
+ ),
+ id="tab-graph-analysis",
+ ),
+ fluid=True,
)
)
-# HTML_ROW_TABLE_ANALYZE = html.Div(dbc.Container(["EMPTY"], id="col-table-analyze"))
+
+_HTML_TROUBLESHOOT = html.Div(
+ dbc.Container(
+ [
+ dbc.Row([html.Div("HEELLOOOO")]),
+ dbc.Button("Hello", id="button-troubleshoot"),
+ html.Div(id="row-troubleshoot"),
+ ],
+ fluid=True,
+ )
+)
+
+HTML_OTHER_PROJECTS = html.Div(
+ [
+ html.Span("other dashboard:"),
+ html.A(
+ [
+ html.Del("BMKG", style={"text-decoration-style": "double"}),
+ " 🛖 Explorer",
+ ],
+ href="https://github.com/taruma/dash-data-explorer",
+ style={"text-decoration": "none"},
+ ),
+ ],
+ className="d-flex gap-2 justify-content-center my-2",
+)
HTML_MADEBY = html.Div(
dcc.Markdown(
- "made with [Dash+Plotly](https://plotly.com)".lower(),
- className="fs-4 text-center mt-5",
+ "Made with [Dash+Plotly](https://plotly.com).",
+ className="fs-4 text-center mt-2",
),
)
diff --git a/pylayoutfunc.py b/pylayoutfunc.py
new file mode 100644
index 0000000..30b1232
--- /dev/null
+++ b/pylayoutfunc.py
@@ -0,0 +1,123 @@
+from dash import html, dash_table, dcc
+import dash_bootstrap_components as dbc
+from pytemplate import hktemplate
+from datetime import datetime
+from pyconfig import appConfig
+
+
+def create_table_layout(
+ dataframe,
+ idtable,
+ filename=None,
+ filedate=None,
+ editable=False,
+ deletable=True,
+ renamable=False,
+):
+ new_dataframe = dataframe.rename_axis("DATE").reset_index()
+ new_dataframe.DATE = new_dataframe.DATE.dt.date
+ table = dash_table.DataTable(
+ id=idtable,
+ columns=[
+ {"name": i, "id": i, "deletable": deletable, "renamable": renamable}
+ for i in new_dataframe.columns
+ ],
+ data=new_dataframe.to_dict("records"),
+ page_size=20,
+ editable=editable,
+ cell_selectable=True,
+ filter_action="native",
+ sort_action="native",
+ style_table={"overflowX": "auto"},
+ style_cell={"font-family": hktemplate.layout.font.family},
+ style_header={"font-size": 20, "textAlign": "center", "font-weight": "bold"},
+ )
+ add_title = (
+ f' ({filename}:{datetime.fromtimestamp(filedate).strftime("%Y-%m-%d")})'
+ if (filename is not None) and (filedate is not None)
+ else ""
+ )
+ title_table = f"TABEL DATA" + add_title
+ return html.H2(title_table, className="text-center"), table
+
+
+def create_table_summary(
+ summary,
+ idtable,
+ editable=False,
+ deletable=True,
+ renamable=False,
+):
+ new_summary = summary.rename_axis("DATE").reset_index()
+ new_summary.DATE = new_summary.DATE.dt.date
+
+ flatten_index = new_summary.columns.to_flat_index()
+ new_id = ["_".join(colx) if colx[1] != "" else colx[0] for colx in flatten_index]
+ new_summary.columns = new_id
+
+ table = dash_table.DataTable(
+ id=idtable,
+ columns=[
+ {"name": name, "id": id, "deletable": deletable, "renamable": renamable}
+ for name, id in zip(flatten_index, new_id)
+ ],
+ data=new_summary.to_dict("records"),
+ page_size=20,
+ editable=editable,
+ cell_selectable=True,
+ filter_action="none",
+ sort_action="native",
+ style_table={"overflowX": "auto"},
+ style_cell={"font-family": hktemplate.layout.font.family},
+ style_header={"font-size": 20, "textAlign": "center", "font-weight": "bold"},
+ merge_duplicate_headers=True,
+ )
+ return table
+
+
+def create_tabcard_table_layout(
+ tables: list, tab_names: list = None, disabled: list = None
+):
+
+ disabled = [False] * len(tables) if disabled is None else disabled
+ tab_names = ["Biweekly", "Monthly", "Yearly"] if tab_names is None else tab_names
+
+ tab = []
+ for table, tab_name, active in zip(tables, tab_names, disabled):
+ _tab = dbc.Tab(
+ dbc.Card(dbc.CardBody([table]), class_name="my-3"),
+ label=tab_name,
+ disabled=active,
+ )
+ tab.append(_tab)
+
+ return dbc.Tabs(tab)
+
+
+def create_tabcard_graph_layout(
+ graphs: list[dcc.Graph], tab_names: list = None, disabled: list = None
+):
+
+ disabled = [False] * len(graphs) if disabled is None else disabled
+ tab_names = ["Biweekly", "Monthly", "Yearly"] if tab_names is None else tab_names
+
+ tab = []
+ for graph, tab_name, active in zip(graphs, tab_names, disabled):
+ _tab = dbc.Tab(
+ dbc.Card(dbc.CardBody([graph]), class_name="my-3"),
+ label=tab_name,
+ disabled=active,
+ )
+ tab.append(_tab)
+
+ return dbc.Tabs(tab)
+
+
+def create_HTML_alert(alert: dbc.Alert, className: str='my-2'):
+ return html.Div(
+ dbc.Container(
+ dbc.Row([dbc.Col(alert, width="auto")], justify="center"),
+ fluid=True,
+ ),
+ className=className,
+ )
diff --git a/pytemplate.py b/pytemplate.py
index 6ca893f..aa158da 100644
--- a/pytemplate.py
+++ b/pytemplate.py
@@ -2,31 +2,21 @@
import plotly.io as pio
from dash_bootstrap_templates import load_figure_template
from pyconfig import appConfig
+from plotly import colors
load_figure_template(appConfig.DASH_THEME.THEME.lower())
hktemplate = pio.templates[pio.templates.default]
-# SETUP
+# VARS
_TEMPLATE = appConfig.TEMPLATE
_FONT_FAMILY = hktemplate.layout.font.family
+_FONT_COLOR_TUPLE = colors.hex_to_rgb(hktemplate.layout.font.color)
+_FONT_COLOR_RGB_ALPHA = "rgba({},{},{},0.4)".format(*_FONT_COLOR_TUPLE)
-# LAYOUT
-## LOGO
-# _SOURCE_LOGO = _TEMPLATE.LOGO_SOURCE
+## LAYOUT
+# WATERMARK
_SOURCE_WATERMARK = _TEMPLATE.WATERMARK_SOURCE
hktemplate.layout.images = [
- # dict(
- # source=_SOURCE_LOGO,
- # xref="paper",
- # yref="paper",
- # x=1,
- # y=1.015,
- # sizex=0.11,
- # sizey=0.11,
- # xanchor="right",
- # yanchor="bottom",
- # name="logo-hidrokit",
- # ),
dict(
source=_SOURCE_WATERMARK,
xref="x domain",
@@ -57,7 +47,8 @@
_LEGEND_FONT_SIZE = 15
hktemplate.layout.showlegend = True
hktemplate.layout.legend.font.size = _LEGEND_FONT_SIZE
-hktemplate.layout.legend.title.text = "placeholder"
+hktemplate.layout.legend.groupclick = "toggleitem"
+# hktemplate.layout.legend.title.text = "placeholder"
def apply_legend_inside():
@@ -91,7 +82,7 @@ def apply_legend_inside():
hktemplate.layout.hoverlabel.font.family = _FONT_FAMILY
# TITLE
-hktemplate.layout.title.text = "PLACEHOLDER TITLE"
+# hktemplate.layout.title.text = "PLACEHOLDER TITLE"
hktemplate.layout.title.pad = dict(b=10, l=0, r=0, t=0)
hktemplate.layout.title.x = 0
hktemplate.layout.title.xref = "paper"
@@ -110,7 +101,9 @@ def apply_legend_inside():
hktemplate.layout.xaxis.linewidth = _XAXIS_LINEWIDTH
hktemplate.layout.xaxis.linecolor = _XAXIS_GRIDCOLOR
hktemplate.layout.xaxis.spikecolor = _XAXIS_GRIDCOLOR
-hktemplate.layout.xaxis.title.text = "PLACEHOLDER XAXIS"
+hktemplate.layout.xaxis.gridcolor = _FONT_COLOR_RGB_ALPHA
+hktemplate.layout.xaxis.gridwidth = _XAXIS_LINEWIDTH
+# hktemplate.layout.xaxis.title.text = "PLACEHOLDER XAXIS"
hktemplate.layout.xaxis.title.font.size = _XAXIS_TITLE_FONT_SIZE
hktemplate.layout.xaxis.title.standoff = _XAXIS_TITLE_STANDOFF
@@ -167,10 +160,16 @@ def apply_rangeselector():
hktemplate.layout.yaxis.linecolor = _YAXIS_GRIDCOLOR
hktemplate.layout.yaxis.spikecolor = _YAXIS_GRIDCOLOR
hktemplate.layout.yaxis.rangemode = "tozero"
-hktemplate.layout.yaxis.title.text = "PLACEHOLDER XAXIS"
+hktemplate.layout.yaxis.gridcolor = _FONT_COLOR_RGB_ALPHA
+hktemplate.layout.yaxis.gridwidth = _YAXIS_LINEWIDTH
+# hktemplate.layout.yaxis.title.text = "PLACEHOLDER XAXIS"
hktemplate.layout.yaxis.title.font.size = _YAXIS_TITLE_FONT_SIZE
hktemplate.layout.yaxis.title.standoff = _YAXIS_TITLE_STANDOFF
+# SUBPLOTS
+# ANNOTATION
+hktemplate.layout.annotationdefaults.font.color = hktemplate.layout.font.color
+
## PLOT SPECIFIC
# HEATMAP