Skip to content

Instantly share code, notes, and snippets.

@jeffsu
Created November 25, 2015 16:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jeffsu/f97465955fe7ef79955b to your computer and use it in GitHub Desktop.
Save jeffsu/f97465955fe7ef79955b to your computer and use it in GitHub Desktop.
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import scipy as sp\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Read the data from the csv, print out number of records, and show a small sample"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Rows in data: 10000\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Name</th>\n",
" <th>Date</th>\n",
" <th>notes</th>\n",
" <th>Value</th>\n",
" <th>Change</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>PGC</td>\n",
" <td>2015-11-7</td>\n",
" <td>notes</td>\n",
" <td>600.61</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>RHS</td>\n",
" <td>2015-10-5</td>\n",
" <td>notes</td>\n",
" <td>202.97</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>KCT</td>\n",
" <td>2015-7-20</td>\n",
" <td>notes</td>\n",
" <td>914.96</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>DLV</td>\n",
" <td>2015-9-12</td>\n",
" <td>notes</td>\n",
" <td>479.16</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>ABU</td>\n",
" <td>2015-8-19</td>\n",
" <td>notes</td>\n",
" <td>725.18</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>WHJ</td>\n",
" <td>2015-7-14</td>\n",
" <td>notes</td>\n",
" <td>795.78</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>ARA</td>\n",
" <td>2015-8-12</td>\n",
" <td>notes</td>\n",
" <td>470.80</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>WYO</td>\n",
" <td>2015-8-3</td>\n",
" <td>notes</td>\n",
" <td>--</td>\n",
" <td>UNKNOWN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>DNX</td>\n",
" <td>2015-7-18</td>\n",
" <td>notes</td>\n",
" <td>600.33</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>IUQ</td>\n",
" <td>2015-10-13</td>\n",
" <td>notes</td>\n",
" <td>641.49</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name Date notes Value Change\n",
"0 PGC 2015-11-7 notes 600.61 INCREASED\n",
"1 RHS 2015-10-5 notes 202.97 DECREASED\n",
"2 KCT 2015-7-20 notes 914.96 INCREASED\n",
"3 DLV 2015-9-12 notes 479.16 DECREASED\n",
"4 ABU 2015-8-19 notes 725.18 DECREASED\n",
"5 WHJ 2015-7-14 notes 795.78 DECREASED\n",
"6 ARA 2015-8-12 notes 470.80 INCREASED\n",
"7 WYO 2015-8-3 notes -- UNKNOWN\n",
"8 DNX 2015-7-18 notes 600.33 DECREASED\n",
"9 IUQ 2015-10-13 notes 641.49 INCREASED"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dframe = pd.read_csv('values.csv')\n",
"print \"Rows in data: \" + str(len(dframe))\n",
"dframe.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look at the data types that pandas managed to extract from this file"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Name object\n",
"Date object\n",
"notes object\n",
"Value object\n",
"Change object\n",
"dtype: object"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dframe.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Looks like everything is an `object` so let's convert the `Value` column to numerics and replace non-numerics with `NaN`"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Rows in data: 10000\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Name</th>\n",
" <th>Date</th>\n",
" <th>notes</th>\n",
" <th>Value</th>\n",
" <th>Change</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>PGC</td>\n",
" <td>2015-11-7</td>\n",
" <td>notes</td>\n",
" <td>600.61</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>RHS</td>\n",
" <td>2015-10-5</td>\n",
" <td>notes</td>\n",
" <td>202.97</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>KCT</td>\n",
" <td>2015-7-20</td>\n",
" <td>notes</td>\n",
" <td>914.96</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>DLV</td>\n",
" <td>2015-9-12</td>\n",
" <td>notes</td>\n",
" <td>479.16</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>ABU</td>\n",
" <td>2015-8-19</td>\n",
" <td>notes</td>\n",
" <td>725.18</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>WHJ</td>\n",
" <td>2015-7-14</td>\n",
" <td>notes</td>\n",
" <td>795.78</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>ARA</td>\n",
" <td>2015-8-12</td>\n",
" <td>notes</td>\n",
" <td>470.80</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>WYO</td>\n",
" <td>2015-8-3</td>\n",
" <td>notes</td>\n",
" <td>NaN</td>\n",
" <td>UNKNOWN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>DNX</td>\n",
" <td>2015-7-18</td>\n",
" <td>notes</td>\n",
" <td>600.33</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>IUQ</td>\n",
" <td>2015-10-13</td>\n",
" <td>notes</td>\n",
" <td>641.49</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name Date notes Value Change\n",
"0 PGC 2015-11-7 notes 600.61 INCREASED\n",
"1 RHS 2015-10-5 notes 202.97 DECREASED\n",
"2 KCT 2015-7-20 notes 914.96 INCREASED\n",
"3 DLV 2015-9-12 notes 479.16 DECREASED\n",
"4 ABU 2015-8-19 notes 725.18 DECREASED\n",
"5 WHJ 2015-7-14 notes 795.78 DECREASED\n",
"6 ARA 2015-8-12 notes 470.80 INCREASED\n",
"7 WYO 2015-8-3 notes NaN UNKNOWN\n",
"8 DNX 2015-7-18 notes 600.33 DECREASED\n",
"9 IUQ 2015-10-13 notes 641.49 INCREASED"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dframe['Value'] = pd.to_numeric(dframe['Value'], errors='coerce')\n",
"print \"Rows in data: \" + str(len(dframe))\n",
"dframe.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's keep only the rows where `Value` is numeric and see how many rows are left"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Rows in data: 8985\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Name</th>\n",
" <th>Date</th>\n",
" <th>notes</th>\n",
" <th>Value</th>\n",
" <th>Change</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>PGC</td>\n",
" <td>2015-11-7</td>\n",
" <td>notes</td>\n",
" <td>600.61</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>RHS</td>\n",
" <td>2015-10-5</td>\n",
" <td>notes</td>\n",
" <td>202.97</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>KCT</td>\n",
" <td>2015-7-20</td>\n",
" <td>notes</td>\n",
" <td>914.96</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>DLV</td>\n",
" <td>2015-9-12</td>\n",
" <td>notes</td>\n",
" <td>479.16</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>ABU</td>\n",
" <td>2015-8-19</td>\n",
" <td>notes</td>\n",
" <td>725.18</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>WHJ</td>\n",
" <td>2015-7-14</td>\n",
" <td>notes</td>\n",
" <td>795.78</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>ARA</td>\n",
" <td>2015-8-12</td>\n",
" <td>notes</td>\n",
" <td>470.80</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>DNX</td>\n",
" <td>2015-7-18</td>\n",
" <td>notes</td>\n",
" <td>600.33</td>\n",
" <td>DECREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>IUQ</td>\n",
" <td>2015-10-13</td>\n",
" <td>notes</td>\n",
" <td>641.49</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>TSM</td>\n",
" <td>2015-10-20</td>\n",
" <td>notes</td>\n",
" <td>933.83</td>\n",
" <td>INCREASED</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name Date notes Value Change\n",
"0 PGC 2015-11-7 notes 600.61 INCREASED\n",
"1 RHS 2015-10-5 notes 202.97 DECREASED\n",
"2 KCT 2015-7-20 notes 914.96 INCREASED\n",
"3 DLV 2015-9-12 notes 479.16 DECREASED\n",
"4 ABU 2015-8-19 notes 725.18 DECREASED\n",
"5 WHJ 2015-7-14 notes 795.78 DECREASED\n",
"6 ARA 2015-8-12 notes 470.80 INCREASED\n",
"8 DNX 2015-7-18 notes 600.33 DECREASED\n",
"9 IUQ 2015-10-13 notes 641.49 INCREASED\n",
"10 TSM 2015-10-20 notes 933.83 INCREASED"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dframe = dframe[pd.notnull(dframe['Value'])]\n",
"print \"Rows in data: \" + str(len(dframe))\n",
"dframe.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's convert the `Date` column to `datetime` type to add an idea of order"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"dframe['Date'] = pd.to_datetime(dframe['Date'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's use `set` to take a look at how many unique stocks we have"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Unique stocks: 100\n"
]
}
],
"source": [
"stock_names = dframe['Name']\n",
"stock_names_unique = set(stock_names)\n",
"print \"Unique stocks: \" + str(len(stock_names_unique))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I think a good way to sort this data is to create a dictionary where the key is the stock name and the value is a data frame with two columns: date and value, sorted by date"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"dict_time_series = {}"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for stock in stock_names_unique:\n",
" temp = dframe[['Date','Value']][dframe['Name']==stock].copy()\n",
" dict_time_series[stock] = temp.sort_values(by='Date')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can now plot the time series for any stock, for example `PGC`:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10797d510>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(dict_time_series['PGC']['Date'], dict_time_series['PGC']['Value'], 'b-')\n",
"plt.title('PGC') \n",
"plt.xlabel('Date') \n",
"plt.ylabel('Value')\n",
"plt.grid(True)\n",
"plt.tight_layout(pad=1) \n",
"plt.gcf().set_size_inches(8, 4)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's answer the question by going through all the stocks and calculating the change between first and last recording\n",
"\n",
"There are only 100 so we can just keep a short data frame with the columns:\n",
"* Name\n",
"* Start\n",
"* End\n",
"* Change (End - Start)\n",
"* Gain (End/Start)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"df_gain = pd.DataFrame(columns=['Name','Start','End','Change','Gain'])"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for stock in stock_names_unique:\n",
" start = dict_time_series[stock]['Value'].values[0]\n",
" end = dict_time_series[stock]['Value'].values[-1]\n",
" change = end - start\n",
" gain = end/start\n",
" df_gain.loc[len(df_gain)+1,:] = [stock,start,end,change,gain]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's find the stock with the biggest change"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Name</th>\n",
" <th>Start</th>\n",
" <th>End</th>\n",
" <th>Change</th>\n",
" <th>Gain</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>OQB</td>\n",
" <td>44.48</td>\n",
" <td>894.48</td>\n",
" <td>850</td>\n",
" <td>20.1097</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>FFJ</td>\n",
" <td>77.28</td>\n",
" <td>870.14</td>\n",
" <td>792.86</td>\n",
" <td>11.2596</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>DEE</td>\n",
" <td>120.65</td>\n",
" <td>894.44</td>\n",
" <td>773.79</td>\n",
" <td>7.41351</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>TSM</td>\n",
" <td>184.73</td>\n",
" <td>946.88</td>\n",
" <td>762.15</td>\n",
" <td>5.12575</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>LII</td>\n",
" <td>10.19</td>\n",
" <td>609.77</td>\n",
" <td>599.58</td>\n",
" <td>59.84</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name Start End Change Gain\n",
"15 OQB 44.48 894.48 850 20.1097\n",
"23 FFJ 77.28 870.14 792.86 11.2596\n",
"33 DEE 120.65 894.44 773.79 7.41351\n",
"28 TSM 184.73 946.88 762.15 5.12575\n",
"4 LII 10.19 609.77 599.58 59.84"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_gain.sort_values(by='Change', ascending=False).head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And now the stock with the biggest gain"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Name</th>\n",
" <th>Start</th>\n",
" <th>End</th>\n",
" <th>Change</th>\n",
" <th>Gain</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>LII</td>\n",
" <td>10.19</td>\n",
" <td>609.77</td>\n",
" <td>599.58</td>\n",
" <td>59.84</td>\n",
" </tr>\n",
" <tr>\n",
" <th>60</th>\n",
" <td>DUO</td>\n",
" <td>12.87</td>\n",
" <td>368.92</td>\n",
" <td>356.05</td>\n",
" <td>28.6651</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>OQB</td>\n",
" <td>44.48</td>\n",
" <td>894.48</td>\n",
" <td>850</td>\n",
" <td>20.1097</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>FFJ</td>\n",
" <td>77.28</td>\n",
" <td>870.14</td>\n",
" <td>792.86</td>\n",
" <td>11.2596</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td>GRH</td>\n",
" <td>87.82</td>\n",
" <td>680.2</td>\n",
" <td>592.38</td>\n",
" <td>7.74539</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name Start End Change Gain\n",
"4 LII 10.19 609.77 599.58 59.84\n",
"60 DUO 12.87 368.92 356.05 28.6651\n",
"15 OQB 44.48 894.48 850 20.1097\n",
"23 FFJ 77.28 870.14 792.86 11.2596\n",
"43 GRH 87.82 680.2 592.38 7.74539"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_gain.sort_values(by='Gain', ascending=False).head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The stock with the biggest rise in price was `OQB`, which went from 44.48 to 894.48.\n",
"\n",
"The stock with the biggest % gain was `LII`, which increased its value by 59.84 times."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"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.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment