<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: RGEv1L</title>
    <description>The latest articles on DEV Community by RGEv1L (@akhan).</description>
    <link>https://dev.to/akhan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F639301%2F851b7686-dc49-4a46-a871-6de9a3a74856.jpeg</url>
      <title>DEV Community: RGEv1L</title>
      <link>https://dev.to/akhan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akhan"/>
    <language>en</language>
    <item>
      <title>Credit Card Purchasing Analysis [ML]</title>
      <dc:creator>RGEv1L</dc:creator>
      <pubDate>Wed, 30 Mar 2022 12:23:32 +0000</pubDate>
      <link>https://dev.to/akhan/credit-card-purchasing-analysis-ml-421o</link>
      <guid>https://dev.to/akhan/credit-card-purchasing-analysis-ml-421o</guid>
      <description>&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;We are going to analyze the credit data and for what purpose people use it for, using German credit card data, published by UCL. The data set contains the following fields:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Age (numeric)&lt;/li&gt;
&lt;li&gt;Sex (text: male, female)&lt;/li&gt;
&lt;li&gt;Job (numeric: 0 - unskilled and non-resident, 1 - unskilled and resident, 2 – skilled, 3 - highly skilled)&lt;/li&gt;
&lt;li&gt;Housing (text: own, rent, or free)&lt;/li&gt;
&lt;li&gt;Saving accounts (text - little, moderate, quite rich, rich)&lt;/li&gt;
&lt;li&gt;Checking account (numeric, in DM - Deutsch Mark)&lt;/li&gt;
&lt;li&gt;Credit amount (numeric, in DM)&lt;/li&gt;
&lt;li&gt;Duration (numeric, in month)&lt;/li&gt;
&lt;li&gt;Purpose (text: car, furniture/equipment, radio/TV, domestic appliances, repairs, 10. education, business, vacation/others)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This problem could be subjected to multi-class analysis, but we are going to try it as a clustering problem. Why as a clustering problem you say? Because, lets say we have to normalize the data in-term of what would be the better approach to divide underlying customers in groups. Marketing segmentation relies heavily on segmenting their customers to get a better understanding of a group. As in this database, there are many columns that describes a behavior of a user in-terms of what is his gender, how much credits a person has used, how much money he has in his savings account etc. We are more interested in how to draw a boundary to grip the problem and deduce results based on groups. Why groups? So, that we can understand better in terms of what is the general trend of buying in these groups. Lets, say you introduce a new user to the record, with a help of a little bit of history with the system, you would be able to pitch a better loan scheme to a customer in a group.&lt;/p&gt;

&lt;p&gt;The Data set looks like this upon show() command:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E68iS5tl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yax69qzp9whnidzq0q1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E68iS5tl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yax69qzp9whnidzq0q1v.png" alt="Image description" width="880" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lets check the minimum, maximum, average “Age” of the user/s in the data set.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5dhsbzk7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3vnb3y9ra5yow30fi8q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5dhsbzk7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3vnb3y9ra5yow30fi8q.png" alt="Image description" width="368" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lets check the minimum, maximum, average Credit Amount Spent” of the user/s in the data set.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mmAxpnDN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1awuh7bkqz4xulam85oz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mmAxpnDN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1awuh7bkqz4xulam85oz.png" alt="Image description" width="387" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lets start the most trivial categorization used in market segmentation, i-e segmentation done using gender, to see if that works.&lt;/p&gt;

&lt;p&gt;To start with, lets check the average amount of credits spent by gender:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---RhA5YLe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mpevmb44z9bqu3yid0kj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---RhA5YLe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mpevmb44z9bqu3yid0kj.png" alt="Image description" width="381" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can see a little bit of difference in average credit spent. Lets check the trends in buying and total credit spent on each category, for both genders:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HNI2ukax--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e0hjy9say5mjy9yvdhqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HNI2ukax--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e0hjy9say5mjy9yvdhqs.png" alt="Image description" width="469" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sPmw3rFd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqli20wstx79f3lli151.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sPmw3rFd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqli20wstx79f3lli151.png" alt="Image description" width="466" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We got two type of differentiation. First, one is the total credits spent on each category and the second one is the top 2nd and 3rd category is different for both. First offset is maybe due to difference in average credit spent, as scene above, but the second differentiation is based on what is the buying trend using credit amount. For Females the 2nd most favorite is “furniture/equipment” category and for males it is “radio/TV”.&lt;/p&gt;

&lt;p&gt;We got a differentiation, but its not much to base all of the recommendations for loans etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lets start Clustering:
&lt;/h2&gt;

&lt;p&gt;We used Apache Spark as the framework and Kmeans for clustering the data. Since, we have so many categorical variables, like  Housing/ Saving accounts etc, we had to first index these string columns to numeric classes using Spark’s “StringIndexer” and then transform into feature vectors. These feature vectors were then fed to the Kmeans algorithm. The Kmeans algorithm was trained for k = 2 up-to k = 6. The error scores for each iteration are given below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1Dsm79UW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ee1emapogpql5ztf41gk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1Dsm79UW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ee1emapogpql5ztf41gk.png" alt="Image description" width="392" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We selected k = 3 as it drops the error rate significantly and next iterations doesn’t really provides much reduction in the error. The results for k = 3 are:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fuR9WG2Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/34ttkh671a1p4tfsvnq7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fuR9WG2Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/34ttkh671a1p4tfsvnq7.png" alt="Image description" width="880" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lets visualize and find trends in Group 0,1 and 2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fyo4aDUT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/si4kuuly51t8uaro43f1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fyo4aDUT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/si4kuuly51t8uaro43f1.png" alt="Image description" width="468" height="262"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--47_erojV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cht0jlbtiwju1w3845ny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--47_erojV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cht0jlbtiwju1w3845ny.png" alt="Image description" width="468" height="262"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ezG8LO-E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x1m5rkf42orshgmozmrr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ezG8LO-E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x1m5rkf42orshgmozmrr.png" alt="Image description" width="468" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We got three advantages by introducing clustering. The groups have successfully eliminated the average credit amount spend differentiation. Now, each group has different representation of trends in credit amount spend. But, here’s the catch. I looked up the total users spending on a category in each group, what I found out was there was a group, far significant in number but dominating all three categories in terms of credit spent on “cars”. So, lets explore it by average credits spent on each category for each group.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wBczR7z2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7fvxavn5sevzn22gtr27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wBczR7z2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7fvxavn5sevzn22gtr27.png" alt="Image description" width="468" height="262"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Nz2XO58e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eqrix8skxya43wnogor3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Nz2XO58e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eqrix8skxya43wnogor3.png" alt="Image description" width="467" height="262"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D0HaUgmG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iyqsy8nkm9julh1he36r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D0HaUgmG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iyqsy8nkm9julh1he36r.png" alt="Image description" width="468" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voila, not only each group spent differently on each category on average, we can distinguish by this demarcation, about whats the most aggressively bought item for each category………….&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GRAPH vs SQL vs NoSQL Part 2: Benchmarks</title>
      <dc:creator>RGEv1L</dc:creator>
      <pubDate>Fri, 21 Jan 2022 21:19:01 +0000</pubDate>
      <link>https://dev.to/akhan/graph-vs-sql-vs-nosql-part-2-benchmarks-k9i</link>
      <guid>https://dev.to/akhan/graph-vs-sql-vs-nosql-part-2-benchmarks-k9i</guid>
      <description>&lt;p&gt;Let’s move things out of theories and designs and check what actually these constructs can perform. So. I chose one database from each category to test out some standard and complex queries. Test databases are as follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Neo4j -&amp;gt; Graph&lt;/li&gt;
&lt;li&gt;PostgreSQL -&amp;gt; SQL&lt;/li&gt;
&lt;li&gt;Apache Cassandra - &amp;gt; NoSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Licensing:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;All of them are flagship products of their own categories. PostgreSQL and Cassandra are fully open-source. Neo4j is open-core and floats a free community edition.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Schema:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Neo4j is schema-less but it is better to define labels to group nodes for faster speed. &lt;/li&gt;
&lt;li&gt;Cassandra is NoSQL but requires a schema up-front. &lt;/li&gt;
&lt;li&gt;PostgreSQL also requires a schema.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data/Key Partitioning:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Neo4j doesn't support data partitioning, but labels provide nodes grouping for faster operations. Neo4j only supports Vertical Scaling with Read-Replica support. &lt;/li&gt;
&lt;li&gt;PostgreSQL doesn’t have any data partitioning mechanism, so vertical scaling with read-replicas support only.&lt;/li&gt;
&lt;li&gt;Cassandra splits data based on primary or composite key across clusters. So, both horizontal and vertical scaling is available.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Benchmark:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Test Setup: T3.Small, 2 vCPUs, 2 GB RAM, 10 GB EBS General Purpose SSD&lt;br&gt;
Test Instances: One instance for each DB Engine&lt;br&gt;
Test Dataset: 65.2 MB (Personality 2018)&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Results:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i8PeokUe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ehtcxynal024vnovrflo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i8PeokUe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ehtcxynal024vnovrflo.png" alt="Image description" width="482" height="290"&gt;&lt;/a&gt;&lt;br&gt;
This result includes combined time for import of both files in the respective databases. Cassandra took a lot of time. Good amount of searching concluded that there is another open-source tool available for bulk-loading CSVs in Cassandra. I used built-in mechanisms for benchmarking purposes only.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dxFWdcbD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/68okniilch5k0q6s3eyf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dxFWdcbD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/68okniilch5k0q6s3eyf.png" alt="Image description" width="482" height="290"&gt;&lt;/a&gt;&lt;br&gt;
 This result contains total time to it took for all of three to count all of the available ratings. Neo4j did an exceptional job snice the traversal was only within “RATINGS” label. Postgres did great also since the traversal was within “Ratings” table only. Cassandra had to open-up each range-key for the traversal that slowed it down a bit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UCRN9AB1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dtx2ovnltpg9na6ym1kz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UCRN9AB1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dtx2ovnltpg9na6ym1kz.png" alt="Image description" width="482" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This result explores all of the ratings greater than “4”. Postgres and Neo4j yielded similar results based on contained traversal. Cassandra cached up quite well because of distributed aggregated functions processing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5ywBIpsY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q7oi7wfpfc72pbzo3nmh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5ywBIpsY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q7oi7wfpfc72pbzo3nmh.png" alt="Image description" width="482" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This traversal includes one table access with a foreign key match at one instance only for a user in Postgres “ratings” table. For Cassandra, it was just a composite key match. Neo4j didn’t perform well, due to the traversal of nodes and relationships for the first time. The same subsequent request yielded scores even lower than PostgreSQL. Neo4j is highly memory-centric and utilizes it well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qigUj11e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wf2ycnw4cc7849bchuzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qigUj11e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wf2ycnw4cc7849bchuzi.png" alt="Image description" width="482" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This involves access pattern just like above example, but with a more aggressive stats function. Return times are quite similar based on prediction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vsKXG4Mk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n6u58xuj78st7m9t3tvg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vsKXG4Mk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n6u58xuj78st7m9t3tvg.png" alt="Image description" width="482" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a complex query with complex access patterns. This is two table accesssses for PostgreSQL. It has to collect the number of users with ratings greater than 3 in the “Ratings” table and agreeableness &amp;gt; 7 in the “Users” table. It has to perform a join operation, hence taking more time for a complex query. For Cassandra, it was two sort keys lookup and then collect users with rating &amp;gt; 3 and agreeableness &amp;gt; 7 within the same table. Hence, relatively faster results than any SQL database. Neo4j performed marvelously due to its pre-embedding of nodes and relationships. Although, it involves scanning two set of labels, “PERSON” and “RATINGS”, the traversal or jumps between these two nodes is pre-embedded by a relationship between then. This relationship embedding not only allows faster complex queries but offers much more complex operations that no other DB could even perform.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Other Capabilities:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cassandra is a columnar database that distributes its keys among shards to achieve horizontal scaling. So, up till a point, where your table has millions of rows, your SQL solutions can work, but after that you would see degraded query performance. Cassandra is for Big Data which distributes data horizontally and also supports a huge amount of column numbers.&lt;/li&gt;
&lt;li&gt;Neo4j is built with a graph visualization browser tool that helps in the deep analysis of your loaded data. Apart from that, Neo4j also contains rich library for AI-based graph analysis that further helps in digging deeper into the data for analysis purposes.Neo4j also keeps a subset of warm data in memory for faster access.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Graph vs SQL vs NoSQL Part 1: Theory</title>
      <dc:creator>RGEv1L</dc:creator>
      <pubDate>Fri, 21 Jan 2022 21:13:54 +0000</pubDate>
      <link>https://dev.to/akhan/graph-vs-sql-vs-nosql-part-1-2cap</link>
      <guid>https://dev.to/akhan/graph-vs-sql-vs-nosql-part-1-2cap</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;SQL:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The age-old standing solution to persist data in a query-able manner has stood the test of time. It started with Web 1.0 and is still serving in Web 2.0. SQL databases store data where rows placement takes precedent over the columns, i-e singular rows are expected to be of more importance to ensure foreign key constraints across tables. This ensures the strong consistency of keys within the table and across the tables as well. Moreover, SQL provides a lot of precise filters to operate on attributes within the table and complex joins to go beyond a table. It also provides enriched features to what goes within your table, I-e you can define constraints other than your keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;NoSQL:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;NoSQL originated with the birth of Web 2.0. Web 2.0 became quickly abundant with data at rest and in transit. SQL faced dire consequences of the bulk of load moving in and out. Those were the few challenges that were faced by SQL databases. NoSQL tackled the problem by being able to shard horizontally. But, in order to be able to shard horizontally, shards used the concept of hash maps to distribute table keys. Columns took exclusive precedence instead of rows for the access pattern. This had a reason, in order to bulk load values, the row-by-row access pattern had to be removed. It solved two problems, the first one being bulk loading data by fetching the entire columns and the other one being column values share more resemblance than row values, so, it yelled better compression ratios. But data embedding and establishing relations across tables became a problem since there is no foreign key to extend the relations. This was partially solved by the massive reduction in storage prices. NoSQL SQL proffered storing data with relations within the same table even if it meant replication of some attributes to favor speed. NoSQL doesn’t provide constraints on attributes. So, a faster speed with a less grip on the data than SQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Graph:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Graph databases contain a mix of both two. Based on graph theory, it uses a linked-list data structure that captures the qualities of SQL and NoSQL databases. Graph databases provide precedence over the row operations but distribute the entities by hashed node ids. It provides NoSQL-like columnar distribution but has relations to serve as foreign keys to establish relationships with different entities without creating replicated data. Complex join operations requiring foreign keys are replaced with an already established path between nodes, called relationships. Labels are just a columnar grouping of nodes with a logical category that speeds up columnar queries. It provides constrains on attributes as well and is still schema-less like NoSQL but provides the grip of data like SQL.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Virtual WorkSpaces for Remote Teams: Match your team’s needs without buying hardware</title>
      <dc:creator>RGEv1L</dc:creator>
      <pubDate>Fri, 21 Jan 2022 21:03:59 +0000</pubDate>
      <link>https://dev.to/akhan/virtual-workspaces-for-remote-teams-match-your-teams-needs-without-buying-hardware-228b</link>
      <guid>https://dev.to/akhan/virtual-workspaces-for-remote-teams-match-your-teams-needs-without-buying-hardware-228b</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Intro:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Building and managing remote teams can be painful if you are not fully equipped with the right tools for it. Matching the computer and storage needs for your team members has always been challenging, and one of the worst parts is that it is constantly changing, and the other being providing IT support for the remote laptops that have gone bad. The big-fat laptops that you just bought for the worst-case scenario aren’t going to keep up with the resource demand for long, and your IT administrator won’t be happy traveling to remote resource's homes to fix their laptops. So, how can you avoid buying expensive hardware and still equip your team with the ability to handle the changing resources demands and have IT provide support? Moving to Virtual Environments is your best option.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Options:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;All the premier cloud-services providers provide virtual workspaces in order to help remote teams in provisioning scalable resources on-demand and monthly/yearly reserved. You can spin up a remote Windows or Linux environment in minutes and quickly scale it up and down based on what your team requires. AWS provides Linux powered Workspaces, starting from 21$/month, and Windows Powered Workspaces, starting from 25$/month. The cheapest, workable, browsing-capable laptops that won’t lift the top of your head while working starts from 250$. You get a cloud-environment that is manageable by your IT guy and can scale it up and down based on your team’s demand. However, there is more to that.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Benefits:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Secure authorization&lt;/li&gt;
&lt;li&gt;Managed accounts&lt;/li&gt;
&lt;li&gt;Scale CPU/MEM/STORAGE on demand&lt;/li&gt;
&lt;li&gt;Automated backups&lt;/li&gt;
&lt;li&gt;Return Workspaces if not needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Limitations:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If your team is low in count per region, example if you have 3 people joining from Middle-East, 2 people joining from South-America, 5 people from North-America and 3 people joining from India, Spinning up domain controllers in each region will sky-rocket the price crazy. To avoid it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go with AWS WorkDocs for directory service wherever it is available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If WorkDocs is not available, spin Active directory service if the number of users is greater than 5 for that region.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If both of the above conditions are not met, your are far better with spinning up an EC2.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Deep Dive:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Managed Workspaces, provided by cloud services providers, are a great choice if you don’t want to manage Virtual Workspaces. Also, you can expect everything from increasing CPUs, memory, and storage to automated-backups, secure-logins, etc. should be a click away. But if you really want to double-down on cost and performance, you can move to provision your own Virtual Machine by setting up remote procedures, setup users and their resource quotas, and you are good to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Stacked Workspaces vs Single user Workspace:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Setting up a single workspace for each team member is certainly more easily manageable and less of an administrative hurdle. However, it tends to waste resources as well. Each single workspace you provision is going to have its own boiler-plate resources that are inevitable. If you provision 50 managed workspaces, that would be 50 cores and ~100 GB of RAM wasted to run the individual operating system on each workspace. On the other hand, the lesser-known fact is that not all the users are going to use 100% of the provisioned CPU and Memory all the time. Most of the time, the resources will sit idle. It is a common practice to provision a 16 core VM and assign 20 users to it. This works fine because 1 core is spared for OS, and 15 cores is still an overkill for 20 users working on excel or browsing etc. So, in order to stack a team of 50, a 48 core VM is more than enough to host 50 users if building for worst-case scenario.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Let's discuss requirements:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AWS Workspace for Linux with 2 cores / 4 GB / 90 GB is about 29$ per user. Keep in mind that only 2.5 – 3 GB of RAM and 1 core is fully available to the end user only. For 50 users, that would be 1450$/month.&lt;/li&gt;
&lt;li&gt;AWS EC2 with 32 cores / 128 GB RAM / 5 TB   ~ 1200$/month.&lt;/li&gt;
&lt;li&gt;Most budget-friendly laptop with $250 price tag for 50 users is 12500$&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Additional Options:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What to do with VM after working hours? With your own managed VM, working hours are usually 8-10 hours out of 24 hours. So, still you are going to waste your Managed / Un-managed workspace for 2/3 of the day that you already paid for. With a single instance with a huge core count, you can put it to good use. You can use the same VM for rendering, conversion, compression, ML, DL, and many more jobs that require huge resources stacked in a single VM. You can’t do that with your managed workspaces. So, here is the additional, not-so-talked advantage of having your own instance at your disposal.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;At the end, it depends on what your exact requirement is, and how much responsibility you want to take while managing resources for your remote teams. Assigning laptops is still fine if you don’t care about budget, and your team is good enough to take care of their devices. Managed workspaces are for ease of use with flexibility and no up-front. Managing your own VM is when you want to utilize your money properly and extracting almost everything you are paying for. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Additional Life-Saver Notes:&lt;/strong&gt;&lt;br&gt;
-Prepare a base-line for Windows-Server and Linux with GUI (XFCE4) with common packages like firefox, 7zip, vscode etc and dont add any users. Create an AMI and you can take it to whatever region for re-deployment. Install additional packages later as per users requirements.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Super-Grouping Users with Big Five Personality Clustering</title>
      <dc:creator>RGEv1L</dc:creator>
      <pubDate>Tue, 18 Jan 2022 16:51:10 +0000</pubDate>
      <link>https://dev.to/akhan/super-grouping-users-with-big-five-personality-clustering-58ge</link>
      <guid>https://dev.to/akhan/super-grouping-users-with-big-five-personality-clustering-58ge</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ERLOQOOL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n1xxny6opak7wy32638u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ERLOQOOL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n1xxny6opak7wy32638u.png" alt="Image description" width="685" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Human behavior is of tremendous importance of tracking behavior from daily life behavior to tracking possibility of diseases. It is currently a hot topic in research domains to enhance user experience based on their behavior. World wide web needs some sort of markers to suggest content based on user personality type. The Big Five personality model has been the most successful empirical model to analyze personality of an individual. We can segregate users based on their personality type by asking questions that are curated based on years of tested research in the domain of psychology. There are five baseline traits that the model identifies and attribute some characteristics associated with these traits. Traits are:&lt;br&gt;
    1. Contentiousness&lt;br&gt;
    2. Openness&lt;br&gt;
    3. Extraversion&lt;br&gt;
    4. Agreeableness&lt;br&gt;
    5. Neuroticism&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Super-Grouping?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Tracking human behavior from patterns found in questionnaires is a tedious job. But, years of research in psychology have made it possible to extract patterns. Grouping these outcomes is another job. From common sense, we know that we are all distinct in our behavior, but we share a lot of common behavioral patterns and yet we only focus on tiny differences. We can be still grouped together on the basis of similar patterns. Big 5 just provide us with an empirical scale to map patterns of behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Methodology&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It is a problem of clustering. We can group user base based on their scores in each trait. The scale we are going to use is “International Personality Item Pool – FFM (IPIP-FFM)-50” which consists of 50 questions which add value to these traits. The end result gives us scores in these traits. The dataset we are going to use is IPIP-FFM-data-8Nov2018.&lt;/p&gt;

&lt;p&gt;The Machine learning algorithm in use is going to be unsupervised clustering which will segregate user-base based on their Euclidian distance from their trait scores. The problem at hand is whether we can segregate user-base using predetermined KNN algorithm where K has to be identified. But, the research doesn’t point to a fixed value of K. There could be another approach of X-Means algorithm where cluster itself defines the number of clusters based on appropriate differentiation. The scale used to score items is from the official ipip.ori.org website &lt;a href="https://ipip.ori.org/newBigFive5broadKey.htm"&gt;https://ipip.ori.org/newBigFive5broadKey.htm&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Jupyter Notebook and Python&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Jupyter makes it easy to break the code into chunks of functional code with meaningful incremental data output. Python libraries uses are &lt;br&gt;
    • scikit-learn from Google&lt;br&gt;
    • numpy for linear algebra&lt;br&gt;
    • matplotlib for plotting 2D graphs&lt;br&gt;
    • seaborn for high level visualization&lt;br&gt;
    • os for directory read/write ops&lt;br&gt;
    • yellowbricks for distortion score visualization&lt;/p&gt;

&lt;p&gt;Rest of the python code from Jupyter notebook is attached with the project files.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Demonstration&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;First, we had to open the csv file and cleanse the data with partial entries, so that we could perform operations on complete dataset only. The number of participants after this operation were 1013481. &lt;/p&gt;

&lt;p&gt;Then we plotted users from their respective countries on the graph. Users on y-axis and countries on x-axis:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rfi7sXpJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvpv94lrm991nci187uw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rfi7sXpJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvpv94lrm991nci187uw.png" alt="Image description" width="691" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using sklearn to form clusters and yellowbricks to visualize the results of cluster distortion for different values of K (from 2 to 15). As the graph below shows the best value is 5 for K&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mstsgdaB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hanaqrv88krub417kt8a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mstsgdaB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hanaqrv88krub417kt8a.png" alt="Image description" width="692" height="413"&gt;&lt;/a&gt;&lt;br&gt;
Using K=5 for personality clusters, we that started to train our model by inserting the dataset to K-Means clustering algorithm. At the end we get users from different ranges into their cluster group.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BKd7oReJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iniituci0j3x4jltsbv1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BKd7oReJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iniituci0j3x4jltsbv1.png" alt="Image description" width="645" height="180"&gt;&lt;/a&gt;&lt;br&gt;
Number of unique users in each cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9G5d6E6x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gdfswla2chfb7fzqk9gk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9G5d6E6x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gdfswla2chfb7fzqk9gk.png" alt="Image description" width="154" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Average psychometric scores for each cluster&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IrfHurAv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hxlchuolmvey1bnym8w7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IrfHurAv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hxlchuolmvey1bnym8w7.png" alt="Image description" width="687" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visual representation of range of average scores for 5 psychometric 5 traits for each cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bpmiTAmA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lmk22pjmsu4w8cvzb504.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bpmiTAmA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lmk22pjmsu4w8cvzb504.png" alt="Image description" width="689" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dispersion of Traits scores for users in each cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--84Fqem4D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2eafnaqfh97ayg6ykfwk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--84Fqem4D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2eafnaqfh97ayg6ykfwk.png" alt="Image description" width="691" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;These graphs with dispersion and average trait scores tell us that we can group users based on similar behavioral patterns for each scenario from daily life. Apart from the research in personality literature that sees each psychometric as an individual maker to group users, but converting it into a clustering problem tells us that range of 5 trait scores is better suited to group user base. It draws better distinction with full mapping of user behavior rather than mapping individual trait. From that we can segregate user base for purposes like recommendation systems etc. Each cluster reflects a particular behavior-system regards to shopping trends, movie liking etc. which is quite popular now a days as a research problem.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Serverless vs Servers</title>
      <dc:creator>RGEv1L</dc:creator>
      <pubDate>Tue, 18 Jan 2022 16:13:08 +0000</pubDate>
      <link>https://dev.to/akhan/serverless-vs-servers-2gna</link>
      <guid>https://dev.to/akhan/serverless-vs-servers-2gna</guid>
      <description>&lt;p&gt;The traditional way of doing computing was, and still is, is by “spinning up a server -&amp;gt; loading the code -&amp;gt; executing the code” still works quite well. But what took the developers and system administrators by surprise was that you can go through these steps quite quickly based on demand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let me explain this idea.&lt;/strong&gt;&lt;br&gt;
For server-based deployment, you have to run a VM, configure a VM, load the application on the VM, and scale it up, down or horizontally based on usage. But, with serverless, you just hand your code, specify Memory configuration and you are good to go. Each invocation of the application code will be scaled and managed by the service provider. So, what you need to focus on based on both technologies is&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For server-based approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Size of VM/VMs [CPU, RAM, NETWORK, STORAGE]&lt;/li&gt;
&lt;li&gt;OS&lt;/li&gt;
&lt;li&gt;OS configurations&lt;/li&gt;
&lt;li&gt;Application package installation&lt;/li&gt;
&lt;li&gt;Application code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For serverless approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Size of Function [Memory, Timeout]&lt;/li&gt;
&lt;li&gt;Application Code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see the difference in design choice. As the saying goes “With great power comes great responsibility”. What is implicit in the statement is that you have chosen to pick up ‘great responsibility’. My idea would be to at least check, based on some metrics, whether you want the ‘great power’ or not. Else, it would ‘great waste’ of time and resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's write some metrics:&lt;/strong&gt;&lt;br&gt;
Do you expect your task to be completed under a timeout? [ AWS Lambda: 15 mins, GCP Cloud Functions: 9 mins, Azure Functions: 10 mins] &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If Yes: 1 point&lt;/li&gt;
&lt;li&gt;If No: Can you decouple your application to a queue-based event driven system?
&lt;/li&gt;
&lt;li&gt;If Yes: 0.25 point&lt;/li&gt;
&lt;li&gt;No: 0 point&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Does your application memory requirement is under the service provider’s max limit? [ AWS Lambda:15 GB, AZURE Functions: 1.5 GB, GCP Cloud Functions: 8 GB]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If Yes: 1 point&lt;/li&gt;
&lt;li&gt;If No: Can you split your job in a way you can run another function and it will pick up the job where the previous function left it?&lt;/li&gt;
&lt;li&gt;If Yes: 0.25 point &lt;/li&gt;
&lt;li&gt;If No: 0 point&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Is your application stateless?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If Yes: 1 point&lt;/li&gt;
&lt;li&gt;If No: Can you rewrite session-based part to a session-less JWT solution?&lt;/li&gt;
&lt;li&gt;If Yes: 0.25 point&lt;/li&gt;
&lt;li&gt;If No: Can you opt-in to store session data on a network file system or on a database?&lt;/li&gt;
&lt;li&gt;If Yes: 0.25 point&lt;/li&gt;
&lt;li&gt;If No: 0 point&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Does your application require another software appliance to operate (DB, SPARK, Compute Nodes etc.) ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If No: 1 point&lt;/li&gt;
&lt;li&gt;If Yes: Can you opt-in for a cloud-based solution that provides the similar capability (DynamoDB, EMR, AWS BATCH)? &lt;/li&gt;
&lt;li&gt;If Yes: 0.25 point&lt;/li&gt;
&lt;li&gt;If No: 0 point&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;br&gt;
If you manage to get all three points. You can go and architect a serverless solution and start coding. No need to manage fleets of servers. But, if your architecture requirements have blocked you from reaching a perfect 4, you can still opt-in for a mix solution. The decimals at the points to the fact that you have to put extra effort to bind a solution that can still leverage a serverless solution with all its benefits. But how hard it is to architect completely serverless solution is based on how far are you from 4. If you fall in the range between 3+ to 4, you might need some extra effort to architect and develop your solution. You might need to bind some other cloud provided services to your application code, design queues workflow that can push and pull jobs etc. There is a little bit of learning curve to learn about binding the relevant cloud service that is equivalent or better than your earlier defined software appliance. If you fall in the range of 3 or below, you can definitely opt in for mix strategy.  &lt;/p&gt;

&lt;p&gt;In the end, manage what can be decoupled on the serverless technology and provision the rest on servers. That’s is very handy and cost saving. Tasks with unpredictable workload and tasks with predictable workload can be divided quite easily and you save a lot in terms of cost for compute resources provisioned as the serverless fleet will only cost as long as you have customers using it. The rest of the provisioned infrastructure can be scaled based on how many serverless functions are in execution or how many messages are in a queue to be processed.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Virtual Workspaces for Remote Teams: Match your team’s needs without buying hardware</title>
      <dc:creator>RGEv1L</dc:creator>
      <pubDate>Tue, 18 Jan 2022 15:41:17 +0000</pubDate>
      <link>https://dev.to/akhan/virtual-workspaces-for-remote-teams-match-your-teams-needs-without-buying-hardware-59oi</link>
      <guid>https://dev.to/akhan/virtual-workspaces-for-remote-teams-match-your-teams-needs-without-buying-hardware-59oi</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Intro:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Building and managing remote teams can be painful if you are not fully equipped with the right tools for it. Matching the computer and storage needs for your team members has always been challenging, and one of the worst parts is that it is constantly changing, and the other being providing IT support for the remote laptops that have gone bad. The big-fat laptops that you just bought for the worst-case scenario aren’t going to keep up with the resource demand for long, and your IT administrator won’t be happy traveling to remote resource's homes to fix their laptops. So, how can you avoid buying expensive hardware and still equip your team with the ability to handle the changing resources demands and have IT provide support? Moving to Virtual Environments is your best option.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Options:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;All the premier cloud-services providers provide virtual workspaces in order to help remote teams in provisioning scalable resources on-demand and monthly/yearly reserved. You can spin up a remote Windows or Linux environment in minutes and quickly scale it up and down based on what your team requires. AWS provides Linux powered Workspaces, starting from 21$/month, and Windows Powered Workspaces, starting from 25$/month. The cheapest, workable, browsing-capable laptops that won’t lift the top of your head while working starts from 250$. You get a cloud-environment that is manageable by your IT guy and can scale it up and down based on your team’s demand. However, there is more to that.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Benefits:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Secure authorization&lt;/li&gt;
&lt;li&gt;Managed accounts&lt;/li&gt;
&lt;li&gt;Scale CPU/MEM/STORAGE on demand&lt;/li&gt;
&lt;li&gt;Automated backups&lt;/li&gt;
&lt;li&gt;Return Workspaces if not needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Limitations:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If your team is low in count per region, example if you have 3 people joining from Middle-East, 2 people joining from South-America, 5 people from North-America and 3 people joining from India, Spinning up domain controllers in each region will sky-rocket the price crazy. To avoid it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spin Active directory service if the number of users is greater than 5 for that region.&lt;/li&gt;
&lt;li&gt;If not , your are far better with spinning up EC2.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Deep Dive:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Managed Workspaces, provided by cloud services providers, are a great choice if you don’t want to manage Virtual Workspaces. Also, you can expect everything from increasing CPUs, memory, and storage to automated-backups, secure-logins, etc. should be a click away. But if you really want to double-down on cost and performance, you can move to provision your own Virtual Machine by setting up remote procedures, setup users and their resource quotas, and you are good to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Stacked Workspaces vs Single user Workspace:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Setting up a single workspace for each team member is certainly more easily manageable and less of an administrative hurdle. However, it tends to waste resources as well. Each single workspace you provision is going to have its own boiler-plate resources that are inevitable. If you provision 50 managed workspaces, that would be 50 cores and ~100 GB of RAM wasted to run the individual operating system on each workspace. On the other hand, the lesser-known fact is that not all the users are going to use 100% of the provisioned CPU and Memory all the time. Most of the time, the resources will sit idle. It is a common practice to provision a 16 core VM and assign 20 users to it. This works fine because 1 core is spared for OS, and 15 cores is still an overkill for 20 users working on excel or browsing etc. So, in order to stack a team of 50, a 48 core VM is more than enough to host 50 users if building for worst-case scenario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's discuss requirements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Workspace for Linux with 2 cores / 4 GB / 90 GB is about 29$ per user. Keep in mind that only 2.5 – 3 GB of RAM and 1 core is fully available to the end user only. For 50 users, that would be 1450$/month.&lt;/li&gt;
&lt;li&gt;AWS EC2 with 32 cores / 128 GB RAM / 5 TB   ~ 1200$/month.&lt;/li&gt;
&lt;li&gt;Most budget-friendly laptop with $250 price tag for 50 users is 12500$&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Additional Options:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What to do with VM after working hours? With your own managed VM, working hours are usually 8-10 hours out of 24 hours. So, still you are going to waste your Managed / Un-managed workspace for 2/3 of the day that you already paid for. With a single instance with a huge core count, you can put it to good use. You can use the same VM for rendering, conversion, compression, ML, DL, and many more jobs that require huge resources stacked in a single VM. You can’t do that with your managed workspaces. So, here is the additional, not-so-talked advantage of having your own instance at your disposal.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;At the end, it depends on what your exact requirement is, and how much responsibility you want to take while managing resources for your remote teams. Assigning laptops is still fine if you don’t care about budget, and your team is good enough to take care of their devices. Managed workspaces are for ease of use with flexibility and no up-front. Managing your own VM is when you want to utilize your money properly and extracting almost everything you are paying for. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Graph Network Analysis</title>
      <dc:creator>RGEv1L</dc:creator>
      <pubDate>Tue, 11 Jan 2022 14:07:14 +0000</pubDate>
      <link>https://dev.to/akhan/graph-network-analysis-2i7o</link>
      <guid>https://dev.to/akhan/graph-network-analysis-2i7o</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Market analysis has traditionally been the bedrock for companies for various purposes. If a company wants to;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch a new product&lt;/li&gt;
&lt;li&gt;Check performance of an existing product&lt;/li&gt;
&lt;li&gt;Find new markets&lt;/li&gt;
&lt;li&gt;Evaluate existing markets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Market analysis is sort of an abstract layer from where you can extract trends in a demographic for certain index (topic) and co-relate with your own use-case. These co-relations can be 1:1, if your product/company seems to have competitors doing the similar thing in a market, or the company already have stakes in the market. If it is not the case, you have to extract a trend, compare it with your use-case in-terms of how much the abstracted-out trend can help you predict your own performance in that demographic/market.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dataset: Nashville Meetup Network&lt;/strong&gt;&lt;br&gt;
meetup.com is a website for people organizing and attending regular or semi-regular events ("meet-ups"). The relationships amongst users—who goes to what meetups—are a social network, ideal for graph-based analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem Confinement:&lt;/strong&gt;&lt;br&gt;
Examples involving a lot of factors that are super-connected must be done in graph. The rational for this is that you would find It computationally limited to run that many join operations for finding a connection and it also logically doesn’t make any sense to preserve what can easily be preserved and requires a lot of call to fetch it, with-in a data-structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loading Data in Neo4j:&lt;/strong&gt;&lt;br&gt;
Loading Cities and States and appending relationship between them &lt;/p&gt;

&lt;p&gt;Loading Members and adding relation to cities they live in&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7FO52RaP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1it9nhy15c9a2cv5zg3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7FO52RaP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1it9nhy15c9a2cv5zg3f.png" alt="Image description" width="880" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Loading Groups&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--soctAaZt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6v0linooky4j0rqie9l3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--soctAaZt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6v0linooky4j0rqie9l3.png" alt="Image description" width="880" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Loading Categories of Groups&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_1EiUdwP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gbslezo8mc7lzw3jepca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_1EiUdwP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gbslezo8mc7lzw3jepca.png" alt="Image description" width="880" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adding Group relation with each category&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ebe6og2A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ep0uioosrzops1wooiiw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ebe6og2A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ep0uioosrzops1wooiiw.png" alt="Image description" width="880" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Loading Organizing Members and attaching their “Organized” relationship with “Group”.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t6lX1Jua--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lqdv87iqo3fl8o1a9jfz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t6lX1Jua--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lqdv87iqo3fl8o1a9jfz.png" alt="Image description" width="880" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Loading Events and adding group as ”Conducted” which conducted that event.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GwoAw_8O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xv0pksbdhr5k5nucty0q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GwoAw_8O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xv0pksbdhr5k5nucty0q.png" alt="Image description" width="880" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Loading Members that participated in Events in groups&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RIeBJ7PW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rr3fg2goyuy9ws65lu6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RIeBJ7PW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rr3fg2goyuy9ws65lu6.png" alt="Image description" width="880" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Loading Total Number of Members for each Group.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MdGto7To--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1hwt5e8pcyigkkh0rhh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MdGto7To--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1hwt5e8pcyigkkh0rhh.png" alt="Image description" width="880" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visualizing Graph Schema:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AOIuKvuY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/96b2eqvw7u67fxshot30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AOIuKvuY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/96b2eqvw7u67fxshot30.png" alt="Image description" width="880" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“””&lt;br&gt;
&lt;strong&gt;&lt;em&gt;I have added members relationship to Group I both directions because that will make DB calls much more optimized when going left or right from members&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
“””&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  Querying:
&lt;/h2&gt;

&lt;p&gt;**&lt;br&gt;
Let's check which group category has the most members&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5fZMOBh6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ms0tzr9nu6osmx8bvgj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5fZMOBh6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ms0tzr9nu6osmx8bvgj.png" alt="Image description" width="880" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finding trends for cities (‘Franklin’)&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H2ir0SgD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p4hj9vlqps0wor37qord.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H2ir0SgD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p4hj9vlqps0wor37qord.png" alt="Image description" width="345" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s find the groups with name ‘Cars &amp;amp; Motorcycles’ across all cities.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mkatEc0c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/55dpglkzhz9flxp5qin5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mkatEc0c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/55dpglkzhz9flxp5qin5.png" alt="Image description" width="880" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finding number of events per city:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--56b9bjYc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sj152xhohs3rel6bo74y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--56b9bjYc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sj152xhohs3rel6bo74y.png" alt="Image description" width="333" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finding ‘Tech’ events hosted by all of the cities:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--trBh8I-e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sm02htsz2gsl9p6tgl1i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--trBh8I-e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sm02htsz2gsl9p6tgl1i.png" alt="Image description" width="272" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  Visual Inspection:
&lt;/h2&gt;

&lt;p&gt;**&lt;br&gt;
Let explore Categories of Groups; Games, Dancing and Education and see how many groups do they have&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h9D9kuV5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ag34dp6sdluvrvhyhaqk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h9D9kuV5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ag34dp6sdluvrvhyhaqk.png" alt="Image description" width="880" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s follow a trail for a particular group like ‘GEEK by AKEIN Engineering’ in Education.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fkyt9Oy5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tpop45qx1ya01k2munf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fkyt9Oy5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tpop45qx1ya01k2munf5.png" alt="Image description" width="815" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can see the ‘Members’ associated with group, Events done for this group and the organizer of this group as well.&lt;/p&gt;

&lt;p&gt;Let’s pick a random person and see in which ‘City’ he lives.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z3kh19x_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msiqf8h1e4ffscnwobiq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z3kh19x_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msiqf8h1e4ffscnwobiq.png" alt="Image description" width="880" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, this person lives in Nashville and share this location with 3 other group members as well.&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  Ending note:
&lt;/h2&gt;

&lt;p&gt;**&lt;br&gt;
With Graph technology, we can find the trends visually as well as programmatically. The bottom line is that preserving the connections within the structure is much more important. We can do trailing queries and segment our problem in areas we need and connect these links when needed for a particular use-case.&lt;/p&gt;

</description>
      <category>datascience</category>
    </item>
  </channel>
</rss>
