ethio_hydro / precipitation_function.py
poooja2012's picture
Upload precipitation_function.py
235c5cc
import pandas as pd
import numpy as np
import streamlit as st
#imports for finding the nearest lat long using haversine distance
#visualization libraries to visualize different plots
import plotly.express as px
import plotly.graph_objects as go
import altair as alt
import io
#for Logo plotting
from PIL import Image
#disabling warnings
import warnings
warnings.filterwarnings("ignore")
#For parallel processing
from pandarallel import pandarallel
pandarallel.initialize(progress_bar=True)
@st.cache(allow_output_mutation=True)
def main_concat(a,b):
z = pd.concat([a,b],ignore_index = True)
return z
@st.cache(allow_output_mutation=True)
def load_data(path):
df = pd.read_csv(path,compression = 'zip')
return df
@st.cache
def date_split(df):
df[['Year','Month','Day']] = df['date'].str.split('-',expand = True)
return df
@st.cache(allow_output_mutation = True)
def lat_long_process_precp(df):
df['lat_long'] = df['lat'].astype(str)+','+df['long'].astype(str)
return df
@st.cache
def drop_dup_funct(x):
x.drop_duplicates(inplace = True)
return x
@st.cache(allow_output_mutation = True)
def concat_func(x,y):
z = pd.concat([x,y],ignore_index = True)
return z
@st.cache
def lat_long_type(nn_value):
if isinstance(nn_value,str):
return nn_value
else:
return nn_value.item((0))
@st.cache
def cumulative(df,start,end):
df1 = df.groupby(['Year','Month'])['precip'].sum()
df1 = df1.reset_index()
df1 = df1.set_index('Year')
df1 = df1.loc[str(start):str(end)]
return df1
@st.cache
def cumulative_plot(df):
fig = px.line(df, y='precip',title = 'Monthly Cumulative Precipitation')
fig.update_traces(line_color = 'blue')
fig.update_xaxes(title_text = 'Year',gridcolor = 'whitesmoke')
fig.update_yaxes(ticklabelposition="inside top", title= 'Monthly Cumulative Precipitation in mm',gridcolor = 'whitesmoke')
fig.update_layout(margin = dict(l=25,r=25,t=25,b=25))
fig.update_layout(plot_bgcolor = 'rgba(0,0,0,0)')
fig.update_layout(title = "Monthly Cumulative Precipitation")
return fig
@st.cache(allow_output_mutation=True)
def daily_precp_data(precipitation_temp,start,end,option):
df_daily = precipitation_temp.get_group(option)
df_daily.set_index('date',inplace = True)
# df_2 = df_daily.loc[str(start):str(end)]
# df_3=df_2.reset_index()
return df_daily
@st.cache
def daily_precp_plot(df):
fig = px.line(df,y='precip',title = 'Daily Precipitation')
fig.update_traces(line_color = 'blue')
fig.update_xaxes(title_text = 'Year',gridcolor = 'whitesmoke')
fig.update_yaxes(ticklabelposition="inside top", title= 'Daily Precipitation in mm',gridcolor = 'whitesmoke')
fig.update_layout(margin = dict(l=25,r=25,t=25,b=25))
fig.update_layout(plot_bgcolor = 'rgba(0,0,0,0)')
fig.update_layout(title = "Daily Precipitation")
return fig
@st.cache(suppress_st_warning=True)
def start_end_date_ui(start,end,key1,key2):
st.markdown('**Enter Start Date**')
start = st.date_input("",value = start,key = key1)
if start < pd.to_datetime('2001/01/01'):
st.write('Start date should not be less than 2001/01/01')
st.markdown('**Enter End Date**')
end = st.date_input("",value = end, key = key2)
if end > pd.to_datetime('2019/12/31'):
st.write('End date should not be greater than 2019/12/31')
return start,end
def lat_long_ui(key1,key2):
st.markdown('**Enter the latitude**')
latitude_input = st.text_input('','12.55',key = key1)
st.markdown('**Enter the longitude**')
longitude_input = st.text_input('','42.45',key = key2)
return latitude_input,longitude_input
def year_selection_ui(key1,key2):
st.markdown('**Select the Start Year**')
start_year = st.selectbox('',
('2001','2002','2003','2004','2005','2006','2007','2008','2009',
'2010','2011','2012','2013','2014','2015','2016','2017','2018','2019'),key = key1)
st.markdown('**Select the End Year**')
end_year = st.selectbox('',
('2001','2002','2003','2004','2005','2006','2007','2008','2009',
'2010','2011','2012','2013','2014','2015','2016','2017','2018','2019'),key = key2)
return start_year,end_year
@st.cache(allow_output_mutation=True)
def monthly_mean_plot(df):
title_text = "Monthly Mean Precipitation"
highlight = alt.selection(
type='single', on='mouseover', fields=['Year'], nearest=True)
base = alt.Chart(df,title = title_text).encode(
x = alt.X('Month:Q',scale = alt.Scale(domain=[1,12]),axis=alt.Axis(tickMinStep=1)),
y = alt.Y('precip:Q',scale = alt.Scale(domain=[df['precip'].min(),df['precip'].max()])),
color = alt.Color('Year:O',scale = alt.Scale(scheme = 'magma'))
)
points = base.mark_circle().encode(
opacity=alt.value(0),
tooltip=[
alt.Tooltip('Year:O', title='Year'),
alt.Tooltip('Month:Q', title='Month'),
alt.Tooltip('precip:Q', title='Monthly Mean Precipitation')
]).add_selection(highlight)
lines = base.mark_line().encode(
size=alt.condition(~highlight, alt.value(1), alt.value(3)))
mean_chart = (points + lines).properties(width=1000, height=400).interactive()
return mean_chart
@st.cache
def annual_max_precip_plot(df):
fig_max = px.line(df, x = 'Year',y='precip',title = 'Annual Maximum Precipitation')
fig_max.update_traces(line_color = 'maroon')
fig_max.update_xaxes(title_text = 'Year',gridcolor = 'whitesmoke')
fig_max.update_yaxes(ticklabelposition="inside top", title= 'Annual Maximum Precipitation in mm',gridcolor = 'whitesmoke')
fig_max.update_layout(margin = dict(l=25,r=25,t=25,b=25))
fig_max.update_layout(plot_bgcolor = 'rgba(0,0,0,0)')
fig_max.update_layout(title = "Annual Maximum Precipitation")
return fig_max
def annual_min_precip_plot(df):
fig_min = px.line(df, x = 'Year',y='precip',title = 'Annual Minimum Precipitation')
fig_min.update_traces(line_color = 'blue')
fig_min.update_xaxes(title_text = 'Year',gridcolor = 'whitesmoke')
fig_min.update_yaxes(ticklabelposition="inside top", title= 'Annual Minimum Precipitation in mm',gridcolor = 'whitesmoke')
fig_min.update_layout(margin = dict(l=25,r=25,t=25,b=25))
fig_min.update_layout(plot_bgcolor = 'rgba(0,0,0,0)')
fig_min.update_layout(title = "Annual Minimum Precipitation")
return fig_min
def annual_avg_plot(df):
fig_avg = px.line(df, x = 'Year',y='precip',title = 'Annual Average Precipitation')
fig_avg.update_traces(line_color = 'dimgray')
fig_avg.update_xaxes(title_text = 'Year',gridcolor = 'whitesmoke')
fig_avg.update_yaxes(ticklabelposition="inside top", title= 'Annual Average Precipitation in mm',gridcolor = 'whitesmoke')
fig_avg.update_layout(margin = dict(l=25,r=25,t=25,b=25))
fig_avg.update_layout(plot_bgcolor = 'rgba(0,0,0,0)')
fig_avg.update_layout(title = "Annual Average Precipitation")
return fig_avg
@st.cache
def max_precip(precipitation_temp,option,start_year,end_year):
maximum_precip_df = precipitation_temp.get_group(option)
maximum_precip_df = date_split(maximum_precip_df)
Annual_max_precip = maximum_precip_df.groupby('Year')['precip'].max()
Annual_max_precip = Annual_max_precip.loc[str(start_year):str(end_year)]
Annual_max_precip = Annual_max_precip.reset_index()
return Annual_max_precip
@st.cache
def min_precip(precipitation_temp,option,start_year,end_year):
minimum_precip_df = precipitation_temp.get_group(option)
minimum_precip_df = date_split(minimum_precip_df)
minimum_precip_df = minimum_precip_df.where(minimum_precip_df['precip']>0)
minimum_precip_df = minimum_precip_df.groupby('Year')['precip'].min()
minimum_precip_df = minimum_precip_df.loc[str(start_year):str(end_year)]
minimum_precip_df = minimum_precip_df.reset_index()
return minimum_precip_df
@st.cache
def avg_precip(precipitation_temp,option,start_year,end_year):
avg_precip_df = precipitation_temp.get_group(option)
avg_precip_df = date_split(avg_precip_df)
avg_precip_df = avg_precip_df.groupby('Year')['precip'].mean()
avg_precip_df_s_e = avg_precip_df.loc[str(start_year):str(end_year)]
avg_precip_df_s_e = avg_precip_df_s_e.reset_index()
return avg_precip_df_s_e