generated from leynier/python-template
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
25 changed files
with
945 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -132,3 +132,4 @@ dmypy.json | |
|
||
.vscode/** | ||
requirements_temp.txt | ||
data |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
web: sh setup.sh && streamlit run app.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,280 @@ | ||
from typing import Dict, List, Tuple | ||
|
||
import pandas as pd | ||
import plotly.graph_objects as go | ||
import streamlit as st | ||
from PIL import Image | ||
|
||
from kickstarter.core import get_favorite_categories as get_favorite_categories_raw | ||
from kickstarter.core import load_json as load_json_raw | ||
from kickstarter.models import CategoryModel, ProjectModel | ||
from kickstarter.processing import ( | ||
GrossingCategoriesModel, | ||
MonthlyCategoriesSuccessModel, | ||
MonthlyCategoriesTotalsModel, | ||
SuccessfulCategoriesModel, | ||
) | ||
|
||
image = Image.open("images/logo.png") | ||
st.image(image, use_column_width=True) | ||
|
||
|
||
def load_json() -> Tuple[ | ||
List[ProjectModel], | ||
Dict[int, CategoryModel], | ||
]: | ||
return load_json_raw() | ||
|
||
|
||
def get_favorite_categories( | ||
projects: List[ProjectModel], | ||
categories: Dict[int, CategoryModel], | ||
) -> Tuple[ | ||
GrossingCategoriesModel, | ||
SuccessfulCategoriesModel, | ||
List[CategoryModel], | ||
List[CategoryModel], | ||
List[CategoryModel], | ||
MonthlyCategoriesSuccessModel, | ||
MonthlyCategoriesTotalsModel, | ||
Dict[int, Tuple[List[int], List[int]]], | ||
]: | ||
return get_favorite_categories_raw(projects, categories) | ||
|
||
|
||
""" | ||
# ¿Qué hace que un proyecto sea exitoso en [Kickstarter](https://www.kickstarter.com)? | ||
""" | ||
|
||
""" | ||
> _Por: Carlos Bermudez Porto, Leynier Gutiérrez González y Tony Raúl Blanco Fernández_ | ||
""" | ||
|
||
""" | ||
### ¿Qué es [Kickstarter](https://www.kickstarter.com)? | ||
**Kickstarter** es un sitio web de micromecenazgo para proyectos creativos. Mediante | ||
**Kickstarter** se ha financiado una amplia gama de proyectos, que van desde películas | ||
independientes, música y cómics a periodismo, videojuegos y proyectos relacionados con | ||
la comida. | ||
Siendo uno nuevo en el conjunto de plataformas de recaudación de fondos llamado | ||
"financiación en masa", **Kickstarter** facilita la captación de recursos monetarios | ||
del público en general, un modelo que evita muchas vías tradicionales de inversión. | ||
Los proyectos deben cumplir con las directrices de **Kickstarter** para ponerse en | ||
marcha - proyectos de caridad, de causas, de "financiación de vida" y recaudación de | ||
fondos sin límites fijos no están permitidos. Los dueños del proyecto eligen una fecha | ||
límite y un mínimo objetivo de fondos a recaudar. Si el objetivo elegido no es | ||
recolectado en el plazo, no se perciben fondos (esto se conoce como provision point | ||
mechanism). El dinero prometido por los donantes se recopila mediante Amazon Payments. | ||
**Kickstarter** toma un 5% de los fondos recaudados; Amazon cobra un 3–5% adicional. | ||
A diferencia de muchos foros de recaudación de fondos o inversión, **Kickstarter** | ||
renuncia a la propiedad sobre los proyectos y el trabajo que producen. Sin embargo, | ||
los proyectos iniciados en el sitio son permanentemente archivados y accesibles al | ||
público. Después de que la financiación se ha completado, los proyectos y elementos | ||
multimedia subidos no pueden ser editados o eliminados del sitio. | ||
No hay garantía de que las personas que publican los proyectos en **Kickstarter** | ||
cumplan sus proyectos, usen el dinero para poner en práctica sus proyectos o que los | ||
proyectos concluidos satisfagan las expectativas de los patrocinadores, y | ||
**Kickstarter** en sí ha sido acusado de proporcionar poco control de calidad. | ||
**Kickstarter** aconseja a los patrocinadores que usen su propio juicio al apoyar | ||
a un proyecto. También advierten a los líderes de proyectos que podrían ser | ||
responsables por los daños y perjuicios de los patrocinadores por no cumplir las | ||
promesas. Los proyectos también pueden fallar, incluso después de una recaudación | ||
de fondos exitosa, cuando los creadores subestiman los costos totales requeridos o | ||
las dificultades técnicas a ser superadas. | ||
""" | ||
|
||
""" | ||
### ¿Cuáles son las categorías más exitosas? | ||
Para crear un proyecto es necesario asignarle un categoría, estas son muy variadas | ||
y brindan una importante información sobre el proyecto, ya que los comportamientos | ||
de estos, el dinero necesario, etc dependerá mucho de que tipo (categoría) de proyecto | ||
se desee hacer. | ||
Haciendo un análisis de las 25 categorías que más dinero han recaudado y de las 25 | ||
categorías con los porcientos más altos de éxitos las categorías que aparecen en ambas | ||
listas sobresaliendo como categorías de interes para los patrocinadores, y con mayores | ||
probabilidades de alcanzar sus metas, son: | ||
""" | ||
|
||
favorite_categories: Tuple[ | ||
GrossingCategoriesModel, | ||
SuccessfulCategoriesModel, | ||
List[CategoryModel], | ||
List[CategoryModel], | ||
List[CategoryModel], | ||
MonthlyCategoriesSuccessModel, | ||
MonthlyCategoriesTotalsModel, | ||
Dict[int, Tuple[List[int], List[int]]], | ||
] = get_favorite_categories( | ||
*load_json() # type: ignore | ||
) | ||
|
||
col1, col2 = st.beta_columns(2) | ||
|
||
with col1: | ||
st.write("**Top 25 - Más dinero recaudado**") | ||
st.write( | ||
pd.DataFrame( | ||
[ | ||
{ | ||
"Nombre": item.name, | ||
"$ Recaudados": favorite_categories[0].counter[item.id], | ||
} | ||
for item in favorite_categories[2] | ||
] | ||
) | ||
) | ||
|
||
with col2: | ||
st.write("**Top 25 - Mejor porciento de exitos**") | ||
st.write( | ||
pd.DataFrame( | ||
[ | ||
{ | ||
"Nombre": item.name, | ||
"% Exitos": str( | ||
round( | ||
favorite_categories[1].categories_success[item.id] | ||
/ favorite_categories[1].categories_total[item.id] | ||
* 100, | ||
2, | ||
) | ||
) | ||
+ "%", | ||
} | ||
for item in favorite_categories[3] | ||
] | ||
) | ||
) | ||
|
||
st.write("**Categorías más exitosas**") | ||
|
||
for item in favorite_categories[4]: | ||
name = item.name | ||
pleged = favorite_categories[0].counter[item.id] | ||
success = round( | ||
favorite_categories[1].categories_success[item.id] | ||
/ favorite_categories[1].categories_total[item.id] | ||
* 100, | ||
2, | ||
) | ||
f""" | ||
* {name} | ||
* Dinero Recaudado: {pleged} | ||
* Porciento de Exitos: {success}% | ||
""" | ||
|
||
""" | ||
### ¿Cómo se han comportado estas categorías a lo largo del tiempo? | ||
Si bien en general las categorías antes mencionadas aparecen como las más | ||
prometedoras, este éxito podría verse enmarcado en un determinado momento y | ||
no como algo que ocuerre casi todo el tiempo. Por eso es necesario analisar | ||
el comportamiento de estas en los últimos años. | ||
En las siguientes gráficas mostramos la cantidad de proyectos, asi como la | ||
cantidad de estos que fueron exitosos, de estas categorías por mes durante | ||
los años del 2009 al 2020. | ||
""" | ||
|
||
timeline = go.Figure() # type: ignore | ||
|
||
for cat in favorite_categories[4]: | ||
timeline.add_scatter( | ||
x=[ | ||
favorite_categories[6].dates[i] | ||
for i in range(len(favorite_categories[5].dates)) | ||
], | ||
y=[ | ||
favorite_categories[6].categories[cat.id][i] | ||
for i in range(len(favorite_categories[5].dates)) | ||
], | ||
name=cat.name, | ||
opacity=0.9, | ||
) | ||
timeline.add_scatter( | ||
x=[ | ||
favorite_categories[5].dates[i] | ||
for i in range(len(favorite_categories[5].dates)) | ||
], | ||
y=[ | ||
favorite_categories[5].categories[cat.id][i] | ||
for i in range(len(favorite_categories[5].dates)) | ||
], | ||
name=cat.name + " Exitosos", | ||
opacity=0.9, | ||
) | ||
|
||
timeline.update_layout( | ||
title_text="Cantidad de Proyectos vs Cantidad de Proyectos Exitosos", | ||
xaxis_rangeslider_visible=True, | ||
) | ||
st.write(timeline) | ||
|
||
""" | ||
Teniendo en cuenta la información anterior podemos notar que muchas de las | ||
categorías anteriores tuvieron un auge en **Kickstarter** durante los años | ||
del 2009 al 2014, pero desde entonces ya casi no aparecen proyectos a partir | ||
de ese año. Un detalle interesante a tener en cuenta es que sobre esas fecha | ||
aparece [**Patreon**](https://www.patreon.com) como un competidor de | ||
**Kickstarter** en el mercado, lo que podría conllevar a que muchos proyectos | ||
se muden hacia esta nueva plataforma. Solo mantienen un ritmo mas estable las | ||
categorías de Libros para niños, No ficción, Película narrativa y Vídeojuegos. | ||
""" | ||
|
||
""" | ||
### ¿Influirá la temporada del año en el éxito de un proyecto? | ||
En principio una puede pensar que dependiendo de la temporada del año en que se | ||
da a conocer un proyecto, este pueda lograr ser exitoso o no. Esto debido a muchas | ||
rasones, por ejemplo, un festival de música no me interesa mucho si este se va a | ||
realizar en tiempo de pruebas finales. Este tipo de situaciones son muy frecuentes | ||
y pueden ser decisivas para un proyecto. | ||
A continuación analizaremos como se comportan las categorías que han sido y son | ||
más exitosas dependiendo del més del año en que sus proyectos fueron dados a conocer. | ||
""" | ||
|
||
category_selected = st.selectbox( | ||
"Categorías:", | ||
options=[item.id for item in favorite_categories[4]], | ||
format_func=lambda x: favorite_categories[0].categories[x].name, | ||
) | ||
|
||
months = [ | ||
"enero", | ||
"febrero", | ||
"marzo", | ||
"abril", | ||
"mayo", | ||
"junio", | ||
"julio", | ||
"agosto", | ||
"septiembre", | ||
"obtubre", | ||
"noviembre", | ||
"diciembre", | ||
] | ||
|
||
successfuls = favorite_categories[7][category_selected][0] | ||
totals = favorite_categories[7][category_selected][1] | ||
|
||
fig_cat_months_rel = go.Figure( # type: ignore | ||
data=[ | ||
go.Bar(name="Total", x=months, y=totals), # type: ignore | ||
go.Bar(name="Éxitos", x=months, y=successfuls), # type: ignore | ||
] | ||
) | ||
|
||
fig_cat_months_rel.update_layout( | ||
title_text="Categoría: " | ||
+ f"{favorite_categories[0].categories[category_selected].name}", | ||
barmode="overlay", | ||
) | ||
|
||
st.title("Kickstarter") | ||
st.write(fig_cat_months_rel) |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.