Buenos días, hace un par de años escribí una duda con un código de java. Y me gustaría saber si también pueden ayudar con el funcionamiento de un código Python.
El código trata de sacar dos archivos .csv de casos covid, y un archivo jpg de tres gráficas de como avanzan los casos covid en tres países.
El problema es que al ejecutar el archivo test.py, el problema es que sale "no tests were found". He instalado matplotlib, numpy, etc. Pero sigue sin funcionar
Adjunto los códigos: (El sim_parameters.py y helper.py nos los dio el profesor por lo que creo que están perfectos)
(test.py):
import unittest
import assignment3
SAMPLE_RATIO = 1e6
# START_DATE = '2020-04-01'
START_DATE = '2021-04-01'
END_DATE = '2022-04-30'
class A3Test(unittest.TestCase):
@staticmethod
def runTest():
assignment3.run(countries_csv_name='C:/Users/Alejandro BTH/Documents/Assign3code/a3-countries.csv',
countries=['Afghanistan', 'Sweden', 'Japan'], sample_ratio=SAMPLE_RATIO, start_date=START_DATE,
end_date=END_DATE)
unittest.main()
(sim_parameters.py):
TRASITION_PROBS = {
'less_5':
{
'H': {'H': 0.9, 'I': 0.1},
'I': {'I': 0, 'S': 0.5, 'M': 0.5},
'S': {'S': 0, 'D': 0.01, 'M': 0.99},
'D': {'D': 1},
'M': {'M': 0, 'H': 1}
},
'5_to_14':
{
'H': {'H': 0.9, 'I': 0.1},
'I': {'I': 0, 'S': 0.5, 'M': 0.5},
'S': {'S': 0, 'D': 0.01, 'M': 0.99},
'D': {'D': 1},
'M': {'M': 0, 'H': 1}
},
'15_to_24':
{
'H': {'H': 0.7, 'I': 0.3},
'I': {'I': 0, 'S': 0.5, 'M': 0.5},
'S': {'S': 0, 'D': 0.05, 'M': 0.95},
'D': {'D': 1},
'M': {'M': 0, 'H': 1}
},
'25_to_64':
{
'H': {'H': 0.7, 'I': 0.3},
'I': {'I': 0, 'S': 0.5, 'M': 0.5},
'S': {'S': 0, 'D': 0.2, 'M': 0.8},
'D': {'D': 1},
'M': {'M': 0, 'H': 1}
},
'over_65':
{
'H': {'H': 0.7, 'I': 0.3},
'I': {'I': 0, 'S': 0.5, 'M': 0.5},
'S': {'S': 0, 'D': 0.4, 'M': 0.6},
'D': {'D': 1},
'M': {'M': 0, 'H': 1}
}
}
HOLDING_TIMES = {
'less_5':
{'H': 0, 'I': 4, 'S': 14, 'D': 0, 'M': 120}
,
'5_to_14':
{'H': 0, 'I': 4, 'S': 14, 'D': 0, 'M': 120}
,
'15_to_24':
{'H': 0, 'I': 4, 'S': 14, 'D': 0, 'M': 120}
,
'25_to_64':
{'H': 0, 'I': 4, 'S': 14, 'D': 0, 'M': 120}
,
'over_65':
{'H': 0, 'I': 4, 'S': 14, 'D': 0, 'M': 120}
}
(helper.py)
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
from pathlib import Path
import os
OUTPUT_NAME = 'a3-covid-simulation.png'
def get_filepath(filename):
source_path = Path(__file__).resolve()
source_dir = source_path.parent
filepath = os.path.join(source_dir, filename)
return filepath
def save_plot(fig, filename):
filepath = get_filepath(filename)
fig.savefig(filepath, dpi=300)
def read_dataset(filename):
filepath = get_filepath(filename)
df = pd.read_csv(filepath, sep=',', header=0)
return df
def create_plot(summary_csv, countries):
states_timeseries_df = read_dataset(summary_csv)
print(f'Plotting is being prepared for the following dataset ...')
print(states_timeseries_df)
states_timeseries_df = states_timeseries_df[['country', 'date', 'H', 'I', 'S', 'M', 'D']] # reorder columns
states_timeseries_df['date'] = pd.to_datetime(states_timeseries_df['date'])
states_timeseries_df.set_index('date')
# Multiple countries in subfigures
countries_num = len(countries)
fig, ax = plt.subplots(countries_num, figsize=(16, 9 * countries_num))
for i in range(countries_num):
states_timeseries_df[states_timeseries_df['country'] == countries[i]].plot(
kind='bar',
x='date',
stacked=True,
width=1,
color=['green', 'darkorange', 'indianred', 'lightseagreen', 'slategray'],
ax=ax[i]
)
ax[i].legend(['Healthy', 'Infected (without symptoms)', 'Infected (with symptoms)', 'Immune', 'Deceased'])
ax[i].set_xticklabels(ax[i].get_xticks(), rotation=30)
plot_name = countries[i]
ax[i].set_title(f"Covid Infection Status in {plot_name}")
ax[i].set_xlabel("Date")
ax[i].set_ylabel("Population in Millions")
ax[i].xaxis.set_major_locator(md.MonthLocator())
selected_dates = states_timeseries_df['date'].dt.to_period('M').unique()
ax[i].set_xticklabels(selected_dates.strftime('%b %Y'), rotation=30, horizontalalignment="center")
save_plot(fig, OUTPUT_NAME)
print(f'Plotting Done!')
(assigment3.py)
import csv
import random
from datetime import datetime, timedelta
import pandas as pd
import helper
from sim_parameters import TRASITION_PROBS, HOLDING_TIMES
# Define 'timeline_data' to be used later
timeline_data = []
def get_population(countries_data, country):
return countries_data[countries_data['country'] == country]['population'].values[0]
def get_age_group_population(countries_data, country, age_group):
return countries_data[countries_data['country'] == country][age_group].values[0]
def get_state_population(people_data, country, state, date, start_datetime):
state_counts = {'H': 0, 'I': 0, 'S': 0, 'D': 0, 'M': 0}
for person in people_data:
if person['country'] == country and person['timeline'][(date - start_datetime).days]['state'] == state:
state_counts[state] += 1
return state_counts[state]
def run(countries_csv_name: str, countries: list[str], sample_ratio: float, start_date: str, end_date: str):
global timeline_data # Make 'timeline_data' global so it can be accessed and modified
countries_data = pd.read_csv(countries_csv_name)
countries_data = countries_data[countries_data['country'].isin(countries)]
countries_data['sample_population'] = (countries_data['population'] * sample_ratio).astype(float)
age_groups = ['less_5', '5_to_14', '15_to_24', '25_to_64', 'over_65']
people_data = []
person_id = 0
for _, row in countries_data.iterrows():
for age_group in age_groups:
num_people = int(row[age_group] * row['sample_population'] / 100)
for _ in range(num_people):
people_data.append({
'person_id': person_id,
'age_group': age_group,
'country': row['country'],
'timeline': []
})
person_id += 1
start_datetime = datetime.strptime(start_date, '%Y-%m-%d')
end_datetime = datetime.strptime(end_date, '%Y-%m-%d')
num_days = (end_datetime - start_datetime).days + 1
# Create and populate the 'timeline_data'
for person in people_data:
person_timeline = [] # A list to store each person's timeline
current_state = 'H' # Initialize the current state to 'H' (Healthy)
for _ in range(num_days):
# Sample the next state using TRASITION_PROBS
next_state = random.choices(['H', 'I', 'S', 'D', 'M'], TRASITION_PROBS[person['age_group']][current_state])[
0]
staying_days = random.choices([0, 1], [1 - HOLDING_TIMES[person['age_group']][current_state],
HOLDING_TIMES[person['age_group']][current_state]])[0]
person_timeline.append({
'date': (start_datetime + timedelta(days=_)).strftime('%Y-%m-%d'),
'state': next_state,
'staying_days': staying_days
})
current_state = next_state
timeline_data.append(person_timeline)
with open('a3-covid-simulated-timeseries.csv', 'w', newline='') as csvfile:
fieldnames = ['person_id', 'age_group_name', 'country', 'date', 'state', 'staying_days']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
person_id = 0
for person in people_data:
for day_data in person['timeline']:
writer.writerow({
'person_id': person_id,
'age_group_name': person['age_group'],
'country': person['country'],
'date': day_data['date'],
'state': day_data['state'],
'staying_days': day_data.get('staying_days', 0)
})
person_id += 1
summary_data = [] # Initialize summary_data as an empty list
for date in pd.date_range(start=start_date, end=end_date, freq='D'):
date_str = date.strftime('%Y-%m-%d')
for country in countries:
country_data = countries_data[countries_data['country'] == country]
state_counts = {'H': 0, 'I': 0, 'S': 0, 'D': 0, 'M': 0, 'date': date_str, 'country': country}
for person_timeline in timeline_data:
if person_timeline[0]['country'] == country:
day_data = person_timeline[(date - start_datetime).days]
state_counts[day_data['state']] += 1
summary_data.append(state_counts)
summary_df = pd.DataFrame(summary_data)
summary_df.to_csv('a3-covid-summary-timeseries.csv', index=False)
helper.create_plot('a3-covid-summary-timeseries.csv', countries)