<jupyter_start><jupyter_text>Cargar  Datos sobre Foursquare checkins en NYC, descargados desde [la página de <NAME>](https://sites.google.com/site/yangdingqi/home/foursquare-dataset)<jupyter_code>data = pd.read_csv('checkins.csv', sep='\t', names=['user_id', 'venue_id'])
data.head()<jupyter_output><empty_output><jupyter_text>Primero vemos cuantos usuarios únicos hay<jupyter_code>len(data['user_id'].unique())
len(data['venue_id'].unique())
Añadimos una columna que nos va a ayudar a contar el número de veces que un user visita un venue
data['checkin']=1<jupyter_output><empty_output><jupyter_text>Ahora vemos si hay duplicados, si un usuario ha visitado un sitio muchas veces<jupyter_code>data.groupby(['user_id', 'venue_id']).count()<jupyter_output><empty_output><jupyter_text>Lo ordenamos por número de visitas para verlo más claramente<jupyter_code>data.groupby(['user_id', 'venue_id']).count().sort_values('checkin', ascending=False)<jupyter_output><empty_output><jupyter_text>Para medir la distancia entre vectores definidos sobre un espacio vectorial booleano se puede usar la distancia de Jaccard, para eso primero tenemos que quitar los duplicados<jupyter_code>data = data.drop_duplicates()
data.shape<jupyter_output><empty_output><jupyter_text>Transformar<jupyter_code>data.head()
len(set(data['user_id']))
len(set(data['venue_id']))
checkins_matrix = data.reset_index()\
    .pivot(index='venue_id', columns='user_id', values='checkin')\
    .fillna(0)\
    .astype(int)
checkins_matrix.head()
checkins_matrix.shape<jupyter_output><empty_output><jupyter_text>Calculamos cuantas visitas tiene cada sitio<jupyter_code>checkins_matrix.sum(axis=1)<jupyter_output><empty_output><jupyter_text>Visualizar Visualizamos las visitas<jupyter_code>checkins_matrix.sum(axis=1).hist()<jupyter_output><empty_output><jupyter_text>La gran mayoría de los lugares han sido visitados entre 0 y 10 veces. Lo vemos en términos de órdenes de magnitud<jupyter_code>checkins_matrix.sum(axis=1).hist(log=True)<jupyter_output><empty_output><jupyter_text>Computar similaridades Vemos cómo se define la similaridad de Jaccard<jupyter_code>venue_1 = {1, 2, 4}
venue_2 = {3, 2, 4}
intersection = venue_1.intersection(venue_2)
len(intersection)
union = venue_1.union(venue_2)
len(union)
len(intersection) / len(union)
def jaccard_similarity(venue_1, venue_2):
    venue_1_user_indices = set( venue_1[venue_1 > 0].index )
    venue_2_user_indices = set( venue_2[venue_2 > 0].index )
    intersection_length = len(venue_1_user_indices.intersection(venue_2_user_indices))
    union_length = len(venue_1_user_indices.union(venue_2_user_indices))
    
    return intersection_length / union_length
def compute_pairwise_jaccard_similarities(query_venue_index):
    query_venue = checkins_matrix.ix[query_venue_index]
    candidate_venues = checkins_matrix.drop(query_venue_index, axis=0)
    similarities = {}
    
    for candidate_venue_id, candidate_venue in candidate_venues.iterrows():
        similarity = jaccard_similarity(query_venue, candidate_venue)
        similarities[candidate_venue_id] = similarity
        
    return pd.Series(similarities)<jupyter_output><empty_output><jupyter_text>Recomendar<jupyter_code>checkins_matrix.head()
while True:
    try:
        query_venue_index = int( input('Please enter a query venue index: ') )
        print( compute_pairwise_jaccard_similarities(query_venue_index).sort_values(ascending=False).head(5) )
    except:
        pass<jupyter_output>Please enter a query venue index: 26
2606      0.500000
12142     0.250000
96751     0.166667
32869     0.166667
407167    0.166667
dtype: float64
Please enter a query venue index: 15
119774    0.333333
43052     0.333333
19700     0.111111
11536     0.000000
11678     0.000000
dtype: float64
Please enter a query venue index: 36
46904      0.153846
1476       0.153846
1283376    0.142857
8613       0.105263
242095     0.100000
dtype: float64
{'fraction_non_alphanumeric': 0.10124968120377455, 'fraction_numerical': 0.05865850548329508, 'mean_word_length': 6.143897996357013, 'pattern_counts': {'":': 0, '<': 45, '<?xml version=': 0, '>': 47, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '193383', 'license': 'Apache-2.0', 'n_tokens_mistral': 1536, 'n_tokens_neox': 1402, 'n_words': 271, 'path': 'foursquare_checkins/foursquare_recomendacion.ipynb', 'repo_name': 'teanocrata/datascience-notebooks', 'size': '3926'}