Skip to content

Commit a79ced6

Browse files
kevmalCESARDELATORRE
authored andcommitted
fsharp customer segmentation example (#236)
1 parent 4dcfe4d commit a79ced6

20 files changed

+4035
-1
lines changed

Diff for: README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ The official ML.NET samples are divided in multiple categories depending on the
102102
</td>
103103
<td>
104104
<h4>Customer segmentation &nbsp;&nbsp;&nbsp;
105-
<a href="samples/csharp/getting-started/Clustering_CustomerSegmentation">C#</a> &nbsp;&nbsp;&nbsp;<img src="images/app-type-getting-started.png" alt="Getting started icon"></h4>
105+
<a href="samples/csharp/getting-started/Clustering_CustomerSegmentation">C#</a> &nbsp; &nbsp; <a href="samples/fsharp/getting-started/Clustering_CustomerSegmentation">F#</a>&nbsp;&nbsp;&nbsp;<img src="images/app-type-getting-started.png" alt="Getting started icon"></h4>
106106
<h4>Clustering Iris flowers &nbsp;&nbsp;&nbsp;
107107
<a href="samples/csharp/getting-started/Clustering_Iris">C#</a> &nbsp; &nbsp; <a href="samples/fsharp/getting-started/Clustering_Iris">F#</a>&nbsp;&nbsp;&nbsp;<img src="images/app-type-getting-started.png" alt="Getting started icon"></h4>
108108
</td>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>netcoreapp2.1</TargetFramework>
6+
</PropertyGroup>
7+
8+
<ItemGroup>
9+
<Compile Include="Program.fs" />
10+
</ItemGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="Microsoft.ML" Version="0.9.0" />
14+
<PackageReference Include="OxyPlot.Core" Version="1.0.0" />
15+
</ItemGroup>
16+
17+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
open System
2+
open System.IO
3+
open Microsoft.ML
4+
open Microsoft.ML.Data
5+
open OxyPlot.Series
6+
open OxyPlot
7+
open System.Diagnostics
8+
9+
let dataRoot = FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location)
10+
11+
let printHeader lines =
12+
let defaultColor = Console.ForegroundColor
13+
Console.ForegroundColor <- ConsoleColor.Yellow
14+
printfn " "
15+
lines |> Seq.iter (printfn "%s")
16+
let maxLength = lines |> Seq.map (fun x -> x.Length) |> Seq.max
17+
printfn "%s" (String('#', maxLength))
18+
Console.ForegroundColor <- defaultColor
19+
20+
let printExn lines =
21+
let defaultColor = Console.ForegroundColor
22+
Console.ForegroundColor <- ConsoleColor.Red
23+
printfn " "
24+
printfn "EXCEPTION"
25+
printfn "#########"
26+
Console.ForegroundColor <- defaultColor
27+
lines |> Seq.iter (printfn "%s")
28+
29+
let savePivotData offersCsv transactionsCsv pivotCsv =
30+
printHeader ["Preprocess input files"]
31+
printfn "Offers file: %s" offersCsv
32+
printfn "Transactions file: %s" transactionsCsv
33+
let pivotData =
34+
File.ReadAllLines(transactionsCsv)
35+
|> Seq.skip 1 //skip header
36+
|> Seq.map
37+
(fun x ->
38+
let fields = x.Split ','
39+
fields.[0] , int fields.[1] // Name, Offer #
40+
)
41+
|> Seq.groupBy fst
42+
|> Seq.map
43+
(fun (k, xs) ->
44+
let offers = xs |> Seq.map snd |> Set.ofSeq
45+
[
46+
yield! Seq.init 32 (fun i -> if Seq.contains (i + 1) offers then "1" else "0")
47+
yield k
48+
]
49+
|> String.concat ","
50+
)
51+
File.WriteAllLines(pivotCsv,
52+
seq {
53+
yield [
54+
yield! Seq.init 32 (fun i -> sprintf "C%d" (i + 1))
55+
yield "LastName"
56+
] |> String.concat ","
57+
yield! pivotData
58+
})
59+
60+
[<CLIMutable>]
61+
type ClusteringPrediction =
62+
{
63+
[<ColumnName("PredictedLabel")>]
64+
SelectedClusterId : uint32
65+
[<ColumnName("Score")>]
66+
Distance : float32 []
67+
[<ColumnName("PCAFeatures")>]
68+
Location : float32 []
69+
[<ColumnName("LastName")>]
70+
LastName : string
71+
}
72+
73+
let savePlot (predictions : ClusteringPrediction []) (plotSvg : string) =
74+
printHeader ["Plot Customer Segmentation"]
75+
let pm = PlotModel(Title = "Customer Segmentation", IsLegendVisible = true)
76+
predictions
77+
|> Seq.groupBy (fun x -> x.SelectedClusterId)
78+
|> Seq.sortBy fst
79+
|> Seq.iter
80+
(fun (cluster,xs) ->
81+
let scatter =
82+
ScatterSeries
83+
(MarkerType = MarkerType.Circle,
84+
MarkerStrokeThickness = 2.0,
85+
Title = sprintf "Cluster: %d" cluster,
86+
RenderInLegend = true )
87+
xs
88+
|> Seq.map (fun x -> ScatterPoint(double x.Location.[0], double x.Location.[1]))
89+
|> scatter.Points.AddRange
90+
pm.Series.Add scatter
91+
)
92+
pm.DefaultColors <- OxyPalettes.HueDistinct(pm.Series.Count).Colors
93+
let exporter = SvgExporter(Width = 600.0, Height = 400.0)
94+
use f = File.OpenWrite(plotSvg)
95+
exporter.Export(pm,f)
96+
printfn "Plot location: %s" plotSvg
97+
98+
[<EntryPoint>]
99+
let main _argv =
100+
let assetsPath = Path.Combine(dataRoot.Directory.FullName, @"..\..\..\assets")
101+
let pivotCsv = Path.Combine(assetsPath, "inputs", "pivot.csv")
102+
let modelZipFilePath = Path.Combine(assetsPath, "inputs", "retailClustering.zip")
103+
let plotSvg = Path.Combine(assetsPath, "outputs", "customerSegmentation.svg")
104+
let plotCsv = Path.Combine(assetsPath, "outputs", "customerSegmentation.csv")
105+
try
106+
let mlContext = MLContext(seed = Nullable 1); //Seed set to any number so you have a deterministic result
107+
108+
//Create the clusters: Create data files and plot a char
109+
let model =
110+
use f = File.OpenRead modelZipFilePath
111+
mlContext.Model.Load(f)
112+
113+
let reader =
114+
mlContext.Data.CreateTextReader(
115+
columns =
116+
[|
117+
TextLoader.Column("Features", Nullable DataKind.R4, [| TextLoader.Range(0, Nullable 31) |])
118+
TextLoader.Column("LastName", Nullable DataKind.Text, 32)
119+
|],
120+
hasHeader = true,
121+
separatorChar = ',')
122+
123+
let data = reader.Read(pivotCsv)
124+
125+
//Apply data transformation to create predictions/clustering
126+
let predictions = model.Transform(data).AsEnumerable<ClusteringPrediction>(mlContext, false) |> Seq.toArray
127+
128+
//Generate data files with customer data grouped by clusters
129+
printHeader ["CSV Customer Segmentation"]
130+
File.WriteAllLines(plotCsv,
131+
seq {
132+
yield "LastName,SelectedClusterId"
133+
yield! predictions |> Seq.map (fun x -> sprintf "%s,%d" x.LastName x.SelectedClusterId)
134+
})
135+
printfn "CSV location: %s" plotCsv
136+
137+
//Plot/paint the clusters in a chart and open it with the by-default image-tool in Windows
138+
savePlot predictions plotSvg
139+
140+
printfn "Showing chart..."
141+
ProcessStartInfo(plotSvg, UseShellExecute = true)
142+
|> Process.Start
143+
|> ignore
144+
145+
with
146+
| ex -> printExn [ex.Message]
147+
148+
let defaultColor = Console.ForegroundColor
149+
Console.ForegroundColor <- ConsoleColor.Green
150+
printfn " "
151+
printfn "Press any key to finish."
152+
Console.ForegroundColor <- defaultColor
153+
Console.ReadKey() |> ignore
154+
0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,LastName
2+
1,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,Thomas
3+
1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,Jackson
4+
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Mitchell
5+
1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,Peterson
6+
1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,Wood
7+
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,Price
8+
1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,Foster
9+
1,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,Sanders
10+
1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,Butler
11+
1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,1,0,Fisher
12+
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,Smith
13+
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,Rodriguez
14+
0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,Martin
15+
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,Campbell
16+
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,Bell
17+
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,Cox
18+
0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,Lee
19+
0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,Nelson
20+
0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,Rogers
21+
0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,Richardson
22+
0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,Brooks
23+
0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Long
24+
0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,Harris
25+
0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,Clark
26+
0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,Sanchez
27+
0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,Wright
28+
0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,Turner
29+
0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,Cooper
30+
0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Ward
31+
0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Reed
32+
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Powell
33+
0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,Miller
34+
0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,Young
35+
0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,Scott
36+
0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,Kelly
37+
0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,Morales
38+
0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Gutierrez
39+
0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,Brown
40+
0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,Taylor
41+
0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,Lewis
42+
0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,Robinson
43+
0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,King
44+
0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Green
45+
0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,Baker
46+
0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,Carter
47+
0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Murphy
48+
0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Rivera
49+
0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,Bailey
50+
0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,Diaz
51+
0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,Watson
52+
0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,James
53+
0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,Hughes
54+
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Jones
55+
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,Wilson
56+
0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,Hill
57+
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Torres
58+
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,Edwards
59+
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,Stewart
60+
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,Morgan
61+
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,Bennett
62+
0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Sullivan
63+
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Ortiz
64+
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,Perry
65+
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,Thompson
66+
0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,Lopez
67+
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,Gonzalez
68+
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,Allen
69+
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Ramirez
70+
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,Reyes
71+
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,Barnes
72+
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,Hall
73+
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,Parker
74+
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,Collins
75+
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,Gomez
76+
0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,Howard
77+
0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,Davis
78+
0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,Martinez
79+
0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,Gray
80+
0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Garcia
81+
0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,White
82+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,Johnson
83+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,Moore
84+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,Phillips
85+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,Flores
86+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,Morris
87+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,Williams
88+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,Walker
89+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,Perez
90+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,Adams
91+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,Myers
92+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,Ross
93+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,Nguyen
94+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,Evans
95+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,Anderson
96+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,Cook
97+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,Jenkins
98+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,Russell
99+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,Hernandez
100+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,Cruz
101+
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,Roberts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
LastName,SelectedClusterId
2+
Thomas,2
3+
Jackson,2
4+
Mitchell,3
5+
Peterson,3
6+
Wood,2
7+
Price,2
8+
Foster,2
9+
Sanders,2
10+
Butler,2
11+
Fisher,2
12+
Smith,3
13+
Rodriguez,3
14+
Martin,3
15+
Campbell,3
16+
Bell,3
17+
Cox,3
18+
Lee,2
19+
Nelson,3
20+
Rogers,3
21+
Richardson,3
22+
Brooks,3
23+
Long,3
24+
Harris,3
25+
Clark,2
26+
Sanchez,2
27+
Wright,3
28+
Turner,3
29+
Cooper,3
30+
Ward,3
31+
Reed,3
32+
Powell,3
33+
Miller,2
34+
Young,2
35+
Scott,3
36+
Kelly,3
37+
Morales,3
38+
Gutierrez,3
39+
Brown,1
40+
Taylor,1
41+
Lewis,1
42+
Robinson,1
43+
King,1
44+
Green,3
45+
Baker,3
46+
Carter,1
47+
Murphy,3
48+
Rivera,1
49+
Bailey,1
50+
Diaz,1
51+
Watson,1
52+
James,1
53+
Hughes,1
54+
Jones,3
55+
Wilson,1
56+
Hill,1
57+
Torres,3
58+
Edwards,3
59+
Stewart,1
60+
Morgan,1
61+
Bennett,1
62+
Sullivan,1
63+
Ortiz,3
64+
Perry,1
65+
Thompson,3
66+
Lopez,3
67+
Gonzalez,3
68+
Allen,3
69+
Ramirez,3
70+
Reyes,3
71+
Barnes,3
72+
Hall,3
73+
Parker,3
74+
Collins,3
75+
Gomez,3
76+
Howard,3
77+
Davis,3
78+
Martinez,3
79+
Gray,3
80+
Garcia,3
81+
White,2
82+
Johnson,3
83+
Moore,3
84+
Phillips,3
85+
Flores,3
86+
Morris,3
87+
Williams,3
88+
Walker,1
89+
Perez,1
90+
Adams,1
91+
Myers,1
92+
Ross,3
93+
Nguyen,3
94+
Evans,3
95+
Anderson,3
96+
Cook,3
97+
Jenkins,3
98+
Russell,3
99+
Hernandez,1
100+
Cruz,1
101+
Roberts,3

0 commit comments

Comments
 (0)