# Simple user similarity in Julia vs Python

**URL:** <https://discourse.julialang.org/t/simple-user-similarity-in-julia-vs-python/53958>\
**Category:** New to Julia\
**Tags:** question, dataframes\
**Created:** [January 26, 2021, 8:21am UTC](https://discourse.julialang.org/t/simple-user-similarity-in-julia-vs-python/53958 "2021-01-26T08:21:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![danielw2904](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/danielw2904/32/10890_2.png) [@danielw2904](https://discourse.julialang.org/u/danielw2904)\
**Post date:** [January 26, 2021, 8:21am UTC](https://discourse.julialang.org/t/simple-user-similarity-in-julia-vs-python/53958/1 "2021-01-26T08:21:30Z")

</div>

I have a simple example in Python to get user similarities based on items they have interacted with.

```python
import pandas as pd
from sklearn.metrics.pairwise import euclidean_distances
item=["a", "b", "c", "a", "b", "a","b","c"]; user=[1,1,1,2,2,3,3,3]; value=[0,1,1,0,1,0,0,0]
df = pd.DataFrame({"item":item, "user":user, "value":value})
uimat = df.pivot("user", "item", "value").fillna(0)
uiusers = uimat.index
print(pd.DataFrame(euclidean_distances(uimat), index=uiusers, columns=uiusers))

```

And my equivalent code feels very clunky in comparison especially around handling missing values

```julia
import Pkg; Pkg.activate("dataframes")
using DataFrames, Distances, AxisArrays
item=["a", "b", "c", "a", "b", "a","b","c"]; user=[1,1,1,2,2,3,3,3]; value=[0,1,1,0,1, 0,0,0]
df = DataFrame(item =item, user=user, value=value)
ui = unstack(df, :user, :item, :value)
[replace!(ui[!, col], missing => 0) for col in names(ui)];
disallowmissing!(ui);
uiusers = ui.user
uiitems = names(ui)[2:end]
uiarray = AxisArray(Matrix(ui[!,2:end]), uiusers, uiitems)
AxisArray(pairwise(Euclidean(), uiarray, dims = 1), uiusers, uiusers)

```

I wonder if there is something I can improve upon? Maybe and alternative to switching from DataFrames to AxisArrays (my understanding is DataFrames does not support row names)?  
Thanks!

---

<div class="post-metadata">

**Author:** ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)\
**Post date:** [January 26, 2021, 8:27am UTC](https://discourse.julialang.org/t/simple-user-similarity-in-julia-vs-python/53958/2 "2021-01-26T08:27:12Z")

</div>

@bkamins: Maybe something you can help simplify? (hope you don’t mind the ping!)

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [January 26, 2021, 8:54am UTC](https://discourse.julialang.org/t/simple-user-similarity-in-julia-vs-python/53958/3 "2021-01-26T08:54:21Z")

</div>

There are two issues here:

1. replacing `missing` with `0` in `unstack`; allowing to specify a sentinel in `unstack` is something I planned to add in the future. Currently, if you want something shorter you could do: `df .= coalesce.(df, 0)`
2. regading the `pairwise` part - @nalimilan was recently working on improving it, but I do not remember now where the PR is - he probably can comment on the status of this work.

---

<div class="post-metadata">

**Author:** ![nalimilan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nalimilan/32/147_2.png) [@nalimilan](https://discourse.julialang.org/u/nalimilan)\
**Post date:** [January 26, 2021, 9:23am UTC](https://discourse.julialang.org/t/simple-user-similarity-in-julia-vs-python/53958/4 "2021-01-26T09:23:35Z")

</div>

My column-name-aware `pairwise` implementation is [in FreqTables](https://github.com/nalimilan/FreqTables.jl/pull/54) currently, but we first need to add the name-unaware version [in StatsBase](https://github.com/JuliaStats/StatsBase.jl/pull/627), find a lightweight interface package where to define `pairwise` so that Distances can override it without depending on StatsBase, and then decide whether FreqTables should use a more general name.

---

<div class="post-metadata">

**Author:** ![danielw2904](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/danielw2904/32/10890_2.png) [@danielw2904](https://discourse.julialang.org/u/danielw2904)\
**Post date:** [January 26, 2021, 9:34am UTC](https://discourse.julialang.org/t/simple-user-similarity-in-julia-vs-python/53958/5 "2021-01-26T09:34:09Z")

</div>

Thank you! `coalesce` is definitely nicer. I will keep track of the issues with `pairwise`.
