added first app, eti megfertozodesek

master
wfct0p 2 years ago
parent ebf9336f72
commit 50ad3b959a

@ -0,0 +1,575 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "2b8d4789-78b3-4f31-9207-4ba6fcf90ad4",
"metadata": {},
"outputs": [],
"source": [
"# data = \"data/data-3d9Ex.csv\"\n",
"import plotly.express as px\n",
"import pandas as pd\n",
"import geopandas as gpd\n",
"import numpy as np\n",
"import json\n",
"import datetime as dt\n",
"\n",
"from dash import Dash, dcc, html, Input, Output\n",
"import dash_bootstrap_components as dbc\n",
"import os\n",
"\n",
"colorscales = px.colors.named_colorscales()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1b985925-91c8-4eb9-bb41-293318bd924e",
"metadata": {},
"outputs": [],
"source": [
"## Local settings to be able to test the app in the user environment and for running as a report\n",
"URL_PREFIX = os.path.join(\"/\", os.getenv(\"REPORT_URL\"))\n",
"PORT = os.getenv(\"REPORT_PORT\", 9000)\n",
"HOSTNAME = os.getenv(\"HOSTNAME\")\n",
"SERVER_NAME = os.getenv(\"SERVERNAME\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "9ef312bf-3c18-4417-806b-3d07830d96d3",
"metadata": {},
"outputs": [],
"source": [
"# Hungary counties shapefile\n",
"# url = \"https://maps.princeton.edu/download/file/stanford-dt251rh6351-shapefile.zip\""
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "c6822dbd-d897-445f-9743-f7267d66537c",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"#!cd data && wget https://maps.princeton.edu/download/file/stanford-dt251rh6351-shapefile.zip && unzip stanford-dt251rh6351-shapefile.zip"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "57706225-be2f-4267-9333-60d3e736f854",
"metadata": {},
"outputs": [],
"source": [
"# read shp data into geopandas\n",
"gg = gpd.read_file(\"data/dt251rh6351.shp\")\n",
"ggjson = gg.to_json()\n",
"# gg.head()\n",
"\n",
"# We will need gejson\n",
"dggjson = json.loads(ggjson)\n",
"\n",
"# Turns out one of the county's name is misspelled so we rename it for now in the dataframe\n",
"# [f['properties']['name_1'] for f in dggjson['features']]"
]
},
{
"cell_type": "markdown",
"id": "bb6b0eda-51f1-4bf9-b161-487db05e4ebc",
"metadata": {},
"source": [
"## Heti adatok"
]
},
{
"cell_type": "markdown",
"id": "770e6ba1-e48a-4fde-aa77-5b898e9853e5",
"metadata": {},
"source": [
"### Letoltes\n",
"https://atlo.team/koronaterkep/#megyeibovebb"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7e5eeb9f-847c-4e73-8b73-9fc6a97ba56b",
"metadata": {},
"outputs": [],
"source": [
"# https://www.eea.europa.eu/data-and-maps/data/eea-reference-grids-2/gis-files/hungary-shapefile\n",
"# Fertozottek szama kumulativ\n",
"url = \"https://docs.google.com/spreadsheets/d/1djH-yUHLPwuEExCjiXS__6-8W2Yp_msFvShpL4bBcuM/export?format=xlsx&gid=1283792994\"\n",
"# heti uj esetek szama\n",
"url = \"https://docs.google.com/spreadsheets/d/1djH-yUHLPwuEExCjiXS__6-8W2Yp_msFvShpL4bBcuM/export?format=xlsx&gid=1332599659\"\n",
"heti_df = pd.read_excel(url) \n",
"\n",
"heti_df['date'] = pd.to_datetime(heti_df['Dátum']) #, format='%y-%m-%d')\n",
"#heti_df = heti_df.drop(columns=['Dátum', 'Összesen'])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "4290d58d-5dfc-46ee-afd7-c46148c62e7c",
"metadata": {},
"outputs": [],
"source": [
"#Rename Győr to Gyor\n",
"heti_df = heti_df.rename(columns={'Győr-Moson-Sopron':'Gyor-Moson-Sopron'})"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "e6d276b1-ccf5-4248-bd08-9c27c180fac7",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>13</th>\n",
" <th>14</th>\n",
" <th>15</th>\n",
" <th>16</th>\n",
" <th>17</th>\n",
" <th>18</th>\n",
" <th>19</th>\n",
" <th>20</th>\n",
" <th>21</th>\n",
" <th>22</th>\n",
" <th>...</th>\n",
" <th>146</th>\n",
" <th>147</th>\n",
" <th>148</th>\n",
" <th>149</th>\n",
" <th>150</th>\n",
" <th>151</th>\n",
" <th>152</th>\n",
" <th>153</th>\n",
" <th>154</th>\n",
" <th>155</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Bács-Kiskun</th>\n",
" <td>19.0</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>577.0</td>\n",
" <td>505.0</td>\n",
" <td>0.0</td>\n",
" <td>730.0</td>\n",
" <td>217.0</td>\n",
" <td>216.0</td>\n",
" <td>184.0</td>\n",
" <td>177.0</td>\n",
" <td>184.0</td>\n",
" <td>197.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Baranya</th>\n",
" <td>23.0</td>\n",
" <td>6.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>658.0</td>\n",
" <td>537.0</td>\n",
" <td>0.0</td>\n",
" <td>661.0</td>\n",
" <td>257.0</td>\n",
" <td>204.0</td>\n",
" <td>182.0</td>\n",
" <td>193.0</td>\n",
" <td>232.0</td>\n",
" <td>354.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Békés</th>\n",
" <td>8.0</td>\n",
" <td>3.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>-6.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>585.0</td>\n",
" <td>359.0</td>\n",
" <td>0.0</td>\n",
" <td>507.0</td>\n",
" <td>208.0</td>\n",
" <td>199.0</td>\n",
" <td>228.0</td>\n",
" <td>204.0</td>\n",
" <td>239.0</td>\n",
" <td>226.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Borsod-Abaúj-Zemplén</th>\n",
" <td>7.0</td>\n",
" <td>38.0</td>\n",
" <td>8.0</td>\n",
" <td>9.0</td>\n",
" <td>3.0</td>\n",
" <td>-1.0</td>\n",
" <td>0.0</td>\n",
" <td>-3.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>658.0</td>\n",
" <td>495.0</td>\n",
" <td>0.0</td>\n",
" <td>575.0</td>\n",
" <td>179.0</td>\n",
" <td>174.0</td>\n",
" <td>158.0</td>\n",
" <td>174.0</td>\n",
" <td>195.0</td>\n",
" <td>205.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Budapest</th>\n",
" <td>317.0</td>\n",
" <td>386.0</td>\n",
" <td>299.0</td>\n",
" <td>284.0</td>\n",
" <td>198.0</td>\n",
" <td>103.0</td>\n",
" <td>94.0</td>\n",
" <td>103.0</td>\n",
" <td>64.0</td>\n",
" <td>58.0</td>\n",
" <td>...</td>\n",
" <td>1819.0</td>\n",
" <td>1437.0</td>\n",
" <td>0.0</td>\n",
" <td>1977.0</td>\n",
" <td>835.0</td>\n",
" <td>786.0</td>\n",
" <td>795.0</td>\n",
" <td>1011.0</td>\n",
" <td>1171.0</td>\n",
" <td>1042.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 143 columns</p>\n",
"</div>"
],
"text/plain": [
" 13 14 15 16 17 18 19 20 \\\n",
"Bács-Kiskun 19.0 3.0 1.0 0.0 0.0 0.0 1.0 0.0 \n",
"Baranya 23.0 6.0 4.0 0.0 3.0 0.0 0.0 0.0 \n",
"Békés 8.0 3.0 2.0 1.0 2.0 1.0 -6.0 0.0 \n",
"Borsod-Abaúj-Zemplén 7.0 38.0 8.0 9.0 3.0 -1.0 0.0 -3.0 \n",
"Budapest 317.0 386.0 299.0 284.0 198.0 103.0 94.0 103.0 \n",
"\n",
" 21 22 ... 146 147 148 149 150 \\\n",
"Bács-Kiskun 0.0 0.0 ... 577.0 505.0 0.0 730.0 217.0 \n",
"Baranya 0.0 1.0 ... 658.0 537.0 0.0 661.0 257.0 \n",
"Békés 0.0 0.0 ... 585.0 359.0 0.0 507.0 208.0 \n",
"Borsod-Abaúj-Zemplén 0.0 1.0 ... 658.0 495.0 0.0 575.0 179.0 \n",
"Budapest 64.0 58.0 ... 1819.0 1437.0 0.0 1977.0 835.0 \n",
"\n",
" 151 152 153 154 155 \n",
"Bács-Kiskun 216.0 184.0 177.0 184.0 197.0 \n",
"Baranya 204.0 182.0 193.0 232.0 354.0 \n",
"Békés 199.0 228.0 204.0 239.0 226.0 \n",
"Borsod-Abaúj-Zemplén 174.0 158.0 174.0 195.0 205.0 \n",
"Budapest 786.0 795.0 1011.0 1171.0 1042.0 \n",
"\n",
"[5 rows x 143 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"heti_df.set_index('date', inplace=True)\n",
"\n",
"heti_df = heti_df.resample('7D').sum()\n",
"\n",
"heti_df.index=range(13,13+len(heti_df.index))\n",
"heti_df = heti_df.transpose()\n",
"heti_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "d50af1bc-b8d4-4fee-9992-f9939071945b",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_723/3451946974.py:2: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n",
"\n",
" cc = gg.centroid\n"
]
}
],
"source": [
"# Get the mean of the county's centroids\n",
"cc = gg.centroid\n",
"\n",
"clon = cc.apply(lambda x: x.x).mean()\n",
"clat = cc.apply(lambda x: x.y).mean()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "ea3d30f8-1e5e-48bd-831e-cc4ec1cffac4",
"metadata": {},
"outputs": [],
"source": [
"heti_df.index=heti_df.index.rename('name_1')\n",
"\n",
"heti_df=heti_df.reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "92cc4cef-e3dd-4197-b0d7-74c2fff04a42",
"metadata": {},
"outputs": [],
"source": [
"colorscale = [[0, 'rgb(166,206,227, 0.5)'],\n",
" [0.01, 'rgb(31,120,180,0.5)'],\n",
" [0.05, 'rgb(178,223,138,0.5)'],\n",
" [0.1, 'rgb(51,160,44,0.5)'],\n",
" [0.15, 'rgb(251,154,153,0.5)'],\n",
" [1, 'rgb(227,26,28,0.5)']\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "3665a994-ec8a-4d7f-ae5c-69955fac559b",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_723/344204418.py:1: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError. Select only valid columns before calling the reduction.\n",
" maxinfect = heti_df.max(axis=1).max()\n"
]
}
],
"source": [
"maxinfect = heti_df.max(axis=1).max()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "7c319fee-1e1b-4b8a-bea0-690b5e3d67d3",
"metadata": {},
"outputs": [],
"source": [
"filtered_df = heti_df[['name_1', heti_df.columns[1]]]\n",
"# filtered_df=filtered_df.rename(columns={heti_df.index[0]:'sum'})\n",
"fig = px.choropleth_mapbox(filtered_df, geojson=dggjson, locations='name_1', color=heti_df.columns[1],\n",
" color_continuous_scale= colorscale,\n",
" #locationmode='geojson-id',\n",
" featureidkey='properties.name_1',\n",
" range_color=(0, maxinfect),\n",
" mapbox_style=\"carto-positron\",\n",
" zoom=5.7, center = {\"lat\": clat, \"lon\": clon},\n",
" opacity=0.5,\n",
" labels={heti_df.columns[1]:'Megfertozodesek szama'}\n",
" )\n",
"fig.update_layout(margin={\"r\":0,\"t\":0,\"l\":0,\"b\":0});\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "bfc17416-a94b-47fb-8166-ef8ae4e111ed",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'k8plex-krft.vo.elte.hu'"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"SERVER_NAME=SERVER_NAME[1:]\n",
"SERVER_NAME"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "427ebf00-b4e8-44de-b3a6-e8ab150c3bf2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"You can access your report at k8plex-krft.vo.elte.hu//notebook/test/wfct0p-jupyter\n",
"Dash is running on http://wfct0p-jupyter:9000/notebook/test/wfct0p-jupyter/\n",
"\n",
" * Serving Flask app \"__main__\" (lazy loading)\n",
" * Environment: production\n",
"\u001b[31m WARNING: This is a development server. Do not use it in a production deployment.\u001b[0m\n",
"\u001b[2m Use a production WSGI server instead.\u001b[0m\n",
" * Debug mode: off\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
" * Running on http://wfct0p-jupyter:9000/ (Press CTRL+C to quit)\n",
"157.181.172.118 - - [09/Feb/2023 23:23:57] \"GET /notebook/test/wfct0p-jupyter/ HTTP/1.1\" 200 -\n",
"157.181.172.118 - - [09/Feb/2023 23:23:58] \"GET /notebook/test/wfct0p-jupyter/_dash-dependencies HTTP/1.1\" 200 -\n",
"157.181.172.118 - - [09/Feb/2023 23:23:58] \"GET /notebook/test/wfct0p-jupyter/_dash-layout HTTP/1.1\" 200 -\n",
"157.181.172.118 - - [09/Feb/2023 23:23:59] \"GET /notebook/test/wfct0p-jupyter/_dash-component-suites/dash/dcc/async-graph.js HTTP/1.1\" 200 -\n",
"157.181.172.118 - - [09/Feb/2023 23:23:59] \"GET /notebook/test/wfct0p-jupyter/_dash-component-suites/dash/dcc/async-slider.js HTTP/1.1\" 304 -\n",
"157.181.172.118 - - [09/Feb/2023 23:23:59] \"GET /notebook/test/wfct0p-jupyter/_dash-component-suites/dash/dcc/async-plotlyjs.js HTTP/1.1\" 304 -\n",
"157.181.172.118 - - [09/Feb/2023 23:24:00] \"POST /notebook/test/wfct0p-jupyter/_dash-update-component HTTP/1.1\" 200 -\n",
"157.181.172.118 - - [09/Feb/2023 23:24:04] \"POST /notebook/test/wfct0p-jupyter/_dash-update-component HTTP/1.1\" 200 -\n"
]
}
],
"source": [
"print(\"You can access your report at %s/%s\"%(SERVER_NAME, URL_PREFIX))\n",
"\n",
"external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']\n",
"app = Dash(__name__, external_stylesheets=[dbc.themes.SANDSTONE], url_base_pathname=URL_PREFIX+\"/\")\n",
"\n",
"app.layout = html.Div([\n",
" html.H4(\"Az azonosított fertőzöttek száma megyénként\"),\n",
"\n",
" dcc.Graph(id=\"graph\", figure=fig),\n",
" # dcc.Slider(heti_df.index[0], heti_df.index[-1], marks={i:i for i in range(heti_df.index[0], heti_df.index[-1],5)},\n",
" # value=heti_df.index[0],\n",
" # id='my-slider'\n",
" # ),\n",
" dcc.Slider(heti_df.columns[1], heti_df.columns[-1], marks={i:i for i in range(heti_df.columns[1], heti_df.columns[-1],5)},\n",
" value=heti_df.columns[1],\n",
" id='my-slider'\n",
" ),\n",
"\n",
"])\n",
"\n",
"@app.callback(\n",
" Output(\"graph\", \"figure\"), \n",
" Input('my-slider', 'value'))\n",
"\n",
"def update_figure(selected_week):\n",
" \n",
" filtered_df = heti_df[['name_1', selected_week]]\n",
" #filtered_df=filtered_df.reset_index().rename(columns={selected_week:'sum','index':'name_1'})\n",
"\n",
" #filtered_df = heti_df[['name_1', heti_df.columns[1]]]\n",
" # filtered_df=filtered_df.rename(columns={heti_df.index[0]:'sum'})\n",
" fig = px.choropleth_mapbox(filtered_df, geojson=dggjson, locations='name_1', color=selected_week,\n",
" color_continuous_scale=colorscale,\n",
" #locationmode='geojson-id',\n",
" \n",
"\n",
" featureidkey='properties.name_1',\n",
" range_color=(0, maxinfect),\n",
" mapbox_style=\"carto-positron\",\n",
" zoom=5.7, center = {\"lat\": clat, \"lon\": clon},\n",
" opacity=0.5,\n",
" labels={selected_week:'Megfertozodesek szama'}\n",
" )\n",
" fig.update_layout(margin={\"r\":0,\"t\":0,\"l\":0,\"b\":0}, transition_duration=500)\n",
"\n",
" return fig\n",
"\n",
"app.run_server(debug=False, port=PORT, host=HOSTNAME)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "273cfd77-ca2f-4a06-aead-bdf013a44b34",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Loading…
Cancel
Save