Skip to content

Instantly share code, notes, and snippets.

@prateekiiest
Last active July 1, 2017 10:55
Show Gist options
  • Save prateekiiest/3821766b665c412ac0ac325f56d95757 to your computer and use it in GitHub Desktop.
Save prateekiiest/3821766b665c412ac0ac325f56d95757 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Internship Project Work"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Student-Group-Activity-Recognition\n",
"\n",
"\n",
"Student Group Activity Recognition deals with looking into the activities of students of a college based on sensor datas from the\n",
"**Student Life Data Set**.\n",
"\n",
"The aim of the project is to see how group formation is taking place, how a particular group evolves over time, how the group breaks over time and correlation with the users of the group with their gpa. \n",
"Also it aims to finding those users who are not participating in group formation and we can check whether the student has some issues, thus helping us to introspect into the matter.\n",
"\n",
"Recognition of group activities is fundamentally different from single, or multi-user activity recognition in that the goal is to recognize the behavior of the group as an entity, rather than the activities of the individual members within it. Group behavior is emergent in nature, meaning that the properties of the behavior of the group are fundamentally different then the properties of the behavior of the individuals within it, or any sum of that behavior. The main challenges are in modeling the behavior of the individual group members, as well as the roles of the individual within the group dynamic and their relationship to emergent behavior of the group in parallel. Challenges which must still be addressed include quantification of the behavior and roles of individuals who join the group, integration of explicit models for role description into inference algorithms, and scalability evaluations for very large groups and crowds. Group activity recognition has applications for crowd management and response in emergency situations, as well as for social networking and Quantified Self applications.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Data Set used = **Student Life Dataset**\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Some definitions \n",
"\n",
"* Group - two or more individuals connected to one another by social relationships.\n",
"\n",
"* Activity: a human situation (context) with physical motion characteristics.\n",
"\n",
"* Activity Recognition: the process through which a device can discern different activities based on sensor observations.\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### User Data Analysis\n",
"\n",
"#### Working on a small data set as an example\n",
"\n",
"\n",
"\n",
"Given some user-specific data on wifi, bssid levels for a particular day , we check whether the data is available throughout all the data points of a particular day.\n",
"\n",
"If the data is not available for a particular time point we print 0 else if data is available we make it 1."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting May 26 Data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x338beb8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0310763888889\n"
]
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"'''\n",
"for May 26\n",
"'''\n",
"string = 'May 26'\n",
"\n",
"# reading from project26.txt file which contains data on May 26\n",
"f = open('project26.txt')\n",
"contents = f.read()\n",
"# reading from project30.txt file which contains data on May 26\n",
"f2 = open('project30.txt')\n",
"contents2 = f2.read()\n",
"# dividing a minute (60 seconds) into 4 parts -> 0,1,2,3\n",
"timedict = {'00': 0, '15' : 1, '30' : 2, '45' :3}\n",
"\n",
"\n",
"# For project26.txt\n",
"p=0\n",
"timelist = []\n",
"for k in range(len(contents) - 6):\n",
" if(string == contents[k:k+6]): # string = May 26 is unique and has length 6. So we extract 6 letter word where word - May 26\n",
" z = (contents[k+7:k+6+9])\n",
" exp = timedict[z[6:8]] + (4 * int(z[3:5])) + (4 * 60 * int(z[0:2])) # After the string we have the time section\n",
" timelist.append(exp) # We calculate the hours,and minutes of the given time and append it.\n",
" p += 1\n",
" \n",
"# p - indicates the number of available data points \n",
"\n",
"\n",
"# For project30.txt\n",
"d = 0\n",
"for k in range(len(contents) - 6):\n",
" if(string == contents2[k:k+6]):\n",
" z = (contents2[k+7:k+6+9]) # Similar as above\n",
" exp = timedict[z[6:8]] + (4 * int(z[3:5])) + (4 * 60 * int(z[0:2]))\n",
" timelist.append(exp)\n",
" d += 1 \n",
" \n",
"# d - indicates the number of available data points \n",
" \n",
"totallist = [0 for k in range(5760)]\n",
"\n",
"\n",
"for h in range(len(timelist)):\n",
" totallist[timelist[h]] = 1\n",
"# totallist denotes data points = 1 if available, 0 if unavailable\n",
" # timelist = denotes the time points through out the day\n",
" \n",
"plt.bar([b for b in range(len(totallist))],[totallist[v] for v in range(len(totallist))])\n",
"plt.xlabel('Data Points through the whole day')\n",
"plt.ylabel('Probability of Available Data')\n",
"plt.show()\n",
"\n",
"percentage = (p+d)/(5760*1.0)\n",
"\n",
"#percentage = 3.107%\n",
"# percentage = denotes the percentage of data points available on the day\n",
"print(percentage)\n",
"\n",
"f.close()\n",
"f2.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting for Day 30"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nrkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0xaf9e5f8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.477951388889\n"
]
}
],
"source": [
"% matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"'''\n",
"for May 26\n",
"'''\n",
"string = 'May 30'\n",
"# Reading from file project30.txt which contains data on May 30\n",
"f2 = open('project30.txt')\n",
"contents = f2.read()\n",
"# dividing a minute (60 seconds) into 4 parts -> 0,1,2,3\n",
"timedict = {'00': 0, '15' : 1, '30' : 2, '45' :3}\n",
"\n",
"p=0\n",
"timelist = []\n",
"for k in range(len(contents) - 6): # string = May 30 is unique and has length 6. So we extract 6 letter word where word - May 30\n",
"\n",
" if(string == contents[k:k+6]):\n",
" z = (contents[k+7:k+6+9])\n",
" exp = timedict[z[6:8]] + (4 * int(z[3:5])) + (4 * 60 * int(z[0:2])) # Extracting time part from each such line.\n",
" timelist.append(exp)\n",
" p += 1\n",
" \n",
" \n",
"# p = total no of available data points\n",
"totallist = [0 for k in range(5760)]\n",
"\n",
"for h in range(len(timelist)):\n",
" totallist[timelist[h]] = 1\n",
" \n",
"\n",
" # totallist denotes data points = 1 if available, 0 if unavailable\n",
" # timelist = time points through out the day\n",
"\n",
"plt.bar([b for b in range(len(totallist))],[totallist[v] for v in range(len(totallist))])\n",
"plt.xlabel('Data Points through the whole day')\n",
"plt.ylabel('Probability of Available Data')\n",
"plt.show()\n",
"\n",
"percentage = (p)/(5760*1.0)\n",
"\n",
"# percentage =denotes percentage of available data points\n",
"\n",
"print(percentage)\n",
"\n",
"#f.close()\n",
"f2.close()"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### For Days 20 - 25"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2e4a208>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0458333333333\n"
]
},
{
"data": {
"image/png": "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\nXxLz3AAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x86de0f0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0\n"
]
},
{
"data": {
"image/png": "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\nAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x114666a0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0\n"
]
},
{
"data": {
"image/png": "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\nrkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0xe2fc0f0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.096875\n"
]
},
{
"data": {
"image/png": "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\nAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10cbb908>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0142361111111\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x97ec198>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0236111111111\n"
]
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"'''\n",
"for May 20 - 25\n",
"'''\n",
"date = ['May 25','May 24','May 23','May 22','May 21','May 20']\n",
"\n",
"for num in date:\n",
"\n",
" string = num\n",
"\n",
" f = open('project26.txt')\n",
"# Checking for the above dates in the file project26.txt\n",
"\n",
" contents = f.read()\n",
"\n",
"# dividing one minute (60 seconds) into 4 parts -> 0,1,2,3\n",
" timedict = {'00': 0, '15' : 1, '30' : 2, '45' :3}\n",
"\n",
"\n",
"\n",
" p=0\n",
"\n",
"\n",
" timelist = []\n",
" for k in range(len(contents) - 6): # Checking for Lines containing that particular date\n",
" if(string == contents[k:k+6]):\n",
" z = (contents[k+7:k+6+9])\n",
" exp = timedict[z[6:8]] + (4 * int(z[3:5])) + (4 * 60 * int(z[0:2])) # Extracting time from the line and calculating it in minutes\n",
" timelist.append(exp) \n",
" p += 1 \n",
"\n",
"\n",
" # Similar as above\n",
" # Plotting for different dates\n",
"\n",
"\n",
"\n",
" totallist = [0 for k in range(5760)]\n",
"\n",
" for h in range(len(timelist)):\n",
" totallist[timelist[h]] = 1\n",
"\n",
"\n",
"\n",
"\n",
" plt.bar([b for b in range(len(totallist))],[totallist[v] for v in range(len(totallist))])\n",
"\n",
" plt.xlabel('Data Points through the whole day of' + num)\n",
" plt.ylabel('Probability of Available Data')\n",
" plt.show()\n",
"\n",
" percentage = (p)/(5760*1.0)\n",
" print(percentage)\n",
" # Calculating the percentage\n",
" f.close() "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"--------------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### Observations\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have plotted the data along different time stamps during the whole day. So this is a timeseries data. \n",
"From the plot that we get, it is evident that some data are missing at different time points. And hence the percentage of available data is very much low.\n",
"\n",
"So we need to overcome this missing values and try to estimate the values at the points where the data is missing. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---------------------------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Missing Data Points"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are various ways to estimate the missing data values.\n",
"\n",
"* Replacing the missing data values with the **mean** of the distribution.\n",
"\n",
"This can be done since each data point has equal probability of being available or missing. So it follows a uniform distribution. So we can approximate the missing data values as being the mean of the distribution.\n",
"\n",
"* Replacing the missing data values with the **(max value - min value)** of the distribution. \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### EM Algorithm"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Expectation maximization is an effective technique that is often used in data analysis to manage missing data.\n",
"\n",
"Expectation maximization overcomes some of the limitations of other techniques, such as mean substitution or regression substitution.\n",
"\n",
"It is an interative procedure in which it uses other variables to impute a value (Expectation), then checks whether that is the value most likely (Maximization). If not, it re-imputes a more likely value. This goes on until it reaches the most likely value.\n",
"\n",
"EM imputations are better than mean imputations because they preserve the relationship with other variables.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---------------------------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting Acceleration Values from a sample user data set"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Here we have a user file containing the acceleration values along three axis for different timepoints during a particular day.\n",
"\n",
"We then plot the acceleration values (x-axis, y-axis, z-axis) for a particular day in May at different time points during the day."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x9a30cf8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x9e98c18>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x9ed2898>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Reading Accelerometer values\n",
"\n",
"%matplotlib inline\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib import cm\n",
"from matplotlib.ticker import LinearLocator, FormatStrFormatter\n",
"\n",
"from statsmodels.nonparametric.smoothers_lowess import lowess\n",
"from sklearn import preprocessing\n",
"import numpy as np\n",
"\n",
"fil = open('pr.txt')\n",
"\n",
"lines = []\n",
"lines.append(fil.readlines())\n",
"\n",
"# dividing one minute into 4 parts\n",
"timedict = {'00': 0, '15' : 1, '30' : 2, '45' :3}\n",
"\n",
"\n",
"string = '23:Mon May' # Search for this string as the file contains acceleration values where this string is present\n",
"accel = []\n",
"accely = []\n",
"accelz = []\n",
"timelist = []\n",
"for i in range(len(lines[0])):\n",
" if(lines[0][i][0:2] == '2:'): # acceleration along x axis has id 2:\n",
" for k in range(len(lines[0][i]) - 10):\n",
" if(string == lines[0][i][k:k+10]):\n",
" z = (lines[0][i][k+14:k+10+12]) # if 2: found extract the time from that line\n",
" exp = timedict[z[6:8]] + (4 * int(z[3:5])) + (4 * 60 * int(z[0:2]))\n",
" timelist.append(exp)\n",
" #print(exp)\n",
" j = 3\n",
" while(lines[0][i][j] != ','): # Example 2: some x value, 3: some y value, 4: some z value\n",
" j += 1\n",
" accel.append(lines[0][i][2:j-1]) # so till a ',' is found starting from 2: we are actually looking at 3: value\n",
" \n",
" l =j + 2\n",
" while(lines[0][i][l] != ','):\n",
" l+=1\n",
" accely.append(lines[0][i][j+3:l])\n",
" \n",
" v = l+3\n",
" while(lines[0][i][v] != ','):\n",
" v+=1\n",
" accelz.append(lines[0][i][l+3:v])\n",
" p = timelist\n",
" \n",
"\n",
"\n",
"acceleration_x = []\n",
"\n",
"for k in range(len(accel)):\n",
" acceleration_x.append(float(accel[k])) # acceleration values along x axis\n",
"\n",
"\n",
"acceleration_y = []\n",
"\n",
"for k in range(len(accely)):\n",
" acceleration_y.append(float(accely[k])) # acceleration values along y axis\n",
"\n",
"acceleration_z = []\n",
"for k in range(len(accely)):\n",
" acceleration_z.append(float(accelz[k])) # acceleration values along z axis\n",
"\n",
"tim = []\n",
"for k in range(len(p)):\n",
" tim.append(p[k]) # appending time values at which acceleration values were found\n",
" \n",
"x_axis = [timelist[b] for b in range(len(tim))]\n",
"y_axis = [acceleration_x[b] for b in range(len(acceleration_x))]\n",
"y_axis2 = [acceleration_y[b] for b in range(len(acceleration_y))]\n",
"y_axis3 = [acceleration_z[b] for b in range(len(acceleration_z))]\n",
"\n",
"\n",
"x_ax = [m for m in range(5760)]\n",
"y_ax = [0 for m in range(5760)]\n",
"y_ax2 = [0 for m in range(5760)]\n",
"y_ax3 = [0 for m in range(5760)]\n",
"\n",
"\n",
"for r in range(len(timelist)):\n",
" y_ax[timelist[r]] = acceleration_x[r]\n",
"\n",
"\n",
"for r in range(len(timelist)):\n",
" y_ax2[timelist[r]] = acceleration_y[r]\n",
"\n",
"for r in range(len(timelist)):\n",
" y_ax3[timelist[r]] = acceleration_z[r]\n",
"\n",
" \n",
"## Plotting acceleration values along 3 axes. \n",
" \n",
"plt.title('For acceleration along X axis')\n",
"plt.plot(x_ax, y_ax, '-') \n",
"plt.xlabel('Time')\n",
"plt.ylabel('Magnitude of Acceleration')\n",
"plt.show()\n",
"\n",
"plt.title('For acceleration along Y axis')\n",
"plt.plot(x_ax, y_ax2, '-') \n",
"plt.xlabel('Time')\n",
"plt.ylabel('Magnitude of Acceleration')\n",
"plt.show()\n",
"\n",
"plt.title('For acceleration along Z axis')\n",
"plt.plot(x_ax, y_ax3, '-') \n",
"plt.xlabel('Time')\n",
"plt.ylabel('Magnitude of Acceleration')\n",
"plt.show() \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Normalize The Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In many cases it is required to normalize the data for various applications.\n",
"\n",
"When the particular model is sensitive to magnitude, and the units of two different features are different, and arbitrary, then we need to normalize the data.\n",
"\n",
"Like in this case for the acceleration values at different time points of the day , the data is needed to be normalized for further analysis."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"## Normalize\n",
"\n",
"X_scale = preprocessing.scale(x_ax) # Normalizing acceleration value for time axis\n",
"Y_scale = preprocessing.scale(y_ax) # Normalizing acceleration value for x axis\n",
"\n",
"Y_scale2 = preprocessing.scale(y_ax2) # Normalizing acceleration value for y axis\n",
"Y_scale3 = preprocessing.scale(y_ax3) # Normalizing acceleration value for z axis\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Smoothing out the curve - Removing unwanted noise in the curve"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So the data has many unwanted noise and we want to filter them and thus smoothen the curve.\n",
"\n",
"One way of doing it is by using 'Window Method' where we take a window of a particular size and calulating an average of the values within the window.\n",
"\n",
"We use the Savitsky-Golay Filter which is a low pass filter which smoothens the curve and reduces noice as far as possible. "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def savitzky_golay(y, window_size, order, deriv=0, rate=1):\n",
" r\"\"\"Smooth (and optionally differentiate) data with a Savitzky-Golay filter.\n",
" The Savitzky-Golay filter removes high frequency noise from data.\n",
" It has the advantage of preserving the original shape and\n",
" features of the signal better than other types of filtering\n",
" approaches, such as moving averages techniques.\n",
" Parameters\n",
" ----------\n",
" y : array_like, shape (N,)\n",
" the values of the time history of the signal.\n",
" window_size : int\n",
" the length of the window. Must be an odd integer number.\n",
" order : int\n",
" the order of the polynomial used in the filtering.\n",
" Must be less then `window_size` - 1.\n",
" deriv: int\n",
" the order of the derivative to compute (default = 0 means only smoothing)\n",
" Returns\n",
" -------\n",
" ys : ndarray, shape (N)\n",
" the smoothed signal (or it's n-th derivative).\n",
" Notes\n",
" -----\n",
" The Savitzky-Golay is a type of low-pass filter, particularly\n",
" suited for smoothing noisy data. The main idea behind this\n",
" approach is to make for each point a least-square fit with a\n",
" polynomial of high order over a odd-sized window centered at\n",
" the point.\n",
" \"\"\"\n",
" \n",
" from math import factorial\n",
"\n",
" try:\n",
" window_size = np.abs(np.int(window_size))\n",
" order = np.abs(np.int(order))\n",
" except ValueError, msg:\n",
" raise ValueError(\"window_size and order have to be of type int\")\n",
" if window_size % 2 != 1 or window_size < 1:\n",
" raise TypeError(\"window_size size must be a positive odd number\")\n",
" if window_size < order + 2:\n",
" raise TypeError(\"window_size is too small for the polynomials order\")\n",
" order_range = range(order+1)\n",
" half_window = (window_size -1) // 2\n",
" # precompute coefficients\n",
" b = np.mat([[k**i for i in order_range] for k in range(-half_window, half_window+1)])\n",
" m = np.linalg.pinv(b).A[deriv] * rate**deriv * factorial(deriv)\n",
" # pad the signal at the extremes with\n",
" # values taken from the signal itself\n",
" firstvals = y[0] - np.abs( y[1:half_window+1][::-1] - y[0] )\n",
" lastvals = y[-1] + np.abs(y[-half_window-1:-1][::-1] - y[-1])\n",
" y = np.concatenate((firstvals, y, lastvals))\n",
" return np.convolve( m[::-1], y, mode='valid')\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"-----------------------------"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEZCAYAAAC5AHPcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xm8HFWZ//HPN0DYkpCEXbawiizKIqsLF3ABWRVcEB0E\nRVQYmUERdJSE4Tc4zKij7IuYYREEUXZQELkIoojsyD6EQEhYJCRkQUhyn98fpzqpdLr79u3b3dV9\n832/Xv3q2rrq6bpJPX3OqXNKEYGZmdlADSs6ADMz605OIGZm1hAnEDMza4gTiJmZNcQJxMzMGuIE\nYmZmDXECsSFJ0gaS+iS15d+4pPUkvSFJ7The7rjjJV3SzmO2m6RZksYVHYctyQnEFiPpOUlzs4vh\nrOx9raLjalDLOjlJmiRpj4UHinghIkZFMR2r2npMScMk3SPpO2XL/iLpuGYfLyJGRsRzzd6vDZ4T\niJULYJ/sYjgye39pIDuQtEyLYmuLbo+/1SKiDzgCOEHSZtni44E+4H8KC8zazgnEKqlYDSNpf0mP\nSpou6feSNs+tmyTpW5IeAmZXqjqS9GNJz0uaKeleSe/PrRsm6TuSnsmtXydbt6WkWyS9JmmapBOz\n5ZJ0YvaZVyX9QtLoKrGPkvRTSVMlvSDplFJ1k6TDJN0l6UeS/g6Ml7SRpNsk/V3SK5IulTQq2/5i\nYH3g+qyE9s3yKjNJa0u6Nov5KUlfysUyXtIVki7KPv+IpO2q/jFqnLcG/kbfkPSQpNclXS5peG79\nt7LzM0XSF7Pvs1Gl40TE34AfAj/NjvFt4IhqJTBJH5N0f/YdJksan1v3KUnPShqRze+d/Z1XzeYX\nxpHt52/ZeXuhFSUeG4CIGFIv4ELgZeDhJu3vZuB14Lqy5eOAPwNPAZcDyxb93Zv0fScBe1RYvhkw\nG9gDWIb0i/Pp0vfOPnc/8A5g+Sr7/iwwmvTD5V+BacDwbN3xwEPAJtn81sAYYAQwFfgXYDiwMrBD\nts2xwN3A2sBywDnAZdm6DYAFwLBs/mrgbGAFYLXsb3dktu4wYB7wtSy25YGNgT2BZYFVgV7gR2Xn\naffcfPnx/gCckcX1HuAVoCdbNx6YC3yUlKxPBf5U429S67yNBy4ewN/oz8Ca2f4eA76crdsrO8+b\nZ+fokuz7bFQjruWAh4FXgZP6+Xf1QWDLbHqr7Dvsn1t/CfAzYCzwIrB3bt3COLIYd82mVwG2Kfr/\nzNL8KjyApn8heD+wDc1LILsD+7BkArkC+GQ2fQ5wVNHfvUnfdxLwBjA9e/06W/5d4Be57QRMAT6Y\n+9xhAzzWdGDrbPoJYN8K23wGuK/K5x8ru4ivDbydXWgXXtCzC+Y/yCW2bL+/z6YPA57rJ9YD8nFQ\nlmjLjrceKSGtlFt/KvCzbHo8cEtu3buAOQ2et3wCqedvdEhu/WnA2dn0hcB/5NZtTD8JJNvugmy7\nTQb4t/8f4Ie5+VWAyaSEdHbZtn25BPIccCQwsuj/K37F0KvCioi7SCWGhbLqiJuz4v8duXrbevZ3\nO+lXXbk9gF9l0xcBH2805g50QESMzV6fyJa9g/QfHIBI/5tfANbJfW5KrZ1mVT2PZdUnrwOjSKUB\nSBfdZyt8bD3g/6rscgPg6qy6ZjopocwjJYy89Um/lqdl274OnJs7Ntl3yce6RlbFM0XSDODSsu1r\nWRuYHhFzc8sms/i5yrcrzQVWqFTtl8VS67zl1fM3ernsuCNyn82fgxeoUpWZi+sDwIGkf/+n97Pt\njlmV2ivZ+Twq/x0iYibwS2BL4Ec1dnUQ6QfdZEm3S9q51nGttYZcAqnifOCYiNiBVKw/ZzA7y+pm\nX4/UmAjpwvmOwYXYUSpdOKaSLth567F40qh6N1BWb388cHBEjImIMaSSTulYL5B+9ZarthzgeVJV\nRynZjYmIlSNiWoV9/ANYNbfd6Ih4d43YTyX98t0yIkYDn2Px81LrzqepwFhJK+eWrU+qmhmQOs5b\n+XH7+xtVMw1YtyzeWn/PFYCfAscBxwCbSfpsjf1fBlwDrJOdz/PIfQdJ25Aa5i8nVf1VFBH3RcSB\nwOrAtcCVtb+WtdKQTyDZf+JdgV9KeoD0D3fNbN3HswbMh3OvRyTdXGTMHepKYB9Ju0taVtI3SRfl\nP9X5+ZGk0sFrkoZLOilbVvJT4BRJmwBI2lrSGOAGYC1JX88+N0LSjtlnzgNOlbR+9pnVJe2f26cA\nIt1FdgvwP5JGKtlI0gf7iXc2MEupMf/4svUvAeUNzKXjTSG1zXxf0vKS3g18kVTPX021X/v9nbe8\nwfyNrgQOl7S5pJVI1WG1/DswKSIuyUpaXwF+LGlsle1HkH50zcv+fguTTZaMLgFOJCWRd0j6avkO\nJC0n6bOSRkXEAmAWqfrMCjLkEwjpO74eEdtFxLbZayuAiLg6IraOiHfnXltHxN61dhgRrwGjc1UO\n69LAr8sOVfFXZ0Q8RfoVfiap0XQfYL+ImF/rczm/zV5Pkeri57J4lcmPSBexWyTNJCWUFSNiNvBh\nYH/SRfspoCf7zE9Iv0JLn7kb2DG3z3xM/0RqhH+M1IbwS6BW/5aTge2BGcD1LKquLPlP4HtZlVjp\nTqD88Q4BNiSVCn4FfC+rDq2m2vnr77wt2sEg/kYR8RtSNdTt2bFKSeet8m0lbU9qh/hy7vO/I52n\nn1Q5xNdIPxBmkpLTFbl1pwKTI+L8iHgb+Hy2bankmY/788CkrBrsy+QSkbWfUjVpQQeX1gUuJpUI\n+oALImKJulRJpwN7A3OAL0TEg/3sdxxwfURsnc3fBfw4Iq7K5t8dEQ8PIM4e4BsRsV9u2RWkBuYr\nJJ0DPBQR59a7T7NOlt2a+wjpxoO+/ra3pVPRJZD5wHERsSWwC3C0cvetQ7onHNg4IjYlNbzVvEhL\nuoz0S3QzpXvnDwcOBb4o6UFJj5J+zdZF0h9Iv5b2yPb34WzVicBxkp4i3Xp4Yb37NOtEkg7MqsnG\nkO7Qus7Jw2optARSTtI1wBkRcVtu2bnA7RFxRTb/OOl++per7MbMGpC1/e1C+mHXCxzt/2dWy7JF\nB1CSVTttA9xTtmodFq/zfTFb5n/YZk3UX9ufWbmiq7AAUBrC4Crg2KzR1MzMOlzhJRBJy5KSxyUR\ncW2FTV4k3cteUvWOJ0mdUx9nZtYlIqKhxxB0QgnkZ8BjEVHt9r/rSLdgkvU6nVGrXrborv39vcaP\nH194DI7TcTpOx1l6DUahJRBJ7yPdIfVI1skvgO+QetNGpPvCb1IagfMZ0m28hxcXsZmZlRSaQCLi\nj6RRQ/vb7pg2hGNmZgPQCVVYS5Wenp6iQ6iL42wux9lcjrMzdFQ/kMGSFEPp+5jZUqS3F7bYAtZY\no62HlUR0cSO6mZntvjucfHLRUQyISyBmZp1AWSGgzdcwl0DMzKztnEDMzIr25ptFR9AQJxAzs6Jt\numl6Hzeu0DAGygnEzKxoL2ajM82dW2wcA+QEYmZWtNKtu3vsUWwcA+QEYmZWtFKHwy67i9QJxMys\naMstl96dQMzMbEBKicMJxMzMBsQJxMzMGvLGG+ldDXUIL4wTiJlZ0W68segIGuIEYmZmDXECMTPr\nFAsWFB3BgDiBmJkV7Z3vTO9OIGZmNiDz56f3V18tNo4BKjyBSLpQ0suSHq6yfjdJMyTdn72+2+4Y\nzcxaqlTyuPvuYuMYoGWLDgCYCJwBXFxjmz9ExP5tisfMrL26rOqqpPASSETcBbzez2bddXO0mdlA\njB2b3tdcs9g4BqjwBFKnXSQ9KOlGSVsUHYyZWVONHQsTJy4aE6tLdEIVVn/uA9aPiLmS9gauATYr\nOCYzs+bp64Pll4d584qOZEA6PoFExOzc9M2SzpY0NiKmV9p+woQJC6d7enroKQ2TbGbWqfr6YPjw\ntiSQ3t5eent7m7IvRQcM3iVpHHB9RGxdYd2aEfFyNr0jcGVEjKuyn+iE72NmNiAf+ACccAIceijM\nnNnWQ0siIhpqZy68BCLpMqAHWFXS88B4YDgQEXE+cLCkrwLzgDeBTxcVq5lZS7SxBNJMhSeQiPhs\nP+vPAs5qUzhmZu3XpW0g3XIXlpnZ0FUqgcyf31XPBHECMTMrWgQsswwMG9ZVnQqdQMzMitbXl5LH\ncst1VTWWE4iZWdHyCeShh4qOpm5OIGZmRevrS4+znT8fdtml6Gjq5gRiZla0iFQCKTWgd0lDuhOI\nmVnRSlVYpQb0LmlIdwIxMytaKYGUHizlBGJmZnUptYGUOIGYmVldSm0gJU4gZmZWl1IVVkmpKqvD\nOYGYmRWtPIG4BGJmZnVxG4iZmTWkvA3EVVhmZlaXLq3C6vd5IJKWBw4CxuW3j4h/b11YZmZLkaGa\nQIBrgZnAfcBbrQ3HzGwpVN4G0iVVWPUkkHUjYq+WR2JmtrQawv1A7pa0dcsjMTNbWnVpFVY9CeT9\nwH2SnpT0sKRHJD3crAAkXSjp5Vr7lHS6pKclPShpm2Yd28ysI3RpR8J6qrD2bnEME4EzgIsrrZS0\nN7BxRGwqaSfgXGDnFsdkZtY+Q7UfSERMBkYD+2Wv0dmypoiIu4DXa2xyAFlyiYh7gFUkrdms45uZ\nFW6otoFIOhb4ObBG9rpU0j+3OrCcdYAXcvMvZsvMzIaGLi2B1FOF9UVgp4iYAyDpNOBPpGqnjjNh\nwoSF0z09PfT09BQWi5lZXfr6YJllFs23sA2kt7eX3t7epuxL0c+jEyU9AuwQEf/I5lcA7o2Ipt2Z\nJWkD4PqIeHeFdecCt0fEFdn8E8BuEfFyhW2jv+9jZtZxRo6EqVNh1Kg039sLu+3WlkNLIiLU/5ZL\nqqcEMhG4R9LV2fyBwIWNHKwGZa9KrgOOBq6QtDMwo1LyMDPrWkO1CisifiSpl3Q7L8DhEfFAswKQ\ndBnQA6wq6XlgPDA8HTrOj4ibJH1M0jPAHODwZh3bzKwjdOlgilUTiKRREfGGpLHAc9mrtG5sRExv\nRgAR8dk6tjmmGccyM+tIXdqRsFYJ5DJgX9IYWPmGBWXzG7UwLjOzpcdQSyARsW/2vmH7wjEzWwp1\naU/0evqB3FbPMjMza1CXNqJXTSCSVsjaP1aTNEbS2Ow1DnfkM7OhZL310q2zRRmCPdGPIrV/bJ69\nl17XAme2PjQzszaZMgXuu6+YY5f6rg2l54FExE+An0j654joyF7nZmZNU9Sv/vL2jyJjGaB6+oGc\nIWkrYAtghdzyiqPnmpl1pXnzijnuUE4gksaTOvptAdxEGt79LqoMv25mZgNQ3oAOXZNA6nmg1MHA\nnsBLEXE48B5glZZGZWbWbkWNo1fegA5d0wZSTwJ5MyL6gPmSRgGvAOu1Niwzs6VEpSqs008vJpYB\nqmcwxb9KGg1cQLoLazZpOHczMxusSgnksceKiWWAaiYQSQK+HxEzgHMl/QYYFRFNeya6mVlHKG+H\naJdKCWTjjYuJZYBqJpCICEk3AVtn88+1Iygzs7Yrqg0k34h+770wcSKs0h3NzPW0gdwvaYeWR2Jm\ntjTKN6K/972pV3yX3IVVTxvITsChkiaTnschUuFkiacHmpnZAJVXYS2zzJBKIB9teRRmZkurLk4g\n/VZhRcRk0m27e2TTc+v5nJlZVyi1fRTRBnLZZbDGGkM3gWQ90U8Avp0tWg64tJVBmZm1TeliXcRF\n+4470nv+DrChlECAjwP7k9o/iIipwMhWBmVm1jZFJpBSqWeolkCAtyMiyB5rK2nlZgYgaS9JT0h6\nStIJFdbvJmmGpPuz13ebeXwzW0qddBJ87nOLLtZFDB/S5Qmknkb0KyWdB4yWdCRwBKlX+qBJGkZ6\ntsiewFTgXknXRsQTZZv+ISL2b8YxzcwAOP98ePllOPvsNO8SyIDV04j+A+Aq4FfAO4GTmvh8kB2B\npyNickTMA34BHFBhu4K6iJrZkLVC9nSKIquw+vrSe3kCmTgRJk9ufzwDVNfdVBFxa0QcHxHfjIhb\nm3j8dYAXcvNTqPy43F0kPSjpRklbNPH4Zra0Wn759N4JbSD5RvRls4qhiy5qfzwDVLUKS9IssnaP\n8lWkjoSjWhbV4u4D1o+IuZL2Bq4BNqu28YQJExZO9/T00NPT0+r4zKwbDR+e3juhBFJ+F1Z+XZP1\n9vbS26Tnv9d6pG077rR6EVg/N79utiwfx+zc9M2SzpY0NiKmV9phPoGYmVVV+qVfShwtumDXVCqB\nlJJGfrpF8ZT/sD755JMb3lddVViS3i/p8Gx6NUkbNnzExd0LbCJpA0nDgc8A15Ude83c9I6AqiUP\nM7O6lS7UpbuviqzCamMCaaZ6H2n7XlID+kRgOKkj4fsGe/CIWCDpGOAWUjK7MCIel3RUWh3nAwdL\n+iowD3gT+PRgj2tmtvBC3QltIE8+uWjZUEogpI6E2wL3Q+pIKKlp1VsR8RtScsovOy83fRZwVrOO\nZ2YG1K7C+vKX4ZxzFi8ZtEKlJNFFCaTwjoRmZoUoTyD5EsgFF8Dcua2PodL4W6Vbeot6PskA1JNA\nyjsS/o4mdSQ0MytMf1VY7biAVzpGF5VA+q3CiogfSPow8AaLOhI2sy+ImVn7lUogRTaiV0oSpRLI\nUEgg2R1Xd5aShqQVJY3z423NrKuVl0DKL9jtKIH84x9LLuuiEkg9VVi/BPLfZEG2zMyse9VqA4H2\nJJC3315yWReVQOpJIMtGxMJvmU0Pb11IZmZtdOed6b2IKqxx45ZcNsRKIK9KWjgSrqQDgL+3LiQz\nsxabORPeeitNH3dceu/rS8tKw4q0owQyb96Sy7qoBFJPP5CvAD+XdGY2PwX4p9aFZGbWYqNHL7ls\nwQJ47bVF8+24gFd6BkkXlUDquQvr/4CdJY3I5mf38xEzs+5TRAJ55pkll5VKIJXaRzpMPc9EP1XS\n6IiYHRGzJY2R9P/aEZyZWdv09S2eQNpRhXX33UsuKx+jq4PV0wayd0TMKM1ExOvAx1oXkplZAV58\nER54YNF8qxvVq5VwSiUQdf5z9OpJIMtIWr40I2lFYPka25uZdZfhw+HRRxc1qENrq7Defhs+//nK\n61o9/lYT1dOI/nPgNkkTs/nDgYtbF5KZWZstt9ySbQ6tTCCvvQaXXVZ53Usvte64TVZPI/ppkh4C\nPpQtOiUiftvasMzM2qjSr/5WJpBla1x6u6DxvKSeEkhpyPXfwMKHS50VEUe3NDIzs3ZpdwKpte9a\nyaXD1BWppG2BQ4BPAZOAX7cyKDOzthpWoTm4lQkk30D/17/CU08tmt955/S+3HKtO36TVE0gkjYj\nJY1DSD3PryA9Tnb3NsVmZtYeRSWQMWNg++3Tq2SlldJ7F5REakX4BHAnsG9EPAMg6V/bEpWZWTtV\nqsJq1m28r74Kb74J66+/5L4r3apbSmbdXAIBPgF8Brhd0m+AXwCdf2OymdlAtbINZK210r7yHRNL\nCaRSyae0rAtu563aDyQiromIzwCbA7cD/wKsIekcSR9pVgCS9pL0hKSnJJ1QZZvTJT0t6UFJ2zTr\n2GZmQGursCrtp1YJZJll4HvfGxqPtI2IORFxWUTsB6wLPABUvNAPlKRhwJnAR4EtgUMkbV62zd7A\nxhGxKXAUcG4zjm1mtlD+137pot7MNpDy0kQpgbz6auXtV1utKwZTrKcn+kIR8XpEnB8Rezbp+DsC\nT0fE5IiYR6omO6BsmwPIOi5GxD3AKpLWbNLxzcwWv8CPGpXe67mAz5wJt90GN98MRx1VfbsFC2Dq\n1EXz55xTe79SVySQopv51wFeyM1PISWVWtu8mC17ubWhZWbMSC9p0WvBArjpJthmG9h229Tx5403\n4IIL4NOfhhEj2hKamQ3S7rvD7bcvXoW1yiopMfR3AV+wYMlh4c87r/r2p5wCJ56Yps84o/a+hw1b\nvApr5sx0V9bKK9f+XJvVuo13+Yh4q53BNMOECRMWTvf09NDT0zO4HV52GZx2Wvpjlv6gr7yyqLfo\nWmul5LHssun9lFMWv9vCzDpL/u6qUskjn0BKy/bbD772tZRgxoyBOXNSwnjpJVh7bbj++iX3HVF9\nEMRzz00/PPO22qrytsOGLZ7AvvMd2GILOHrw/bd7e3vp7e0d9H6gdgnkT8B2ki6JiCqjfg3ai0D+\nartutqx8m/X62WahfAJpiq99Lb3KPfFE+sfw3vfCZpvB+efDgQfCllt2xd0TZkut6dNh1VXTdOn/\nar7PxVZbwaRJqcrpjjtSDcSqq8JOO6U2i+nT0w/IWbOW3Pfbb8PyVcaanTYt/eAEOOgg+PWvqyeb\n8gQyf37T+oWU/7A++eSTG95XrYiGS/ossKukT5SvjIhm9Ea/F9hE0gbANNJtw4eUbXMdcDRwhaSd\ngRkR0Z7qq1o23zy9Sk46qbhYzKx++Yt2pRLIiium98MOg//93+r7+fvfYfXV0/ZvvpmWzZlTPYHk\nq5/GjFnyuOUxtiiBNFOtiL4CHAqMBvYrWxc0YTiTiFgg6RjgFlKD/oUR8biko9LqOD8ibpL0MUnP\nAHNIowGbmTWmUnVVf8sqWW01ePbZ9F5qeH/+eRg7tvL2pR7m+X3XKoHk20C6LYFExF3AXZL+GhEX\ntiqAbKDGd5YtO69s/phWHd/MljL5xFC6KOernSstq2bDDdN7BLz//TC7whO/S9VRlW4VfuON6jHm\nSyBXXw0f/nD/8bRZPbfxXiLp65Kuyl7/LKnz+9ibmfWnUq/veksg5UaMqNwuMmzYkkO0lxLIs89W\n3ld5FdasWXDffQOLpw3qKROdDSyXvQN8HjgH+FKrgjIza5l81VBpulIV1kBvhhk5cskSyNy5lauf\n+htnK1+FVUokd945sHjaoJ4EskNEvCc3//vsAVNmZt1n+PAll1WqwmpGCeSww9J7eVvHl74EP/1p\n9X3lq7BKyaYDB1es5wwtkLRxaUbSRkCLnzZvZtYiK6wAp5+++LJGGtHLjRy5ZAK56qrK2+60U3ov\nPfujXL4Ka9q09F6tcb5A9ZRAjieNyPssaTTeDfCdUGbWzcoHKsxXMZUSyCc/ObB9VqrC6k+13u75\nEkip6mqLLQa27zao55not0nalEV3Sj3ZjT3UzcwWKr9wl/p+wKIE8oEPDGyfI0akIUfKlW7xraTa\niLvSonWlpNSBt/HWVUaLiLci4uHs5eRhZt2t/MJd6vx3332NX6hHjky91vP7/sAH4NprK2//nvdU\nvzU3n0BmzYIdd4Rvf7uxuFqo81KamVmrlZdATj4ZrrkmJY+Btn2UjBiRBlN88EH47W8XDbRYbXDV\nBx+svq/8XVizZ8Nee9UuyRSkwTNlZtbFyhPI1lun9/Ie4AMxcmR6v+ceGD9+0fJ8D/R65RvR585t\nbB9t0G8CUfI5SSdl8+tLKh9y3cyse5QuzqXqqtJttoN5Dke+pJHv59FIiSZfhdWhw5hAfSWQs4Fd\nWDTI4SzgrJZFZGbWaqUkcdZZ8FCuW1v+wj1Q+Yv8nDmLpjfffMlt+5MvCS1Y0LEjfNeT1naKiO0k\nPQDpqYSSKvTEMTPrEqUEstpq6VUipT4alTob9iefeEp3Tl16aWPx5UtCHZxA6imBzJO0DGkEXiSt\nDnT+sxbNzKqpVU31qU/BWw3cbLrZZoumZ89OJY9DDx34fmDxklCXJ5DTgauBNST9B3AXcGpLozIz\na6VqY1EN5nHU668Pl1+epmfNGtxdU0OlCisifi7pPmBPUk/0AyPi8ZZHZmbWKp/+9JK9xidNgvXW\nq7x9vUoN5q++Orh9dUkVVq1noucHXnkFuDy/LiKmtzIwM7OWede74Ac/WHzZuHGD32/pbq4pUwY3\n9EiXVGHVKoHcR2r3EOm55a9n06OB54ENWx6dmVk3KV3058xpXhVWN97GGxEbRsRGwO+A/SJitYhY\nFdiX9AhaMzPLe+97F00PJoF0SRVWPY3oO0fETaWZiLgZ2LV1IZmZdamNNlo0RMkqqzS+nyFQhVUy\nVdJ3gdINzYcCUwd7YEljgCtIw8M/B3wqIpYYylLSc8BM0q3D8yLCveDNrHONGZPeB/P8ji65C6ue\nEsghwOqkW3mvBtZgUa/0wTgR+F1EvBP4PVBtqMk+oCcitnXyMLOOV0ogpfdGdEkVVj238U4Hjm3B\nsQ8AdsumLwJ6SUmlnPCgj2bWLUp9SdZaq/F9DJUqLEm3k/VCz4uIPQZ57DUi4uVsXy9JWqPKdgHc\nKmkBcH5EXDDI45qZtY4Et94KH/xg4/vokiqsetpAvpmbXgE4CJhfz84l3QqsmV9ESgjfrbB5tRHM\n3hcR07IhVG6V9HhE3FXtmBMmTFg43dPTQ09PTz2hmpk1z4c+NLjPt7AKq7e3l97e3qbsS9HAyJOS\n/jLY9ghJj5PaNl6WtBZwe0S8q5/PjAdmRcSPqqyPRr6PmVlH6e1NzxS54w7Yc8/0NMLBJqUqJBER\nauSz9TwPZGzutZqkjwKDuD9toeuAL2TThwFLPPdR0kqSRmTTKwMfAR5twrHNzDrXEKrCyvdInw9M\nAr7YhGOfBlwp6QhgMvApAElrAxdExL6k6q+rJUUW688jwp0YzWxoGyp3YQHvioh/5BdIWn6wB87u\n7lqiTBYR00i93YmIScA2gz2WmVlX6ZK7sOq5PfbuCsv+1OxAzMws0+1VWFnD9jrAipK2JVVhAYwC\nOvMJ72ZmQ8EQqML6KKmRe10gf9fTLOA7LYzJzGzp1iVVWFUTSERcBFwk6aCI+FUbYzIzW7oNgSqs\nz0XEpcA4SceVr6/WF8PMzAYpX4XVwc8DqRXVytn7IB4SbGZmAzYEqrDOy95Pbl84ZmbW9VVYJdkY\nVEcC4/LbR8QRrQvLzGwpNgTuwiq5FriT9GjbBa0Nx8zMur4KK2eliDih5ZGYmVnSJVVY9fREv0HS\nx1oeiZmZJV1ShVVPAjmWlETelPSGpFmS3mh1YGZmS62hUoUVESPbEYiZmWXKq7C6sB8IAJK2q7B4\nJjA5Iup6MqGZmQ1AeUfCbi2BAGcD2wGPZPNbkx7qtIqkr/r5HGZmTdYlVVj1tIFMBbaNiO0jYnvS\n8zmeBT4M/FcrgzMzWyoNobuwNouIv5VmIuIxYPOIeLZ1YZmZLcW65C6seqqw/ibpHOAX2fyngcey\npxLOa1k2AMCVAAAMoklEQVRkZmZLqyFUhfUF4BngX7LXs9myecDurQrMzGypNWxYajy/446USIbV\nc6luP0Upy7X7wNLBwATgXcAOEXF/le32An5MSnYXRsRpNfYZRX0fM7OmmTQJNtooTQ8blkohLSKJ\niFD/Wy6p37QmaVNJV0l6TNKzpVcjByvzCPBx4I4axx4GnEl6OuKWwCGSNm/Csc3MOpdy1/MO7QMC\n9VVhTQTOAeaTqqwuBi4d7IEj4smIeJpFz1qvZEfg6YiYHBHzSO0wBwz22GZmHS1fZdWh7R9QXwJZ\nMSJuI1V3TY6ICcA+rQ1roXWAF3LzU7JlZmZD15w5i6Y7OIHUUzZ6K6tKelrSMcCL1PmUQkm3Amvm\nFwEB/FtEXD/QYOsxYcKEhdM9PT309PS04jBmZq0zffqi6SYnkN7eXnp7e5uyr34b0SXtADwOjAZO\nAVYB/isi/tyUAKTbgW9UakSXtDMwISL2yuZPBKJaQ7ob0c1sSJg1C0aNStNjx8Jrr7XsUINpRK9n\nMMV7s8nZwOGNHKQO1YK/F9hE0gbANOAzwCEtisHMrDOMyFXydGMVlqTran0wIvYfzIElHQicAaxG\nGi7+wYjYW9LawAURsW9ELMiqzW5h0W28jw/muGZmHS9/F1YHJ5CqVViSXiU1YF8O3ENZKSEiqt5+\nWxRXYZnZkFFKIuusA1OmtPAwranCWos0YOIhwGeBG4HL8+NimZlZi3VjP5CIWBARv4mIw4CdScOZ\n9GZVSmZm1g4dXIVVM7VlAybuQyqFjANOB65ufVhmZgZ0ZwKRdDGwFXATcHJEPNq2qMzMLOngBFKr\nEb0PKHWHzG8kUl+MUS2ObcDciG5mQ0apEX3LLeHR1v1+b0kjekR05vjBZmZLkw4ugThJmJl1sg6u\nVXECMTPrZG+8UXQEVTmBmJl1svnzi46gqsKeSNgKbkQ3syEjP5xJC69rLX0ioZmZWSVOIGZm1hAn\nEDMza4gTiJmZNcQJxMzMGuIEYmZmDXECMTOzhjiBmJlZQ5xAzMw60R//WHQE/SosgUg6WNKjkhZI\n2q7Gds9JekjSA5L+0s4YzcwKs+uuMHJk0VHUVOTDdh8BPg6c1892fUBPRLze+pDMzDpIX1/REdRU\nWAKJiCcBJPU3BotwVZuZLY06fGy/brgwB3CrpHslHVl0MGZmbbM0l0Ak3QqsmV9ESgj/FhHX17mb\n90XENEmrkxLJ4xFxV7WNJ0yYsHC6p6eHnp6eAcdtZtYRWlAC6e3tpbe3tyn7Knw4d0m3A9+IiPvr\n2HY8MCsiflRlvYdzN7Oho1TD7+Hca6oYvKSVJI3IplcGPgK07unyZmZWtyJv4z1Q0gvAzsANkm7O\nlq8t6YZsszWBuyQ9APwZuD4ibikmYjMzyyu8CquZXIVlZkPKD34AY8fCEUe07BCDqcJyAjEzW4oN\nhTYQMzPrMk4gZmbWECcQMzNriBOImZk1xAnEzMwa4gRiZmYNcQIxM7OGOIGYmVlDnEDMzKwhTiBm\nZtYQJxAzM2uIE4iZmTXECcTMzBriBGJmZg1xAjEzs4Y4gZiZWUOcQMzMrCFFPhP9vyQ9LulBSb+S\nNKrKdntJekLSU5JOaHecZmZWWZElkFuALSNiG+Bp4NvlG0gaBpwJfBTYEjhE0uZtjbLJent7iw6h\nLo6zuRxncznOzlBYAomI30VEXzb7Z2DdCpvtCDwdEZMjYh7wC+CAdsXYCt3yD8pxNpfjbC7H2Rk6\npQ3kCODmCsvXAV7IzU/JlpmZWcGWbeXOJd0KrJlfBATwbxFxfbbNvwHzIuKyVsZiZmbNpYgo7uDS\nF4AjgT0i4q0K63cGJkTEXtn8iUBExGlV9lfclzEz61IRoUY+19ISSC2S9gKOBz5YKXlk7gU2kbQB\nMA34DHBItX02ehLMzGzgimwDOQMYAdwq6X5JZwNIWlvSDQARsQA4hnTH1t+AX0TE40UFbGZmixRa\nhWVmZt2rU+7CGrBu6Ygo6WBJj0paIGm7Gts9J+khSQ9I+ks7Y8yOX2+cRZ/PMZJukfSkpN9KWqXK\ndoWcz3rOj6TTJT2d/dvdpl2x1RujpN0kzchqBu6X9N12x5jFcaGklyU9XGObQs9lFkPNODvhfEpa\nV9LvJf1N0iOSvl5lu4Gdz4joyhfwIWBYNv2fwPcrbDMMeAbYAFgOeBDYvM1xvhPYFPg9sF2N7Z4F\nxhR4PvuNs0PO52nAt7LpE4D/7JTzWc/5AfYGbsymdwL+3IEx7gZcV8S/w7I43g9sAzxcZX2h53IA\ncRZ+PoG1gG2y6RHAk834t9m1JZDoko6IEfFkRDxNuoW5FlFsx8564iz8fGbHuyibvgg4sMp2RZzP\nes7PAcDFABFxD7CKpDVpn3r/hoXfkBIRdwGv19ik6HNJduz+4oSCz2dEvBQRD2bTs4HHWbJP3YDP\nZ9cmkDJDoSNikG4ouFfSkUUHU0UnnM81IuJlSP8pgDWqbFfE+azn/JRv82KFbVqp3r/hLlk1xo2S\ntmhPaANW9LkciI45n5LGkUpM95StGvD5LOw23np0S0fEeuKsw/siYpqk1UkXvsezXzadFmfL1Yiz\nUt1xtbtAWn4+h7D7gPUjYq6kvYFrgM0Kjqmbdcz5lDQCuAo4NiuJDEpHJ5CI+HCt9VlHxI8Be1TZ\n5EVg/dz8utmypuovzjr3MS17f1XS1aSqhqZe8JoQZ+HnM2usXDMiXpa0FvBKlX20/HxWUM/5eRFY\nr59tWqnfGPMXloi4WdLZksZGxPQ2xVivos9lXTrlfEpalpQ8LomIaytsMuDz2bVVWLmOiPtHHR0R\nJQ0ndUS8rl0xVlCxHlTSStkvAyStDHwEeLSdgZWHVGV5J5zP64AvZNOHAUv8RyjwfNZzfq4D/imL\nbWdgRqlKrk36jTFf7y1pR9Lt/kUlD1H932PR5zKvapwddD5/BjwWET+psn7g57PIOwMGeVfB08Bk\n4P7sdXa2fG3ghtx2e5HuOHgaOLGAOA8k1Su+SepNf3N5nMCGpLthHgAe6dQ4O+R8jgV+l8VwCzC6\nk85npfMDHAV8ObfNmaQ7oR6ixp15RcUIHE1KuA8AdwM7tTvGLI7LgKnAW8DzwOGddi7ribMTzifw\nPmBB7v/F/dm/g0GdT3ckNDOzhnRtFZaZmRXLCcTMzBriBGJmZg1xAjEzs4Y4gZiZWUOcQMzMrCFO\nINb1JPVJ+u/c/DckndTmGCZK+kQ2fYGkzQe5vw0kPVK2bKtsePr7Jb0m6dls/halB7FdOZhjmg1U\nRw9lYlant4BPSPp+NNDDV9IykZ5+2RQR0azBGxfrpBURjwLbAkj6Ganj5K9zm3yqScc1q4sTiA0F\n84HzgeMoG3BR0gakIRxWBV4FDo+IKZImAv8gjUr6R0mzSD3YNyKNB3QcsDPpGQlTgP0iYoGk7wH7\nAisCd0fEV8qDkXQ78A3SSKb/TkoEKwHLRcTGkrYHfgisDPwd+EKksb22By7Mtr+1n++82LAZ2fe8\nISK2lnQYaWSBlYFNsmMNBz6ffeePRcQMSRsBZwGrAXOBIyPiqX6Oa7aQq7BsKAjShfBQSSPL1p0B\nTIyIbUhDTpyRW7dOROwSEd/M5jcCekjPRbgUuC0i3k266O5T2l9E7JQtX0nSPlQREddHxLYRsR1p\naIj/zga0Ox04KCJ2ACYCp2Yf+RlwdERs28A5gMVLLFuSksiOwH8As7M4/kw23hEp6R6TxXE8cE6D\nx7WllEsgNiRExGxJFwHHksbzKtkF+Hg2fQnpiYYlvyzbzc0R0Ze1PQyLiFuy5Y8A47LpPSUdTypR\njCGNcXRjrdgkfQuYGxHnStoS2Io0xHzpoVdTlR7Nu0pE/DEX6151fPVqbo+IucBcSTOAG3LfZets\nkMldgV9mcUB6QqFZ3ZxAbCj5CWmQuIm5ZbUGe5tTNv8WQESEpHm55X3AspKWJ5V0touIqZLGAyvU\nCkjSh4CDgA+UFgGPRsT7yrar+Gz3QciPUB25+T7S//thwOtZqcSsIa7CsqFAABHxOnAl8MXcuruB\nQ7LpzwF3DmSfZVYgXYxfy4aLP7jmDlK7xJnAJyPi7Wzxk8Dq2XDZSFpW0hYRMROYIWnXbLtD64yz\nIRExC5gkaeF3kPTuVh7Thh4nEBsK8qWMH5IazEvLvg4cLulB0kX52Aqf6W+faUG6yP8U+BvpEcp/\nqbJ9afow0vDz12S3294Q6TnknwROy2J6gFTNBunRzGdLur+f2OqJv55tPwd8MXvU6qPA/gPYp5mH\nczczs8a4BGJmZg1xAjEzs4Y4gZiZWUOcQMzMrCFOIGZm1hAnEDMza4gTiJmZNcQJxMzMGvL/AcjQ\n6PQJRC2uAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0xb546128>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0xc12a0b8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEZCAYAAAC5AHPcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xm4HFWd//H3JyRhD/uOBBBZFBBBVlEuMLKILAIzgiCL\ngIwDA/5UlHFUEp1hGR1HFFkFHhAZUBBZBESBq6DgIPsWCItAEmQxYQlrcu/390dV51Y6vVT3rV7z\neT3PfbqW03W+Xffe+vY5VXVKEYGZmVmjxnQ6ADMz601OIGZm1hQnEDMza4oTiJmZNcUJxMzMmuIE\nYmZmTXECsb4kaaKkYUlt+RuX9B5Jr0lSO+rL1HuSpJ+2s8526tR+tXycQGw+kv4q6c30n/b19HXV\nTsfVpJbd5CTpaUk7zaso4rmImBCdubGqrXVK2j7zt/Fa5m9lSNJPiqyrw/vV6nACsXIB7JH+0y6d\nvv6tkQ1IWqRFsbVFr8ffahFxe+ZvY0JETAD2BWYD/93h8KyNnECskordBZL2kvSQpJmSbpG0YWbd\n05K+Kul+YHalriNJP5D0rKRXJd0lafvMujGSvi7picz6NdJ1H5B0k6S/S3pe0onpckk6MX3PS5Iu\nk7RsldgnSPqJpBmSnpP0nVK3iKRDJd0u6fuSXgZOkrSupJslvSzpRUmXSJqQlr8YWAu4Nv32/ZXy\nLjNJq0m6Oo35cUlHZmI5SdLlki5K3/+gpM2r/jJq7LcmfkdflnS/pFmS/lfS+Mz6r6b7Z5qkI9LP\ns261ujLvew/wM+CfI+LRKmUOk/RI+nmfkPT5snrvzOy7L6T7ZHyF/XqYpCfT7Twp6cB68VkLRURf\n/QDnAy8ADxS0vRuAWcA1ZcvXBu4EHgf+Fxjb6c9e0Od9GtipwvL1Sb5h7gQsApwATC197vR99wCr\nA4tW2fZngGVJvrj8P+B5YHy67gTgfmC9dH4TYDlgKWAG8EVgPLAksGVa5njgT8BqwDjgLODSdN1E\nYAgYk85fBZwJLAasmP7ujkrXHQrMAf4ljW1R4L3AzsBYYAVgEPh+2X7aMTNfXt8fgB+lcX0QeBEY\nSNedBLwJ7EqSrE8G7qjxO6m1304CLm7gd3QnsEq6vUeAz6frdkv384bpPvpp+nnWrfP3Mg64Azij\nTrndgbXT6Y8CbwCbpfNK9++3gPWAmcCm5fsVWAJ4NfM3sgqwUaf/Zxbmn44HUPgHgu2BzSgugewI\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0xc0c7828>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"xhat = savitzky_golay(Y_scale, 111, 10) # window size 111, polynomial order\n",
"yhat = savitzky_golay(Y_scale2, 111, 10)\n",
"zhat = savitzky_golay(Y_scale3, 111, 10)\n",
"\n",
"# Plotting the acceleration values bu smoothing data\n",
"\n",
"plt.title('For acceleration along X axis')\n",
"plt.plot(X_scale,xhat,'r')\n",
"plt.xlabel('Normalized Time')\n",
"plt.ylabel('Magnitude of Acceleration')\n",
"plt.show()\n",
"\n",
"\n",
"\n",
"plt.title('For acceleration along Y axis')\n",
"plt.plot(X_scale,yhat,'r')\n",
"plt.xlabel('Normalized Time')\n",
"plt.ylabel('Magnitude of Acceleration')\n",
"plt.show()\n",
"\n",
"\n",
"plt.title('For acceleration along Z axis')\n",
"plt.plot(X_scale,zhat,'r')\n",
"plt.xlabel('Normalized Time')\n",
"plt.ylabel('Magnitude of Acceleration')\n",
"plt.show()\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Similarly I plotted the acceleration values for other days."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Detecting whether users form a group based on their BSSID levels"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### BSSID , wifi value \n",
"\n",
"Here, I made some files each containg user_id and their BSSID at different points of time throughout the day.\n",
"\n",
"Like wise I created files for the two months data."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\n",
"\"\"\"\n",
"This code is used to process files for about 57 users on the basis of their wifi data\n",
"\"\"\"\n",
"from datetime import datetime\n",
"import csv\n",
"import os\n",
"\n",
"### Importing the modules\n",
"\n",
"# Function for converting the time value in the csv files to Year-Month-Day Format\n",
"def year(value):\n",
"\n",
" yeartime = datetime.fromtimestamp(int(value)).strftime('%Y:%m:%d')\n",
" return yeartime\n",
"\n",
"# Function for converting the time value in the csv files to Hours-Minutes-Seconds format\n",
"def timevalue(value):\n",
" time = datetime.fromtimestamp(int(value)).strftime('%H:%M:%S')\n",
" return time\n",
"\n",
"# --------------------------------------------------------------------------------------------------------------\n",
"\n",
"##--- Main part of the Program--------------------------\n",
"\n",
"# Creating a string of user ids '00 , 01, 02, 03, O4, 05 ................. 59 '\n",
"na = [str(i) for i in range(60)]\n",
"for i in range(len(na)):\n",
" if(len(str(na[i])) == 1):\n",
" na[i] = '0' + na[i]\n",
"\n",
"# CSV Files had no user_ids 06, 11, 21 ,26, 28, 29, 37, 38, 40, 48, 55\n",
"NOFILES = ['06','11','21','26','28','29','37','38','40','48','55']\n",
"\n",
"for flname in range(len(na)):\n",
" if na[flname] not in NOFILES: ## Handling exception if no files of the above unavailable user_ids were detected\n",
" filename = 'wifi\\wifi'+ '_u' + na[flname] + '.csv'\n",
" lines= []\n",
" with open(filename) as f: ## Opening the CSV files\n",
" reader = csv.reader(f, delimiter=' ')\n",
" for row in reader:\n",
" lines.append(row) ### Reading through lines from individual a csv file\n",
"\n",
" ## line[] contains a list of the LINES of the CSV file\n",
" time =[]\n",
" Year = []\n",
" NElines = [] # NELines denotes the non-empty lines in the csv file\n",
" for i in range(1,len(lines)):\n",
" if(lines[i] != [] ):\n",
" NElines.append(lines[i])\n",
" Year.append(year(int(lines[i][0][0:10])))\n",
" ## Year list contains all the dates of that particular CSV file\n",
" ## UniqueYear contains distinct dates of that particular file, unlike Year which contains some repetitions in its dates\n",
" UniqueYear = list(set(Year))\n",
" \n",
" p = 'User' + str(na[flname])\n",
" os.makedirs(p)\n",
" # Make directory of name User00, User01, ........ User59\n",
"\n",
"\n",
" UniqueYear.sort() # Sort UniqueYear numerically\n",
" Year.sort() # Sort Year numerically\n",
"\n",
" for i in range(len(UniqueYear)): # Loop through the UniqueYear\n",
" #UniqueYear[i][5:7] = Month -> 04\n",
" #UniqueYear[i][8:11] = Day -> 05 EXAMPLE = 2013-04-05\n",
" #UniqueYear[i][0:4] = Year -> 2013\n",
"\n",
" name = p + '\\ ' + 'wifi_u'+ na[flname] + '_' + UniqueYear[i][5:7] + UniqueYear[i][8:11] + UniqueYear[i][0:4] +'.txt'\n",
" # name = p\\wifi_u(user_ids)_monthdayyear.txt\n",
"\n",
" fil = open(name, 'a') # Open textfile with name = directory_name\\wifi_u(user_ids)_monthdayyear.txt\n",
" fil = open(name,'w') # Open the textfile for writing\n",
"\n",
" timetext = [] # Extract the time section from the line\n",
" BSSID = [] # Extract the BSSID no. from the line\n",
" level = [] # Extract the level from the line\n",
"\n",
" for j in range(len(Year)): # Loop through the whole Year\n",
" if(Year[j] == UniqueYear[i]): # If a match occurs then update the corresponding line's time, BSSID and level values\n",
"\n",
" # --------------EXPLANATION -------------------------------------------------------------------------------------\n",
" # NElines[j][0][0:10] - Extracting the time values from the csv file. Since each such number in the time column is of length 11, so we are slicing the first 11 characters.\n",
" # NElines[j][0][0:10][0:2] - Hour Part , NElines[j][0][0:10][3:5] - Minute Part\n",
" # BSSID = NElines[j][0][11: 17+11] , Since Each BSSID values start after the first 11 characters(time value) and has a fixed length = 17 characters\n",
" # level values start after 34 characters and have a length of 3 characters. So level = NElines[j][0][34:38]\n",
"\n",
" timetext.append(str( (int(timevalue(NElines[j][0][0:10])[0:2]))*60 + int(timevalue(NElines[j][0][0:10])[3:5])))\n",
" BSSID.append(NElines[j][0][11: 17+11])\n",
" level.append(NElines[j][0][34:38])\n",
"\n",
"\n",
" ptim = timetext # Copying the time section to ptim\n",
" bs = BSSID # Copying the BSSID nos to bs\n",
" lve = level # Copying the level to lve\n",
"\n",
" ## uniquetime contains distinct time(Hours-Minutes) of that particular file, unlike ptim which contains some repetitions in its time values\n",
" uniquetime = list(set(ptim))\n",
"\n",
" for h in range(len(uniquetime)):\n",
" uniquetime[h] = int(uniquetime[h])\n",
"\n",
" uniquetime.sort()\n",
" ## Sort the uniquetime numerically\n",
"\n",
" listoflines = [] # Lines to be written in the file\n",
" for d in range(len(uniquetime)):\n",
" t = uniquetime[d] ## Loop through all the distinct time\n",
" xc = ''\n",
" for g in range(len(ptim)):\n",
"\n",
" if(str(t) == ptim[g]): # Check for matching for time with the values in ptim\n",
" if(bs[g] not in xc): # to check if the same BSSID value is not repeated\n",
" xc+= (',' + bs[g]+ ',' + lve[g]) # then append the BSSID and the level value to the end of the line\n",
"\n",
"\n",
"\n",
" listoflines.append('\\n'+str(t)+xc)\n",
"\n",
"\n",
" fil.writelines(listoflines) # write the corresponding content in to the file\n",
" fil.close() # close the text file\n",
"\n",
"\n",
" f.close() # close the csv file\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---------------------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Given two user datas, we check if the two users are within the same wifi range. \n",
"Each user at a particular time has upto maximum 6-7 BSSID slots available to him. \n",
"So we check the BSSID values for each of the two users and calulate the **Jacker Index Coefficient**.\n",
"\n",
"\n",
"**Jacker Index Coefficient** is given by the ratio \n",
"\n",
"\n",
"### I / U\n",
"\n",
"\n",
"Where \n",
"\n",
"- I = Intersection of the BSSID values of two users\n",
"- U = Union of the BSSID values of two users\n",
" \n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"--------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Proximity of two Users "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We say that two users are in close proximity if they have a high Jaccard Index Coefficient.\n",
"\n",
"This is because higher the intersection of the BSSID values between two users, higher is the chances of the users being in close proximity.\n",
"\n",
"So based on this we can check whether users are in close proximity with each other."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"----------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this project we have total 59 users and we have data for two months.\n",
"\n",
"So we have files for a particular day and for two specific users from the 59 users.\n",
"\n",
"For example,\n",
"'Wifi_Jaccard_u00_u01_03272013' is a file thay stores the Jaccard Index values and Pearson Coefficient Values for two specific users u00 and u01 throughout the day 27/03/2013.\n",
"\n",
"Likewise, we have data files for a particular day and for two specific users."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting Jaccard Index and Pearson Coefficient for two users during a particular day.\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import matplotlib.patches as mpatches\n",
"from matplotlib.font_manager import FontProperties\n",
"import numpy as np\n",
"import os\n",
"from glob import glob\n",
"\n",
"p = 'JCPearsonPlots2'\n",
"os.makedirs(p)\n",
"main_directory = 'JC'\n",
"\n",
"files_list = glob(os.path.join('JC1\\JC', '*.txt'))\n",
"for a_file in sorted(files_list):\n",
" #print(a_file)\n",
" filename = a_file\n",
" fil = open(filename, 'r')\n",
" lines = []\n",
" lines.append(fil.readlines())\n",
" textlines = []\n",
" for i in range(len(lines[0])):\n",
" textlines.append( lines[0][i].split(\",\"))\n",
"\n",
" time = []\n",
" JC = []\n",
" Pearson_coefficient = []\n",
" for j in range(len(textlines)):\n",
" time.append(textlines[j][0]) # appending the time index\n",
" JC.append(textlines[j][1]) # appending the Jaccard Index coefficient for that particular time\n",
" Pearson_coefficient.append(textlines[j][2]) # appending the Pearson coefficient for that particular time\n",
"\n",
" for k in range(len(time)):\n",
" time[k] = int(time[k]) # converting to int\n",
" for k in range(len(JC)):\n",
" JC[k] = float(JC[k]) # converting to float\n",
" for k in range(len(Pearson_coefficient)):\n",
" Pearson_coefficient[k] = float(Pearson_coefficient[k])\n",
" # Plotting\n",
"\n",
" plot1, = plt.plot(time,JC, 'o', linewidth = '4',color = 'red' ,label = 'JC')\n",
" plot2, = plt.plot(time,Pearson_coefficient,'o',color = 'green' ,label = 'PC' ,linewidth = '5')\n",
" \n",
" plt.legend([plot1,plot2],[\"JaccardIndex\", \"PearsoncCoeff.\"], loc='upper left')\n",
" plt.xticks([0, 180,360,540,720,900,1080,1260,1440])\n",
" plt.xlabel('Time')\n",
" plt.ylabel('JaccardIndex & PearsonCoeff.')\n",
" plt.grid(animated = True)\n",
" \n",
" # Saving the plots\n",
" name = a_file\n",
" afile = a_file.replace('.txt','.png')\n",
" Afil = afile.replace('JC\\\\','')\n",
" A_fil = Afil.replace('JC1\\\\','')\n",
" fileplot = p + '\\ ' + A_fil\n",
" plt.savefig(fileplot, dpi = 150)\n",
" plt.close()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"-------------------------------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Some plots of Jaccard Index and Pearson Coefficient "
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/%20Wifi_Jaccard_u00_u01_03272013.png)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
" JaccardIndex and Pearson Coefficient for User 00 and User 01 on 27 March 2013"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"--------------------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/%20Wifi_Jaccard_u00_u01_03292013.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" JaccardIndex and Pearson Coefficient for User 00 and User 01 on 29 March 2013"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"-------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---------------------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We now plot the groups formed at different points of time throughout the day.\n",
"\n",
"We check for the characteristics of the users of the group."
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from bokeh.plotting import figure, output_file, show, ColumnDataSource,save\n",
"from bokeh.models import HoverTool\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.patches as mpatches\n",
"from matplotlib.font_manager import FontProperties\n",
"import numpy as np\n",
"import os\n",
"from glob import glob\n",
"from bokeh.io import output_notebook\n",
"from bokeh.palettes import inferno\n",
"\n",
"f = open('ProximityData\\\\groups_05242013.txt','r')\n",
"lines = []\n",
"lines.append(f.readlines())\n",
"textlines = []\n",
"for i in range(len(lines[0])): \n",
" textlines.append( lines[0][i].split(\"|\"))\n",
" \n",
"# Reading data from the file\n",
"\n",
"time = []\n",
"for i in range(len(textlines)):\n",
" time.append((int(textlines[i][0]))) # Storing the time index\n",
"\n",
"group = [[] for h in range(len(time))]\n",
"for i in range(len(textlines)):\n",
" for p in range(1,len(textlines[i])-1):\n",
" group[i].append((textlines[i][p])) # Storing the groups that were formed inside a list.\n",
" \n",
"for k in range(len(group)):\n",
" for p in range(len(group[k])):\n",
" group[k][p] = group[k][p].replace('u','')\n",
" \n",
"f.close()"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"na = [i for i in range(60)]\n",
"use= []\n",
"for j in range(len(na)): # user ids are like 08, 09. We convert it to u08, u09\n",
" if(len(str(na[j])) == 1):\n",
" use.append('0'+ str(na[j]))\n",
" else:\n",
" use.append(str(na[j])) \n",
"\n",
"for k in range(len(use)):\n",
" use[k] = 'u' + use[k] \n",
"\n",
"\n",
"color_palette = inferno(60) # Adding colors to the plot \n",
"colors = {use[u] : color_palette[u] for u in range(len(use))}\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div class=\"bk-root\">\n",
" <a href=\"http://bokeh.pydata.org\" target=\"_blank\" class=\"bk-logo bk-logo-small bk-logo-notebook\"></a>\n",
" <span id=\"05341dbc-1e26-4869-af13-a459fb89b4c0\">Loading BokehJS ...</span>\n",
" </div>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
"(function(global) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
"\n",
" var force = true;\n",
"\n",
" if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n",
" window._bokeh_onload_callbacks = [];\n",
" window._bokeh_is_loading = undefined;\n",
" }\n",
"\n",
"\n",
" \n",
" if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n",
" window._bokeh_timeout = Date.now() + 5000;\n",
" window._bokeh_failed_load = false;\n",
" }\n",
"\n",
" var NB_LOAD_WARNING = {'data': {'text/html':\n",
" \"<div style='background-color: #fdd'>\\n\"+\n",
" \"<p>\\n\"+\n",
" \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
" \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
" \"</p>\\n\"+\n",
" \"<ul>\\n\"+\n",
" \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
" \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
" \"</ul>\\n\"+\n",
" \"<code>\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"</code>\\n\"+\n",
" \"</div>\"}};\n",
"\n",
" function display_loaded() {\n",
" if (window.Bokeh !== undefined) {\n",
" var el = document.getElementById(\"05341dbc-1e26-4869-af13-a459fb89b4c0\");\n",
" el.textContent = \"BokehJS \" + Bokeh.version + \" successfully loaded.\";\n",
" } else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(display_loaded, 100)\n",
" }\n",
" }\n",
"\n",
" function run_callbacks() {\n",
" window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n",
" delete window._bokeh_onload_callbacks\n",
" console.info(\"Bokeh: all callbacks have finished\");\n",
" }\n",
"\n",
" function load_libs(js_urls, callback) {\n",
" window._bokeh_onload_callbacks.push(callback);\n",
" if (window._bokeh_is_loading > 0) {\n",
" console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
" return null;\n",
" }\n",
" if (js_urls == null || js_urls.length === 0) {\n",
" run_callbacks();\n",
" return null;\n",
" }\n",
" console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" window._bokeh_is_loading = js_urls.length;\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" var s = document.createElement('script');\n",
" s.src = url;\n",
" s.async = false;\n",
" s.onreadystatechange = s.onload = function() {\n",
" window._bokeh_is_loading--;\n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: all BokehJS libraries loaded\");\n",
" run_callbacks()\n",
" }\n",
" };\n",
" s.onerror = function() {\n",
" console.warn(\"failed to load library \" + url);\n",
" };\n",
" console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
" }\n",
" };var element = document.getElementById(\"05341dbc-1e26-4869-af13-a459fb89b4c0\");\n",
" if (element == null) {\n",
" console.log(\"Bokeh: ERROR: autoload.js configured with elementid '05341dbc-1e26-4869-af13-a459fb89b4c0' but no matching script tag was found. \")\n",
" return false;\n",
" }\n",
"\n",
" var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.5.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.5.min.js\"];\n",
"\n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" Bokeh.set_log_level(\"info\");\n",
" },\n",
" \n",
" function(Bokeh) {\n",
" \n",
" },\n",
" \n",
" function(Bokeh) {\n",
" \n",
" document.getElementById(\"05341dbc-1e26-4869-af13-a459fb89b4c0\").textContent = \"BokehJS is loading...\";\n",
" },\n",
" function(Bokeh) {\n",
" console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.5.min.css\");\n",
" Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.5.min.css\");\n",
" console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.5.min.css\");\n",
" Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.5.min.css\");\n",
" }\n",
" ];\n",
"\n",
" function run_inline_js() {\n",
" \n",
" if ((window.Bokeh !== undefined) || (force === true)) {\n",
" for (var i = 0; i < inline_js.length; i++) {\n",
" inline_js[i](window.Bokeh);\n",
" }if (force === true) {\n",
" display_loaded();\n",
" }} else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(run_inline_js, 100);\n",
" } else if (!window._bokeh_failed_load) {\n",
" console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
" window._bokeh_failed_load = true;\n",
" } else if (force !== true) {\n",
" var cell = $(document.getElementById(\"05341dbc-1e26-4869-af13-a459fb89b4c0\")).parents('.cell').data().cell;\n",
" cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
" }\n",
"\n",
" }\n",
"\n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
" run_inline_js();\n",
" } else {\n",
" load_libs(js_urls, function() {\n",
" console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n",
" run_inline_js();\n",
" });\n",
" }\n",
"}(this));"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"output_notebook()"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" <div class=\"bk-root\">\n",
" <div class=\"bk-plotdiv\" id=\"3ca1a212-af19-4795-b922-8997056b09ea\"></div>\n",
" </div>\n",
"<script type=\"text/javascript\">\n",
" \n",
" (function(global) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
" \n",
" var force = false;\n",
" \n",
" if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n",
" window._bokeh_onload_callbacks = [];\n",
" window._bokeh_is_loading = undefined;\n",
" }\n",
" \n",
" \n",
" \n",
" if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n",
" window._bokeh_timeout = Date.now() + 0;\n",
" window._bokeh_failed_load = false;\n",
" }\n",
" \n",
" var NB_LOAD_WARNING = {'data': {'text/html':\n",
" \"<div style='background-color: #fdd'>\\n\"+\n",
" \"<p>\\n\"+\n",
" \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
" \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
" \"</p>\\n\"+\n",
" \"<ul>\\n\"+\n",
" \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
" \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
" \"</ul>\\n\"+\n",
" \"<code>\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"</code>\\n\"+\n",
" \"</div>\"}};\n",
" \n",
" function display_loaded() {\n",
" if (window.Bokeh !== undefined) {\n",
" var el = document.getElementById(\"3ca1a212-af19-4795-b922-8997056b09ea\");\n",
" el.textContent = \"BokehJS \" + Bokeh.version + \" successfully loaded.\";\n",
" } else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(display_loaded, 100)\n",
" }\n",
" }\n",
" \n",
" function run_callbacks() {\n",
" window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n",
" delete window._bokeh_onload_callbacks\n",
" console.info(\"Bokeh: all callbacks have finished\");\n",
" }\n",
" \n",
" function load_libs(js_urls, callback) {\n",
" window._bokeh_onload_callbacks.push(callback);\n",
" if (window._bokeh_is_loading > 0) {\n",
" console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
" return null;\n",
" }\n",
" if (js_urls == null || js_urls.length === 0) {\n",
" run_callbacks();\n",
" return null;\n",
" }\n",
" console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" window._bokeh_is_loading = js_urls.length;\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" var s = document.createElement('script');\n",
" s.src = url;\n",
" s.async = false;\n",
" s.onreadystatechange = s.onload = function() {\n",
" window._bokeh_is_loading--;\n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: all BokehJS libraries loaded\");\n",
" run_callbacks()\n",
" }\n",
" };\n",
" s.onerror = function() {\n",
" console.warn(\"failed to load library \" + url);\n",
" };\n",
" console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
" }\n",
" };var element = document.getElementById(\"3ca1a212-af19-4795-b922-8997056b09ea\");\n",
" if (element == null) {\n",
" console.log(\"Bokeh: ERROR: autoload.js configured with elementid '3ca1a212-af19-4795-b922-8997056b09ea' but no matching script tag was found. \")\n",
" return false;\n",
" }\n",
" \n",
" var js_urls = [];\n",
" \n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" (function() {\n",
" var fn = function() {\n",
" var docs_json = {\"0003dc78-f773-474e-9679-8928df3af4c1\":{\"roots\":{\"references\":[{\"attributes\":{},\"id\":\"2c617eb7-afe0-41bc-abd3-e20439627257\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"callback\":null},\"id\":\"c0c0584d-176a-453a-ad3c-9791d80e7492\",\"type\":\"DataRange1d\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"af27874b-2ec2-46ee-8026-7d989650bbfa\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"60c3ac60-53cc-4ad9-b02c-8aa3833ac108\",\"type\":\"BasicTicker\"}},\"id\":\"810626d8-d6ce-4481-9f09-f35006efbfe8\",\"type\":\"Grid\"},{\"attributes\":{\"axis_label\":\"At Time 0\",\"formatter\":{\"id\":\"2c617eb7-afe0-41bc-abd3-e20439627257\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"af27874b-2ec2-46ee-8026-7d989650bbfa\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"88aefb20-72b6-49c9-94d6-d1043f3baead\",\"type\":\"BasicTicker\"}},\"id\":\"0828c60d-9afa-41b3-9a31-0905b20ddf1d\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data_source\":{\"id\":\"eb2a3529-4db1-472a-803f-8fdfa1fcc64b\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"c9d5de01-34b1-4507-bcfa-627fd2c40df2\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"0ac2cfdf-e407-4ac4-9f8a-17303ddd736f\",\"type\":\"Circle\"},\"selection_glyph\":null},\"id\":\"57b3e972-ec07-4077-aa63-12a93c32afe8\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_color\":{\"field\":\"fill_color\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"units\":\"screen\",\"value\":15},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"c9d5de01-34b1-4507-bcfa-627fd2c40df2\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"units\":\"screen\",\"value\":15},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"0ac2cfdf-e407-4ac4-9f8a-17303ddd736f\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null,\"column_names\":[\"y\",\"x\",\"fill_color\",\"User_groups\"],\"data\":{\"User_groups\":[\"02\",\"31\",\"13\",\"36\"],\"fill_color\":[\"#030212\",\"#C23B4F\",\"#4A0B6A\",\"#DE5337\"],\"x\":[1,1,2,2],\"y\":[0,1,0,1]}},\"id\":\"eb2a3529-4db1-472a-803f-8fdfa1fcc64b\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"callback\":null,\"plot\":{\"id\":\"af27874b-2ec2-46ee-8026-7d989650bbfa\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"tooltips\":[[\"User_groups\",\"@User_groups\"],[\"fill color\",\"$color[hex, swatch]:fill_color\"],[\"time\",\"$x\"]]},\"id\":\"17fc4b12-698f-492c-b7b0-7c25b8b0d421\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"60c3ac60-53cc-4ad9-b02c-8aa3833ac108\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"19d3e124-86be-46cf-badf-14b0f796ca5a\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"171f015c-4d28-47a4-a07a-94cc00b521d0\",\"type\":\"ToolEvents\"},{\"attributes\":{\"below\":[{\"id\":\"0828c60d-9afa-41b3-9a31-0905b20ddf1d\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"e63c0b36-4ae9-4d75-aec3-d3bf820955a0\",\"type\":\"LinearAxis\"}],\"plot_height\":400,\"plot_width\":400,\"renderers\":[{\"id\":\"0828c60d-9afa-41b3-9a31-0905b20ddf1d\",\"type\":\"LinearAxis\"},{\"id\":\"f681ec3a-1a7c-4959-88e9-7e7022109fe6\",\"type\":\"Grid\"},{\"id\":\"e63c0b36-4ae9-4d75-aec3-d3bf820955a0\",\"type\":\"LinearAxis\"},{\"id\":\"810626d8-d6ce-4481-9f09-f35006efbfe8\",\"type\":\"Grid\"},{\"id\":\"57b3e972-ec07-4077-aa63-12a93c32afe8\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"de2830ce-90d3-4578-b539-7f0e759ef91d\",\"type\":\"Title\"},\"tool_events\":{\"id\":\"171f015c-4d28-47a4-a07a-94cc00b521d0\",\"type\":\"ToolEvents\"},\"toolbar\":{\"id\":\"bbf1e7fb-1320-4aae-8f8b-ec1052eeccd2\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"f99fbbc0-f839-4f2f-a327-0b2d9de1bfa9\",\"type\":\"DataRange1d\"},\"y_range\":{\"id\":\"c0c0584d-176a-453a-ad3c-9791d80e7492\",\"type\":\"DataRange1d\"}},\"id\":\"af27874b-2ec2-46ee-8026-7d989650bbfa\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"plot\":{\"id\":\"af27874b-2ec2-46ee-8026-7d989650bbfa\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"88aefb20-72b6-49c9-94d6-d1043f3baead\",\"type\":\"BasicTicker\"}},\"id\":\"f681ec3a-1a7c-4959-88e9-7e7022109fe6\",\"type\":\"Grid\"},{\"attributes\":{\"plot\":null,\"text\":\"Mouse over the dots\"},\"id\":\"de2830ce-90d3-4578-b539-7f0e759ef91d\",\"type\":\"Title\"},{\"attributes\":{\"callback\":null},\"id\":\"f99fbbc0-f839-4f2f-a327-0b2d9de1bfa9\",\"type\":\"DataRange1d\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"17fc4b12-698f-492c-b7b0-7c25b8b0d421\",\"type\":\"HoverTool\"}]},\"id\":\"bbf1e7fb-1320-4aae-8f8b-ec1052eeccd2\",\"type\":\"Toolbar\"},{\"attributes\":{\"formatter\":{\"id\":\"19d3e124-86be-46cf-badf-14b0f796ca5a\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"af27874b-2ec2-46ee-8026-7d989650bbfa\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"60c3ac60-53cc-4ad9-b02c-8aa3833ac108\",\"type\":\"BasicTicker\"}},\"id\":\"e63c0b36-4ae9-4d75-aec3-d3bf820955a0\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"88aefb20-72b6-49c9-94d6-d1043f3baead\",\"type\":\"BasicTicker\"}],\"root_ids\":[\"af27874b-2ec2-46ee-8026-7d989650bbfa\"]},\"title\":\"Bokeh Application\",\"version\":\"0.12.5\"}};\n",
" var render_items = [{\"docid\":\"0003dc78-f773-474e-9679-8928df3af4c1\",\"elementid\":\"3ca1a212-af19-4795-b922-8997056b09ea\",\"modelid\":\"af27874b-2ec2-46ee-8026-7d989650bbfa\"}];\n",
" \n",
" Bokeh.embed.embed_items(docs_json, render_items);\n",
" };\n",
" if (document.readyState != \"loading\") fn();\n",
" else document.addEventListener(\"DOMContentLoaded\", fn);\n",
" })();\n",
" },\n",
" function(Bokeh) {\n",
" }\n",
" ];\n",
" \n",
" function run_inline_js() {\n",
" \n",
" if ((window.Bokeh !== undefined) || (force === true)) {\n",
" for (var i = 0; i < inline_js.length; i++) {\n",
" inline_js[i](window.Bokeh);\n",
" }if (force === true) {\n",
" display_loaded();\n",
" }} else if (Date.now() < window._bokeh_timeout) {\n",
" setTimeout(run_inline_js, 100);\n",
" } else if (!window._bokeh_failed_load) {\n",
" console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
" window._bokeh_failed_load = true;\n",
" } else if (force !== true) {\n",
" var cell = $(document.getElementById(\"3ca1a212-af19-4795-b922-8997056b09ea\")).parents('.cell').data().cell;\n",
" cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
" }\n",
" \n",
" }\n",
" \n",
" if (window._bokeh_is_loading === 0) {\n",
" console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
" run_inline_js();\n",
" } else {\n",
" load_libs(js_urls, function() {\n",
" console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n",
" run_inline_js();\n",
" });\n",
" }\n",
" }(this));\n",
"</script>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"'C:\\\\Users\\\\pratik\\\\Anaconda2\\\\lib\\\\runpy.html'"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"i = 0 \n",
"#output_file('toolbar.html')\n",
"user_group = ''\n",
"for kj in range(len(group[i])):\n",
" user_group += ',' + group[i][kj]\n",
"\n",
"h = user_group.split(\",\") \n",
"totaluser = len(h) - 1\n",
"\n",
"# processing done for x_Axis\n",
"ck= []\n",
"ck.append(time[i])\n",
"v = ck * totaluser\n",
"\n",
"xaxis = [j for j in range(1,len(group[i]) + 1)] # x_axis as an array - denotes the no of groups formed at that time\n",
"\n",
"\n",
"yaxis = [len(group[i][hj].split(\",\")) for hj in range(len(group[i]))] # denotes the member of a particular group at that time.\n",
"\n",
"\n",
"\n",
"\n",
"yt = [range(yaxis[k]) for k in range(len(yaxis))]\n",
"\n",
"s = yt[0]\n",
"for hg in range(1,len(yt)):\n",
" s += yt[hg]\n",
"xax = [] \n",
"for bh in range(len(xaxis)):\n",
" cp = []\n",
" cp.append(xaxis[bh])\n",
" vp = cp * yaxis[bh]\n",
" xax.append(vp)\n",
"# Processing data for x and y axis in the plot.\n",
"xs = xax[0]\n",
"for hg in range(1,len(xax)):\n",
" xs += xax[hg]\n",
"for g in range(len(h)):\n",
" h[g] = h[g].replace(\" \",\"\")\n",
"#userlok.append([h[kl] for kl in range(1,len(h))])\n",
"source = ColumnDataSource(\n",
" data=dict(\n",
" x= xs, # xaxis\n",
" y= s, # yaxis\n",
" #desc=['A', 'b', 'C', 'd', 'E'],\n",
" fill_color= [colors['u'+ h[kl]] for kl in range(1,len(h))], # giving unique color to each member of a group\n",
" User_groups=[h[kl] for kl in range(1,len(h))] # denoting the usergroups (members of the group)\n",
" )\n",
" )\n",
"\n",
"# Hover options for Interactive Plot\n",
"hover = HoverTool(\n",
" tooltips=[ \n",
" (\"User_groups\", \"@User_groups\"),\n",
" (\"fill color\", \"$color[hex, swatch]:fill_color\"),\n",
" (\"time\", \"$x\"),\n",
"\n",
" ]\n",
" )\n",
"\n",
"p = figure(plot_width=400, plot_height=400, tools=[hover],\n",
" title=\"Mouse over the dots\", x_axis_label = 'At Time ' + str(time[i]))\n",
"\n",
"\n",
"p.circle('x', 'y', size=15, source=source,fill_color = 'fill_color')\n",
"\n",
"\n",
"\n",
"#p.yaxis.visible = False\n",
"\n",
"\n",
"show(p)\n",
"save(p)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For Data on 05242013 at Time 0\n",
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/UsergroupPlot05242013.png)\n",
"\n",
"\n",
"Similarily for data on 05292013 at Time 0\n",
"\n",
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/UsergroupPlot.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Analysing data on 05292013 at Time 0\n",
"\n",
"##### Left\n",
"user 57 - yellow\n",
"user 36 - red\n",
"user 13 - Violet\n",
"\n",
"They form one group at Time 0\n",
"\n",
"\n",
"\n",
"##### Right\n",
"Similarily,\n",
"\n",
"user 22 - light violet\n",
"user 05 - deep blue"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Checking the number of class attendess during that particular day. In this case for day 05242013."
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"userlok = []\n",
"for i in range(600,665): # class timings are from 600 - 665 minutes\n",
" #output_file('toolbar.html')\n",
" user_group = ''\n",
" for kj in range(len(group[i])):\n",
" user_group += ',' + group[i][kj]\n",
"\n",
" h = user_group.split(\",\") \n",
" totaluser = len(h) - 1\n",
"\n",
" ck= []\n",
" ck.append(time[i])\n",
" v = ck * totaluser\n",
"\n",
" xaxis = [j for j in range(1,len(group[i]) + 1)]\n",
"\n",
"\n",
" yaxis = [len(group[i][hj].split(\",\")) for hj in range(len(group[i]))]\n",
"\n",
"\n",
"\n",
"\n",
" yt = [range(yaxis[k]) for k in range(len(yaxis))]\n",
"\n",
" s = yt[0]\n",
" for hg in range(1,len(yt)):\n",
" s += yt[hg]\n",
" xax = [] \n",
" for bh in range(len(xaxis)):\n",
" cp = []\n",
" cp.append(xaxis[bh])\n",
" vp = cp * yaxis[bh]\n",
" xax.append(vp)\n",
"\n",
" xs = xax[0]\n",
" for hg in range(1,len(xax)):\n",
" xs += xax[hg]\n",
" for g in range(len(h)):\n",
" h[g] = h[g].replace(\" \",\"\")\n",
" userlok.append([h[kl] for kl in range(1,len(h))])\n",
" source = ColumnDataSource(\n",
" data=dict(\n",
" x= xs,\n",
" y= s,\n",
" #desc=['A', 'b', 'C', 'd', 'E'],\n",
" fill_color= [colors['u'+ h[kl]] for kl in range(1,len(h))],\n",
" User_groups=[h[kl] for kl in range(1,len(h))]\n",
" )\n",
" )\n",
"\n",
" hover = HoverTool(\n",
" tooltips=[\n",
" (\"User_groups\", \"@User_groups\"),\n",
" (\"fill color\", \"$color[hex, swatch]:fill_color\"),\n",
" (\"time\", \"$x\"),\n",
"\n",
" ]\n",
" )\n",
"\n",
" p = figure(plot_width=400, plot_height=400, tools=[hover],\n",
" title=\"Mouse over the dots\", x_axis_label = 'At Time ' + str(time[i]))\n",
"\n",
"\n",
" p.circle('x', 'y', size=15, source=source,fill_color = 'fill_color')\n",
"\n",
"\n",
"\n",
" #p.yaxis.visible = False\n",
"\n",
"\n",
" #show(p)\n",
" #save(p)"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"class_attendes = []\n",
"for j in range(len(userlok)):\n",
" v = userlok[j][0].split(\",\")\n",
" for l in range(len(v)):\n",
" class_attendes.append('u' + v[l])\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"classmembers = list(set(class_attendes)) # unique class attendees"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"5"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(classmembers)"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['u18', 'u13', 'u02', 'u14', 'u01']"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"classmembers"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So total 5 students attended the class on that day."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So we check the GPAs of the students who attended the class on that day."
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import csv\n",
"csvlines = []\n",
"\n",
"# reading the gpa value file\n",
"with open('grades.csv', 'rb') as csvfile:\n",
" \n",
" spamreader = csv.reader(csvfile, delimiter=' ')\n",
" for row in spamreader:\n",
" csvlines.append(row)\n",
" \n",
" \n",
"\n",
"for k in range(len(csvlines)):\n",
" csvlines[k] = csvlines[k][0].split(\",\")\n",
" \n",
"user_id = [] \n",
"for k in range(1,len(csvlines)):\n",
" user_id.append(csvlines[k][0])\n",
" \n",
"# appending the user_ids in a list \n",
" \n",
"gpa = []\n",
"for k in range(1,len(csvlines)):\n",
" gpa.append(float(csvlines[k][1])) \n",
"# appending the gpa values in a list\n",
"\n",
"gpavalue = {}\n",
"for i in range(len(user_id)):\n",
" gpavalue[user_id[i]] = gpa[i]\n",
"# matching user_id to his/her gpa \n",
" \n",
"def gpa_finder(fg):\n",
" gpauser = []\n",
" for j in range(len(user_id)): \n",
" if(user_id[j] in fg):\n",
" gpauser.append(float(gpa[j])) \n",
" return gpauser"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.474\n",
"3.505\n",
"3.293\n",
"2.863\n"
]
}
],
"source": [
"for g in range(len(classmembers)):\n",
" if classmembers[g] in user_id:\n",
" print(gpavalue[ classmembers[g]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So about 75% of the group members have GPA more than 3 and they are attending that class."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Similarily for other days also, the number of class attendees were calculated."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Group forming "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we check for group formation during a particular day for about 10 - 15 mins.\n",
"\n",
"We select all such groups whose duration is about 10-15 mins during the particular day."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"f = open('ProximityData\\groups_05292013.txt','r')\n",
"lines = []\n",
"lines.append(f.readlines())\n",
"textlines = []\n",
"for i in range(len(lines[0])): \n",
" textlines.append( lines[0][i].split(\"|\"))\n",
" \n",
"\n",
"time = []\n",
"for i in range(len(textlines)):\n",
" time.append((int(textlines[i][0]))) \n",
"\n",
"group = [[] for h in range(len(time))]\n",
"for i in range(len(textlines)):\n",
" for p in range(1,len(textlines[i])-1): # storing groups formed\n",
" group[i].append((textlines[i][p])) \n",
" \n",
" \n",
" \n",
"gr = group[0]\n",
"for ip in range(1,len(group)):\n",
" gr += group[ip]\n",
" \n",
"unique_group = list(set(gr))\n",
"\n",
"\n",
"\n",
"def cummulative_diff(li):\n",
" p = [0]\n",
" for j in range(1,len(li)):\n",
" p.append(li[j] - li[j-1])\n",
" return p \n",
"\n",
"# appending time index and the group formed at that time in a list\n",
"def group_time(uniquegroup): \n",
" uniqtime = [] \n",
" for gr in range(len(group)): \n",
" for br in range(len(group[gr])):\n",
" \n",
" if(group[gr][br] == uniquegroup):\n",
" uniqtime.append(time[gr])\n",
" return uniqtime\n",
" \n",
"# finding the time indices at which the group occurs\n",
"\n",
"stable_group5 = []\n",
"for g in range(len(unique_group)):\n",
"\n",
" t = (cummulative_diff(group_time(unique_group[g])))\n",
" if(t.count(1) > 5):\n",
" #print t\n",
" stable_group5.append(unique_group[g])\n",
" \n",
"# Checking for groups who have spend time for about 5 minutes"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"u08, u30, u32, u41, u49\n"
]
}
],
"source": [
"print(stable_group5[2])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"u13, u36\n"
]
}
],
"source": [
"print(stable_group5[1])"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"So we get Unique Group Members having duration 5 mins"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"stable_group10 = []\n",
"for g in range(len(unique_group)):\n",
"\n",
" t = (cummulative_diff(group_time(unique_group[g])))\n",
" if(t.count(1) > 10):\n",
" #print t\n",
" stable_group10.append(unique_group[g])\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"u13, u36\n"
]
}
],
"source": [
"print(stable_group10[0])"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"u22, u49\n"
]
}
],
"source": [
"print(stable_group10[4])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So we get groups having duration 10 mins"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"stable_group15 = []\n",
"for g in range(len(unique_group)):\n",
"\n",
" t = (cummulative_diff(group_time(unique_group[g])))\n",
" if(t.count(1) > 15):\n",
" #print t\n",
" stable_group15.append(unique_group[g])\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"u30, u32, u41, u49, u54\n"
]
}
],
"source": [
"print(stable_group15[3])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"print(stable_group15[4])"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"So we get Groups having duration 15 mins"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Group Regularity"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this code we compare two days to see if the same group is always formed in the both the days at the same point of time in the day. \n",
"If the groups formed are same in both the days at the same time, we say that the two days are regular.\n",
"If there are more number of such groups we will assume that the two days are highly regular. \n",
"\n",
"### Coefficient of Regularity\n",
"It is a number indicating the regularity of two days.\n",
"Higher the number , higher the regularity."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\n",
"import os\n",
"from glob import glob\n",
"\n",
"from bokeh.plotting import figure, output_file, show, ColumnDataSource\n",
"from bokeh.models import HoverTool\n",
"import matplotlib.pyplot as plt\n",
"\n",
"filename = []\n",
"files_list = glob(os.path.join('ProximityData', '*.txt'))\n",
"for a_file in sorted(files_list):\n",
" \n",
" filename.append(a_file) # checking all the files in the give folder\n",
"\n",
"for nk in range(len(filename)):\n",
" for rt in range(len(filename)):\n",
" if(filename[nk] != filename[rt]):\n",
" \n",
" \n",
" f = open(filename[nk],'r')\n",
" lines1 = []\n",
" lines1.append(f.readlines()) # Reading\n",
" textlines1 = []\n",
" for i in range(len(lines1[0])): \n",
" textlines1.append( lines1[0][i].split(\"|\"))\n",
" \n",
" \n",
" # For first file\n",
" time = []\n",
" for i in range(len(textlines1)):\n",
" time.append((int(textlines1[i][0]))) \n",
" \n",
" group = [[] for h in range(len(time))]\n",
" for i in range(len(textlines1)):\n",
" for p in range(1,len(textlines1[i])-1):\n",
" group[i].append((textlines1[i][p]))\n",
" \n",
" \n",
" # For second file\n",
" gf = open(filename[rt],'r')\n",
" lines2 = []\n",
" lines2.append(gf.readlines())\n",
" textlines2 = []\n",
" for i in range(len(lines2[0])): \n",
" textlines2.append( lines2[0][i].split(\"|\"))\n",
" \n",
" \n",
" time2 = []\n",
" for i in range(len(textlines2)):\n",
" time2.append((int(textlines2[i][0]))) \n",
" \n",
" group2 = [[] for h in range(len(time2))]\n",
" for i in range(len(textlines2)):\n",
" for p in range(1,len(textlines2[i])-1):\n",
" group2[i].append((textlines2[i][p]))\n",
" \n",
" \n",
" \n",
" gr = group[0]\n",
" for ip in range(1,len(group)):\n",
" gr += group[ip]\n",
" \n",
" unique_group = list(set(gr)) #suffix 2 indicates attributes for second file, otherwise for first file\n",
" \n",
" gr = group2[0]\n",
" for ip in range(1,len(group2)):\n",
" gr += group2[ip]\n",
" \n",
" unique_group2 = list(set(gr))\n",
" \n",
" \n",
" \n",
" group = [[] for h in range(len(time))]\n",
" for i in range(len(textlines1)):\n",
" for p in range(1,len(textlines1[i])-1):\n",
" group[i].append((textlines1[i][p]))\n",
" \n",
" \n",
" \n",
" group2 = [[] for h in range(len(time2))]\n",
" for i in range(len(textlines2)):\n",
" for p in range(1,len(textlines2[i])-1):\n",
" group2[i].append((textlines2[i][p]))\n",
" \n",
" common = []\n",
" for gt in range(len(unique_group)):\n",
" for bt in range(len(unique_group2)):\n",
" if(unique_group[gt] == unique_group2[bt]):\n",
" common.append(unique_group[gt])\n",
" \n",
" \n",
" timeof1 = []\n",
" timeof2 = []\n",
" \n",
" \n",
" for gh in range(len(group)):\n",
" for d in range(len(common)):\n",
" if(common[d] in group[gh]):\n",
" timeof1.append(time[gh])\n",
" \n",
" for gh in range(len(group2)):\n",
" for d in range(len(common)):\n",
" if(common[d] in group2[gh]):\n",
" timeof2.append(time2[gh])\n",
" \n",
" \n",
" # Comparing two files\n",
" bn = 0\n",
" for k in range(len(timeof1)):\n",
" for p in range(len(timeof2)):\n",
" if(timeof1[k] == timeof2[p]):\n",
" #print(timeof1[k])\n",
" bn +=1\n",
" print(\"For filenames {} and {}\".format(filename[nk],filename[rt])) \n",
" print(\"Number of same group occurences is {}\".format(bn))\n",
" print(\"\\n\")\n",
" \n",
" \n",
" f.close()\n",
" gf.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Audio Checking"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Checking if users within the same group has the same audio levels. We can therefore filter out those groups which have the same proximity for the users having different audio levels."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"f = open('ProximityData\\groups_05292013.txt','r')\n",
"lines = []\n",
"lines.append(f.readlines())\n",
"textlines = []\n",
"for i in range(len(lines[0])): \n",
" textlines.append( lines[0][i].split(\"|\"))\n",
" \n",
"\n",
"\n",
"time = []\n",
"for i in range(len(textlines)):\n",
" time.append((int(textlines[i][0]))) \n",
"\n",
"group = [[] for h in range(len(time))]\n",
"for i in range(len(textlines)):\n",
" for p in range(1,len(textlines[i])-1):\n",
" group[i].append((textlines[i][p])) \n",
" \n",
" \n",
"gr = group[0]\n",
"for ip in range(1,len(group)):\n",
" gr += group[ip]\n",
" \n",
"unique_group = list(set(gr))\n",
"\n",
"stable_group = []\n",
"for g in range(len(unique_group)):\n",
"\n",
" t = (cummulative_diff(group_time(unique_group[g])))\n",
" if(t.count(1) > 5):\n",
" #print t\n",
" stable_group.append(unique_group[g])\n",
" \n",
" \n",
" \n",
"def group_time(uniquegroup): \n",
" uniqtime = [] \n",
" for gr in range(len(group)): \n",
" for br in range(len(group[gr])):\n",
" \n",
" if(group[gr][br] == uniquegroup):\n",
" uniqtime.append(time[gr])\n",
" return uniqtime\n",
" \n",
"\n",
" \n",
"stablegroup = [] \n",
"for r in range(len(stable_group)):\n",
"\n",
" stablegroup.append(stable_group[r].split(\",\")) \n",
"\n",
"stableuniqgroup = [] \n",
"for r in range(len(unique_group)):\n",
" \n",
" stableuniqgroup.append(unique_group[r].split(\",\")) \n",
" \n"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Function checks the audio level of a particular group\n",
"def check_audio_level_uniqgroup(usergroup):\n",
" for k in range(len(stableuniqgroup)):\n",
" if(usergroup == stableuniqgroup[k]):\n",
" p = group_time(unique_group[k])\n",
" \n",
" re = p \n",
" \n",
" audiolevel = [[] for il in range(len(usergroup))] \n",
" for gt in range(len(usergroup)): \n",
" \n",
" #audiolevel = [] \n",
" \n",
" filn = 'audio\\\\'+ usergroup[gt].replace(\" \",\"\") + '\\\\audio_' + usergroup[gt].replace(\" \",\"\") + '_' + '04132013.txt'\n",
" iof = open(filn,'r')\n",
" linesaudio = []\n",
" linesaudio.append(iof.readlines())\n",
" timeli = [] # checking the audio levels of the user\n",
" for ku in range(len(linesaudio[0])):\n",
" linesaudio[0][ku] = linesaudio[0][ku].split(\",\")\n",
" for ki in range(len(linesaudio[0])): \n",
" timeli.append(linesaudio[0][ki][0])\n",
" \n",
" co = timeli\n",
" for y in range(len(p)):\n",
" for x in range(len(timeli)): \n",
" if(re[y] == int(co[x]) ):\n",
" audiolevel[gt].append(linesaudio[0][x][1].replace(\"\\n\",\"\"))\n",
" \n",
"\n",
" pu = audiolevel\n",
"\n",
" c = 0\n",
" \n",
" for lu in range(len(pu)):\n",
" for ky in range(len(pu)):\n",
" if(lu != ky):\n",
" for s in range(len(pu[lu])):\n",
" for t in range(len(pu[ky])):\n",
" if(s == t):\n",
" if(pu[lu][s] == pu[ky][t]):\n",
" c += 1 \n",
" psame = (c/2)\n",
" su = [] \n",
" for kg in range(len(pu)):\n",
" su.append(len(pu[kg]))\n",
" \n",
" sumof = min(su) \n",
" if(sumof == 0):\n",
" #print(\"Not Same\") \n",
" percent = 0\n",
" else: \n",
" percent = (psame/(sumof * 1.0)) \n",
" \n",
" if(percent>0.8): # if 80% of the audio level of the users in close proximity match then we conclude that it forms a real group\n",
" return 1\n",
" else:\n",
" return 0\n",
"\n",
"# Same group = 1\n",
"# Not same = 0 "
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFH9JREFUeJzt3H9s3Hd9x/HX2/XaEndx2Q9i7MRxuKgbVOpYJDq2aqpF\nN9aB1HZsqtol27IBEtK0lhJV/IziKv+NDcS6IYFgbUEFppUAYbCuRMWFTprIVqq0hJS0jttgN86q\ntaQJEk3we3/c1+7F/p7vvt/v586+d58Pycr57vPr/fne95Xz9842dxcAIKa+1V4AAKBzCHkACIyQ\nB4DACHkACIyQB4DACHkACKw/xSBmNi3pJ5LmJZ119ytTjAsAqCZJyKse7uPu/nyi8QAACaS6XGMJ\nxwIAJJIqmF3St8zsoJm9O9GYAICKUl2uucrdnzWzX1U97H/o7g8nGhsAUFKSkHf3Z7N//9fMviLp\nSknnhbyZ8UdyAKAEd7eyfStfrjGzdWZ2SXZ7QNJbJT2e19bdw37t2bNn1ddAfdRGffG+qkrxSn6D\npK9kr9T7Jd3r7g8kGBcAUFHlkHf3Y5LemGAtAIDE+NhjIuPj46u9hI6KXF/k2iTqe6WzFNd82prI\nzLs1FwBEYWby1XzjFQBWy9jYmMwsxNfY2FhH9ohX8gB6VvYqd7WXkUSzWnglDwBoipAHgMAIeQAI\njJAHgMAIeQDogJdeeknvete7NDY2psHBQW3btk33339/19eR6q9QAsCacezY09q9+27NzMxrZKRP\ne/fu1JYtm7s6xrlz5zQ6Oqrvfve72rRpk77xjW/oxhtv1OOPP67R0dFiBVXRxT+y4wCQUl6uTE1N\ne622y6XTLrlLp71W2+VTU9Ntj5tijDxXXHGF79u3L/exZhmZ3V86e7lcAyCU3bvv1lNP3SFpILtn\nQE89dYd27767q2MsNTc3p6NHj+ryyy8vPUYZhDyAUGZm5vVyOC8Y0OzsfFfHaHTu3Dnt2LFDO3fu\n1GWXXVZqjLIIeQChjIz0STqz5N4zGh5uP+5SjLHA3bVjxw5ddNFFuvPOOwv3r4qQBxDK3r07Vavt\n0cshfUa12h7t3buzq2MseOc736nnnntO+/bt0wUXXFC4f1X87RoAPavZ33tZ+GTM7Oy8hoerfbqm\nyhjvec97dOjQIR04cEDr1q1bsW2n/nYNIQ+gZ63lP1D2zDPPaGxsTBdffPHiK3gz06c+9SndfPPN\ny9oT8gCwxFoO+aL4K5QAgMIIeQAIjJAHgMAIeQAIjJAHgMAIeQAIjD81DKBnbd68WWalP124pmze\nXOwXrdrF5+QBYA3jc/IAgKYIeQAILFnIm1mfmT1iZvtTjQkAqCblK/lbJR1OOB4AoKIkIW9mGyW9\nTdJnUowHAEgj1Sv5j0u6XRIfnwGANaRyyJvZ2yXNufujkiz7AgCsASl+GeoqSdeZ2dskvUrSL5rZ\n59z9z5c2nJiYWLw9Pj6u8fHxBNMDQByTk5OanJxMNl7SX4Yys6sl7XL363Ie45ehAKAgfhkKANAU\nf9YAANYwXskDAJoi5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj\n5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEg\nMEIeAAIj5AEgMEIeAAIj5AEgMEIeAALrrzqAmV0k6TuSLszGu8/d76g6LgCgOnP36oOYrXP3n5rZ\nBZL+U9It7v69JW08xVwA8EpiZnJ3K9s/yeUad/9pdvMi1V/Nk+YAsAYkCXkz6zOz70s6Ielb7n4w\nxbgAgGoqX5OXJHefl/SbZrZe0lfN7A3ufnhpu4mJicXb4+PjGh8fTzE9AIQxOTmpycnJZOMluSZ/\n3oBmuyWdcfePLbmfa/IAUNCqX5M3s18xs8Hs9qsk/b6kI1XHBQBUl+JyzWsl3WNmfar/p/Ev7v7N\nBOMCACpKfrmm6URcrgGAwlb9cg0AYO0i5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIe\nAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj\n5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgsMohb2YbzexBM/uBmT1mZrekWBgAoLr+BGOc\nk/Q+d3/UzC6R9D9m9oC7H1na8LYbblC/u9adOqVTg4Pqd9fZuTkdn5vT1qEhvbRhw7LHy7btlX5r\neW3sBTX12toi1lSZuyf9kvRVSdfk3O+3SX5a8uns9mHJdy25r9ntIm17pd9aXht7QU29traoNdVj\nukImJw74MUnTki7JC/nTkrvkE9ntiZz7mt0u0rZX+q3ltbEX1NRra4taU9WQT3G5RpKUXaq5T9Kt\n7n46r81Hs3+/LelqSfOSBrL7Wt0u0rZX+q3ltbEX1NRra4tS06SkB1VP9xSSfLrGzPpVD/jPu/vX\nmrW7XdKEpLdIelM2+ZmGhax0u0jbXum3ltfGXlBTr60tSk3jqmfkQl5WlugyzeckfaxFm9DXzaiJ\nveiltVFTb6zttKpfrrEsgEszs6skfUfSY8oWJOlD7n7/knb+3uuvr79z/OKLOrV+ff1d5pMndfzE\nCdWGhnR24V3mhsfLtu2Vfmt5bewFNfXa2iLW9Hf798vdrXRGVw35ticy827NBQBRmFmlkOc3XgEg\nMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIe\nAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj\n5AEgMEIeAAJLEvJm9lkzmzOzQynGAwCk0Z9onLsk3Snpc4nG07FjT2v37rs1MzOvkZE+7d27U1u2\nbG75eKt+Zedr1nZw8JTc+3Xq1LrFfpJari2vX+p1puhf5Di02ouyNTdbz8J4c3NnNTd3XENDW1Wr\nrcsdN6+OdtZW5Jh1Yy/KnhfdUPYc6sb5m3rfUu5zq72ozN2TfEnaLOnQCo97u6ampr1W2+XSaZfc\npdNeq+3yqanpFR9/6KGHV+xXdr7mbadduu28fps2vdtHR29psbbl/VKvM0X/Yseh1V6Uq7n13h92\naeWa8upoZ21Fjlk39qLseVFkj8sqfw51/vxNvW8p97m9vZB7lWyu0vm8gRKG/PbtEw1F+2Lx27dP\nrPj42Ng7VuxXdr7mbfP6faSNtbU/X9l1puhf7Di02otqa28+X+tx8+tovbYix6wbe1H2vCiyx2WV\nP4c6f/6m3reU+9zeXsi9QjanulzTlomJicXb4+PjGh8fz203MzMvaWDJvQOanZ1f8fEXXhhYsV8z\nreZr3javX18ba2t/vrLrTNG/2HFotRfV1t58vtbj5tfRem1Fjlk39qLseVFkj8sqfw693LZT52/q\nfUu5z/ljHdSzzz4p6aOFx8uzaiG/kpGRPklndH7xZzQ83Lfi45deekYvvNC8X9n5mrfN6zffxtra\nn6/sOlP0L3YcWu1FtbU3n6/1uPl1tF5bkWPWjb0oe14U2eOyyp9DL7ft1Pmbet9S7nP+WG/Sa1+7\nVdPTt2f331F43PNU+TGg8UvSmKTHVni87R9huCZffZ0p+nNNnmvy7eKa/Nq9Jm9eD+BKzOwLksYl\n/bKkOUl73P2uJW28yFwL7yzPzs5reLj5u+FLH2/Vr+x8zdquX1//lMSLL65b7Cep5dry+qVeZ4r+\nRY5Dq70oW3Oz9SyMd/LkWZ04cVxDQzXVagMrfrqmsY521lbkmHVjL8qeF91Q9hzqxvmbet9S7nOr\nvbj33gm5u5UaXEoT8m1NVDDkAQCSmVUKeX7jFQACI+QBIDBCHgACI+QBIDBCHgACI+QBIDBCHgAC\nI+QBIDBCHgACI+QBIDBCHgACI+QBIDBCHgACI+QBIDBCHgACI+QBIDBCHgACI+QBIDBCHgACI+QB\nIDBCHgACI+QBIDBCHgACI+QBIDBCHgACI+QBIDBCHgACI+QBILAkIW9m15rZETP7kZm9P8WYAIDq\nzN2rDWDWJ+lHkq6RNCvpoKSb3P3IknZedS4AeKUxM7m7le3fn2ANV0o66u5PZwv6kqTrJR1Z2vCG\nG26Te79OnVqnwcFTcu/X3NxZzc0d19DQVm3Y8NLi4yMjfdq7d6e2bNmsY8ee1u7dd+vJJ59fbFur\nrVv2+MzMfMt+jXMsrKGd+ZqtrVHeOiTlri2vT+N6mt3OG7edfmXHaNW2yF60qrvZc6Gd+VrtZ97x\nbWdtRY5ZmbGK7kWzOqo+R9rZ+6pra+zX7fO32XydOi+K7HervajM3St9SfpjSZ9u+H6HpH/IaefS\nbS6ddmk6u33YpV1L7jvtkrt02mu1Xf7QQw97rbZrSdu8x9vpN52zhqL9Xm47NTXtC6amppetY9Om\nd/vo6C1N+53fp9nals99/rjt9Cs7Rqu27e9F67qLHafG+fLnbXV821lbkWNWfKzie9GsjqrPkXb2\nvuraVvP8Tb1vVc/DYntRj+kKGd3dkF9Y/ER2eyLnPm/4Ou1jY+/IaZv3eDv9ys6X33b79onFk3X7\n9rw2H1mx3/l9iqzzIwX7lR2jVdsie9Gq7mLHqXG+/HmLPV/y11bkmBUfq/heNKuj6nOkyHOo7NpW\n8/xNvW9Vz8Nie1E15FNcrpmRNNrw/cbsvhwfzf79tqSrJc1LGsjua7y9YEAvvDCQ3d/q8Xb6lZ0v\nv+3s7PzidzMzeW36Vux3fp8i6+wr2K/sGK3aLq9peV3L2+TXXew4Nc6XP2+x50v+2tpde7mxmo9X\ntI6qz5Eiz6Gya1vN87fV2hqlOC+K7GHe2iazrzRSfLrmoKStZrbZzC6UdJOk/flNb5c0Iektkt6U\nTX+mYSlnlrQ/o0svPZPd3+rxdvqVnS+/7fDwy9s3MpLXZn7Ffuf3KbLO+YL9yo7Rqu3ympbXtbxN\nft3FjlPjfPnzFnu+5K+t3bWXG6v5eEXrqPocKfIcKru21Tx/W62tUYrzosge5q1tXPWcnFA9Myuq\nerkmuxRzraQnJB2V9IEmbZxr8lyTb1431+S5Jt+p8zf1vlU9D7t7Tb7yRyjbZWZ+/fXvlXu/Xnxx\nndavr7/LfPLkWZ04cVxDQzVt2HB28fHh4eXvlj/11POLbWu1gWWPz87Ot+zXOMfCGtqZr9naGuWt\nQ1Lu2vL6NK6n2e28cdvpV3aMVm2L7EWrups9F9qZr9V+5h3fdtZW5JiVGavoXjSro+pzpJ29r7q2\nxn7dPn+bzdep86LIfrfai9e9bkxe4SOUXQ35bs0FAFFU/Zw8f9YAAAIj5AEgMEIeAAIj5AEgMEIe\nAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj\n5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAIj5AEgMEIeAAKrFPJm9idm9riZ/dzM\ntqVaFAAgjaqv5B+T9EeSHkqwlp42OTm52kvoqMj1Ra5Nor5Xukoh7+5PuPtRSZZoPT0r+hMtcn2R\na5Oo75WOa/IAEFh/qwZm9i1JGxrvkuSSPuzuX+/UwgAA1Zm7Vx/E7NuSdrn7Iyu0qT4RALwCuXvp\nS+ItX8kXsOIiqiwSAFBO1Y9Q3mBmxyW9WdK/mdm/p1kWACCFJJdrAABrU8c/XWNm15rZETP7kZm9\nv9PzdZqZbTSzB83sB2b2mJndkt3/ajN7wMyeMLP/MLPB1V5rFWbWZ2aPmNn+7Psw9ZnZoJn9q5n9\nMDuOvxWlPjO7LfsFxUNmdq+ZXdjrtZnZZ81szswONdzXtCYz+6CZHc2O71tXZ9XtaVLb32Zrf9TM\nvmxm6xseK1xbR0PezPok/aOkP5B0uaSbzezXOzlnF5yT9D53v1zSb0v666ymD0g64O6/JulBSR9c\nxTWmcKukww3fR6rvE5K+6e6vl/Qbko4oQH1mNizpbyRtc/crVH/P7Wb1fm13qZ4hjXJrMrM3SLpR\n0usl/aGkT5rZWn4/MK+2ByRd7u5vlHRUFWvr9Cv5KyUddfen3f2spC9Jur7Dc3aUu59w90ez26cl\n/VDSRtXruidrdo+kG1ZnhdWZ2UZJb5P0mYa7Q9SXvSr6XXe/S5Lc/Zy7/0RB6pN0gaQBM+uX9CpJ\nM+rx2tz9YUnPL7m7WU3XSfpSdlynVQ/JK7uxzjLyanP3A+4+n337X6rni1Sytk6H/Iik4w3f/zi7\nLwQzG5P0RtUPxAZ3n5Pq/xFIes3qrayyj0u6XfXfh1gQpb4tkp4zs7uyy1GfNrN1ClCfu89K+ntJ\nz6ge7j9x9wMKUFuO1zSpaWnmzKi3M+evJH0zu12qNn7jtSQzu0TSfZJuzV7RL30Huyff0Tazt0ua\ny35aWelHwZ6sT/VLGNsk/ZO7b5N0RvUf/Xv++JnZpaq/wt0saVj1V/TbFaC2NoSrycw+LOmsu3+x\nyjidDvkZSaMN32/M7utp2Y/C90n6vLt/Lbt7zsw2ZI8PSTq5Wuur6CpJ15nZlKQvSnqLmX1e0okg\n9f1Y0nF3/+/s+y+rHvoRjt/vSZpy9/9z959L+oqk31GM2pZqVtOMpE0N7Xoyc8xsp+qXTP+04e5S\ntXU65A9K2mpmm83sQkk3Sdrf4Tm74Z8lHXb3TzTct1/Szuz2X0j62tJOvcDdP+Tuo+7+OtWP14Pu\n/meSvq4Y9c1JOm5ml2V3XSPpB4px/J6R9GYzuzh7Q+4a1d88j1Cb6fyfLJvVtF/STdmnirZI2irp\ne91aZEnn1WZm16p+ufQ6d/9ZQ7tytbl7R78kXSvpCdXfJPhAp+frQj1XSfq5pEclfV/SI1mNvyTp\nQFbrA5IuXe21Jqj1akn7s9th6lP9EzUHs2O4T9JglPok7VH9wwCHVH9D8hd6vTZJX5A0K+lnqv9H\n9peSXt2sJtU/jfJktg9vXe31l6jtqKSns2x5RNInq9TGL0MBQGC88QoAgRHyABAYIQ8AgRHyABAY\nIQ8AgRHyABAYIQ8AgRHyABDY/wOA6h5RI0r8CAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x34f6470>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"\n",
"import matplotlib.pyplot as plt\n",
"userno = [i for i in range(121)]\n",
"gry = [2 for i in range(121)]\n",
"value = [check_audio_level_uniqgroup(stableuniqgroup[i]) for i in range(121)]\n",
"\n",
"plt.plot(userno,value,'o')\n",
"plt.plot(userno,gry,'o',color = 'red')\n",
"plt.ylim(-1,5)\n",
"plt.legend('2')\n",
"plt.show() \n",
" \n",
" \n",
" \n",
"noofgroups = 0 \n",
"for u in range(len(stableuniqgroup)):\n",
" if(check_audio_level_uniqgroup(stableuniqgroup[u]) == 1):\n",
" noofgroups += 1\n",
" # no of uniquegroups based on audio level checking\n",
" \n",
" \n",
"no = 0 \n",
"for u in range(len(stablegroup)):\n",
" if(check_audio_level_uniqgroup(stablegroup[u]) == 1):\n",
" no += 1\n",
" \n",
" # no of groups based on audio level checking\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So the number of groups formed based on proximity indicated by red is now subdivided into two parts \n",
"\n",
"* 1 if the members in the group are really in a group\n",
"* else it is 0\n",
"\n",
"\n",
"Hence we can now eliminate those groups which were being formed based on proximity data, but the users of the group had different audio levels."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"-----------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"-------------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Checking for GPA Correlation with users in a group "
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import csv\n",
"\n",
"f = open('ProximityData\\groups_05292013.txt','r')\n",
"lines = []\n",
"lines.append(f.readlines())\n",
"textlines = []\n",
"for i in range(len(lines[0])): \n",
" textlines.append( lines[0][i].split(\"|\"))\n",
"\n",
"\n",
"\n",
"time = []\n",
"for i in range(len(textlines)):\n",
" time.append((int(textlines[i][0]))) \n",
"\n",
"group = [[] for h in range(len(time))]\n",
"for i in range(len(textlines)):\n",
" for p in range(1,len(textlines[i])-1):\n",
" group[i].append((textlines[i][p])) \n",
"\n",
"\n",
"gr = group[0]\n",
"for ip in range(1,len(group)):\n",
" gr += group[ip]\n",
"\n",
"unique_group = list(set(gr))\n",
"\n",
"stable_group5 = []\n",
"for g in range(len(unique_group)):\n",
"\n",
" t = (cummulative_diff(group_time(unique_group[g])))\n",
" if(t.count(1) > 5):\n",
" #print t\n",
" stable_group5.append(unique_group[g])\n",
"\n",
"csvlines = []\n",
"with open('grades.csv', 'rb') as csvfile:\n",
" \n",
" spamreader = csv.reader(csvfile, delimiter=' ')\n",
" for row in spamreader:\n",
" csvlines.append(row)\n",
" \n",
" \n",
"\n",
"for k in range(len(csvlines)):\n",
" csvlines[k] = csvlines[k][0].split(\",\")\n",
" \n",
"user_id = [] \n",
"for k in range(1,len(csvlines)):\n",
" user_id.append(csvlines[k][0])\n",
" \n",
" \n",
" \n",
"gpa = []\n",
"for k in range(1,len(csvlines)):\n",
" gpa.append(float(csvlines[k][1]))\n",
" \n",
" \n",
"def gpa_finder(fg):\n",
" gpauser = []\n",
" for j in range(len(user_id)):\n",
" \n",
" if(user_id[j] in fg):\n",
" gpauser.append(float(gpa[j]))\n",
" \n",
" return gpauser\n",
"\n",
"# gpa finder greater than 3.5\n",
"def gpa_finder_greater35(fg):\n",
" gpauser = {}\n",
" for j in range(len(user_id)):\n",
" if(user_id[j] in fg):\n",
" #print(user_id[j])\n",
" if(gpa[j] > 3.5):\n",
" gpauser[user_id[j]] = (float(gpa[j]))\n",
" else:\n",
" gpauser = {}\n",
" return gpauser\n",
"\n",
"# gpa finder greater than 3\n",
"def gpa_finder_greater3(fg):\n",
" gpauser = {}\n",
" for j in range(len(user_id)):\n",
" if(user_id[j] in fg):\n",
" #print(user_id[j])\n",
" if(gpa[j] > 3):\n",
" gpauser[user_id[j]] = (float(gpa[j]))\n",
" \n",
" return gpauser\n",
" \n",
"\n",
"\n",
"more35 = 0\n",
"for o in range(len(stable_group5)):\n",
" \n",
" if(all(i >= 3.5 for i in gpa_finder(stable_group5[o])) == True):\n",
" more35 += 1 \n",
"\n",
"\n",
"more3 = 0\n",
"for o in range(len(stable_group5)):\n",
" if(all(i >= 3 for i in gpa_finder(stable_group5[o])) == True):\n",
" more3 += 1\n",
" \n",
" \n",
" \n",
"# 31 May \n",
"#4 attended among 24 above 3 gpa\n",
"#3 attended among 15 above 3.5 gpa)\n",
" \n",
" \n",
"# 0413 2013\n",
"# 14 out of 24 3 toppers \n",
"# 7 out of 15 attended 3.5 toppers \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"------------------------------------------------------------------------------------"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"22"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"more3 ## 22 groups with each student in a group more than 3 gpa."
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"14"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"more35 ## 14 groups with each student in a group more than 3.5 gpa."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Similarily for \n",
"\n",
"##### 21 May\n",
"\n",
"* (3.5 - 3) 2 groups\n",
"* more than 3.5 - 14 groups\n",
"* Total 16 groups\n",
"* Rest mingled with (3 - 3.5) and > 3.5\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 31 May\n",
"\n",
"* 31 st May\n",
"* 12 groups\n",
"* gpa more than 3 = 12 groups\n",
"* gpa more than 3.5 = 5 groups\n",
"* gpa between 3 - 3.5 = 6 groups\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So we can say that most of the users in a particular group tend to participate with users who are in the same gpa range.\n",
"\n",
"There might be few exceptions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"--------------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Location Checking"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Members of a particular group must have the same location in order to participate in the group. \n",
"\n",
"If some members of a group are in different location and some members are in other location, then we shall discard the group."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Created files containing location of a group per day basis. If 80% of users in a group are in the same location, then we can conclude that the particular group is in that specific location.\n",
"\n",
"\n",
"So I created files on a day to day basis, indicating the groups formed at a particular location during a specific time for a specific duration"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import re\n",
"from datetime import datetime\n",
"from collections import defaultdict\n",
"import csv\n",
"import os\n",
"\n",
"na = [str(i) for i in range(60)]\n",
"for i in range(len(na)):\n",
" if(len(str(na[i])) == 1):\n",
" na[i] ='u'+ '0' + na[i]\n",
" else:\n",
" na[i] = 'u' + na[i]\n",
" \n",
"filid = ['22','23','24','25','26','27','28','29']\n",
"\n",
"\n",
"filname = 'uniqueGroup_04' + filid[n] + '2013_bin5.txt'\n",
"\n",
"fil = open(filname,'r')\n",
"\n",
"lines = []\n",
"lines.append(fil.readlines())\n",
"\n",
"for r in range(len(lines[0])):\n",
" lines[0][r] = re.split('[ |]',lines[0][r])\n",
" \n",
" \n",
" \n",
"time = []\n",
"\n",
"for k in range(len(lines[0])):\n",
" #p = (lines[0][k][1]).split(\",\")\n",
" p = re.split('[ , ;]',lines[0][k][1])\n",
" time.append((p))\n",
" \n",
"\n",
"\n",
"usergroups = []\n",
"for k in range(len(lines[0])):\n",
" p = (lines[0][k][0])\n",
" p = p.split(\";\")\n",
" usergroups.append(p[0]) \n",
"\n",
"\n",
"t = [[] for r in range(len(time))]\n",
"for r in range(len(time)):\n",
" for j in range(0,len(time[r]),2):\n",
" t[r].append(time[r][j]) \n",
" \n",
" \n",
"duration = [[] for r in range(len(time))]\n",
"for r in range(len(time)):\n",
" for j in range(1,len(time[r]),2):\n",
" duration[r].append(time[r][j]) \n",
" \n",
" \n",
" \n",
"usergrp = [[] for sd in range(len(usergroups))] \n",
"for r in range(len(usergroups)):\n",
" \n",
" usergrp[r] = usergroups[r].split(\",\")\n",
" \n",
"q = 'Day_04'+ filid[n]+ '2013'\n",
"os.mkdir(q) \n",
"\n",
"# This function checks which user was present with which group at what time during a particular day during month 04\n",
"def useracitvityfile(user_id):\n",
" \n",
" data = [] \n",
" #user_id = 'u25'\n",
" for out in range(len(usergrp)): \n",
" \n",
" for c in usergrp[out]:\n",
" if(user_id == c):\n",
" #print('Group')\n",
" #print(usergrp[out])\n",
" #print('location') \n",
" for g in range(len(t[out])):\n",
" o = usergrp[out][0]\n",
" for f in range(1,len(usergrp[out])):\n",
" o = o + ' ' + usergrp[out][f] \n",
"\n",
" if(timefinder(user_id,int(t[out][g]),filid[n]) != []):\n",
" data.append(o +',' + timefinder(user_id,int(t[out][g]),filid[n])[0] + ',' + t[out][g] + ','+ str(int(duration[out][g])) + '\\n')\n",
" else:\n",
" for h in range(len(usergrp[out])):\n",
" if(timefinder(usergrp[out][h],int(t[out][g]),filid[n]) != []):\n",
" data.append( o +',' + timefinder(usergrp[out][h],int(t[out][g]),filid[n])[0] + ',' + t[out][g] +',' + str(int(duration[out][g])) + '\\n')\n",
"\n",
" if(data!= []): \n",
" fl = open( q + '\\ ' + user_id + '.csv' ,'a' )\n",
" sortedlist = sorted(data, key=lambda column: column[2], reverse=False)\n",
" fl.write('User Group, Location, Time, Duration \\n')\n",
" for row in sortedlist:\n",
" fl.writelines(row)\n",
" \n",
" fl.close() \n",
"for jt in range(len(na)):\n",
" useracitvityfile(na[jt])\n",
"\n",
"\n",
"\n",
"\n",
"# The function finds the location of an user at a particular time and at a particular date\n",
"def timefinder(user,tim,date): \n",
" filename = 'wifi_location\\wifi_location_' + user + '.csv' \n",
" loclines = []\n",
" with open(filename) as f: ## Opening the CSV files\n",
" reader = csv.reader(f, delimiter=' ')\n",
" for row in reader:\n",
" loclines.append(row) \n",
" \n",
" \n",
" f.close() \n",
" for j in range(len(loclines)):\n",
" loclines[j] = loclines[j][0].split(\",\")\n",
" \n",
" timevalue = []\n",
" for j in range(1,len(loclines)):\n",
" timevalue.append((loclines[j][0]))\n",
" \n",
" yeardate = []\n",
" for k in range(len(timevalue)):\n",
" yeardate.append(year(timevalue[k]))\n",
" \n",
" location = []\n",
" for j in range(1,len(loclines)):\n",
" location.append((loclines[j][1]))\n",
" \n",
" \n",
" daytime = []\n",
" for k in range(len(timevalue)):\n",
" daytime.append(timeval(timevalue[k]))\n",
" \n",
" day = []\n",
" for k in range(len(daytime)):\n",
" day.append(int(daytime[k][0:2]) *60 + int(daytime[k][3:5]))\n",
" \n",
" loc = []\n",
" #c = 0\n",
" for k in range(len(yeardate)):\n",
" if(yeardate[k] == '2013:04:' + str(date)):\n",
" if(day[k] == tim):\n",
" \n",
" loc.append(location[k])\n",
" #f.close() \n",
" return list(set(loc)) \n",
"\n",
" \n",
"\n",
"\n",
"# Create a file for location backer-berry for month 04 and store the groups formed at what time and what date\n",
"locationfil = open('in[backer-berry]04.csv','a')\n",
"locationfil.writelines('Group' + ',' +'Time' + ',' + 'Date' + '\\n')\n",
"\n",
" \n",
"for ry in range(len(filid)):\n",
" filname = 'uniqueGroup_04' + filid[ry] + '2013_bin5.txt'\n",
"\n",
" fil = open(filname,'r')\n",
" \n",
" lines = []\n",
" lines.append(fil.readlines())\n",
" \n",
" for r in range(len(lines[0])):\n",
" lines[0][r] = re.split('[ |]',lines[0][r])\n",
" \n",
" \n",
" \n",
" time = []\n",
" \n",
" for kd in range(len(lines[0])): # appending time index\n",
" \n",
" p = re.split('[ , ;]',lines[0][kd][1])\n",
" time.append((p))\n",
" \n",
" \n",
" \n",
" usergroups = []\n",
" for kp in range(len(lines[0])):\n",
" p = (lines[0][kp][0])\n",
" p = p.split(\";\") # the groups formed at that time\n",
" usergroups.append(p[0]) \n",
" \n",
" \n",
" t = [[] for r in range(len(time))]\n",
" for r in range(len(time)):\n",
" for j in range(0,len(time[r]),2):\n",
" t[r].append(time[r][j]) \n",
" \n",
" \n",
" duration = [[] for r in range(len(time))]\n",
" for r in range(len(time)): # duration of the group\n",
" for j in range(1,len(time[r]),2):\n",
" duration[r].append(time[r][j]) \n",
" \n",
" \n",
" \n",
" \n",
" usergrp = [[] for sd in range(len(usergroups))] \n",
" for r in range(len(usergroups)):\n",
" \n",
" usergrp[r] = usergroups[r].split(\",\") \n",
" \n",
" \n",
"\n",
" for k in range(len(usergroups)):\n",
" \n",
" for v in range(len(t[k])):\n",
" if(timefinder(usergrp[k][0], int(t[k][v]), int(filid[ry])) != []):\n",
" if(timefinder(usergrp[k][0], int(t[k][v]), int(filid[ry]))[0] == 'in[backer-berry]'):\n",
" us = usergrp[k][0]\n",
" for l in range(1,len(usergrp[k])): # if location is in backer-berry\n",
" us = us + ' ' + usergrp[k][l]\n",
" locationfil.writelines(us + ',' + t[k][v] + ',' + filid[ry] + '\\n')\n",
" \n",
" \n",
"# Function for converting the year value in the csv files to Day-Month-Year format\n",
"def year(value):\n",
"\n",
" yeartime = datetime.fromtimestamp(int(value)).strftime('%Y:%m:%d')\n",
" return yeartime\n",
"\n",
"\n",
"# Function for converting the time value in the csv files to Hours-Minutes-Seconds format\n",
"def timeval(value):\n",
"\n",
" time = datetime.fromtimestamp(int(value)).strftime('%H:%M:%S')\n",
" return time\n",
" \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"-----------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"--------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### Checking the Largest Group Formed"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Finding the largest group in a particular day and studying its evolution throughout the day. Like who were the persons who were added to the group, the persons who who went out of the group.\n",
"\n",
"Taking the largest group formed as a single entity , we can check its activity through out the day.\n",
"\n",
"We can also check if the largest grou formed on one day prevails as the largest group in the upcoming days also.\n",
"\n",
"For example group u13, u36 is the largest group formed on consecutive 3 days 23,24 and 25th May."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import re\n",
"from datetime import datetime\n",
"from collections import defaultdict\n",
"import csv\n",
"import os\n",
"\n",
"na = [str(i) for i in range(60)]\n",
"for i in range(len(na)):\n",
" if(len(str(na[i])) == 1):\n",
" na[i] ='u'+ '0' + na[i]\n",
" else:\n",
" na[i] = 'u' + na[i]\n",
" \n",
"filid = ['23','24','25','26','27','28']\n",
"\n",
"# For Day 23\n",
"filname = 'uniqueGroup_05' + filid[0] + '2013_bin5.txt'\n",
"\n",
"fil = open(filname,'r')\n",
"\n",
"lines = []\n",
"lines.append(fil.readlines())\n",
"\n",
"for r in range(len(lines[0])):\n",
" lines[0][r] = re.split('[ |]',lines[0][r])\n",
" \n",
" \n",
" \n",
"time = []\n",
"\n",
"for k in range(len(lines[0])):\n",
" \n",
" p = re.split('[ , ;]',lines[0][k][1])\n",
" time.append((p))\n",
" \n",
"\n",
"\n",
"usergroups = []\n",
"for k in range(len(lines[0])):\n",
" p = (lines[0][k][0]) # storing the groups formed in a list\n",
" p = p.split(\";\")\n",
" usergroups.append(p[0]) \n",
"\n",
"\n",
"t = [[] for r in range(len(time))]\n",
"for r in range(len(time)): # storing the time index in a list\n",
" for j in range(0,len(time[r]),2):\n",
" t[r].append(time[r][j]) \n",
" \n",
" \n",
"duration = [[] for r in range(len(time))]\n",
"for r in range(len(time)):\n",
" for j in range(1,len(time[r]),2): # storing the duration of the group in a list\n",
" duration[r].append(time[r][j]) \n",
" \n",
"occurence = [] \n",
"for i in range(len(t)): # how many times the group occured\n",
" occurence.append(len(t[i]))\n",
" \n",
"maxoccurgroup = [] \n",
"for jl in range(len(occurence)):\n",
" if(occurence[jl] == max(occurence)): # the group that occured for maximum time \n",
" print(\"Group that occurred most frequently is {}\".format(usergroups[jl]))\n",
" maxoccurgroup.append(usergroups[jl])\n",
" \n",
"## Checking the maximum times a group formed in a day\n",
"\n",
"\n",
"##checking How the group evolved \n",
"\n",
" \n",
"for i in range(len(usergroups)):\n",
" for c in usergroups[i].split(\",\"):\n",
" if c not in maxoccurgroup[0].split(\",\"):\n",
" print(c)\n",
" print('\\n')\n",
" \n",
" \n",
"# For Day 24\n",
"filname = 'uniqueGroup_05' + filid[1] + '2013_bin5.txt'\n",
"\n",
"fil = open(filname,'r')\n",
"\n",
"lines24 = []\n",
"lines24.append(fil.readlines())\n",
"\n",
"for r in range(len(lines24[0])):\n",
" lines24[0][r] = re.split('[ |]',lines24[0][r])\n",
" \n",
" \n",
"time24 = []\n",
"\n",
"for k in range(len(lines24[0])):\n",
" #p = (lines[0][k][1]).split(\",\")\n",
" p = re.split('[ , ;]',lines24[0][k][1])\n",
" time24.append((p))\n",
" \n",
"\n",
"\n",
"usergroups24 = []\n",
"for k in range(len(lines24[0])):\n",
" p = (lines24[0][k][0])\n",
" p = p.split(\";\")\n",
" usergroups24.append(p[0]) \n",
"\n",
"\n",
"t24 = [[] for r in range(len(time24))]\n",
"for r in range(len(time24)):\n",
" for j in range(0,len(time24[r]),2):\n",
" t24[r].append(time24[r][j]) \n",
" \n",
" \n",
"duration24 = [[] for r in range(len(time24))]\n",
"for r in range(len(time24)):\n",
" for j in range(1,len(time24[r]),2):\n",
" duration24[r].append(time24[r][j]) \n",
" \n",
" \n",
" \n",
"occurence24 = [] \n",
"for i in range(len(t24)):\n",
" occurence24.append(len(t24[i]))\n",
" \n",
"maxoccurgroup24 = [] \n",
"for jl in range(len(occurence24)):\n",
" if(occurence24[jl] == max(occurence24)):\n",
" print(\"Group that occurred most frequently is {}\".format(usergroups24[jl]))\n",
" maxoccurgroup24.append(usergroups24[jl])\n",
" \n",
" \n",
" \n",
"fl = open('LargeGroup'+ filid[1],'a')\n",
"#associate = []\n",
"fl.writelines('Group Evolution, Time \\n')\n",
"for g in range(len(usergroups24)):\n",
" if(maxoccurgroup24[0] in usergroups24[g]):\n",
" for b in range(len(t24[g])):\n",
" ght = usergroups24[g].split(\",\")\n",
" us = ght[0]\n",
" for ji in range(1,len(ght)):\n",
" us = us + ' ' + ght[ji]\n",
" \n",
" \n",
" fl.writelines(us + ',' + t24[g][b] + '\\n') \n",
" \n",
" \n",
"\n",
"# For Day 25 \n",
"filname = 'uniqueGroup_05' + filid[2] + '2013_bin5.txt'\n",
"\n",
"fil = open(filname,'r')\n",
"\n",
"lines25 = []\n",
"lines25.append(fil.readlines())\n",
"\n",
"for r in range(len(lines25[0])):\n",
" lines25[0][r] = re.split('[ |]',lines25[0][r])\n",
" \n",
" \n",
"time25 = []\n",
"\n",
"for k in range(len(lines25[0])):\n",
" \n",
" p = re.split('[ , ;]',lines25[0][k][1])\n",
" time25.append((p))\n",
" \n",
"\n",
"\n",
"usergroups25 = []\n",
"for k in range(len(lines25[0])):\n",
" p = (lines25[0][k][0])\n",
" p = p.split(\";\")\n",
" usergroups25.append(p[0]) \n",
"\n",
"\n",
"t25 = [[] for r in range(len(time25))]\n",
"for r in range(len(time25)):\n",
" for j in range(0,len(time25[r]),2):\n",
" t25[r].append(time25[r][j]) \n",
" \n",
" \n",
"duration25 = [[] for r in range(len(time25))]\n",
"for r in range(len(time25)):\n",
" for j in range(1,len(time25[r]),2):\n",
" duration25[r].append(time25[r][j]) \n",
" \n",
" \n",
" \n",
" \n",
" \n",
"occurence25 = [] \n",
"for i in range(len(t25)):\n",
" occurence25.append(len(t25[i]))\n",
" \n",
"maxoccurgroup25 = [] \n",
"for jl in range(len(occurence25)):\n",
" if(occurence25[jl] == max(occurence25)):\n",
" print(\"Group that occurred most frequently is {}\".format(usergroups25[jl]))\n",
" maxoccurgroup25.append(usergroups25[jl])\n",
" \n",
"\n",
"# For Day 26\n",
"filname = 'uniqueGroup_05' + filid[3] + '2013_bin5.txt'\n",
"\n",
"fil = open(filname,'r')\n",
"\n",
"lines26 = []\n",
"lines26.append(fil.readlines())\n",
"\n",
"for r in range(len(lines26[0])):\n",
" lines26[0][r] = re.split('[ |]',lines26[0][r])\n",
" \n",
" \n",
" \n",
"time26 = []\n",
"\n",
"for k in range(len(lines26[0])):\n",
" #p = (lines[0][k][1]).split(\",\")\n",
" p = re.split('[ , ;]',lines26[0][k][1])\n",
" time26.append((p))\n",
" \n",
"\n",
"usergroups26 = []\n",
"for k in range(len(lines26[0])):\n",
" p = (lines26[0][k][0])\n",
" p = p.split(\";\")\n",
" usergroups26.append(p[0]) \n",
"\n",
"\n",
"t26 = [[] for r in range(len(time26))]\n",
"for r in range(len(time26)):\n",
" for j in range(0,len(time26[r]),2):\n",
" t26[r].append(time26[r][j]) \n",
" \n",
" \n",
"duration26 = [[] for r in range(len(time26))]\n",
"for r in range(len(time26)):\n",
" for j in range(1,len(time26[r]),2):\n",
" duration26[r].append(time26[r][j]) \n",
" \n",
" \n",
" \n",
"occurence26 = [] \n",
"for i in range(len(t26)):\n",
" occurence26.append(len(t26[i]))\n",
" \n",
"maxoccurgroup26 = [] \n",
"for jl in range(len(occurence26)):\n",
" if(occurence26[jl] == max(occurence26)):\n",
" print(\"Group that occurred most frequently is {}\".format(usergroups26[jl]))\n",
" maxoccurgroup26.append(usergroups26[jl])\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"At the end I created files for each day which contained the data about the largest group formed on that day.\n",
"\n",
"One observation - Throughout the 3 days, we get the same group being the largest one.\n",
"So we wish to study the activity of that particular group."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"------------------------------------------------"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.0.8\n"
]
}
],
"source": [
"from plotly import __version__\n",
"from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot\n",
"\n",
"print __version__"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<script>requirejs.config({paths: { 'plotly': ['https://cdn.plot.ly/plotly-latest.min']},});if(!window.Plotly) {{require(['plotly'],function(plotly) {window.Plotly=plotly;});}}</script>"
],
"text/vnd.plotly.v1+html": [
"<script>requirejs.config({paths: { 'plotly': ['https://cdn.plot.ly/plotly-latest.min']},});if(!window.Plotly) {{require(['plotly'],function(plotly) {window.Plotly=plotly;});}}</script>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"init_notebook_mode(connected=True)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/Plot%2035.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[See interactive plot](https://plot.ly/~prateekkol21/35/)\n",
"\n",
"Hover over the dots to check about the user groups formed."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/Plot%2037.png)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"[See Interactive Plot](https://plot.ly/~prateekkol21/37/)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/Plot%2039.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[See Interactive Plot](https://plot.ly/~prateekkol21/39)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"--------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"--------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### User Activity on a Particular Day"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"User Activity denotes the activity of a particular user during a day.\n",
"\n",
"* With which group the user was associated and at which time along with the duration.\n",
"\n",
"By studying these user activities we can infer some characteristics of the user.\n",
"\n",
"\n",
"I thus created csv files for each users on a particular day.\n",
"\n",
"Like I wise I created files for data on 2 months, April and May"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"##### Activity of User 52 on 22 April 2013\n",
"\n",
"[See Interactive Plot](https://plot.ly/~prateekkol21/50)\n",
"\n",
"Hover over the plots to check the groups formed by user 52 on that day."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/Plot%2050.png)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Activity of User 52 on 23 April 2013\n",
"\n",
"[See Interactive Plot](https://plot.ly/~prateekkol21/52)\n",
"\n",
"Hover over the plots to check the groups formed by user 52 on that day."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/Plot%2052.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Group ,Percentage of Time spent in a location for some days during a month."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import re\n",
"from datetime import datetime\n",
"from collections import defaultdict\n",
"import csv\n",
"import os\n",
"\n",
"na = [str(i) for i in range(60)]\n",
"for i in range(len(na)):\n",
" if(len(str(na[i])) == 1):\n",
" na[i] ='u'+ '0' + na[i]\n",
" else:\n",
" na[i] = 'u' + na[i]\n",
" \n",
"filid = ['22','23','24','25','26','27','28','29']\n",
"filname = 'uniqueGroup_05' + filid[0] + '2013_bin5.txt'\n",
"fil = open(filname,'r')\n",
"lines = []\n",
"lines.append(fil.readlines())\n",
"\n",
"for r in range(len(lines[0])):\n",
" lines[0][r] = re.split('[ |]',lines[0][r])\n",
" \n",
"\n",
" \n",
"time = []\n",
"for k in range(len(lines[0])):\n",
" #p = (lines[0][k][1]).split(\",\")\n",
" p = re.split('[ , ;]',lines[0][k][1])\n",
" time.append((p))\n",
" \n",
"\n",
"usergroups = []\n",
"for k in range(len(lines[0])):\n",
" p = (lines[0][k][0])\n",
" p = p.split(\";\")\n",
" usergroups.append(p[0]) \n",
"\n",
"\n",
"t = [[] for r in range(len(time))]\n",
"for r in range(len(time)):\n",
" for j in range(0,len(time[r]),2): # time index\n",
" t[r].append(time[r][j]) \n",
" \n",
" \n",
"duration = [[] for r in range(len(time))]\n",
"for r in range(len(time)):\n",
" for j in range(1,len(time[r]),2):\n",
" duration[r].append(time[r][j]) # duration index\n",
" \n",
"\n",
" \n",
"uniqgroup = list(set(usergroups))\n",
"\n",
"for i in range(len(uniqgroup)):\n",
" for j in range(len(usergroups)):\n",
" if(uniqgroup[i] == usergroups[j]):\n",
" print(usergroups[j])\n",
" for c in usergroups[j].split(\",\"):\n",
" for h in range(len(t[j])):\n",
" (timefindr(c,int(t[j][h],filid[0])))\n",
" print('\\n')\n",
" \n",
"\n",
" # We create a csv file, store the number of groups formed at different locations through out the day along with the duration of the group.\n",
"fg = open('GroupsLcationPercebntage22.csv','a')\n",
" \n",
"for i in range(len(uniqgroup)):\n",
" x = uniqgroup[i].split(\",\")\n",
" us = x[0]\n",
" for r in range(1,len(x)):\n",
" us = us + ' ' + x[r]\n",
" loco = []\n",
" tim = []\n",
" for j in range(len(usergroups)):\n",
" if(uniqgroup[i] == usergroups[j]):\n",
" \n",
" for h in range(len(t[j])):\n",
" v = usergroups[j].split(\",\")\n",
" \n",
" for c in range(len(v)):\n",
" \n",
" if((timefindr(v[c],int(t[j][h]),(filid[0]))) != []):\n",
" loco.append((timefindr(v[c],int(t[j][h]),(filid[0])))[0])\n",
" tim.append(int(duration[j][h]))\n",
" d = defaultdict(int)\n",
" for p in loco:\n",
" d[p] += 1\n",
" result = max(d.iteritems(), key=lambda x: x[1]) # checking whether maximum of users in a group are in a particular location.\n",
" loc = list(result)\n",
" z = ((sum(tim)*100/(1440*1.0)))\n",
" fg.writelines(us+','+str(z) + ',' +loc[0] + '\\n')\n",
"fg.close() \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"#### Plotting the Percentage of Group formation at different locations for days 22 - 29 May\n",
"\n",
"[See Interactive Plot](https://plot.ly/~prateekkol21/43)\n",
"\n",
"Hover over the dots in the link above to see the usergroups information.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/plot43.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting groups formed per location at different time points of some number of days"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Location - [backer-berry]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/Plot%2046.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[See Interactive Plot](https://plot.ly/~prateekkol21/46)\n",
"\n",
"Hover over the dots in the interctive plot to check the groups information."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Location - [sudikoff]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/Plot%2048.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[See Interactive Plot](https://plot.ly/~prateekkol21/48)\n",
"\n",
"Hover over the dots for checking user group inforation\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Similarily for other locations I plotted this data."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Per Location Percentage of Time Spent"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Month 05\n",
"For Days 25 -28\n",
"\n",
"north-main = 0.86%\n",
"\n",
"kemeny percentage = (3/(4* 96.26666666666667)) = 0.77 %\n",
"\n",
"sudikoff percentage = 50/(4.0* 96.26666666666667) = 13%\n",
"\n",
"backer-berry percentage = 32/(4.0 * 96.26666666666667 ) =8.31%\n",
" \n",
" \n",
" \n",
"Month 04\n",
"\n",
"north-main = 11.3%\n",
"\n",
"kemeny = 12.5%\n",
"\n",
"sudikoff percentage = 9.8%\n",
"\n",
"backer-berry percentage = 4.35%\n",
" \n",
" \n",
" \n",
" \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Given the Jaccard Index and Pearson Coefficient values between every possible pair of users for a particular day, we check for the minimum Jaccard Index and minimum Pearson Coefficient among all such pairs where the pair of users have the same location during the same time. \n",
"\n",
"\n",
"We see that the minimum Jaccard Index comes out to be 0.0 for two users spending 5 mins together in the same location and during the same time. But this is contradictory, since if the two users are at the same place and time for about 5 minutes, there must be some common BSSID values (intersection of the BSSID values) and hence Jaccard Index is ought to come out as non- zero.\n",
"\n",
"So there is some mismatch and we want calcluate this mismatch error percentage. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import matplotlib.patches as mpatches\n",
"from matplotlib.font_manager import FontProperties\n",
"import numpy as np\n",
"from glob import glob\n",
"import re\n",
"from datetime import datetime\n",
"from collections import defaultdict\n",
"import csv\n",
"import os\n",
"\n",
"\n",
" \n",
" \n",
" \n",
"J= []\n",
"P = [] \n",
"mismatch = 0\n",
"nofiles = 0\n",
"files_list = glob(os.path.join('JC', '*.txt'))\n",
"for a_file in (files_list):\n",
" #print(a_file)\n",
" nofiles += 1\n",
" filename = a_file\n",
" \n",
" # finding all such files\n",
" \n",
" fil = open(filename, 'r')\n",
" fl = a_file.split(\"_\")\n",
" lines = []\n",
" lines.append(fil.readlines()) # Reading from file\n",
"\n",
" fil.close()\n",
" textlines = []\n",
" for i in range(len(lines[0])):\n",
" textlines.append( lines[0][i].split(\",\"))\n",
"\n",
" time = []\n",
" JC = []\n",
" Pearson_coefficient = []\n",
"\n",
" for j in range(len(textlines)):\n",
" time.append(textlines[j][0])\n",
" JC.append(textlines[j][1])\n",
" Pearson_coefficient.append(textlines[j][2])\n",
"\n",
"\n",
" for k in range(len(time)):\n",
" time[k] = int(time[k])\n",
"\n",
" for k in range(len(JC)):\n",
" JC[k] = float(JC[k]) # We store the JaccardIndex, pearson coefficent value and the time index as previously done\n",
"\n",
" for k in range(len(Pearson_coefficient)):\n",
" Pearson_coefficient[k] = float(Pearson_coefficient[k])\n",
" \n",
" \n",
" ft = open('LocationData\\\\'+ 'wifiLoc_' + fl[4],'r')\n",
"\n",
" li= []\n",
" \n",
" li.append(ft.readlines()) \n",
" \n",
" ft.close()\n",
" for r in range(len(li[0])):\n",
" li[0][r] = re.split('[ , :]',li[0][r])\n",
" \n",
" \n",
" \n",
" ik =1 \n",
" while(ik < len(li[0]) - 5): \n",
" t = ik \n",
" Jac = [] # we take 5 mins of data, check if two users are in same location and same time , and then append the Jaccard Coefficient and Pearson Coefficient\n",
" Pac = []\n",
" jacsu = 0\n",
" while(t < (5 + ik )):\n",
" if fl[2] in (li[0][t]) and fl[3] in (li[0][t]):\n",
" for h in range(len(li[0][t])):\n",
" if(fl[2] == li[0][t][h]):\n",
" loc2 = li[0][t][h+1]\n",
" for h in range(len(li[0][t])):\n",
" if(fl[3] == li[0][t][h]):\n",
" loc3 = li[0][t][h+1]\n",
" \n",
" if(loc2 == loc3):\n",
" # if two locations are equal\n",
" Jac.append(JC[t])\n",
" Pac.append(Pearson_coefficient[t])\n",
" \n",
" if((Jac) == [0.0, 0.0, 0.0, 0.0, 0.0]):\n",
" # if Jac coefficient is 0 for consecutive 5 minutes\n",
" mismatch += 1\n",
" \n",
" t += 1\n",
" \n",
" ik +=1 \n",
"\n",
"# iter the loop\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The mismatch error comes out to be around 8.908%."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"--------------------------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Relation of User GPA with group formation tendency."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\n",
"import csv \n",
"from glob import glob\n",
"\n",
"import os\n",
"\n",
"filn = open('GradesRelation.csv','a')\n",
"f = open('grades.csv','r')\n",
"\n",
"li = []\n",
"li.append(f.readlines())\n",
"f.close()\n",
"\n",
"for i in range(1,len(li[0])):\n",
" li[0][i] = li[0][i].split(\",\")\n",
" \n",
"user = [] # storing the user id and their corresponding gpa\n",
"for i in range(1,len(li[0])):\n",
" user.append(li[0][i][0])\n",
" \n",
"gpa = [] \n",
"for i in range(1,len(li[0])):\n",
" gpa.append(li[0][i][1])\n",
" \n",
" \n",
"filname = ['Day_04222013' ,'Day_04232013', 'Day_04242013' , 'Day_04252013' , 'Day_04262013' , 'Day_04272013' ,'Day_05222013' , 'Day_05232013', 'Day_05242013' , 'Day_05252013' , 'Day_05262013' , 'Day_05272013' , 'Day_05282013' , 'Day_05292013'] \n",
"\n",
"\n",
"# for the above filenames we create a file containing the user_ids, the number of groups that they formed and their gpa\n",
"for na in range(len(user)):\n",
" su = 0\n",
" for r in range(len(filname)):\n",
" if(os.path.isfile( filname[r] + '\\ ' + user[na] + '.csv') == True):\n",
" fil = open( filname[r] + '\\ ' + user[na] + '.csv' , 'r')\n",
" line =[]\n",
" line.append(fil.readlines())\n",
" fil.close()\n",
" z = len(line[0]) - 1\n",
" su += z\n",
" \n",
" filn.writelines(user[na] + ',' + str(su) + ',' + gpa[na] + '\\n ')\n",
" \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Plot between Groups formed vs GPA\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![](https://raw.githubusercontent.com/prateekiiest/Student-Group-Activity-Recognition/master/Plot%2041.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[See Interactive Plot](https://plot.ly/~prateekkol21/41) \n",
"\n",
"\n",
"Hover over the data points to check about the user groups. The data points indicate the users groups formed."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Inference and Results\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* ### At date 22/05\n",
"- Toppers are in library more of the time. Some during the night also\n",
"- Lab is always crowded. \n",
"- U32,u30 toppers are the major group in library \n",
"- U13 u36 are the major group in lab \n",
"\n",
"\n",
"Completely different group characteristics in day 22 04 and day 22 05 \n",
"\n",
"\n",
"* ### At date 22/04\n",
"- Less population in backer-berry\n",
"- North main population more\n",
"- U19 , another topper in spends mostly backer-berry.\n",
"\n",
"\n",
"\n",
"* Less number of users are participating in groups with time.\n",
"\n",
"* Users spending time with friends in north-main or ssliby-rocky are seen to spend more time in other places together.\n",
"* Some exceptions are there.\n",
"\n",
"\n",
"* With time user groups are spending more time in library and lab(sudikoff)\n",
"\n",
"* Users within the same group tend to have almost close gpas.\n",
"\n",
"* Students with low gpa are seen to less tendency in participating in a group.\n",
"* Students with a medium gpa have high tendency in participating in a group.\n",
"* Students with a high gpa have a bit lower tendency of particiating in a group.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"## Conclusion"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So we get to study about the different group characteristics, in a particular data set here in this case the **Student Life Data Set**.\n",
"\n",
"Based on proximity,wifi data we get to classify students into groups in order to study their activity.\n",
"\n",
"We get to know how the groups are being formed , how these groups evolve over time and the characteristics of such groups formed.\n",
"\n",
"Group Activity Recognition in mobile devices is a challenging problem due to the conceptual disparity\n",
"between the emergent nature of group behavior, and the local scope of observations of mobile devices.\n",
"\n",
"There is still a lot to explore in this area and I am eager to explore more about it. \n",
"\n"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment