From 1bd6c565b5baf42a3ba9b3e5c4d609b04c435e29 Mon Sep 17 00:00:00 2001 From: cemgungor1 Date: Sun, 15 Dec 2024 15:15:16 +0300 Subject: [PATCH] refactor: change stock range structure --- backend/marketfeed/serializers.py | 24 +++++++------- backend/marketfeed/views.py | 53 ++++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 24 deletions(-) diff --git a/backend/marketfeed/serializers.py b/backend/marketfeed/serializers.py index 28763e94..b8ca19c1 100644 --- a/backend/marketfeed/serializers.py +++ b/backend/marketfeed/serializers.py @@ -51,20 +51,20 @@ def __init__(self, *args, **kwargs): class StockHistoricDataSerializer(serializers.Serializer): - start_date = serializers.DateField() # Start date of the interval - end_date = serializers.DateField() # End date of the interval + start_date = serializers.DateField(required=False, default=None) # Start date of the interval + end_date = serializers.DateField(required=False, default=None) # End date of the interval + period = serializers.CharField( + required=False, + max_length=3, # Adjust based on the maximum length of your options + help_text="'1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max'." + ) + interval = serializers.CharField( + max_length=3, # Adjust based on the maximum length of your options + help_text="'1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1wk', '1mo', '3mo" + ) + def validate_date(self, value): - two_years_ago = datetime.now() - timedelta(days=365*2) - today = datetime.now().date() - range = self.end_date - self.start_date - if self.start_date < two_years_ago or self.end_date < two_years_ago: - raise serializers.ValidationError("The given date/s cannot be older than 2 years.") - elif self.start_date > today or self.end_date > today: - raise serializers.ValidationError("The given date cannot be later than the current date.") - elif range.days > 365: - raise serializers.ValidationError("The date range must be less than or equal to one year.") - return value class StockPatternSearchSerializer(serializers.Serializer): diff --git a/backend/marketfeed/views.py b/backend/marketfeed/views.py index 922aa25b..ed213d32 100644 --- a/backend/marketfeed/views.py +++ b/backend/marketfeed/views.py @@ -117,31 +117,61 @@ def search(self, request): serializer = StockSerializer(stocks, many=True) return Response(serializer.data) - @swagger_auto_schema(request_body=StockHistoricDataSerializer) + @swagger_auto_schema(request_body=StockHistoricDataSerializer, operation_summary=''' + Submit a request for historic stock data. + Available time ranges: + '1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max', + Available intervals: + '1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1wk', '1mo', '3mo'. + ''', + operation_description=( + ''' + Submit a request for historic stock data. + Available time ranges: + '1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max', + Available intervals: + '1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1wk', '1mo', '3mo'. + ''' + + )) @action(detail=True, methods=['post'], serializer_class=StockHistoricDataSerializer) def get_historical_data(self, request, pk=None): stock = self.get_object() stock_symbol = stock.symbol serializer = StockHistoricDataSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + start_date = serializer.validated_data['start_date'] end_date = serializer.validated_data['end_date'] + period = serializer.validated_data['period'] + interval = serializer.validated_data['interval'] + + if stock.currency.code == 'TRY': + stock_symbol += '.IS' if not start_date or not end_date: - return Response({"error": "Start date and end date are required."}, status=status.HTTP_400_BAD_REQUEST) + try: + data = yf.Ticker(stock_symbol).history(period=period,interval=interval) + # download(tickers=stock_symbol, period=serializer.validated_data['period'], interval=serializer.validated_data['interval']) + data = data.drop(columns=['Dividends', 'Stock Splits']) + data = data.round(2) + data['Date'] = data.index + + data = data.reset_index(drop=True) + + return Response(data, status=status.HTTP_200_OK) + except Exception as e: + return Response({"error": f"An error occurred while fetching data: {str(e)}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) - if stock.currency.code == 'TRY': - stock_symbol += '.IS' try: - # Fetch stock data using yfinance - stock_data = yf.Ticker(stock_symbol) - data = stock_data.history(start=start_date, end=end_date) - data = data.drop(columns=['Volume', 'Dividends', 'Stock Splits']) - data['Date'] = data.index.date + data = yf.Ticker(stock_symbol).history(interval=interval, start=start_date, end=end_date) + data = data.drop(columns=['Dividends', 'Stock Splits']) + data = data.round(2) + data['Date'] = data.index data = data.reset_index(drop=True) - data['Stock'] = stock.symbol - + return Response(data, status=status.HTTP_200_OK) except Exception as e: @@ -458,7 +488,6 @@ def list(self, request): for index in serializerData: index['price'] = prices[index['symbol']] - print(serializerData) return Response(serializer.data)