chore(chart): convert indent to tabs

This commit is contained in:
Данил 2025-02-19 13:43:07 +03:00
parent ab97ee1e62
commit ef2c126d68

View file

@ -13,99 +13,98 @@ from function.gen_unique_name import generate_unique_name
from database.server import create_pool from database.server import create_pool
async def create_chart( async def create_chart(
from_currency: str, from_currency: str,
conv_currency: str, conv_currency: str,
start_date: str, start_date: str,
end_date: str end_date: str
) -> (str, None): ) -> (str, None):
""" """
Generates a line chart of currency rates for a given date range. Generates a line chart of currency rates for a given date range.
The chart shows the exchange rate trend between `from_currency` and The chart shows the exchange rate trend between `from_currency` and
`conv_currency` within the specified `start_date` and `end_date` range. `conv_currency` within the specified `start_date` and `end_date` range.
The generated chart is saved as a PNG file, and the function returns the The generated chart is saved as a PNG file, and the function returns the
file name. If data is invalid or insufficient, the function returns `None`. file name. If data is invalid or insufficient, the function returns `None`.
Args: Args:
from_currency (str): The base currency (e.g., "USD"). from_currency (str): The base currency (e.g., "USD").
conv_currency (str): The target currency (e.g., "EUR"). conv_currency (str): The target currency (e.g., "EUR").
start_date (str): The start date in the format 'YYYY-MM-DD'. start_date (str): The start date in the format 'YYYY-MM-DD'.
end_date (str): The end date in the format 'YYYY-MM-DD'. end_date (str): The end date in the format 'YYYY-MM-DD'.
Returns: Returns:
str | None: The name of the saved chart file, or `None` if the operation fails. str | None: The name of the saved chart file, or `None` if the operation fails.
""" """
pool = await create_pool() pool = await create_pool()
if not validate_date(start_date) or not validate_date(end_date): if not validate_date(start_date) or not validate_date(end_date):
return None return None
start_date_obj = datetime.strptime(start_date, '%Y-%m-%d').date() start_date_obj = datetime.strptime(start_date, '%Y-%m-%d').date()
end_date_obj = datetime.strptime(end_date, '%Y-%m-%d').date() end_date_obj = datetime.strptime(end_date, '%Y-%m-%d').date()
async with pool.acquire() as conn: async with pool.acquire() as conn:
data = await conn.fetch( data = await conn.fetch(
'SELECT date, rate FROM currency ' 'SELECT date, rate FROM currency '
'WHERE (date BETWEEN $1 AND $2) ' + 'WHERE (date BETWEEN $1 AND $2) ' +
'AND from_currency = $3 AND conv_currency = $4 ORDER BY date', 'AND from_currency = $3 AND conv_currency = $4 ORDER BY date',
start_date_obj, start_date_obj,
end_date_obj, end_date_obj,
from_currency.upper(), from_currency.upper(),
conv_currency.upper() conv_currency.upper()
) )
if not data or len(data) <= 1: if not data or len(data) <= 1:
return None return None
date, rate = [], [] date, rate = [], []
for row in data: for row in data:
parsed_date = datetime.strptime(row['data'], '%Y-%m-%d%H:%M:%S.%fZ').date() parsed_date = datetime.strptime(row['data'], '%Y-%m-%d%H:%M:%S.%fZ').date()
date.append(parsed_date) date.append(parsed_date)
rate.append(row['rate']) rate.append(row['rate'])
spline = make_interp_spline(range(len(date)), rate, k=2) spline = make_interp_spline(range(len(date)), rate, k=2)
x = np.arange(len(date)) x = np.arange(len(date))
newx_2 = np.linspace(0, len(date) - 1, 200) newx_2 = np.linspace(0, len(date) - 1, 200)
newy_2 = spline_2(newx_2) newy_2 = spline_2(newx_2)
fig, ax = plt.subplot(figsize=(15, 6)) fig, ax = plt.subplot(figsize=(15, 6))
for label in (ax.get_xticklabels() + ax.get_yticklabels()): for label in (ax.get_xticklabels() + ax.get_yticklabels()):
label.set_fontsize(10) label.set_fontsize(10)
ax.set_xtick(np.linspace(0, len(date) - 1, 10)) ax.set_xtick(np.linspace(0, len(date) - 1, 10))
ax.set_xticklabels( ax.set_xticklabels(
[ [
date[int(i)].strftime('%Y-%m-%d') date[int(i)].strftime('%Y-%m-%d')
for i in np.linspace(0, len(date) - 1, 10).astype(int) for i in np.linspace(0, len(date) - 1, 10).astype(int)
] ]
) )
name = await generate_unique_name( name = await generate_unique_name(
f'{from_currency.upper()}_{conv_currency.upper()}', f'{from_currency.upper()}_{conv_currency.upper()}',
datetime.now() datetime.now()
) )
plt.plot(newx_2, newy_2) plt.savefig(f'../charts/{name}.png')
plt.savefig(f'../charts/{name}.png') fig.clear()
fig.clear()
return name return name
def validate_date(date_str: str) -> bool: def validate_date(date_str: str) -> bool:
""" """
Validates whether the provided string is a valid date in the format 'YYYY-MM-DD'. Validates whether the provided string is a valid date in the format 'YYYY-MM-DD'.
Args: Args:
date_str (str): The date string to validate. date_str (str): The date string to validate.
Returns: Returns:
bool: `True` if the string is a valid date, `False` otherwise. bool: `True` if the string is a valid date, `False` otherwise.
""" """
try: try:
datetime.strptime(date_str, '%Y-%m-%d') datetime.strptime(date_str, '%Y-%m-%d')
return True return True
except ValueError: except ValueError:
return False return False