├── README.md ├── File1 ├── milestone_forecast.py ├── File 2 └── file 2 python file.py /README.md: -------------------------------------------------------------------------------- 1 | # 📈 Milestone Achievement Forecast App 2 | 3 | This Streamlit web app generates synthetic project milestone data and forecasts future achievements using linear regression. 4 | 5 | ## 🔧 Features 6 | - Simulated milestone achievements over time 7 | - Forecast of future milestone dates 8 | - Visual progress chart and speedometer 9 | - Downloadable Excel report 10 | - Interactive controls (milestone counts, forecast range) 11 | 12 | ## 🚀 How to Run Locally 13 | 14 | 1. Clone this repo: 15 | ```bash 16 | git clone https://github.com/yourusername/milestone-forecast-app.git 17 | cd milestone-forecast-app 18 | 19 | Install dependencies: 20 | 21 | pip install -r requirements.txt 22 | 23 | Run the app: 24 | 25 | streamlit run milestone_forecast_app.py 26 | 27 | 🌐 Deploy to Streamlit Cloud 28 | 29 | Push this repo to GitHub 30 | 31 | Visit streamlit.io/cloud 32 | 33 | Click New App, select this repo, and deploy! 34 | 35 | 📊 Preview 36 | 37 | 👤 Author 38 | 39 | Name: Otutu Anslem 40 | 41 | GitHub: https://github.com/Otutu11 42 | 43 | 44 | -------------------------------------------------------------------------------- /File1: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import matplotlib.pyplot as plt 4 | from sklearn.linear_model import LinearRegression 5 | from datetime import timedelta 6 | import random 7 | 8 | # 1. Generate Synthetic Data 9 | np.random.seed(42) 10 | milestones = [f"Milestone {i}" for i in range(1, 11)] 11 | start_date = pd.to_datetime("2024-01-01") 12 | achievement_days = np.cumsum(np.random.randint(10, 20, size=10)) 13 | achievement_dates = [start_date + timedelta(days=int(day)) for day in achievement_days] 14 | 15 | # 2. Create DataFrame 16 | df = pd.DataFrame({ 17 | "Milestone": milestones, 18 | "Achievement Date": achievement_dates 19 | }) 20 | df["Days Since Start"] = (df["Achievement Date"] - start_date).dt.days 21 | 22 | # 3. Forecast Future Milestones (Milestone 11–15) 23 | future_milestones = [f"Milestone {i}" for i in range(11, 16)] 24 | future_indices = np.array(range(11, 16)).reshape(-1, 1) 25 | 26 | # 4. Linear Regression Model 27 | X = np.array(range(1, 11)).reshape(-1, 1) # Milestone numbers 28 | y = df["Days Since Start"].values 29 | 30 | model = LinearRegression() 31 | model.fit(X, y) 32 | 33 | future_days = model.predict(future_indices) 34 | future_dates = [start_date + timedelta(days=int(day)) for day in future_days] 35 | 36 | # 5. Combine Data 37 | df_forecast = pd.DataFrame({ 38 | "Milestone": future_milestones, 39 | "Predicted Achievement Date": future_dates, 40 | "Forecast Days Since Start": future_days.astype(int) 41 | }) 42 | 43 | # 6. Export to Excel 44 | combined_df = pd.concat([ 45 | df[["Milestone", "Achievement Date", "Days Since Start"]], 46 | df_forecast.rename(columns={ 47 | "Predicted Achievement Date": "Achievement Date", 48 | "Forecast Days Since Start": "Days Since Start" 49 | }) 50 | ], ignore_index=True) 51 | 52 | combined_df.to_excel("Milestone_Achievement_Forecast.xlsx", index=False) 53 | 54 | # 7. Plot Progress 55 | plt.figure(figsize=(10, 6)) 56 | plt.plot(X, y, 'o-', label="Actual") 57 | plt.plot(future_indices, future_days, 'x--', label="Forecast") 58 | plt.xlabel("Milestone Number") 59 | plt.ylabel("Days Since Start") 60 | plt.title("Milestone Achievement Forecast") 61 | plt.grid(True) 62 | plt.legend() 63 | plt.tight_layout() 64 | plt.savefig("Milestone_Forecast_Chart.png") 65 | plt.show() 66 | -------------------------------------------------------------------------------- /milestone_forecast.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import matplotlib.pyplot as plt 4 | from sklearn.linear_model import LinearRegression 5 | from datetime import timedelta 6 | import random 7 | 8 | # 1. Generate Synthetic Data 9 | np.random.seed(42) 10 | milestones = [f"Milestone {i}" for i in range(1, 11)] 11 | start_date = pd.to_datetime("2024-01-01") 12 | achievement_days = np.cumsum(np.random.randint(10, 20, size=10)) 13 | achievement_dates = [start_date + timedelta(days=int(day)) for day in achievement_days] 14 | 15 | # 2. Create DataFrame 16 | df = pd.DataFrame({ 17 | "Milestone": milestones, 18 | "Achievement Date": achievement_dates 19 | }) 20 | df["Days Since Start"] = (df["Achievement Date"] - start_date).dt.days 21 | 22 | # 3. Forecast Future Milestones (Milestone 11–15) 23 | future_milestones = [f"Milestone {i}" for i in range(11, 16)] 24 | future_indices = np.array(range(11, 16)).reshape(-1, 1) 25 | 26 | # 4. Linear Regression Model 27 | X = np.array(range(1, 11)).reshape(-1, 1) # Milestone numbers 28 | y = df["Days Since Start"].values 29 | 30 | model = LinearRegression() 31 | model.fit(X, y) 32 | 33 | future_days = model.predict(future_indices) 34 | future_dates = [start_date + timedelta(days=int(day)) for day in future_days] 35 | 36 | # 5. Combine Data 37 | df_forecast = pd.DataFrame({ 38 | "Milestone": future_milestones, 39 | "Predicted Achievement Date": future_dates, 40 | "Forecast Days Since Start": future_days.astype(int) 41 | }) 42 | 43 | # 6. Export to Excel 44 | combined_df = pd.concat([ 45 | df[["Milestone", "Achievement Date", "Days Since Start"]], 46 | df_forecast.rename(columns={ 47 | "Predicted Achievement Date": "Achievement Date", 48 | "Forecast Days Since Start": "Days Since Start" 49 | }) 50 | ], ignore_index=True) 51 | 52 | combined_df.to_excel("Milestone_Achievement_Forecast.xlsx", index=False) 53 | 54 | # 7. Plot Progress 55 | plt.figure(figsize=(10, 6)) 56 | plt.plot(X, y, 'o-', label="Actual") 57 | plt.plot(future_indices, future_days, 'x--', label="Forecast") 58 | plt.xlabel("Milestone Number") 59 | plt.ylabel("Days Since Start") 60 | plt.title("Milestone Achievement Forecast") 61 | plt.grid(True) 62 | plt.legend() 63 | plt.tight_layout() 64 | plt.savefig("Milestone_Forecast_Chart.png") 65 | plt.show() 66 | -------------------------------------------------------------------------------- /File 2: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | import pandas as pd 3 | import numpy as np 4 | import matplotlib.pyplot as plt 5 | from sklearn.linear_model import LinearRegression 6 | from datetime import timedelta 7 | from io import BytesIO 8 | 9 | # Set up page 10 | st.set_page_config(page_title="Milestone Achievement Forecast", layout="centered") 11 | 12 | st.title("📈 Milestone Achievement Forecast") 13 | st.markdown("This app simulates milestone achievement and forecasts future completions using linear regression.") 14 | 15 | # 1. Generate Synthetic Data 16 | np.random.seed(42) 17 | milestone_count = st.slider("Number of Completed Milestones", min_value=5, max_value=20, value=10) 18 | start_date = pd.to_datetime("2024-01-01") 19 | achievement_days = np.cumsum(np.random.randint(10, 20, size=milestone_count)) 20 | achievement_dates = [start_date + timedelta(days=int(day)) for day in achievement_days] 21 | 22 | df = pd.DataFrame({ 23 | "Milestone": [f"Milestone {i}" for i in range(1, milestone_count + 1)], 24 | "Achievement Date": achievement_dates 25 | }) 26 | df["Days Since Start"] = (df["Achievement Date"] - start_date).dt.days 27 | 28 | # Display synthetic data 29 | st.subheader("🔍 Actual Milestone Data") 30 | st.dataframe(df) 31 | 32 | # 2. Forecast Future Milestones 33 | future_count = st.slider("Number of Future Milestones to Forecast", min_value=1, max_value=10, value=5) 34 | X = np.array(range(1, milestone_count + 1)).reshape(-1, 1) 35 | y = df["Days Since Start"].values 36 | 37 | model = LinearRegression() 38 | model.fit(X, y) 39 | 40 | future_indices = np.array(range(milestone_count + 1, milestone_count + future_count + 1)).reshape(-1, 1) 41 | future_days = model.predict(future_indices) 42 | future_dates = [start_date + timedelta(days=int(day)) for day in future_days] 43 | 44 | df_forecast = pd.DataFrame({ 45 | "Milestone": [f"Milestone {i}" for i in range(milestone_count + 1, milestone_count + future_count + 1)], 46 | "Predicted Achievement Date": future_dates, 47 | "Forecast Days Since Start": future_days.astype(int) 48 | }) 49 | 50 | # Display forecast 51 | st.subheader("🔮 Forecasted Milestone Data") 52 | st.dataframe(df_forecast) 53 | 54 | # 3. Combine and Download 55 | combined_df = pd.concat([ 56 | df[["Milestone", "Achievement Date", "Days Since Start"]], 57 | df_forecast.rename(columns={ 58 | "Predicted Achievement Date": "Achievement Date", 59 | "Forecast Days Since Start": "Days Since Start" 60 | }) 61 | ], ignore_index=True) 62 | 63 | # Download button 64 | def to_excel(df): 65 | output = BytesIO() 66 | with pd.ExcelWriter(output, engine='xlsxwriter') as writer: 67 | df.to_excel(writer, index=False, sheet_name='Milestones') 68 | return output.getvalue() 69 | 70 | st.download_button("📥 Download Forecast Data as Excel", data=to_excel(combined_df), 71 | file_name="Milestone_Achievement_Forecast.xlsx") 72 | 73 | # 4. Plotting 74 | st.subheader("📊 Forecast Plot") 75 | fig, ax = plt.subplots(figsize=(10, 5)) 76 | ax.plot(X.flatten(), y, 'o-', label="Actual", color="blue") 77 | ax.plot(future_indices.flatten(), future_days, 'x--', label="Forecast", color="orange") 78 | ax.set_xlabel("Milestone Number") 79 | ax.set_ylabel("Days Since Start") 80 | ax.set_title("Milestone Achievement Forecast") 81 | ax.grid(True) 82 | ax.legend() 83 | st.pyplot(fig) 84 | -------------------------------------------------------------------------------- /file 2 python file.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | import pandas as pd 3 | import numpy as np 4 | import matplotlib.pyplot as plt 5 | from sklearn.linear_model import LinearRegression 6 | from datetime import timedelta 7 | from io import BytesIO 8 | 9 | # Set up page 10 | st.set_page_config(page_title="Milestone Achievement Forecast", layout="centered") 11 | 12 | st.title("📈 Milestone Achievement Forecast") 13 | st.markdown("This app simulates milestone achievement and forecasts future completions using linear regression.") 14 | 15 | # 1. Generate Synthetic Data 16 | np.random.seed(42) 17 | milestone_count = st.slider("Number of Completed Milestones", min_value=5, max_value=20, value=10) 18 | start_date = pd.to_datetime("2024-01-01") 19 | achievement_days = np.cumsum(np.random.randint(10, 20, size=milestone_count)) 20 | achievement_dates = [start_date + timedelta(days=int(day)) for day in achievement_days] 21 | 22 | df = pd.DataFrame({ 23 | "Milestone": [f"Milestone {i}" for i in range(1, milestone_count + 1)], 24 | "Achievement Date": achievement_dates 25 | }) 26 | df["Days Since Start"] = (df["Achievement Date"] - start_date).dt.days 27 | 28 | # Display synthetic data 29 | st.subheader("🔍 Actual Milestone Data") 30 | st.dataframe(df) 31 | 32 | # 2. Forecast Future Milestones 33 | future_count = st.slider("Number of Future Milestones to Forecast", min_value=1, max_value=10, value=5) 34 | X = np.array(range(1, milestone_count + 1)).reshape(-1, 1) 35 | y = df["Days Since Start"].values 36 | 37 | model = LinearRegression() 38 | model.fit(X, y) 39 | 40 | future_indices = np.array(range(milestone_count + 1, milestone_count + future_count + 1)).reshape(-1, 1) 41 | future_days = model.predict(future_indices) 42 | future_dates = [start_date + timedelta(days=int(day)) for day in future_days] 43 | 44 | df_forecast = pd.DataFrame({ 45 | "Milestone": [f"Milestone {i}" for i in range(milestone_count + 1, milestone_count + future_count + 1)], 46 | "Predicted Achievement Date": future_dates, 47 | "Forecast Days Since Start": future_days.astype(int) 48 | }) 49 | 50 | # Display forecast 51 | st.subheader("🔮 Forecasted Milestone Data") 52 | st.dataframe(df_forecast) 53 | 54 | # 3. Combine and Download 55 | combined_df = pd.concat([ 56 | df[["Milestone", "Achievement Date", "Days Since Start"]], 57 | df_forecast.rename(columns={ 58 | "Predicted Achievement Date": "Achievement Date", 59 | "Forecast Days Since Start": "Days Since Start" 60 | }) 61 | ], ignore_index=True) 62 | 63 | # Download button 64 | def to_excel(df): 65 | output = BytesIO() 66 | with pd.ExcelWriter(output, engine='xlsxwriter') as writer: 67 | df.to_excel(writer, index=False, sheet_name='Milestones') 68 | return output.getvalue() 69 | 70 | st.download_button("📥 Download Forecast Data as Excel", data=to_excel(combined_df), 71 | file_name="Milestone_Achievement_Forecast.xlsx") 72 | 73 | # 4. Plotting 74 | st.subheader("📊 Forecast Plot") 75 | fig, ax = plt.subplots(figsize=(10, 5)) 76 | ax.plot(X.flatten(), y, 'o-', label="Actual", color="blue") 77 | ax.plot(future_indices.flatten(), future_days, 'x--', label="Forecast", color="orange") 78 | ax.set_xlabel("Milestone Number") 79 | ax.set_ylabel("Days Since Start") 80 | ax.set_title("Milestone Achievement Forecast") 81 | ax.grid(True) 82 | ax.legend() 83 | st.pyplot(fig) 84 | --------------------------------------------------------------------------------