# Задача: вычислить 3 тикера с максимальной и 3 тикера с минимальной волатильностью.
# Бумаги с нулевой волатильностью вывести отдельно.
# Результаты вывести на консоль в виде:
# Максимальная волатильность:
# ТИКЕР1 - ХХХ.ХХ %
# ТИКЕР2 - ХХХ.ХХ %
# ТИКЕР3 - ХХХ.ХХ %
# Минимальная волатильность:
# ТИКЕР4 - ХХХ.ХХ %
# ТИКЕР5 - ХХХ.ХХ %
# ТИКЕР6 - ХХХ.ХХ %
# Нулевая волатильность:
# ТИКЕР7, ТИКЕР8, ТИКЕР9, ТИКЕР10, ТИКЕР11, ТИКЕР12
# Волатильности указывать в порядке убывания. Тикеры с нулевой волатильностью упорядочить по имени.
# волатильность = ((максимальная цена - минимальная цена) / средняя цена) * 100
# средняя цена = (максимальная цена + минимальная цена) / 2
# В каждом файле в папке trades содержится данные по сделкам по одному тикеру, разделенные запятыми.
# Первая строка - название колонок:
# SECID - тикер
# TRADETIME - время сделки
# PRICE - цена сделки
# QUANTITY - количество бумаг в этой сделке
# Все последующие строки в файле - данные о сделках
мое решение ниже , но только от этого решения мой код не ускорился , помогите исправить ошибки.
список файлов для перебора в прикрепленном файле ,
# Бумаги с нулевой волатильностью вывести отдельно.
# Результаты вывести на консоль в виде:
# Максимальная волатильность:
# ТИКЕР1 - ХХХ.ХХ %
# ТИКЕР2 - ХХХ.ХХ %
# ТИКЕР3 - ХХХ.ХХ %
# Минимальная волатильность:
# ТИКЕР4 - ХХХ.ХХ %
# ТИКЕР5 - ХХХ.ХХ %
# ТИКЕР6 - ХХХ.ХХ %
# Нулевая волатильность:
# ТИКЕР7, ТИКЕР8, ТИКЕР9, ТИКЕР10, ТИКЕР11, ТИКЕР12
# Волатильности указывать в порядке убывания. Тикеры с нулевой волатильностью упорядочить по имени.
# волатильность = ((максимальная цена - минимальная цена) / средняя цена) * 100
# средняя цена = (максимальная цена + минимальная цена) / 2
# В каждом файле в папке trades содержится данные по сделкам по одному тикеру, разделенные запятыми.
# Первая строка - название колонок:
# SECID - тикер
# TRADETIME - время сделки
# PRICE - цена сделки
# QUANTITY - количество бумаг в этой сделке
# Все последующие строки в файле - данные о сделках
мое решение ниже , но только от этого решения мой код не ускорился , помогите исправить ошибки.
список файлов для перебора в прикрепленном файле ,
Python:
import os
import threading
import time
import itertools
class OPEN(threading.Thread):
def __init__(self, filename, spisok, slovar,*args, **kwargs):
super().__init__(*args, **kwargs)
self.spisok = spisok
self.slovar = slovar
self.filename = filename
def __str__(self):
return self.filename
def run(self):
with open(os.path.join('F:\\my Progects\\lesson_012\\trades', self.filename), 'r', encoding='utf8') as f:
lines = itertools.islice(f, 1, None)
for line in lines:
line = line.split(',')
self.spisok.append(float(line[2]))
mini = min(self.spisok)
maxi = max(self.spisok)
average_price = (mini + maxi) / 2
volatility = ((maxi - mini) / average_price) * 100
self.slovar[self.filename[7:10]] = volatility
return self.slovar
class SORTER(threading.Thread):
def run_s(self, slovar, b):
self.sorted_tuples = sorted(slovar.items(), key=lambda item: item[1])
a = len(self.sorted_tuples)
num_max = self.sorted_tuples[a - 3: a]
num_max.sort(reverse=True)
num_min = []
num0 = []
for item in self.sorted_tuples:
if int(item[1]) == 0:
num0.append(item[0])
if float(item[1]) > 0:
num_min.append(item)
b += 1
if b == 3:
break
num0.sort(reverse=False)
num_min.sort(reverse=True)
return num_max, num0, num_min
def time_track(func):
def surrogate(*args, **kwargs):
started_at = time.time()
result = func(*args, **kwargs)
ended_at = time.time()
elapsed = round(ended_at - started_at, 4)
print(f'Функция работала {elapsed} секунд(ы)')
return result
return surrogate
@time_track
def main():
slovar1 = {}
way = os.listdir('F:\\my Progects\\lesson_012\\trades')
filenames = [OPEN(spisok=[], slovar=slovar1, filename=filename) for filename in way]
for filename in filenames:
filename.start()
for filename in filenames:
filename.join()
sorted_slovar1 = SORTER()
num_max, num0, num_min = sorted_slovar1.run_s(slovar1, 0)
# переделываю
print('Максимальная волатильность')
for item in num_max:
print(item[0], format(item[1], '.2f'))
print('Нулевая волатильность')
print(*num0)
print('Минимальная волатильность')
for item in num_min:
print(item[0], format(item[1], '.2f'))
if __name__ == '__main__':
main()