Newer
Older
from dash import dash, dcc, html, Output, Input
from collections import Counter
from dash_plot_generation.utils import split_companies, extract_unique_companies, convert_owners_to_limits, \
get_owner_means
DEVELOPER_DROPDOWN = "developer_dropdown"
DEV_TOP_GENRES_LABEL = "dev_top_genres"
DEV_CCU_LABEL = "dev_ccu"
DEV_GAME_COUNT_LABEL = "dev_game_count"
DEV_REV_PER_GAME_LABEL = "dev_rev_per_game"
DEV_REVENUE_LABEL = "dev_revenue"
csv_path = os.path.normpath(os.getcwd() + os.sep + os.pardir + os.sep + "api_exploration")
split_csv_path = os.path.join(csv_path, "file_segments")
df = None
DASH_ASSETS_PATH = "dash_assets"
APP = dash.Dash(
name=__name__,
assets_folder=DASH_ASSETS_PATH,
external_stylesheets=['https://codepen.io/chriddyp/pen/bWLwgP.css']
)
def initialize_data():
global df
files = os.listdir(split_csv_path)
dataframe = None
for file in os.listdir(split_csv_path):
file_path = os.path.join(split_csv_path, file)
dataframe = pandas.concat([dataframe, pandas.read_csv(file_path)]) if dataframe is not None \
@APP.callback([Output(DEV_REVENUE_LABEL, "children"),
Output(DEV_TOP_GENRES_LABEL, "children"),
Output(DEV_CCU_LABEL, "children"),
Output(DEV_GAME_COUNT_LABEL, "children"),
Output(DEV_REV_PER_GAME_LABEL, "children")],
inputs=[Input(DEVELOPER_DROPDOWN, "value")])
def update_dev_info(dev_name):
global df
mask = df.developer.apply(lambda x: dev_name in x if isinstance(x,str) else False)
dev_data = df[mask]
ccu = sum(dev_data["ccu"])
dev_data["owner_means"] = dev_data["owners"].apply(lambda x: get_owner_means(convert_owners_to_limits(x)))
dev_data["game_prices"] = dev_data["price"]
game_revenue = [owner_count*game_price for (owner_count, game_price) in
zip(dev_data["owner_means"],dev_data["game_prices"]) if
not (pandas.isna(game_price) or pandas.isna(owner_count))]
genre_totals = [genre for genre_list in dev_data["genres"] if isinstance(genre_list,str) for genre in genre_list]
genre_counts = Counter(genre_totals).keys()
return str(sum(game_revenue)), "hello2", str(ccu), str(dev_data.shape[0]), str(round(sum(game_revenue)/len(game_revenue))
def initialize_dash(host: str = "0.0.0.0", **kwargs):
"""
Runs the Dash server.
Args:
host: IP address of the server
kwargs: Variables which are passed down to APP.run function as named arguments.
Note:
The server IP is not actually 0.0.0.0; if the dash app is not accessible via this address, use the same port
number but replace the IP address with your local network IP instead.
"""
global APP, df
unique_publishers = extract_unique_companies(df["publisher"].apply(lambda x: split_companies(x)))
unique_developers = extract_unique_companies(df["developer"].apply(lambda x: split_companies(x)))
# unique_publishers = ["Valve"]
# unique_developers = ["Valve"]
APP.layout = html.Div(children=[
html.Nav(className="nav nav-pills", children=[
html.H6("STEAM-SAVVY", style={"margin-left": "30px", "width": "20%", "display": "inline-block"}),
html.A('About', className="nav-item nav-link btn", href='/apps/App1',
style={"margin-left": "300px"}),
html.A('Technical report', className="nav-item nav-link active btn", href='/apps/App2',
style={"background-color": "rgb(30,30,30)", "color": "rgb(255,255,255)"}),
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
dcc.Tabs(id="tabs_main_plots1", value="tab1", children=[
dcc.Tab(label="Genre performance", value="tab1"),
dcc.Tab(label="Game popularity", value="tab2"),
dcc.Tab(label="Company revenues", value="tab3"),
dcc.Tab(label="Market performance", value="tab4"),
],
style={'width': '80%', 'display': 'inline-block', "outline": "2px dot'ted black"}),
], style={'width': '60%', 'display': 'inline-block'}),
html.Div(children=[
dcc.Tabs(id="tabs_main_plots2", value="tab3", children=[
dcc.Tab(label="Developer infromation", value="Valve", children=[
html.Div(children=[
dcc.Dropdown(id=DEVELOPER_DROPDOWN, value="Valve",
options=[{"label": developer, "value": developer} for developer in
unique_developers]
),
html.Div(children=[
html.H6("General statistics"),
html.Div( # Revenue
children=[html.P("Revenue"),
html.Div(children=[
html.P("Total game sale revenue"),
html.Small(id=DEV_REVENUE_LABEL, children="524.245.000€"),
html.P("Total game sale revenue per game"),
html.Small(id=DEV_REV_PER_GAME_LABEL, children="92.625.000€"),
html.P("Highest game sale revenue games:"),
html.Small("Half life 2"),
html.Small("CS GO"),
html.Small("Portal 2")
])
],
style={'width': '48%', 'display': 'inline-block'}
),
html.Div(children=[
html.Div(children=[
html.P("Number of games"),
html.Small(id=DEV_GAME_COUNT_LABEL, children="5"),
html.P("Number of concurrent users"),
html.Small(id=DEV_CCU_LABEL, children="92.625.000€"),
html.P("Most common game genres"),
html.Small(id=DEV_TOP_GENRES_LABEL, children="FPS, Action, Puzzle"),
html.P("Average game rating"),
])
], style={'width': '48%', 'display': 'inline-block'}
)
])
],
)
]),
dcc.Tab(label="Publisher information", value="tab4", children=[
dcc.Dropdown(id="publisher_dropdown", value="Valve",
options=[{"label": publisher, "value": publisher} for publisher in
unique_publishers]
),
])
],
style={'width': '100%', 'display': 'inline-block'}),
style={'width': '30%', 'display': 'inline-block', "outline": "2px dotted black"})
style={'width': '100%', "padding-top": "15px"}),
])
APP.run(host=host, **kwargs)
print("The server has closed!")
if __name__ == "__main__":
initialize_data()