import pytz from pkg.tool import get_tweets_since_last_friday from pkg.dash.app_init import app from dash.dependencies import Input, Output from datetime import timedelta from datetime import datetime from dash import html @app.callback( [Output('info-tooltip', 'children')], [Input('clock-interval', 'n_intervals')] ) def update_info(n): # 获取所有指标 pace = calculate_tweet_pace() decline_rates = calculate_pace_decline_rate() pace_increases = calculate_pace_increase_in_hour() table_rows = [ html.Tr([html.Td('Pace (Xtracker)', style={'textAlign': 'center'}), html.Td(pace, style={'textAlign': 'center'})]), html.Tr([html.Td('-Minute', style={'textAlign': 'center'}), html.Td(decline_rates['decline_per_minute'], style={'textAlign': 'center'})]), html.Tr([html.Td('+0(1h)', style={'textAlign': 'center'}), html.Td(decline_rates['decline_per_hour'], style={'textAlign': 'center'})]), html.Tr([html.Td('+1(1h)', style={'textAlign': 'center'}), html.Td(pace_increases['increase_1'], style={'textAlign': 'center'})]), html.Tr([html.Td('+5(1h)', style={'textAlign': 'center'}), html.Td(pace_increases['increase_5'], style={'textAlign': 'center'})]), html.Tr([html.Td('+10(1h)', style={'textAlign': 'center'}), html.Td(pace_increases['increase_10'], style={'textAlign': 'center'})]), html.Tr([html.Td('+20(1h)', style={'textAlign': 'center'}), html.Td(pace_increases['increase_20'], style={'textAlign': 'center'})]), html.Tr([html.Td('+30(1h)', style={'textAlign': 'center'}), html.Td(pace_increases['increase_30'], style={'textAlign': 'center'})]), ] table = html.Table(table_rows, style={ 'width': '100%', 'textAlign': 'left', 'borderCollapse': 'collapse' }) return [table] def get_pace_params(): est = pytz.timezone('US/Eastern') now = datetime.now(est) today = now.date() days_to_next_friday = (4 - today.weekday()) % 7 if days_to_next_friday == 0: days_to_next_friday = 7 next_friday = (now.replace(hour=12, minute=0, second=0, microsecond=0) + timedelta(days=days_to_next_friday)) if now > next_friday: next_friday += timedelta(days=7) days_to_next_friday = (next_friday - now).total_seconds() / (24 * 60 * 60) tweet_count = get_tweets_since_last_friday() return tweet_count, days_to_next_friday def calculate_tweet_pace(): tweet_count, days_to_next_friday = get_pace_params() pace = (tweet_count / (7 - days_to_next_friday)) * days_to_next_friday + tweet_count return round(pace, 6) if pace > 0 else float(tweet_count) def calculate_pace_decline_rate(): tweet_count, days_to_next_friday = get_pace_params() T = 7 decline_per_day = -(tweet_count * T) / ((T - days_to_next_friday) ** 2) decline_per_hour = decline_per_day / 24 decline_per_minute = decline_per_hour / 60 return { 'decline_per_hour': round(decline_per_hour, 6), 'decline_per_minute': round(decline_per_minute, 6) } def calculate_pace_increase_in_hour(): tweet_count, days_to_next_friday = get_pace_params() current_pace = (tweet_count / (7 - days_to_next_friday)) * days_to_next_friday + tweet_count future_days = days_to_next_friday - (1 / 24) increments = [1, 5, 10, 20, 30] pace_increases = {} for increment in increments: new_tweet_count = tweet_count + increment new_pace = (new_tweet_count / (7 - future_days)) * future_days + new_tweet_count pace_increase = new_pace - current_pace pace_increases[f'increase_{increment}'] = round(pace_increase, 6) return pace_increases