Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <Query Kind="Program">
- <NuGetReference>Extreme.Data</NuGetReference>
- <NuGetReference>Extreme.Data.Json</NuGetReference>
- <NuGetReference>Extreme.Numerics</NuGetReference>
- <NuGetReference>Extreme.Numerics.Generic</NuGetReference>
- <NuGetReference>Extreme.Numerics.SinglePrecision</NuGetReference>
- <Namespace>Extreme.Collections</Namespace>
- <Namespace>Extreme.Mathematics</Namespace>
- <Namespace>Extreme.Statistics.Multivariate</Namespace>
- <RemoveNamespace>System.Collections</RemoveNamespace>
- <RemoveNamespace>System.Data</RemoveNamespace>
- <RemoveNamespace>System.Diagnostics</RemoveNamespace>
- <RemoveNamespace>System.Linq.Expressions</RemoveNamespace>
- <RemoveNamespace>System.Reflection</RemoveNamespace>
- <RemoveNamespace>System.Text</RemoveNamespace>
- <RemoveNamespace>System.Text.RegularExpressions</RemoveNamespace>
- <RemoveNamespace>System.Threading</RemoveNamespace>
- <RemoveNamespace>System.Transactions</RemoveNamespace>
- <RemoveNamespace>System.Xml</RemoveNamespace>
- <RemoveNamespace>System.Xml.Linq</RemoveNamespace>
- <RemoveNamespace>System.Xml.XPath</RemoveNamespace>
- </Query>
- //sources
- //https://twitter.com/ClimateAudit/status/1326905529160126464
- //https://results.enr.clarityelections.com//MI/Oakland/105840/269402/reports/detailxls.zip
- //www.climateaudit.info/data/election/MI_Oakland-2020.csv
- public static void Main()
- {
- var dirpath = @"C:\Users\user\Desktop\Trump2020data\climateaudit\";
- var filenames = new List<string> { "MI_Oakland-2020.csv" };
- foreach (var filename in filenames)
- {
- var text = File.ReadAllText(dirpath + filename);
- var data = text.Split(Environment.NewLine).Select(i => i.Split(",")).Where(i => i.Count() > 1).Skip(1).ToList();//.Dump("data", 0);
- var results = data.Select((i, index) =>
- {
- int colindex = 0;
- return new PrecinctResult
- {
- index = index,
- name = i[colindex++].Replace(@"""", ""),
- StrAbsenteeD = double.Parse(i[colindex++]),
- StrElectionD = double.Parse(i[colindex++]),
- StrTotalD = double.Parse(i[colindex++]),
- StrAbsenteeR = double.Parse(i[colindex++]),
- StrElectionR = double.Parse(i[colindex++]),
- StrTotalR = double.Parse(i[colindex++]),
- StrAbsenteeO = double.Parse(i[colindex++]),
- StrElectionO = double.Parse(i[colindex++]),
- StrTotalO = double.Parse(i[colindex++]),
- StrVotesTotal = double.Parse(i[colindex++]),
- MixAbsenteeD = double.Parse(i[colindex++]),
- MixElectionD = double.Parse(i[colindex++]),
- MixTotalD = double.Parse(i[colindex++]),
- MixAbsenteeR = double.Parse(i[colindex++]),
- MixElectionR = double.Parse(i[colindex++]),
- MixTotalR = double.Parse(i[colindex++]),
- MixAbsenteeO = double.Parse(i[colindex++]),
- MixElectionO = double.Parse(i[colindex++]),
- MixTotalO = double.Parse(i[colindex++]),
- MixVotesTotal = double.Parse(i[colindex++]),
- TotAbsenteeD = double.Parse(i[colindex++]),
- TotElectionD = double.Parse(i[colindex++]),
- TotTotalD = double.Parse(i[colindex++]),
- TotAbsenteeR = double.Parse(i[colindex++]),
- TotElectionR = double.Parse(i[colindex++]),
- TotTotalR = double.Parse(i[colindex++]),
- TotAbsenteeO = double.Parse(i[colindex++]),
- TotElectionO = double.Parse(i[colindex++]),
- TotTotalO = double.Parse(i[colindex++]),
- TotVotesTotal = double.Parse(i[colindex++])
- };
- }).ToList();
- var array = new Array2D<double>(results.Count(), 4);
- //data.Dump();
- for (int r = 1; r < results.Count(); r++)
- {
- var colindex = 0;
- array[r, colindex++] = results[r].MixElectionD / results[r].TotVotesTotal;
- array[r, colindex++] = results[r].MixElectionR / results[r].TotVotesTotal;
- array[r, colindex++] = results[r].StrElectionD / results[r].TotVotesTotal;
- array[r, colindex++] = results[r].StrElectionR / results[r].TotVotesTotal;
- }
- //array.Dump(0);
- var m = Matrix.Create(results.Count(), 4, array, MatrixElementOrder.NotApplicable);
- PrincipalComponentAnalysis pca = new PrincipalComponentAnalysis(m);
- pca.Compute();
- for (int i = 0; i < pca.Components.Count(); i++)
- {
- PrincipalComponent component = pca.Components[i];
- Console.WriteLine("{0,2}{1,12:F4}{2,11:F4}{2,14:F3}%{3,10:F3}%",
- i, component.Eigenvalue, component.EigenvalueDifference,
- 100 * component.ProportionOfVariance,
- 100 * component.CumulativeProportionOfVariance);
- }
- for (int i = 0; i < pca.ScoreMatrix.Columns[0].Count(); i++)
- {
- results[i].PC1 = pca.ScoreMatrix.Columns[0][i];
- results[i].PC2 = pca.ScoreMatrix.Columns[1][i];
- results[i].PC3 = pca.ScoreMatrix.Columns[2][i];
- results[i].PC4 = pca.ScoreMatrix.Columns[3][i];
- //results[i].PC5 = pca.ScoreMatrix.Columns[4][i];
- }
- results = results.OrderBy(i => i.PC1).ToList().Dump(0);
- pca.Dump("pca",0);
- if (true)
- {
- var c = Util.Chart(Enumerable.Range(0, results.Count()));
- c.AddYSeries(i => results[i].StrElectionR, LINQPad.Util.SeriesType.Line, "StrElectionR");
- c.AddYSeries(i => results[i].MixElectionR, LINQPad.Util.SeriesType.Line, "MixElectionR");
- c.AddYSeries(i => results[i].StrElectionD, LINQPad.Util.SeriesType.Line, "StrElectionD");
- c.AddYSeries(i => results[i].MixElectionD, LINQPad.Util.SeriesType.Line, "MixElectionD");
- c.DumpInline($"{filename} ordered by PC1");
- }
- if (true)
- {
- var c = Util.Chart(Enumerable.Range(0, results.Count()));
- c.AddYSeries(i => results[i].StrElectionR / results[i].TotVotesTotal, LINQPad.Util.SeriesType.Line, "StrElectionR / TotVotesTotal");
- c.AddYSeries(i => results[i].MixElectionR / results[i].TotVotesTotal, LINQPad.Util.SeriesType.Line, "MixElectionR / TotVotesTotal");
- c.AddYSeries(i => results[i].StrElectionD / results[i].TotVotesTotal, LINQPad.Util.SeriesType.Line, "StrElectionD / TotVotesTotal");
- c.AddYSeries(i => results[i].MixElectionD / results[i].TotVotesTotal, LINQPad.Util.SeriesType.Line, "MixElectionD / TotVotesTotal");
- c.DumpInline($"{filename} ordered by PC1, divided by votescast");
- }
- }
- }
- class PrecinctResult
- {
- public int index;
- public string name;
- public Double StrAbsenteeD;
- public Double StrElectionD;
- public Double StrTotalD;
- public Double StrAbsenteeR;
- public Double StrElectionR;
- public Double StrTotalR;
- public Double StrAbsenteeO;
- public Double StrElectionO;
- public Double StrTotalO;
- public Double StrVotesTotal;
- public Double MixAbsenteeD;
- public Double MixElectionD;
- public Double MixTotalD;
- public Double MixAbsenteeR;
- public Double MixElectionR;
- public Double MixTotalR;
- public Double MixAbsenteeO;
- public Double MixElectionO;
- public Double MixTotalO;
- public Double MixVotesTotal;
- public Double TotAbsenteeD;
- public Double TotElectionD;
- public Double TotTotalD;
- public Double TotAbsenteeR;
- public Double TotElectionR;
- public Double TotTotalR;
- public Double TotAbsenteeO;
- public Double TotElectionO;
- public Double TotTotalO;
- public Double TotVotesTotal;
- public Double PC1;
- public Double PC2;
- public Double PC3;
- public Double PC4;
- public Double PC5;
- }
RAW Paste Data