diff --git a/data/bitcoin_data.csv b/data/bitcoin_data.csv new file mode 100644 index 0000000..cb85906 --- /dev/null +++ b/data/bitcoin_data.csv @@ -0,0 +1,453 @@ +Timestamp,Open,High,Low,Close,Volume (BTC),Volume (Currency),Weighted Price +1/1/17 0:00,966.34,1005,960.53,997.75,6850.59,6764742.06,987.47 +1/2/17 0:00,997.75,1032,990.01,1012.54,8167.38,8273576.99,1013 +1/3/17 0:00,1011.44,1039,999.99,1035.24,9089.66,9276500.31,1020.56 +1/4/17 0:00,1035.51,1139.89,1028.56,1114.92,21562.46,23469644.96,1088.45 +1/5/17 0:00,1114.38,1136.72,885.41,1004.74,36018.86,36211399.53,1005.35 +1/6/17 0:00,1004.73,1026.99,871,893.89,27916.7,25523261.28,914.26 +1/7/17 0:00,894.02,907.05,812.28,906.2,20401.11,17624310.02,863.89 +1/8/17 0:00,906.2,941.81,881.3,909.75,8937.49,8168170.35,913.92 +1/9/17 0:00,909.8,912.87,875,896.23,8716.18,7780059.06,892.6 +1/10/17 0:00,896.09,912.47,889.41,905.05,8535.52,7704271.2,902.61 +1/11/17 0:00,905.24,918.4,755,778.62,35893.77,29459968.9,820.75 +1/12/17 0:00,778.7,832.99,751.34,807.47,17400.14,13632251.44,783.46 +1/13/17 0:00,807.51,831.4,775,825.86,11409.52,9224729.89,808.51 +1/14/17 0:00,825.98,837.76,810,818.27,6614.72,5470214.99,826.98 +1/15/17 0:00,819.52,823.45,808,821.86,4231.46,3455365.87,816.59 +1/16/17 0:00,821.86,835,818.09,831.81,6166.04,5107031.21,828.25 +1/17/17 0:00,831.76,908.5,827,905.99,12264.17,10775497.86,878.62 +1/18/17 0:00,905.95,915.99,851.74,887.7,11181.9,9830117.65,879.11 +1/19/17 0:00,887.69,910,878.89,901.01,11094.6,9929647.2,895 +1/20/17 0:00,902.23,902.43,880,895.8,6618.63,5915865.49,893.82 +1/21/17 0:00,895.81,928,895,921.98,5865.63,5373391.08,916.08 +1/22/17 0:00,921.98,937.74,886.76,923.76,7166.67,6569177.19,916.63 +1/23/17 0:00,923.75,927.57,913.21,913.52,3514.74,3234454.3,920.25 +1/24/17 0:00,913.15,923,881.48,885.47,9405.05,8495975.46,903.34 +1/25/17 0:00,885.47,904.01,884.5,893.43,5291.55,4725942.37,893.11 +1/26/17 0:00,893.25,919.49,892.86,914.83,5164.9,4688102.25,907.69 +1/27/17 0:00,914.95,924.88,908.01,918.02,4830.54,4433746.38,917.86 +1/28/17 0:00,918.02,920.99,913.08,918.6,1175.86,1078884.52,917.53 +1/29/17 0:00,918.6,919.99,910.45,912.01,1349.01,1234746.08,915.29 +1/30/17 0:00,913.12,923,910,919.99,3121.19,2865063.73,917.94 +1/31/17 0:00,919.99,970,917.5,963.99,9507.1,9024041.55,949.19 +2/1/17 0:00,963.99,986.96,962,983.67,6954.4,6748543.97,970.4 +2/2/17 0:00,983.79,1011.65,973.12,1009.17,8269.68,8222686.79,994.32 +2/3/17 0:00,1009.15,1022.64,987.01,1016.99,10928.02,11029881.3,1009.32 +2/4/17 0:00,1015.06,1044.23,1004,1033.18,5752.29,5884560.6,1022.99 +2/5/17 0:00,1033.72,1034.6,1004.7,1011.07,4348.17,4417546.51,1015.96 +2/6/17 0:00,1010.03,1031.94,1005.1,1023.99,5080.85,5188721.52,1021.23 +2/7/17 0:00,1024,1056.25,1021.3,1052.48,5372.13,5605838.11,1043.5 +2/8/17 0:00,1052.48,1070,1025,1050.4,9633.26,10072826.84,1045.63 +2/9/17 0:00,1051.73,1074.69,913.73,986,25150.07,25064862.06,996.61 +2/10/17 0:00,985.71,1010.68,950,996.08,10731.29,10491584.37,977.66 +2/11/17 0:00,995.49,1020,987.62,1012.4,4472.51,4509154.73,1008.19 +2/12/17 0:00,1011.01,1011.97,991.98,1000.73,2684,2690265.37,1002.34 +2/13/17 0:00,1000.73,1007.89,975.1,1000.79,4547.26,4522130.78,994.47 +2/14/17 0:00,1000.74,1019,987.97,1008.88,6761.11,6806110.34,1006.66 +2/15/17 0:00,1008.88,1013.8,1000.97,1011.53,3095.66,3123812.22,1009.09 +2/16/17 0:00,1011.53,1043.21,1010.75,1032.7,5996.1,6170238.86,1029.04 +2/17/17 0:00,1032.91,1064.99,1031.98,1055.46,6085.02,6386285.16,1049.51 +2/18/17 0:00,1055.75,1068.99,1046.14,1056.4,4474.95,4745831.61,1060.53 +2/19/17 0:00,1056.4,1061.9,1039.07,1051.8,2270.85,2388775.41,1051.93 +2/20/17 0:00,1051.8,1089.99,1044.39,1084,3664.37,3902660.35,1065.03 +2/21/17 0:00,1084,1126.86,1077,1124.62,8395.47,9273663.18,1104.6 +2/22/17 0:00,1124.83,1143,1098.16,1130.01,11673.09,13146726.04,1126.24 +2/23/17 0:00,1130.02,1193.92,1120.73,1188.11,11753.24,13558056.03,1153.56 +2/24/17 0:00,1183.53,1220,1091.1,1180.14,19598.23,23023500.2,1174.77 +2/25/17 0:00,1180.05,1184.73,1127,1152.2,6238.44,7226444.77,1158.37 +2/26/17 0:00,1152.11,1184.97,1133,1179.05,3536.49,4127618.08,1167.15 +2/27/17 0:00,1180.46,1197.99,1169,1194.64,4640.77,5511306.9,1187.58 +2/28/17 0:00,1194.64,1209.99,1176.27,1191.21,7562.47,9017082.51,1192.35 +3/1/17 0:00,1191.16,1231,1188.3,1226.39,6013.07,7276140.33,1210.05 +3/2/17 0:00,1228,1283.25,1215,1257.6,7762.73,9679539.51,1246.92 +3/3/17 0:00,1256.32,1298,1255,1285.33,7545.48,9615648.42,1274.36 +3/4/17 0:00,1287.38,1289.55,1230,1260,4951.23,6237601.9,1259.81 +3/5/17 0:00,1260,1275,1240,1273,3026.02,3809526.44,1258.92 +3/6/17 0:00,1269.98,1285,1251,1278.49,4249.65,5420772.93,1275.58 +3/7/17 0:00,1278.49,1281.62,1175.97,1233.05,14450.04,17887749.61,1237.9 +3/8/17 0:00,1233.86,1245.49,1145.5,1150.05,13399.44,15905595.45,1187.03 +3/9/17 0:00,1149.34,1208,1135.01,1190.89,7654.74,9019820.32,1178.33 +3/10/17 0:00,1190.99,1350,975,1116.97,33467.94,38830456.29,1160.23 +3/11/17 0:00,1111.55,1198,1106.51,1176.55,7346.79,8529224.3,1160.95 +3/12/17 0:00,1176.58,1241.85,1170.9,1226.62,5793.91,7003314.41,1208.74 +3/13/17 0:00,1226.42,1249.02,1215.43,1242.46,5637.36,6963555.14,1235.25 +3/14/17 0:00,1242.46,1260,1226.5,1245.86,5745.5,7156458.55,1245.58 +3/15/17 0:00,1245.82,1260,1238.32,1257.32,3930.5,4920843.36,1251.96 +3/16/17 0:00,1258.75,1258.96,1130,1172.62,15246.55,18265147.56,1197.99 +3/17/17 0:00,1172,1173.23,1063,1071.02,16704.57,18711161.79,1120.12 +3/18/17 0:00,1068.16,1099,944.36,969.4,21292.6,21545879.41,1011.89 +3/19/17 0:00,969.4,1063.7,969.4,1017.97,12201.86,12333561.01,1010.79 +3/20/17 0:00,1012.88,1053,1010.01,1035.96,7497.91,7764665.81,1035.58 +3/21/17 0:00,1036.23,1117.9,1034.92,1114.39,11125.5,12068049.72,1084.72 +3/22/17 0:00,1114.39,1114.39,988,1037.56,14521.26,15061002.63,1037.17 +3/23/17 0:00,1037.6,1054.4,1010.69,1029.65,5917,6134595.75,1036.78 +3/24/17 0:00,1030.84,1032,920,929.06,16072.42,15697051.68,976.65 +3/25/17 0:00,928.1,963.36,891.33,956.02,13507.44,12469646.95,923.17 +3/26/17 0:00,956.02,997,937.52,960,9012.92,8743359.97,970.09 +3/27/17 0:00,959.08,1043,952.95,1039.92,8687.09,8753826.09,1007.68 +3/28/17 0:00,1039.09,1068.26,1014.9,1043.99,9115.52,9538479.55,1046.4 +3/29/17 0:00,1042.83,1059.43,1008.16,1035.96,9379.72,9675900.4,1031.58 +3/30/17 0:00,1037.29,1050.17,1017.14,1033.7,8645.38,8919386.18,1031.69 +3/31/17 0:00,1033.79,1081,1031.43,1070.31,12058.79,12711331.62,1054.11 +4/1/17 0:00,1071.34,1097,1061.64,1083.94,5209.13,5617315.77,1078.36 +4/2/17 0:00,1083.95,1100,1066.49,1078.01,7639.9,8274688.32,1083.09 +4/3/17 0:00,1076.59,1152,1076.19,1144.77,11076.86,12487637.63,1127.36 +4/4/17 0:00,1146.42,1162.93,1118.85,1143,7420.87,8471842.7,1141.62 +4/5/17 0:00,1143,1145,1111,1134.58,5588.98,6299621.45,1127.15 +4/6/17 0:00,1134.86,1201.37,1134.36,1190.85,9134.3,10690571.43,1170.38 +4/7/17 0:00,1190.72,1202,1176,1190.66,5450.27,6486716.5,1190.16 +4/8/17 0:00,1190.66,1197.3,1166.66,1184.03,2720.8,3224244.36,1185.04 +4/9/17 0:00,1184.05,1216.87,1173.98,1206.2,4817.42,5764973.91,1196.69 +4/10/17 0:00,1205.2,1219.71,1195,1209.25,3656.82,4416613.87,1207.78 +4/11/17 0:00,1209.99,1229,1198.02,1218.99,3487.75,4229830.76,1212.77 +4/12/17 0:00,1218.99,1224.57,1208,1212.17,3475.19,4224875.8,1215.72 +4/13/17 0:00,1212.16,1219.45,1141,1172.91,7135.3,8410788.79,1178.76 +4/14/17 0:00,1172.56,1193,1142,1170.34,8982.77,10475652.88,1166.19 +4/15/17 0:00,1169.53,1192.5,1165,1173.45,1804.45,2128067.82,1179.34 +4/16/17 0:00,1171,1179.3,1150,1162.31,2663.99,3094769.46,1161.7 +4/17/17 0:00,1162.31,1192.5,1161,1176.54,3568.83,4210491.81,1179.8 +4/18/17 0:00,1176.59,1210,1175.95,1202.58,5514.18,6636782.79,1203.58 +4/19/17 0:00,1202.59,1209.99,1190,1203.98,6046.52,7247878.76,1198.69 +4/20/17 0:00,1203.98,1243.88,1201.66,1234.19,5972.94,7302307.33,1222.57 +4/21/17 0:00,1234.93,1252.32,1231.65,1243.61,5023.04,6236859.58,1241.65 +4/22/17 0:00,1243.6,1247.15,1199,1233.2,4173.28,5126960.21,1228.52 +4/23/17 0:00,1231.85,1248.99,1223.42,1241.99,2604.72,3219987.14,1236.21 +4/24/17 0:00,1242,1254,1234,1253.58,3048.69,3788507.32,1242.67 +4/25/17 0:00,1253.57,1280,1251.07,1269,5249.77,6651231.27,1266.96 +4/26/17 0:00,1271.4,1330,1265,1287.99,8707.64,11266221.16,1293.83 +4/27/17 0:00,1287.92,1342.02,1285,1331.53,6669.99,8810060.91,1320.85 +4/28/17 0:00,1331,1347.02,1299,1330.7,8234.28,10882526.4,1321.61 +4/29/17 0:00,1333.93,1342.8,1316,1333,3927.45,5226089.45,1330.66 +4/30/17 0:00,1336.77,1356,1315.68,1350.21,3536.18,4718587.81,1334.38 +5/1/17 0:00,1348.88,1425,1341.22,1390.86,8604.41,11923132.22,1385.7 +5/2/17 0:00,1390.86,1481.73,1388,1447.75,8920.69,12836209.77,1438.93 +5/3/17 0:00,1447.75,1516.04,1431.02,1503.22,11077.59,16380266.84,1478.69 +5/4/17 0:00,1503.25,1623.01,1444.94,1537.23,19548.53,30115422.58,1540.55 +5/5/17 0:00,1537.36,1609,1495,1514.9,15603.68,24257672.5,1554.61 +5/6/17 0:00,1515.39,1578.97,1505,1558.02,7901.14,12179087.26,1541.43 +5/7/17 0:00,1554.04,1565,1525,1554.01,7667.79,11809645.33,1540.16 +5/8/17 0:00,1554.38,1653.97,1554.38,1649.54,19262.35,30652223.06,1591.3 +5/9/17 0:00,1649.55,1760.4,1616.05,1720.28,16807.73,28741490.64,1710.02 +5/10/17 0:00,1720.26,1794.21,1682,1772.58,11265.38,19697560.66,1748.5 +5/11/17 0:00,1774.52,1892,1745.01,1828.45,14740.22,26997283.11,1831.54 +5/12/17 0:00,1830.85,1832,1650,1691.51,17062.84,29856372.54,1749.79 +5/13/17 0:00,1690.33,1785.82,1601.46,1776.89,10532.23,17797259.46,1689.79 +5/14/17 0:00,1776.8,1815,1753,1784,4816.73,8585557.39,1782.44 +5/15/17 0:00,1782.3,1784,1682.56,1705.48,13316.8,22951575.79,1723.51 +5/16/17 0:00,1706.07,1750,1641.22,1700.01,16554.09,28255380.02,1706.85 +5/17/17 0:00,1700.01,1840.42,1670.01,1782.99,17797.32,31598676.87,1775.47 +5/18/17 0:00,1779,1881.8,1766.33,1878.99,11916.12,21766168.13,1826.61 +5/19/17 0:00,1879,1969.99,1874.99,1958,14124.62,27218796.92,1927.05 +5/20/17 0:00,1959.09,2021,1914,2013.99,12309.95,24248476.49,1969.83 +5/21/17 0:00,2013.99,2063.11,1961.52,2017.55,6755.83,13647083.74,2020.04 +5/22/17 0:00,2017.55,2230.34,2001,2099.97,16338.54,34535101.53,2113.72 +5/23/17 0:00,2088.76,2275,2088.45,2264.23,14138.92,31139771.52,2202.42 +5/24/17 0:00,2265.9,2481.75,2264.64,2420.29,22144.6,52782234.68,2383.53 +5/25/17 0:00,2420.29,2760.1,2221,2292.53,32964.76,83028907.05,2518.72 +5/26/17 0:00,2277.01,2599.12,2060,2279.82,28326.82,66466402.58,2346.41 +5/27/17 0:00,2280.7,2339.94,1850,2042,26216.28,54113571.78,2064.12 +5/28/17 0:00,2042.89,2313.96,2041.48,2178.81,15375.22,33655092.72,2188.92 +5/29/17 0:00,2172.54,2350,2110,2292.1,12129.28,27376000.71,2257.02 +5/30/17 0:00,2290.18,2339.08,2160,2203.51,13888.85,31434633.58,2263.3 +5/31/17 0:00,2201.7,2334,2154.28,2298.01,16279.29,36862481.13,2264.38 +6/1/17 0:00,2298.01,2456.39,2296.81,2413.63,18401.66,43990417.87,2390.57 +6/2/17 0:00,2413.58,2489,2370.03,2488.94,12428.7,30186115.46,2428.74 +6/3/17 0:00,2488.94,2584.34,2445,2540.94,10810.58,27295110.64,2524.85 +6/4/17 0:00,2538.1,2569,2460,2530.27,8828.62,22263365.05,2521.73 +6/5/17 0:00,2530.27,2699.35,2525.28,2698,12221.44,31919212.32,2611.74 +6/6/17 0:00,2698,2933,2689.4,2880.74,26695.67,75249106.78,2818.78 +6/7/17 0:00,2875.71,2893.28,2612.5,2683.03,16967.04,47205426.44,2782.18 +6/8/17 0:00,2680.24,2815,2613.13,2806,13251.41,36430027.3,2749.14 +6/9/17 0:00,2805.46,2868.23,2780.43,2822.32,8036.31,22701156.24,2824.82 +6/10/17 0:00,2818,2912.98,2800,2899.99,9593.36,27434766.12,2859.77 +6/11/17 0:00,2899.01,2967.46,2861.53,2954.22,6830.61,19889995.68,2911.89 +6/12/17 0:00,2954.23,2980,2480.03,2667.06,31534.95,85799286.22,2720.77 +6/13/17 0:00,2656.97,2783.62,2638.62,2703.02,16275.83,44217458.2,2716.76 +6/14/17 0:00,2705.99,2801,2320,2450,29478.82,76114991.86,2582.02 +6/15/17 0:00,2451.42,2516.2,2120,2424.91,36751.09,84952914.56,2311.58 +6/16/17 0:00,2424.96,2540,2307.66,2484.68,13802.39,33831741.34,2451.15 +6/17/17 0:00,2484.68,2674.4,2420.53,2630,11142.99,28569796.41,2563.93 +6/18/17 0:00,2630.06,2665,2460.62,2516.98,9424.23,24023680.66,2549.14 +6/19/17 0:00,2516.98,2598,2480.96,2598,10570.67,27011860.51,2555.36 +6/20/17 0:00,2598,2783,2581,2740,15891.7,42538164.74,2676.75 +6/21/17 0:00,2734.03,2789,2611,2657.04,15676.32,42304860.31,2698.65 +6/22/17 0:00,2658.67,2740,2594.61,2713.48,10792.79,28955845.86,2682.89 +6/23/17 0:00,2713.48,2745,2657.46,2685.05,8232.48,22348019.56,2714.62 +6/24/17 0:00,2685.05,2724.96,2512.13,2557.66,13342.82,34944802.73,2619 +6/25/17 0:00,2557.66,2635.72,2432,2502.03,10339.57,26249953.89,2538.78 +6/26/17 0:00,2502.26,2550.03,2315.01,2421.22,22094.21,54096000.65,2448.42 +6/27/17 0:00,2421.21,2565,2291,2565,19129.6,45774590.05,2392.87 +6/28/17 0:00,2565,2593,2468.01,2559.9,12274.55,31106035.77,2534.19 +6/29/17 0:00,2550.99,2594.78,2500.31,2541.59,8125.38,20771078.34,2556.32 +6/30/17 0:00,2538.41,2564.58,2451,2465.49,8715.72,21948643.03,2518.28 +7/1/17 0:00,2465.48,2517.11,2390,2412.41,8885.89,21750491.24,2447.76 +7/2/17 0:00,2421.3,2528.72,2374.34,2504.37,8744.53,21386273.68,2445.67 +7/3/17 0:00,2504.81,2595,2472.68,2550.47,11520.71,29213705.74,2535.76 +7/4/17 0:00,2540.07,2639.47,2540.07,2596.12,9662.76,25107482.88,2598.38 +7/5/17 0:00,2594.52,2623,2530.1,2602.9,10882.84,27950344.7,2568.3 +7/6/17 0:00,2598.37,2614,2522,2600.39,8333.98,21529601.71,2583.35 +7/7/17 0:00,2599.01,2605,2475,2501.46,9430.62,23870564.36,2531.18 +7/8/17 0:00,2501.46,2555,2462,2550.07,5405.89,13584489.52,2512.9 +7/9/17 0:00,2550.13,2564.65,2500.5,2502.28,4483.14,11362427.97,2534.48 +7/10/17 0:00,2504,2527.88,2261.85,2323.45,17296.34,41650843.77,2408.07 +7/11/17 0:00,2326.12,2399,2242.62,2305.98,17580.96,41145883.94,2340.37 +7/12/17 0:00,2301.55,2408.84,2239.54,2388,12883.55,30256255.57,2348.44 +7/13/17 0:00,2383.97,2425.16,2312.93,2339.99,8429.85,19957908.68,2367.53 +7/14/17 0:00,2340,2357.84,2140,2213.37,12659.02,28326253.11,2237.63 +7/15/17 0:00,2209.44,2219.99,1967.65,1970.51,19886.68,40927009.37,2058.01 +7/16/17 0:00,1970.51,2044.44,1830,1917.63,25562.71,49010482.23,1917.27 +7/17/17 0:00,1917.72,2229.97,1910.57,2226,26448.5,55057438.35,2081.68 +7/18/17 0:00,2226,2392,2164,2303.71,25204.49,57683997.07,2288.64 +7/19/17 0:00,2308.82,2402.5,2223,2265.21,17009.88,39248446.86,2307.39 +7/20/17 0:00,2265.51,2938,2265.51,2875.03,30989.89,80388738.23,2594.03 +7/21/17 0:00,2880,2887.45,2611.39,2670,20724.16,56456355.34,2724.18 +7/22/17 0:00,2667.01,2882,2644.59,2832.71,12819.63,35805144.41,2792.99 +7/23/17 0:00,2824.82,2855,2640,2749.02,11001.96,30310788.74,2755.03 +7/24/17 0:00,2756.8,2800,2701,2759.98,10001.92,27562701.02,2755.74 +7/25/17 0:00,2759.95,2775.79,2450,2564.82,21326.55,55120720.9,2584.61 +7/26/17 0:00,2564.74,2608.96,2400,2524.99,17713.67,44091449.21,2489.12 +7/27/17 0:00,2524.99,2695,2509.63,2666.33,11826.48,30470923.86,2576.5 +7/28/17 0:00,2666.33,2825,2655.82,2777.01,14069.5,38675840.62,2748.91 +7/29/17 0:00,2777.01,2785.65,2631.78,2680.56,10782.22,29159800.95,2704.43 +7/30/17 0:00,2681.6,2774.45,2569.69,2742.37,9678.16,25848893.08,2670.85 +7/31/17 0:00,2745.76,2889.99,2680.01,2855.81,11114.34,30777296.21,2769.15 +8/1/17 0:00,2855.81,2929.17,2615,2731,12525.08,34322796.56,2740.33 +8/2/17 0:00,2732,2760,2650,2703.51,9486.63,25701106.1,2709.19 +8/3/17 0:00,2703.51,2807.44,2698.83,2793.37,7963.7,21938304,2754.79 +8/4/17 0:00,2793.34,2877.52,2765.91,2855,7635.82,21650087.64,2835.33 +8/5/17 0:00,2851.01,3339.66,2848.32,3263.62,16996.27,53861926.03,3169.04 +8/6/17 0:00,3263.51,3296.51,3146.1,3222.75,5998.74,19412655.97,3236.12 +8/7/17 0:00,3216.78,3430,3186,3387.55,12046.12,40225852,3339.32 +8/8/17 0:00,3387.54,3490,3300,3412.41,15835.37,54054824.25,3413.55 +8/9/17 0:00,3408.46,3423.1,3178.72,3342.99,14286.84,47356464.4,3314.69 +8/10/17 0:00,3342.99,3448,3311.17,3413.03,9031.12,30658440.51,3394.75 +8/11/17 0:00,3410,3705,3390.67,3645.06,11927.37,41888022.26,3511.92 +8/12/17 0:00,3651.74,3934,3586.95,3855.1,12351.07,46799798.4,3789.13 +8/13/17 0:00,3855.04,4190,3841.71,4053.87,15889.83,63672103.45,4007.1 +8/14/17 0:00,4053.87,4329.43,3964.96,4306.23,14212.3,59836002.81,4210.15 +8/15/17 0:00,4320.95,4400,3800,4155.67,25515.72,104651369.1,4101.45 +8/16/17 0:00,4154.99,4379.78,3926.06,4378.84,12923.64,54194325.8,4193.43 +8/17/17 0:00,4361.99,4480,4167.21,4276.5,14573.19,63228604.19,4338.69 +8/18/17 0:00,4260.47,4368,3964.96,4100,17516.99,73224029.24,4180.17 +8/19/17 0:00,4100,4188,3900,4099.55,15036.18,60604905.58,4030.6 +8/20/17 0:00,4091.99,4125.95,4000,4058.68,6237.97,25289638.6,4054.14 +8/21/17 0:00,4058.64,4080,3949.78,3987.52,9782.06,39203908.96,4007.74 +8/22/17 0:00,3987.51,4139.31,3600,4085,23522.76,91600325.72,3894.12 +8/23/17 0:00,4078,4248.97,4051.94,4108.12,14979.4,62117291.56,4146.85 +8/24/17 0:00,4121.78,4350,4082.57,4300.34,10782.69,45174068.67,4189.5 +8/25/17 0:00,4308.8,4449.98,4270,4355.98,9699.61,42274063.39,4358.33 +8/26/17 0:00,4348.17,4369.78,4232.43,4333.38,6559.67,28227915.28,4303.25 +8/27/17 0:00,4333.38,4393.3,4290.32,4337.68,3979.12,17263967.23,4338.63 +8/28/17 0:00,4329.91,4399.72,4169.01,4379.99,8641,37077203.39,4290.85 +8/29/17 0:00,4385,4649.78,4336.26,4578.82,11879.64,53491168.4,4502.76 +8/30/17 0:00,4578.82,4642.22,4479,4573.2,8720.04,39800539.16,4564.26 +8/31/17 0:00,4573.15,4765.21,4566.66,4734.26,8911.41,41726210.49,4682.33 +9/1/17 0:00,4734.26,4935,4671.09,4921.7,15367.53,73889667.5,4808.17 +9/2/17 0:00,4921.71,4979.9,4488.5,4599.9,16977.79,79492706.8,4682.16 +9/3/17 0:00,4599.9,4700,4385,4606.26,11224.91,51112035,4553.45 +9/4/17 0:00,4603.68,4613.97,4058.5,4277,25069.13,107792606.9,4299.82 +9/5/17 0:00,4282.53,4474.88,4001.93,4396.52,20884.22,88444473.15,4234.99 +9/6/17 0:00,4397.38,4649.23,4356.42,4605.8,16634.1,75306805.37,4527.25 +9/7/17 0:00,4605.81,4674.34,4475,4615,9254.85,42435328.99,4585.2 +9/8/17 0:00,4615,4679.97,4125.99,4312,23693.3,103569423.2,4371.25 +9/9/17 0:00,4327.41,4379.78,4164,4308.72,9974.39,42689334.62,4279.9 +9/10/17 0:00,4322.44,4322.44,4010,4226.22,14724.2,61040452.05,4145.59 +9/11/17 0:00,4226.21,4353.49,4092.4,4207.31,11191.6,47148979.98,4212.89 +9/12/17 0:00,4198.89,4377.65,4080,4172.56,13294.44,56268039.79,4232.45 +9/13/17 0:00,4170.6,4179.14,3720.01,3865.34,29636.38,115516897.1,3897.81 +9/14/17 0:00,3861.89,3921.74,3210,3227.79,41319.4,146101729.7,3535.91 +9/15/17 0:00,3227.79,3820,2972.01,3700.01,60278.95,203168386,3370.47 +9/16/17 0:00,3699.89,3872.9,3500,3678.93,23158.23,84905914.76,3666.34 +9/17/17 0:00,3669.07,3772.52,3463,3662.99,11770.22,42657776.56,3624.21 +9/18/17 0:00,3662.95,4122.7,3659.42,4101.6,17207.6,67988469.46,3951.07 +9/19/17 0:00,4102,4119.7,3848.35,3888.8,15278.93,60404491.57,3953.45 +9/20/17 0:00,3888.8,4050,3820.56,3874.46,11660.27,45847238.86,3931.92 +9/21/17 0:00,3864,3914,3573,3617.05,17904.3,67012342.18,3742.81 +9/22/17 0:00,3607.83,3761.84,3514,3612.18,15007.74,54271184.82,3616.21 +9/23/17 0:00,3611.91,3810.25,3552,3779.17,10123.23,37609099.77,3715.13 +9/24/17 0:00,3781.13,3783.25,3615,3664.22,6508.72,24009707.82,3688.85 +9/25/17 0:00,3667.01,3968.59,3658.39,3918,14979.78,57632408.09,3847.35 +9/26/17 0:00,3920.66,3970,3850.61,3888.03,10014.62,39220959.7,3916.37 +9/27/17 0:00,3883.95,4226.73,3870,4199.29,15075.84,61255648.53,4063.17 +9/28/17 0:00,4202.34,4270.01,4123.5,4184.84,9625.93,40309035.77,4187.55 +9/29/17 0:00,4183.47,4227.62,4022.02,4164.82,12191.93,50336312.65,4128.66 +9/30/17 0:00,4162.04,4349,4154.28,4326.09,7496.78,32073448.82,4278.3 +10/1/17 0:00,4326.09,4377.22,4216,4377.22,7211.34,30871704.79,4281 +10/2/17 0:00,4369.33,4453,4352,4391.48,8259.82,36293751.01,4394.01 +10/3/17 0:00,4391.41,4425,4218,4315.83,12468.06,53551605.48,4295.1 +10/4/17 0:00,4315.73,4343,4170.07,4219.53,8518.99,36068254.94,4233.86 +10/5/17 0:00,4219.74,4358.97,4137.96,4301.09,8419.96,35912272.84,4265.13 +10/6/17 0:00,4301.09,4425,4278.4,4362.95,8377.3,36552658.15,4363.3 +10/7/17 0:00,4356.09,4463,4312.82,4423.3,4646.41,20320065.24,4373.29 +10/8/17 0:00,4422.72,4612,4404.5,4597.98,10083.87,45490443.57,4511.21 +10/9/17 0:00,4597.97,4865,4541,4764.7,12923.67,60473207.29,4679.26 +10/10/17 0:00,4761.67,4909.97,4700,4749.29,11666.02,56088789.35,4807.87 +10/11/17 0:00,4747.9,4869.78,4700,4822.01,9866.9,47256315.42,4789.38 +10/12/17 0:00,4822.01,5445,4793.66,5445,19916.23,102559923.2,5149.57 +10/13/17 0:00,5444,5846.43,5380,5653.6,27827.38,155848051.9,5600.53 +10/14/17 0:00,5653.58,5817.34,5558.26,5801.29,8410.94,47779356.45,5680.62 +10/15/17 0:00,5795.01,5830,5415,5679.7,11542.95,64464008.42,5584.71 +10/16/17 0:00,5683.92,5807.11,5548,5745.72,9066.8,51508749.11,5681.03 +10/17/17 0:00,5752.2,5776.31,5506.78,5597.31,9105.28,51035573.57,5605.05 +10/18/17 0:00,5591.97,5617.75,5101.36,5582.05,18961.68,101657249.6,5361.2 +10/19/17 0:00,5572.64,5735.14,5512.06,5698.69,9919.84,56087316.56,5654.06 +10/20/17 0:00,5700,6074,5589.8,5977.29,15109.06,89014299.88,5891.45 +10/21/17 0:00,5977.26,6180,5871,6013.46,15357.42,92912504.83,6050.01 +10/22/17 0:00,6010.85,6071.07,5700,5969,12232.52,71898806.16,5877.68 +10/23/17 0:00,5967.38,6045.34,5617.75,5871.17,15331.64,89530043.16,5839.56 +10/24/17 0:00,5869.82,5870,5453.01,5523.4,17286.72,97560230.19,5643.65 +10/25/17 0:00,5518.49,5748,5366,5735.88,12349.11,68370411.13,5536.47 +10/26/17 0:00,5741.35,5988,5683,5890,11788.3,69079451.81,5860 +10/27/17 0:00,5889.99,5994.06,5674.06,5771.89,11911.04,69053794.44,5797.46 +10/28/17 0:00,5773.03,5875.66,5646.18,5730.69,5926.3,33993472.69,5736.04 +10/29/17 0:00,5731.7,6316.85,5683,6137.37,16086.63,96361934.29,5990.19 +10/30/17 0:00,6133.01,6229.77,6024.03,6119.99,9574.64,58637080.14,6124.2 +10/31/17 0:00,6120,6449.78,6072.81,6434.21,13423.31,84354477.98,6284.18 +11/1/17 0:00,6434.24,6756.36,6340.01,6741.59,12967.22,84891427.3,6546.62 +11/2/17 0:00,6745.04,7354.1,6700,7030,26514.65,184979262.3,6976.49 +11/3/17 0:00,7030,7500,6925.22,7146.82,15999.78,116037544.2,7252.44 +11/4/17 0:00,7145.24,7569.9,6994,7388.83,9200.11,66730277.42,7253.2 +11/5/17 0:00,7388.79,7590,7275.16,7372.72,9218.33,68631151.85,7445.08 +11/6/17 0:00,7373.3,7421.39,6922.07,6967.68,19323.13,138542391.8,7169.77 +11/7/17 0:00,6967.64,7244.69,6945,7130.28,11634.27,82632999.59,7102.55 +11/8/17 0:00,7131.38,7888,7080.01,7450.32,24679.72,183501327.1,7435.31 +11/9/17 0:00,7465.06,7490,7061.2,7148,14799.27,106985408.5,7229.1 +11/10/17 0:00,7150.61,7343.18,6429.44,6588.18,26614.28,181284361.1,6811.55 +11/11/17 0:00,6588.18,6820,6218,6355.13,14942.7,96800268.09,6478.1 +11/12/17 0:00,6355.13,6488.88,5555.55,5870.37,37315.16,225565297.5,6044.87 +11/13/17 0:00,5870.03,6775.75,5846,6525.17,27202.28,173971383.6,6395.47 +11/14/17 0:00,6524.69,6750,6466.88,6609,12072.05,79508390.54,6586.15 +11/15/17 0:00,6609,7350,6609,7294,16869.9,119171192.4,7064.13 +11/16/17 0:00,7294,7976.79,7120.85,7846.96,19272.37,145738327.5,7562.03 +11/17/17 0:00,7846.96,7997,7528.5,7674.99,17714.37,138124189.4,7797.3 +11/18/17 0:00,7675,7858,7431.54,7771.03,7326.81,56264967.21,7679.33 +11/19/17 0:00,7775.55,8087.35,7675,8016.58,8307.78,65332064.65,7863.96 +11/20/17 0:00,8016.58,8269.99,7900,8226.17,8179.46,66366007.81,8113.74 +11/21/17 0:00,8226.14,8354.46,7770,8095.23,13686.51,110811263.5,8096.38 +11/22/17 0:00,8095.19,8310.89,8045.76,8214.69,8078.58,66215711.71,8196.45 +11/23/17 0:00,8214.69,8279.76,7980,7989,7811.79,63644740.39,8147.26 +11/24/17 0:00,7988.96,8340,7876,8199.19,9289.99,75751868.75,8154.14 +11/25/17 0:00,8199.83,8737,8114.78,8717.99,11611.67,97628924.79,8407.83 +11/26/17 0:00,8718,9366.6,8538.2,9271.06,12021.22,108525815.5,9027.86 +11/27/17 0:00,9278.99,9721.7,9267,9708.07,13272.45,126458117.7,9527.86 +11/28/17 0:00,9708.06,9968,9582.25,9868.82,11214.93,110496755.9,9852.65 +11/29/17 0:00,9877.63,11395,9250,9824.68,33432.34,346949562.2,10377.66 +11/30/17 0:00,9833.7,10618.29,9000,9947.67,25433.46,247093850.8,9715.31 +12/1/17 0:00,9927.29,10949.89,9370.11,10840.45,16708.03,171881760.6,10287.37 +12/2/17 0:00,10840.45,11200,10637.69,10872,9267.16,101270084.4,10927.84 +12/3/17 0:00,10875.68,11800.01,10513.16,11250,14238.53,160176290.4,11249.5 +12/4/17 0:00,11250,11613.07,10850,11613.07,13621.48,154122917.9,11314.7 +12/5/17 0:00,11613.07,11850,11384.25,11677,11875.03,138370076.2,11652.18 +12/6/17 0:00,11676.99,13700,11659.8,13623.5,19784.87,250560790.3,12664.26 +12/7/17 0:00,13623,16615.62,13085.9,16599.99,25787.68,382694044.1,14840.19 +12/8/17 0:00,16599.99,16666.66,13482.42,15800,25473.4,389366035.1,15285.2 +12/9/17 0:00,15799.87,15998.5,12701.05,14607.49,16587.47,238909072.6,14402.98 +12/10/17 0:00,14601.01,15385,13011,14691,18487.98,263150668,14233.61 +12/11/17 0:00,14690.99,17270,14677.19,16470,16583.72,270203844.3,16293.32 +12/12/17 0:00,16470,17428.42,15967.29,16650.01,13517.89,227842348.7,16854.87 +12/13/17 0:00,16650.01,17107.03,15497.69,16250,17136.71,281640493.8,16434.93 +12/14/17 0:00,16245.02,16830.45,15852.69,16404.99,13409.52,219263192.5,16351.3 +12/15/17 0:00,16404.99,17934,16337.19,17471.5,18998.39,329337014.8,17335 +12/16/17 0:00,17477.98,19377,17269.99,19187.78,9761.22,179906034.6,18430.69 +12/17/17 0:00,19187.78,19666,18465,18953,9749.25,186310530.8,19110.24 +12/18/17 0:00,18953,19220,17835.2,18940.57,14678.94,273533539.4,18634.42 +12/19/17 0:00,18940.58,19160.79,16831.26,17700,21528.14,387206242.4,17986.05 +12/20/17 0:00,17700,17950,15343.04,16466.98,31172.23,521350550.6,16724.84 +12/21/17 0:00,16466.98,17281.17,15005,15600.01,20377.86,326730689.7,16033.61 +12/22/17 0:00,15600,15795.61,11159.93,14009.79,57444.89,772143020.6,13441.46 +12/23/17 0:00,13980,15756.22,13496.48,14619,21786.41,322120599.6,14785.39 +12/24/17 0:00,14619,14619.1,12488,14157.87,18519.49,250476423.6,13525.02 +12/25/17 0:00,14107.87,14650,13210,13911.28,11564.54,161347357.1,13951.9 +12/26/17 0:00,13925.5,16147.87,13746.95,15764.44,15051.16,230922569.2,15342.51 +12/27/17 0:00,15764.45,16480.52,14484,15364.93,15643.75,241860985.1,15460.55 +12/28/17 0:00,15390.05,15474.19,13500,14470.07,16557.22,234428578.5,14158.69 +12/29/17 0:00,14436.99,15111,13998,14340,13505.7,195727638.8,14492.22 +12/30/17 0:00,14351,14463.28,12050,12640,21749.67,285985550.3,13148.96 +12/31/17 0:00,12640,14296.06,12491.21,13880,11583.42,154552644.5,13342.58 +1/1/18 0:00,13880,13941.75,12801.38,13443.41,7688.03,102815718.5,13373.48 +1/2/18 0:00,13394.2,15257.53,12910.58,14678.94,16299.67,229138844.1,14057.88 +1/3/18 0:00,14670.96,15500,14546.28,15155.62,12275,183639413.7,14960.44 +1/4/18 0:00,15155.62,15430.27,14192.37,15143.67,15004.02,222160244.5,14806.72 +1/5/18 0:00,15143.67,17200,14810,16928,16248.91,259695892.9,15982.35 +1/6/18 0:00,16927.99,17234.99,16220,17149.67,9501.02,158389594.5,16670.8 +1/7/18 0:00,17142.43,17149.97,15707.16,16124.02,8632.81,141555094.2,16397.33 +1/8/18 0:00,16173.98,16300,13900,14999.99,16676.35,251877784.1,15103.89 +1/9/18 0:00,14999.99,15367.18,14123.97,14403.51,13913.52,204579121.6,14703.62 +1/10/18 0:00,14403.51,14900,13412,14890.02,18479.01,261210687,14135.53 +1/11/18 0:00,14899.99,14973.07,12800,13243.83,19630.08,266846190.8,13593.74 +1/12/18 0:00,13249.99,14152.19,12807.27,13781.41,13433.08,183399343.5,13652.81 +1/13/18 0:00,13829.28,14619.1,13789.42,14197.78,7488.99,106595650.1,14233.65 +1/14/18 0:00,14197.78,14365.81,13072.22,13647.99,7588.64,102783826.7,13544.44 +1/15/18 0:00,13647.99,14394.36,13429.25,13607.04,9444.64,131049852.4,13875.59 +1/16/18 0:00,13581.66,13607.04,10162,11386.34,38789.88,457725763.4,11800.13 +1/17/18 0:00,11393.97,11794.07,9222,11191.35,41356.19,433168120.1,10474.08 +1/18/18 0:00,11199,12146,10693,11247.57,22195.26,256082650,11537.72 +1/19/18 0:00,11290.9,12050.39,11025.18,11552,13203.26,151834406.4,11499.77 +1/20/18 0:00,11560.82,13052.12,11515.94,12775.99,10324.06,128912075.5,12486.57 +1/21/18 0:00,12782.99,12791.88,11100,11558.87,11596.44,137150604.6,11826.96 +1/22/18 0:00,11558.87,11910.78,10028.41,10808.99,17067.73,186028930.6,10899.45 +1/23/18 0:00,10810,11409.87,9927.54,10851.82,17250.18,184369293.7,10687.97 +1/24/18 0:00,10848.99,11500,10488.13,11400.96,11646.79,128825119.7,11061 +1/25/18 0:00,11400.98,11741.82,10868.57,11155.54,10212.92,115421975,11301.56 +1/26/18 0:00,11140.01,11635,10263.32,11092.95,15074.67,164020352.5,10880.53 +1/27/18 0:00,11093.74,11630.47,10815.84,11446.54,10309.81,116376809.5,11287.97 +1/28/18 0:00,11446.54,11989.15,11360.52,11685.58,9956.09,116531522.5,11704.54 +1/29/18 0:00,11685.58,11820.01,10991,11162.62,9996.36,112806531.8,11284.76 +1/30/18 0:00,11162.62,11222.36,9731.2,9971,21082.19,219169216.4,10395.94 +1/31/18 0:00,9971,10324,9514.96,10149,12743.51,126723437.3,9944.16 +2/1/18 0:00,10148.99,10187.56,8455,8998.99,26356.59,243067799.6,9222.28 +2/2/18 0:00,9010.87,9096.79,7625.25,8838.83,44406.02,373423805.1,8409.31 +2/3/18 0:00,8838.29,9491.2,8170.71,9225.86,16208.37,144713399.5,8928.31 +2/4/18 0:00,9225.31,9350.09,7825,8191,19110.67,162005632.6,8477.23 +2/5/18 0:00,8190.78,8335.56,6600,6874.27,46544.43,342210634.7,7352.34 +2/6/18 0:00,6878.65,8150,5920.72,7737.37,70961.37,487504446,6870 +2/7/18 0:00,7737.26,8649,7213.8,7588.01,32640.89,260674865.8,7986.14 +2/8/18 0:00,7588.01,8644.36,7565.5,8259.76,22746.39,187157997.7,8228.03 +2/9/18 0:00,8259.42,8779.62,7753.32,8693.98,18418.12,152040059.9,8254.92 +2/10/18 0:00,8693.98,9090.8,8170.86,8560,14670.56,127082570.7,8662.42 +2/11/18 0:00,8560,8560,7820,8067,12711.79,103542540.6,8145.4 +2/12/18 0:00,8077.25,8995,8067,8899,15071.04,130557481.6,8662.8 +2/13/18 0:00,8891.2,8951.89,8360.13,8522.99,11374.52,97689771.64,8588.47 +2/14/18 0:00,8504.57,9515,8504.57,9490.98,17468.74,158839393.3,9092.78 +2/15/18 0:00,9490.98,10234,9350,10018,21036.34,206814744.9,9831.31 +2/16/18 0:00,10011.3,10300,9707.51,10196,11857.64,118860367.7,10023.95 +2/17/18 0:00,10203.14,11135.83,10053.5,11101,14511.17,155314935.2,10703.13 +2/18/18 0:00,11101,11300,10153.15,10421.06,17623.08,188724919.3,10708.96 +2/19/18 0:00,10433.68,11262.48,10307.51,11173,11698.26,127802568.1,10924.92 +2/20/18 0:00,11159.12,11780,11080.37,11233.41,15880.91,182156478,11470.15 +2/21/18 0:00,11233.42,11275.74,10256,10449.4,19959.68,215353691.9,10789.44 +2/22/18 0:00,10446.79,10935,9731.2,9843.34,20204.69,206051152.4,10198.18 +2/23/18 0:00,9843.33,10405.3,9600,10166.1,16044.04,160782973.1,10021.35 +2/24/18 0:00,10135.2,10540.63,9373.48,9689.99,13972.71,137805304.5,9862.46 +2/25/18 0:00,9688.26,9883.41,9260,9590.04,11037.18,105367249.3,9546.58 +2/26/18 0:00,9595.99,10461.97,9376.34,10324.7,16156.81,162306362.4,10045.7 +2/27/18 0:00,10329.99,10850,10150,10566.3,10408.48,110086762.8,10576.64 +2/28/18 0:00,10572.49,11064.75,10255.07,10314.9,10490.75,111457734.8,10624.38 +3/1/18 0:00,10314.99,11090,10223.41,10903.13,9481.67,101712406.7,10727.27 +3/2/18 0:00,10917.37,11175,10774.01,11029.99,8329.1,91455982.5,10980.3 +3/3/18 0:00,11032.81,11503.24,11022.85,11445,7786.27,88241259.78,11332.93 +3/4/18 0:00,11445,11511,11054.91,11463.27,6831.63,77060624.28,11279.98 +3/5/18 0:00,11479.68,11688,11383.66,11419.24,9933.68,114638102.2,11540.35 +3/6/18 0:00,11417.39,11420.01,10560.19,10723.76,14734.42,161507885.7,10961.27 +3/7/18 0:00,10723.01,10911.78,9450,9913.03,26116.51,264099759.8,10112.37 +3/8/18 0:00,9904.52,10150,9078.95,9285.32,22522.43,217370120.9,9651.27 +3/9/18 0:00,9293.06,9420.39,8366,9230,29014.17,257069817.6,8860.15 +3/10/18 0:00,9228.83,9514.96,8697,8791.47,12886.59,118146982.5,9168.21 +3/11/18 0:00,8795.04,9768.37,8450,9535.04,16407.54,149758874.8,9127.44 +3/12/18 0:00,9535.04,9892,8742.07,9120.75,18751.02,175103380.1,9338.34 +3/13/18 0:00,9115.24,9482.79,8830,9142.32,16001.48,146461539.3,9153 +3/14/18 0:00,9152.07,9356.14,7948,8196.69,21191.02,182210730.9,8598.49 +3/15/18 0:00,8195.99,8425,7682,8265.05,18387.61,148610946.9,8082.12 +3/16/18 0:00,8265.05,8613.06,7914.08,8258.54,16498.62,137219222.8,8317.01 +3/17/18 0:00,8258.54,8356.4,7730.23,7860.83,12048.67,97294029.18,8075.09 +3/18/18 0:00,7860.83,8324.92,7325.37,8188.24,19547.36,150315447.6,7689.81 +3/19/18 0:00,8205.55,8718.74,8114.17,8596.93,19396.09,162448296.2,8375.31 +3/20/18 0:00,8596.79,9051,8313.01,8904.02,13454.82,116496171,8658.32 +3/21/18 0:00,8904.02,9188.1,8754.83,8893.79,12101,108594771.1,8974.03 +3/22/18 0:00,8892.18,9099.59,8503.52,8704.67,12587.63,109923828.1,8732.68 +3/23/18 0:00,8708.52,8920.79,8265,8920.79,13749.78,117134344.5,8518.99 +3/24/18 0:00,8917.99,9020,8505,8547,9731.98,85811618.32,8817.49 +3/25/18 0:00,8541.96,8680,8368.63,8453.9,9155.91,78013217.69,8520.53 +3/26/18 0:00,8451.12,8500,7831.15,8149.66,17693.42,145246518.5,8209.07 +3/27/18 0:00,8152.26,8211.62,7742.11,7791.7,12385.25,98488415.19,7952.07 +3/28/18 0:00,7791.69,8104.98,7723.03,8039.86,4732.51,37497616.99,7923.4 \ No newline at end of file diff --git a/data/btc-market-price.csv b/data/btc-market-price.csv new file mode 100644 index 0000000..4046108 --- /dev/null +++ b/data/btc-market-price.csv @@ -0,0 +1,365 @@ +2017-04-02 00:00:00,1099.169125 +2017-04-03 00:00:00,1141.813 +2017-04-04 00:00:00,1141.6003625 +2017-04-05 00:00:00,1133.0793142857142 +2017-04-06 00:00:00,1196.3079375 +2017-04-07 00:00:00,1190.45425 +2017-04-08 00:00:00,1181.1498375 +2017-04-09 00:00:00,1208.8005 +2017-04-10 00:00:00,1207.744875 +2017-04-11 00:00:00,1226.6170375 +2017-04-12 00:00:00,1218.92205 +2017-04-13 00:00:00,1180.0237125 +2017-04-14 00:00:00,1185.2600571428572 +2017-04-15 00:00:00,1184.8806714285713 +2017-04-16 00:00:00,1186.9274125 +2017-04-17 00:00:00,1205.634875 +2017-04-18 00:00:00,1216.1867428571427 +2017-04-19 00:00:00,1217.9300875 +2017-04-20 00:00:00,1241.6863250000001 +2017-04-21 00:00:00,1258.3614125 +2017-04-22 00:00:00,1261.311225 +2017-04-23 00:00:00,1257.9881125 +2017-04-24 00:00:00,1262.902775 +2017-04-25 00:00:00,1279.4146875000001 +2017-04-26 00:00:00,1309.109875 +2017-04-27 00:00:00,1345.3539125 +2017-04-28 00:00:00,1331.2944285714286 +2017-04-29 00:00:00,1334.9790375 +2017-04-30 00:00:00,1353.0045 +2017-05-01 00:00:00,1417.1728125 +2017-05-02 00:00:00,1452.0762875 +2017-05-03 00:00:00,1507.5768571428573 +2017-05-04 00:00:00,1508.292125 +2017-05-05 00:00:00,1533.3350714285714 +2017-05-06 00:00:00,1560.4102 +2017-05-07 00:00:00,1535.8684285714285 +2017-05-08 00:00:00,1640.619225 +2017-05-09 00:00:00,1721.2849714285715 +2017-05-10 00:00:00,1762.88625 +2017-05-11 00:00:00,1820.9905625 +2017-05-12 00:00:00,1720.4785 +2017-05-13 00:00:00,1771.9200125 +2017-05-14 00:00:00,1776.3165 +2017-05-15 00:00:00,1723.1269375 +2017-05-16 00:00:00,1739.031975 +2017-05-17 00:00:00,1807.4850625 +2017-05-18 00:00:00,1899.0828875 +2017-05-19 00:00:00,1961.5204875 +2017-05-20 00:00:00,2052.9097875 +2017-05-21 00:00:00,2046.5344625 +2017-05-22 00:00:00,2090.6623125 +2017-05-23 00:00:00,2287.7102875 +2017-05-24 00:00:00,2379.1938333333333 +2017-05-25 00:00:00,2387.2062857142855 +2017-05-26 00:00:00,2211.976857142857 +2017-05-27 00:00:00,2014.0529625 +2017-05-28 00:00:00,2192.9808 +2017-05-29 00:00:00,2275.9307 +2017-05-30 00:00:00,2239.2053428571426 +2017-05-31 00:00:00,2285.9339142857143 +2017-06-01 00:00:00,2399.2426714285716 +2017-06-02 00:00:00,2446.142414285714 +2017-06-03 00:00:00,2525.7651584699997 +2017-06-04 00:00:00,2516.173142857143 +2017-06-05 00:00:00,2698.3138125 +2017-06-06 00:00:00,2883.3136966371426 +2017-06-07 00:00:00,2664.9208625 +2017-06-08 00:00:00,2792.9991875 +2017-06-09 00:00:00,2827.4913 +2017-06-10 00:00:00,2845.3728571428574 +2017-06-11 00:00:00,2961.8296124999997 +2017-06-12 00:00:00,2657.6750625 +2017-06-13 00:00:00,2748.185085714286 +2017-06-14 00:00:00,2447.0415625 +2017-06-15 00:00:00,2442.48025 +2017-06-16 00:00:00,2464.9598142857144 +2017-06-17 00:00:00,2665.927 +2017-06-18 00:00:00,2507.389252144286 +2017-06-19 00:00:00,2617.2102625 +2017-06-20 00:00:00,2754.97825 +2017-06-21 00:00:00,2671.04325 +2017-06-22 00:00:00,2727.2880125 +2017-06-23 00:00:00,2710.4122857142856 +2017-06-24 00:00:00,2589.1648875 +2017-06-25 00:00:00,2512.3662857142854 +2017-06-26 00:00:00,2436.4510571428573 +2017-06-27 00:00:00,2517.9031142857143 +2017-06-28 00:00:00,2585.349185714286 +2017-06-29 00:00:00,2544.414475 +2017-06-30 00:00:00,2477.641375 +2017-07-01 00:00:00,2434.0778625 +2017-07-02 00:00:00,2501.191342857143 +2017-07-03 00:00:00,2561.225428571429 +2017-07-04 00:00:00,2599.7298375 +2017-07-05 00:00:00,2619.1875030042856 +2017-07-06 00:00:00,2609.96775 +2017-07-07 00:00:00,2491.201214285714 +2017-07-08 00:00:00,2562.1306624999997 +2017-07-09 00:00:00,2536.2389375 +2017-07-10 00:00:00,2366.1701428571428 +2017-07-11 00:00:00,2369.8621285714285 +2017-07-12 00:00:00,2385.7485714285717 +2017-07-13 00:00:00,2354.7834166666667 +2017-07-14 00:00:00,2190.947833333333 +2017-07-15 00:00:00,2058.9955999999997 +2017-07-16 00:00:00,1931.2143 +2017-07-17 00:00:00,2176.6234875 +2017-07-18 00:00:00,2320.12225 +2017-07-19 00:00:00,2264.7657 +2017-07-20 00:00:00,2898.1884166666664 +2017-07-21 00:00:00,2682.1953625 +2017-07-22 00:00:00,2807.609857142857 +2017-07-23 00:00:00,2725.549716666667 +2017-07-24 00:00:00,2751.821028571429 +2017-07-25 00:00:00,2560.9979166666667 +2017-07-26 00:00:00,2495.028585714286 +2017-07-27 00:00:00,2647.625 +2017-07-28 00:00:00,2781.636583333333 +2017-07-29 00:00:00,2722.512785714286 +2017-07-30 00:00:00,2745.955416666666 +2017-07-31 00:00:00,2866.431666666667 +2017-08-01 00:00:00,2710.4130666666665 +2017-08-02 00:00:00,2693.6339833333336 +2017-08-03 00:00:00,2794.117716666666 +2017-08-04 00:00:00,2873.8510833333335 +2017-08-05 00:00:00,3218.1150166666666 +2017-08-06 00:00:00,3252.5625333333332 +2017-08-07 00:00:00,3407.2268333333336 +2017-08-08 00:00:00,3457.374333333333 +2017-08-09 00:00:00,3357.326316666667 +2017-08-10 00:00:00,3424.4042000000004 +2017-08-11 00:00:00,3632.5066666666667 +2017-08-12 00:00:00,3852.8029142857145 +2017-08-13 00:00:00,4125.54802 +2017-08-14 00:00:00,4282.992 +2017-08-15 00:00:00,4217.028328571429 +2017-08-16 00:00:00,4360.876871428572 +2017-08-17 00:00:00,4328.725716666667 +2017-08-18 00:00:00,4130.440066666667 +2017-08-19 00:00:00,4222.662214285714 +2017-08-20 00:00:00,4157.958033333333 +2017-08-21 00:00:00,4043.722 +2017-08-22 00:00:00,4082.180983333333 +2017-08-23 00:00:00,4174.95 +2017-08-24 00:00:00,4340.316716666667 +2017-08-25 00:00:00,4363.05445 +2017-08-26 00:00:00,4360.5133166666665 +2017-08-27 00:00:00,4354.308333333333 +2017-08-28 00:00:00,4391.673516666667 +2017-08-29 00:00:00,4607.98545 +2017-08-30 00:00:00,4594.98785 +2017-08-31 00:00:00,4748.255 +2017-09-01 00:00:00,4911.740016666667 +2017-09-02 00:00:00,4580.387479999999 +2017-09-03 00:00:00,4648.159983333334 +2017-09-04 00:00:00,4344.0983166666665 +2017-09-05 00:00:00,4488.72014 +2017-09-06 00:00:00,4641.822016666666 +2017-09-07 00:00:00,4654.6585000000005 +2017-09-08 00:00:00,4310.750183333334 +2017-09-09 00:00:00,4375.55952 +2017-09-10 00:00:00,4329.955 +2017-09-11 00:00:00,4248.090016666666 +2017-09-12 00:00:00,4219.036616666667 +2017-09-13 00:00:00,3961.2712666666666 +2017-09-14 00:00:00,3319.6299999999997 +2017-09-15 00:00:00,3774.2652833333336 +2017-09-16 00:00:00,3763.62604 +2017-09-17 00:00:00,3746.060783333333 +2017-09-18 00:00:00,4093.316666666667 +2017-09-19 00:00:00,3943.4133333333334 +2017-09-20 00:00:00,3977.5616666666665 +2017-09-21 00:00:00,3658.8981833333332 +2017-09-22 00:00:00,3637.5025499999997 +2017-09-23 00:00:00,3776.3869 +2017-09-24 00:00:00,3703.0406500000004 +2017-09-25 00:00:00,3942.5550000000003 +2017-09-26 00:00:00,3910.3073833333333 +2017-09-27 00:00:00,4202.554983333333 +2017-09-28 00:00:00,4201.98905 +2017-09-29 00:00:00,4193.574666666666 +2017-09-30 00:00:00,4335.368316666667 +2017-10-01 00:00:00,4360.722966666667 +2017-10-02 00:00:00,4386.88375 +2017-10-03 00:00:00,4293.3066 +2017-10-04 00:00:00,4225.175 +2017-10-05 00:00:00,4338.852 +2017-10-06 00:00:00,4345.6033333333335 +2017-10-07 00:00:00,4376.191666666667 +2017-10-08 00:00:00,4602.280883333334 +2017-10-09 00:00:00,4777.967816666666 +2017-10-10 00:00:00,4782.28 +2017-10-11 00:00:00,4819.485766666667 +2017-10-12 00:00:00,5325.130683333333 +2017-10-13 00:00:00,5563.806566666666 +2017-10-14 00:00:00,5739.438733333333 +2017-10-15 00:00:00,5647.311666666667 +2017-10-16 00:00:00,5711.205866666667 +2017-10-17 00:00:00,5603.71294 +2017-10-18 00:00:00,5546.176100000001 +2017-10-19 00:00:00,5727.6335 +2017-10-20 00:00:00,5979.45984 +2017-10-21 00:00:00,6020.371683333334 +2017-10-22 00:00:00,5983.184550000001 +2017-10-23 00:00:00,5876.079866666667 +2017-10-24 00:00:00,5505.827766666666 +2017-10-25 00:00:00,5669.622533333334 +2017-10-26 00:00:00,5893.138416666666 +2017-10-27 00:00:00,5772.504983333333 +2017-10-28 00:00:00,5776.6969500000005 +2017-10-29 00:00:00,6155.43402 +2017-10-30 00:00:00,6105.87422 +2017-10-31 00:00:00,6388.645166666666 +2017-11-01 00:00:00,6665.306683333333 +2017-11-02 00:00:00,7068.020100000001 +2017-11-03 00:00:00,7197.72006 +2017-11-04 00:00:00,7437.543316666666 +2017-11-05 00:00:00,7377.012366666667 +2017-11-06 00:00:00,6989.071666666667 +2017-11-07 00:00:00,7092.127233333333 +2017-11-08 00:00:00,7415.878250000001 +2017-11-09 00:00:00,7158.03706 +2017-11-10 00:00:00,6719.39785 +2017-11-11 00:00:00,6362.851033333333 +2017-11-12 00:00:00,5716.301583333334 +2017-11-13 00:00:00,6550.227533333334 +2017-11-14 00:00:00,6635.412633333333 +2017-11-15 00:00:00,7301.42992 +2017-11-16 00:00:00,7815.0307 +2017-11-17 00:00:00,7786.884366666666 +2017-11-18 00:00:00,7817.1403833333325 +2017-11-19 00:00:00,8007.654066666667 +2017-11-20 00:00:00,8255.596816666666 +2017-11-21 00:00:00,8059.8 +2017-11-22 00:00:00,8268.035 +2017-11-23 00:00:00,8148.95 +2017-11-24 00:00:00,8250.978333333334 +2017-11-25 00:00:00,8707.407266666667 +2017-11-26 00:00:00,9284.1438 +2017-11-27 00:00:00,9718.29505 +2017-11-28 00:00:00,9952.50882 +2017-11-29 00:00:00,9879.328333333333 +2017-11-30 00:00:00,10147.372 +2017-12-01 00:00:00,10883.912 +2017-12-02 00:00:00,11071.368333333332 +2017-12-03 00:00:00,11332.622 +2017-12-04 00:00:00,11584.83 +2017-12-05 00:00:00,11878.433333333334 +2017-12-06 00:00:00,13540.980000000001 +2017-12-07 00:00:00,16501.971666666668 +2017-12-08 00:00:00,16007.436666666666 +2017-12-09 00:00:00,15142.834152123332 +2017-12-10 00:00:00,14869.805 +2017-12-11 00:00:00,16762.116666666665 +2017-12-12 00:00:00,17276.393333333333 +2017-12-13 00:00:00,16808.366666666665 +2017-12-14 00:00:00,16678.892 +2017-12-15 00:00:00,17771.899999999998 +2017-12-16 00:00:00,19498.683333333334 +2017-12-17 00:00:00,19289.785 +2017-12-18 00:00:00,18961.856666666667 +2017-12-19 00:00:00,17737.111666666668 +2017-12-20 00:00:00,16026.271666666667 +2017-12-21 00:00:00,16047.51 +2017-12-22 00:00:00,15190.945 +2017-12-23 00:00:00,15360.261666666667 +2017-12-24 00:00:00,13949.175000000001 +2017-12-25 00:00:00,14119.028333333334 +2017-12-26 00:00:00,15999.048333333332 +2017-12-27 00:00:00,15589.321666666665 +2017-12-28 00:00:00,14380.581666666667 +2017-12-29 00:00:00,14640.14 +2017-12-30 00:00:00,13215.573999999999 +2017-12-31 00:00:00,14165.574999999999 +2018-01-01 00:00:00,13812.186666666666 +2018-01-02 00:00:00,15005.856666666667 +2018-01-03 00:00:00,15053.261666666665 +2018-01-04 00:00:00,15199.355000000001 +2018-01-05 00:00:00,17174.12 +2018-01-06 00:00:00,17319.198 +2018-01-07 00:00:00,16651.471666666668 +2018-01-08 00:00:00,15265.906666666668 +2018-01-09 00:00:00,14714.253333333334 +2018-01-10 00:00:00,15126.398333333333 +2018-01-11 00:00:00,13296.794 +2018-01-12 00:00:00,13912.882000000001 +2018-01-13 00:00:00,14499.773333333333 +2018-01-14 00:00:00,13852.92 +2018-01-15 00:00:00,14012.196 +2018-01-16 00:00:00,11180.998333333331 +2018-01-17 00:00:00,11116.946666666669 +2018-01-18 00:00:00,11345.423333333332 +2018-01-19 00:00:00,11422.44 +2018-01-20 00:00:00,12950.793333333333 +2018-01-21 00:00:00,11505.228 +2018-01-22 00:00:00,10544.593333333332 +2018-01-23 00:00:00,11223.064 +2018-01-24 00:00:00,11282.258333333333 +2018-01-25 00:00:00,11214.44 +2018-01-26 00:00:00,10969.815 +2018-01-27 00:00:00,11524.776666666667 +2018-01-28 00:00:00,11765.71 +2018-01-29 00:00:00,11212.654999999999 +2018-01-30 00:00:00,10184.061666666666 +2018-01-31 00:00:00,10125.013333333334 +2018-02-01 00:00:00,9083.258333333333 +2018-02-02 00:00:00,8901.901666666667 +2018-02-03 00:00:00,9076.678333333333 +2018-02-04 00:00:00,8400.648333333333 +2018-02-05 00:00:00,6838.816666666667 +2018-02-06 00:00:00,7685.633333333334 +2018-02-07 00:00:00,8099.958333333333 +2018-02-08 00:00:00,8240.536666666667 +2018-02-09 00:00:00,8535.516666666668 +2018-02-10 00:00:00,8319.876566184 +2018-02-11 00:00:00,8343.455 +2018-02-12 00:00:00,8811.343333333332 +2018-02-13 00:00:00,8597.7675 +2018-02-14 00:00:00,9334.633333333333 +2018-02-15 00:00:00,9977.154 +2018-02-16 00:00:00,10127.161666666667 +2018-02-17 00:00:00,10841.991666666667 +2018-02-18 00:00:00,10503.298333333334 +2018-02-19 00:00:00,11110.964999999998 +2018-02-20 00:00:00,11390.391666666668 +2018-02-21 00:00:00,10532.791666666666 +2018-02-22 00:00:00,9931.071666666667 +2018-02-23 00:00:00,10162.116666666667 +2018-02-24 00:00:00,9697.956 +2018-02-25 00:00:00,9696.593333333332 +2018-02-26 00:00:00,10348.603333333334 +2018-02-27 00:00:00,10763.883333333333 +2018-02-28 00:00:00,10370.164999999999 +2018-03-01 00:00:00,11009.381666666668 +2018-03-02 00:00:00,11055.815 +2018-03-03 00:00:00,11326.948333333334 +2018-03-04 00:00:00,11430.181666666665 +2018-03-05 00:00:00,11595.54 +2018-03-06 00:00:00,10763.198333333334 +2018-03-07 00:00:00,10118.058 +2018-03-08 00:00:00,9429.111666666666 +2018-03-09 00:00:00,9089.278333333334 +2018-03-10 00:00:00,8746.002 +2018-03-11 00:00:00,9761.396666666666 +2018-03-12 00:00:00,9182.843333333332 +2018-03-13 00:00:00,9154.699999999999 +2018-03-14 00:00:00,8151.531666666667 +2018-03-15 00:00:00,8358.121666666666 +2018-03-16 00:00:00,8530.402 +2018-03-17 00:00:00,7993.674643641666 +2018-03-18 00:00:00,8171.415 +2018-03-19 00:00:00,8412.033333333333 +2018-03-20 00:00:00,8986.948333333334 +2018-03-21 00:00:00,8947.753333333334 +2018-03-22 00:00:00,8690.408333333333 +2018-03-23 00:00:00,8686.826666666666 +2018-03-24 00:00:00,8662.378333333334 +2018-03-25 00:00:00,8617.296666666667 +2018-03-26 00:00:00,8197.548333333334 +2018-03-27 00:00:00,7876.195 +2018-03-28 00:00:00,7960.38 +2018-03-29 00:00:00,7172.28 +2018-03-30 00:00:00,6882.531666666667 +2018-03-31 00:00:00,6935.48 +2018-04-01 00:00:00,6794.105 diff --git a/pandas/Lecture.ipynb b/pandas/Lecture.ipynb new file mode 100644 index 0000000..9c4f728 --- /dev/null +++ b/pandas/Lecture.ipynb @@ -0,0 +1,1085 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![rmotr](https://user-images.githubusercontent.com/7065401/52071918-bda15380-2562-11e9-828c-7f95297e4a82.png)\n", + "
\n", + "\n", + "\n", + "\n", + "# What is Pandas?\n", + "\n", + "`pandas` is an open source, BSD-licensed library providing high-performance, easy-to-use data structures and data analysis tools for the Python programming language.\n", + "\n", + "**The pandas package is probably the most important tool for Data Scientists and Analysts working with Python today**. The powerful machine learning and glamorous visualization tools may get all the attention, but pandas is the backbone of most data-related projects.\n", + "\n", + "> **Fun fact 🎁**: `pandas` is derived from the term \"panel data\", an econometrics term for data sets that include observations over multiple time periods for the same individuals. — Wikipedia\n", + "\n", + "pandas popularity has **grown exponentially** in the last years. Here's an image of The Atlas showing popularity of data science tools on Stack Overflow where we see pandas has become the dominating tools used by Python data scientists.\n", + "\n", + "
\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)\n", + "\n", + "## What is pandas used for?\n", + "\n", + "If you're thinking about data science as a career, then it is imperative that one of the first things you do is learn pandas.\n", + "\n", + "> **This tool will help you get, clean, transform and analyze your data**.\n", + "\n", + "For example, say you want to explore a dataset stored in a CSV on your computer. The first step is to use pandas to extract the data from that CSV into a DataFrame (a table-like data structure, we'll see more about it later). The we proceed with the routine data analysis tasks:\n", + "\n", + "- Quick Exploratory Data Analysis (EDA);\n", + "- Calculate statistics such as average, median, max, or min of each column;\n", + "- Creating visualizations. Plot bars, lines, histograms, bubbles, and more;\n", + "- Cleaning the data by doing things like removing missing values and filtering rows or columns by some criteria;\n", + "- Building machine learning models to create predictions or classifications\n", + "- Store the cleaned, transformed data back into a CSV, other file or a database;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)\n", + "\n", + "## Why no just using Excel?\n", + "\n", + "Excel is one of the most popular and widely-used data tools; it's hard to find an organization that doesn't work with it in some way. From analysts, to sales VPs, to CEOs, professionals use Excel for both quick stats and accounting and serious data crunching.\n", + "\n", + "> Using pandas with Microsoft Excel can give you the best of both worlds and optimize your workflow.\n", + "\n", + "Pandas works with data stored in Python to manipulate and analyze data. As opposed to Excel, Python is completely **free to download and use**.\n", + "\n", + "Pandas operates right on the back of Python. As a result, is **extremely fast and efficient** by using useful methods that **allow automating data processing tasks better than what Excel does**, including processing Excel files.\n", + "\n", + "In Excel, once you exceed 50K rows, it starts to slow down considerably. Pandas, on the other hand, **has no real limit and handles millions of data points seamlessly**. In terms of pure space, Excel caps a single spreadsheet at 1.048.576 rows exactly. At that point, your calculations would take forever to compute. More likely, Excel would just crash. A million rows may seem like a lot of data, but for data scientists, this is but a drop in the bucket.\n", + "\n", + "Pandas, however, has no limitation to the number of data points you can have in a `DataFrame` (their version of a data set). It’s limited only by the amount of memory (RAM) of the computer it is running on.\n", + "\n", + "It is also **easier to create and use complex equations and calculations on your data**. You can apply hundreds of computations to millions of data points instantly with pandas. Since Python is open source, there are already hundreds of libraries created that could streamline the length of time it takes to calculate." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## Hands on!\n", + "\n", + "We'll just import pandas and other useful libraries such as numpy, matplotlib and seaborn to work with.\n", + "\n", + "Note that to import pandas and numpy we use the aliases `pd` and `np`. This is just a convention, which means it's not strictly necessary, but it is recommended." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAABICAYAAABGH6SaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAACWUlEQVR4nO3bvWoUYRiG4XdUgiSNhRGRgCDYBAUhgofhWSyCpZWFlWfhCQjaeQb2WgREEPypBFGJaCoFGQtthJBlH/Lx7QzX1S07xfMWyw0TMozjWADAak71HgAAUySgABAQUAAICCgABAQUAAICCgCBM8seGIZhUVWLqqphY3Pv7PaV5qN62T382HtCW5d6D2jr9emN3hOa2T342XtCUy/PXew9oam9b796T2jqYGtpSibry+dPdfjj+3DUd8Mq/we6uXN9vHr32YkNWzf7z+/3ntDU+LD3grZubO30ntDM/pN3vSc0Ndye92/v99MPvSc09fjWhd4Tmnlw7069f/vmyIB6hQsAAQEFgICAAkBAQAEgIKAAEBBQAAgIKAAEBBQAAgIKAAEBBYCAgAJAQEABICCgABAQUAAICCgABAQUAAICCgABAQWAgIACQEBAASAgoAAQEFAACAgoAAQEFAACAgoAAQEFgICAAkBAQAEgIKAAEBBQAAgIKAAEBBQAAgIKAAEBBYCAgAJAQEABICCgABAQUAAICCgABAQUAAICCgABAQWAgIACQEBAASAgoAAQEFAACAgoAAQEFAACAgoAAQEFgICAAkBAQAEgMIzjePwDw7CoqsW/j9eq6lXrUR2dr6qvvUc0Mufbqtw3de6brjnfVlV1eRzH7aO+WBrQ/x4ehhfjON48sVlrZs73zfm2KvdNnfuma863LeMVLgAEBBQAAqsG9FGTFetjzvfN+bYq902d+6Zrzrcda6W/gQIAf3mFCwABAQWAgIACQEBAASAgoAAQ+AOXfmFPuMDVZwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from utils import apply_theme\n", + "\n", + "%matplotlib inline\n", + "apply_theme()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## NumPy and pandas\n", + "\n", + "**Pandas is built on top of the NumPy package**, which means that all the efficient structures and functions we saw about numpy in previous lessons, will also apply to pandas.\n", + "\n", + "While pandas adopts many coding idioms from NumPy, the biggest difference is that pandas is designed to work with tabular or heterogeneous data. NumPy, by contrast, is best suited for working with homogeneous numerical (possibly multidimensional) arrays." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview Data Structures - Series and Dataframe\n", + "\n", + "To get started with pandas, you will need to get comfortable with its two main data structures: `Series` and `DataFrame`s.\n", + "\n", + "A `Series` is essentially used for column-data, and a `DataFrame` is a multi-dimensional table made up of a collection of `Series`. Pandas relies on NumPy arrays to store this data, which means it also uses its data types.\n", + "\n", + "\n", + "\n", + "`DataFrame`s and `Series` are quite similar in that many operations that you can do with one you can do with the other, such as filling in null values and calculating the mean.\n", + "\n", + "Let's define some data within Python lists:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "names = ['Avery Bradley', 'John Holland', 'Jonas Jerebko',\n", + " 'Jordan Mickey', 'Terry Rozier', 'Jared Sullinger', 'Evan Turner']\n", + "\n", + "teams = ['Boston Celtics', 'Boston Celtics', 'Boston Celtics',\n", + " 'Boston Celtics', 'Boston Celtics', 'Boston Celtics', 'Boston Celtics']\n", + "\n", + "numbers = [0, 30, 8, np.nan, 12, 7, 11]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Avery Bradley',\n", + " 'John Holland',\n", + " 'Jonas Jerebko',\n", + " 'Jordan Mickey',\n", + " 'Terry Rozier',\n", + " 'Jared Sullinger',\n", + " 'Evan Turner']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "names" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Boston Celtics',\n", + " 'Boston Celtics',\n", + " 'Boston Celtics',\n", + " 'Boston Celtics',\n", + " 'Boston Celtics',\n", + " 'Boston Celtics',\n", + " 'Boston Celtics']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "teams" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 30, 8, nan, 12, 7, 11]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Series creation" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Name
0Avery Bradley
1John Holland
2Jonas Jerebko
3Jordan Mickey
4Terry Rozier
5Jared Sullinger
6Evan Turner
\n", + "
" + ], + "text/plain": [ + " Name\n", + "0 Avery Bradley\n", + "1 John Holland\n", + "2 Jonas Jerebko\n", + "3 Jordan Mickey\n", + "4 Terry Rozier\n", + "5 Jared Sullinger\n", + "6 Evan Turner" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series = pd.Series(names, name='Name')\n", + "\n", + "my_series.to_frame()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each value can be accessed using just its key/index position on Series:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Jordan Mickey'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series[3]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Jordan Mickey'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series.loc[3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### DataFrame creation\n", + "\n", + "There are many ways to create a `DataFrame` from scratch, but a great option is to just use a simple `dict`." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "data = {\n", + " 'Name': names,\n", + " 'Team': teams,\n", + " 'Number': numbers\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
NameTeamNumber
0Avery BradleyBoston Celtics0.000
1John HollandBoston Celtics30.000
2Jonas JerebkoBoston Celtics8.000
3Jordan MickeyBoston Celticsnan
4Terry RozierBoston Celtics12.000
5Jared SullingerBoston Celtics7.000
6Evan TurnerBoston Celtics11.000
\n", + "
" + ], + "text/plain": [ + " Name Team Number\n", + "0 Avery Bradley Boston Celtics 0.000\n", + "1 John Holland Boston Celtics 30.000\n", + "2 Jonas Jerebko Boston Celtics 8.000\n", + "3 Jordan Mickey Boston Celtics nan\n", + "4 Terry Rozier Boston Celtics 12.000\n", + "5 Jared Sullinger Boston Celtics 7.000\n", + "6 Evan Turner Boston Celtics 11.000" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_df = pd.DataFrame(data)\n", + "\n", + "my_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each value can be accessed using its key/index position and value position on DataFrames:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 Avery Bradley\n", + "1 John Holland\n", + "2 Jonas Jerebko\n", + "3 Jordan Mickey\n", + "4 Terry Rozier\n", + "5 Jared Sullinger\n", + "6 Evan Turner\n", + "Name: Name, dtype: object" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_df['Name']" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Jordan Mickey'" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_df['Name'][3]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Jordan Mickey'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_df.loc[3, 'Name']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> In future lectures we'll see more on locating and extracting data from the DataFrame, don't worry if you don't get it right not.\n", + "\n", + "Let's move on to some quick methods for creating DataFrames from various other sources." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## Reading external data\n", + "\n", + "pandas allow us to read different types of external data files such as CSV, TXT and XLS.\n", + "\n", + "With CSV files all you need is a single line to load in the data:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TimestampOpenHighLowCloseVolume (BTC)Volume (Currency)Weighted Price
01/1/17 0:00966.3401,005.000960.530997.7506,850.5906,764,742.060987.470
11/2/17 0:00997.7501,032.000990.0101,012.5408,167.3808,273,576.9901,013.000
21/3/17 0:001,011.4401,039.000999.9901,035.2409,089.6609,276,500.3101,020.560
31/4/17 0:001,035.5101,139.8901,028.5601,114.92021,562.46023,469,644.9601,088.450
41/5/17 0:001,114.3801,136.720885.4101,004.74036,018.86036,211,399.5301,005.350
\n", + "
" + ], + "text/plain": [ + " Timestamp Open High Low Close Volume (BTC) Volume (Currency) Weighted Price\n", + "0 1/1/17 0:00 966.340 1,005.000 960.530 997.750 6,850.590 6,764,742.060 987.470\n", + "1 1/2/17 0:00 997.750 1,032.000 990.010 1,012.540 8,167.380 8,273,576.990 1,013.000\n", + "2 1/3/17 0:00 1,011.440 1,039.000 999.990 1,035.240 9,089.660 9,276,500.310 1,020.560\n", + "3 1/4/17 0:00 1,035.510 1,139.890 1,028.560 1,114.920 21,562.460 23,469,644.960 1,088.450\n", + "4 1/5/17 0:00 1,114.380 1,136.720 885.410 1,004.740 36,018.860 36,211,399.530 1,005.350" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('../data/bitcoin_data.csv')\n", + "\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Also, there are many options when loading data, for example CSVs don't have indexes like our DataFrames, so we'll designate the `index_col` when reading:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OpenHighLowClose
Timestamp
2017-01-01966.3401,005.000960.530997.750
2017-01-02997.7501,032.000990.0101,012.540
2017-01-031,011.4401,039.000999.9901,035.240
2017-01-041,035.5101,139.8901,028.5601,114.920
2017-01-051,114.3801,136.720885.4101,004.740
\n", + "
" + ], + "text/plain": [ + " Open High Low Close\n", + "Timestamp \n", + "2017-01-01 966.340 1,005.000 960.530 997.750\n", + "2017-01-02 997.750 1,032.000 990.010 1,012.540\n", + "2017-01-03 1,011.440 1,039.000 999.990 1,035.240\n", + "2017-01-04 1,035.510 1,139.890 1,028.560 1,114.920\n", + "2017-01-05 1,114.380 1,136.720 885.410 1,004.740" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv(\n", + " '../data/bitcoin_data.csv',\n", + " index_col=0,\n", + " parse_dates=True\n", + ").loc[:, 'Open':'Close']\n", + "\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Bitcoin price (USD)')" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "dark" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(16, 6))\n", + "\n", + "df.plot(ax=ax)\n", + "\n", + "plt.title(\"Bitcoin price (USD)\", fontsize=16, fontweight='bold', color='white')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## Plotting example: Bollinger bands\n", + "\n", + "As a sneak peek of what we'll see in upcoming lectures, lets make some basic plots using _pandas_.\n", + "\n", + "Bollinger Bands are a technical trading tool created by John Bollinger in the early 1980s. They arose from the need for adaptive trading bands and the observation that volatility was dynamic, not static as was widely believed at the time." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Calculate Bollinger bands\n", + "\n", + "To demostrate the strategy we will use a 30 periods rolling mean window, and 1.5 standard deviations for each of the bands. This might not be the optimal configuration for this dataset, but we will talk more about optimizing these two arguments later." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# set number of days and standard deviations to use for rolling \n", + "# lookback period for Bollinger band calculation\n", + "window = 30\n", + "no_of_std = 1.5\n", + "\n", + "# calculate rolling mean and standard deviation\n", + "rolling_mean = df['Close'].rolling(window).mean()\n", + "rolling_std = df['Close'].rolling(window).std()\n", + "\n", + "# create two new DataFrame columns to hold values of upper and lower Bollinger bands\n", + "df['Rolling Mean'] = rolling_mean\n", + "df['Bollinger High'] = rolling_mean + (rolling_std * no_of_std)\n", + "df['Bollinger Low'] = rolling_mean - (rolling_std * no_of_std)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OpenHighLowCloseRolling MeanBollinger HighBollinger Low
Timestamp
2018-03-248,917.9909,020.0008,505.0008,547.0009,533.03011,150.4067,915.654
2018-03-258,541.9608,680.0008,368.6308,453.9009,475.95711,109.2297,842.684
2018-03-268,451.1208,500.0007,831.1508,149.6609,424.61211,096.2487,752.976
2018-03-278,152.2608,211.6207,742.1107,791.7009,364.66811,094.0487,635.287
2018-03-287,791.6908,104.9807,723.0308,039.8609,288.50611,032.6167,544.396
\n", + "
" + ], + "text/plain": [ + " Open High Low Close Rolling Mean Bollinger High Bollinger Low\n", + "Timestamp \n", + "2018-03-24 8,917.990 9,020.000 8,505.000 8,547.000 9,533.030 11,150.406 7,915.654\n", + "2018-03-25 8,541.960 8,680.000 8,368.630 8,453.900 9,475.957 11,109.229 7,842.684\n", + "2018-03-26 8,451.120 8,500.000 7,831.150 8,149.660 9,424.612 11,096.248 7,752.976\n", + "2018-03-27 8,152.260 8,211.620 7,742.110 7,791.700 9,364.668 11,094.048 7,635.287\n", + "2018-03-28 7,791.690 8,104.980 7,723.030 8,039.860 9,288.506 11,032.616 7,544.396" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Bitcoin - Bollinger bands (USD)')" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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OXPmKGDNsWQyybPPPsucOXOG/R4FrSIiIiIi8oFgWZYC1kkgmUyOqDx7WLMHi4iIiIiIyPiYPXs2n/zkJ/H7/QSDQd544w02b97MEUccwa233prr7k06ClpFRERERET2kLy8PM4991x+97vf0dDQgGVZnHfeebS1teW6a5OWglYREREREZE95IADDmDz5s00NJgVP13X5bbbbmPvvfdm0aJFACxfvpxjjz2WRCJBfX09d911F+Xl5Zxzzjkkk0k8Hg+33norLS0tnHrqqSxcuBCPx8MTTzzBhg0bcnl5E0JBq4iIiIiIfOBYe38Ma5E9rsd0tzi47z4+aJvi4mIaGxt7bYvFYiQSCQDy8/M5+eSTufrqq4lGo5x++umsWLEC13XZvn079913HwsXLiQvL4/99tuPsrIyrr/+enw+H5deeilvvfUWXV1d43pduaaJmERERERERPaQ5uZmZsyY0WtbWVlZd5a1vLyc2tpaotEoAFu2bGH27Nm88MILRCIRLrjgAo4++mhSqRRz585l/vz5rFq1igsuuACv10tZWdkev6aJpkyriIiIiMgEsvY/A7dpC+x6JdddkSzuu48PmRWdCK+99honnngizzzzDI2NjXg8Hk477TTefvttAJqampg9ezaBQIBYLMaiRYuor69n6dKlbNmyhYcffpiDDz6Y448/nldffZXNmzdz1113YVkWJ5100m5Z3OlAQauIiIiIyASyDvwcVrSN1H0XQCqR6+5IjkWjUW6//XbOPvtsLMsiGAzy2muvsWvXLhYuXEhHRwcPPfQQF110Ea7r0tDQwP33309JSQmf+9znupeLuffee9mxYwf77LMPF198MYFAgFdffbU7QzudKGgVEREREZkoHj+WLw98eViLV+K+9ddc90gmgR07dnDDDTfstn3z5s0ArFu3jnXr1vXa19jYyPXXX7/be+69996J6eQkoqBVRERERGSiBAoBcFNJrA+fhbvFgcTuk+TkWx4uKJ5JieUl7CbZkYjzTiLK+mgnCdw93WuRSUVBq4iIiIjIRAkWAeC+dT+e/U/Dc+ovIVxD6tU7oP51APbyBbi2fAF7+4I0pRIUe7wELTNfak0ixm/DDdzT0Uxcwat8QCloFRERERGZKJmgdedaUuEdWJXLYN5hWNXH4ta/ToXHx20zF5ICzm/YyovRDgAqvT6W+kOcV1TB90vncl5RBb9s28WuZIJyj5emVJLtiRi1yXjurk1kD1HQKiIiIiIyUQImaCUaxq3dgLvpITynXIcVKsMFvjtjDiGPh7N2beGdRM8EOruSCXYlwzzaFeaIYAHfLJnNf5XN3+3wa7rCXN1Sy+bE9Jt8RyRDQauIiIiIyASx0mNaiYV7NkaaIVTK0XmFnJxfwvWtu3oFrH09F+3gn+q28NFgAUmgKZmg1OvjoEA+5xVVcE/lPlzbtotbwg0TezEiOaKgVURERERkogQzmdb27k1upAlfcRXfmzGXLfEufjuMYNPFBK/dElHWRju4q6OJ78+YwzdLZrPIF+SK5p0a+yrTjifXHRARERERmbaCRbjJOCQiPdsiTRwebWK+L8D1bXVjmh24NZXk2007+GXrLk4rKOXn5fPxY41Dx2UiLFq0iB/+8IesWrWKVatWcckll1BVVTVg+9LSUi655BIALrvsMnw+HyeccAILFiyY0H4eeuihfOITn+i17dxzz2XRokXst99+HHHEEQO+9+Mf/zgrVqwY1/4o0yoiIiIiMlECRRBr770t0sQn6zbQmkryZCTc//tG6NfheppTSS4rncs15fP5VuN7xJRxnZQ2bdrErbfeCsC+++7LypUrufnmm4f9/kcffXSiujYsb7755h4/p4JWEREREZEJYgWLeo9nBfI7mzi+ayf3JlPjWsq7uqMJgMtK57K6chHfbdrBW/Hd14SVySMUCtHebn7UqKqq4tOf/jSpVIpEIsHq1av7fc8555zD+vXrKSoq4kMf+hB+v5+KigoeffRR1q5dy4IFCzjzzDOJRqOEw2ESiQR33HEHRx99NMuXL8d1XdavX8+aNWs455xzKCgoID8/n5tuuolIJNLvObMdeuihVFZWcv/992PbNgceeCDt7e0EAgH+9re/AbB06VKWLVtGQUEBDz74IK+99tqYPicFrSIiIiIiEyVQCNHeQasdbyHk93KfJzTup1vd0cR7iRg/KavijlkL+UlLDfd0NI/7eaaDT+XP4IyC0nE95p87mrmvs2XQNosXL2bVqlX4fD7mzp3LLbfcAsDZZ5/NnXfeyc6dO1m6dCmnn346995776DHysvL4ze/+Q0VFRV85StfYe3atZx11lncdttt1NbWcsopp1BSUkJlZSUHHXQQ1113HQAXXnhhd8Z006ZNPPnkk7sde/ny5ey1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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "dark" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(16, 6))\n", + "\n", + "df[['Close','Bollinger High','Bollinger Low']].plot(ax=ax)\n", + "\n", + "plt.title(\"Bitcoin - Bollinger bands (USD)\", fontsize=16, fontweight='bold', color='white')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> Check out the blog post we wrote about Bollinger bands here!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pandas/conditional-selection-and-operations.ipynb b/pandas/conditional-selection-and-operations.ipynb new file mode 100644 index 0000000..e1c5245 --- /dev/null +++ b/pandas/conditional-selection-and-operations.ipynb @@ -0,0 +1,1548 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![rmotr](https://user-images.githubusercontent.com/7065401/52071918-bda15380-2562-11e9-828c-7f95297e4a82.png)\n", + "
\n", + "\n", + "\n", + "\n", + "# Vectorized Operations and Methods on Pandas Series\n", + "\n", + "Series also support vectorized operations and aggregation functions as Numpy, on this lecture we'll see most common ones." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)\n", + "\n", + "## Hands on! " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "pd.options.display.float_format = '{:,.2f}'.format" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "The first thing we'll do is create again the `Series` from our previous lecture: " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "g7_pop = pd.Series({\n", + " 'Canada': 35.467,\n", + " 'France': 63.951,\n", + " 'Germany': 80.94,\n", + " 'Italy': 60.665,\n", + " 'Japan': 127.061,\n", + " 'United Kingdom': 64.511,\n", + " 'United States': 318.523\n", + "}, dtype=np.float, name='G7 Population in millions')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.47\n", + "France 63.95\n", + "Germany 80.94\n", + "Italy 60.66\n", + "Japan 127.06\n", + "United Kingdom 64.51\n", + "United States 318.52\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "gdp = pd.Series(\n", + " [1785387, 2833687, 3874437, 2167744, 4602367, 2950039, 17348075],\n", + " index=['Canada', 'France', 'Germany', 'Italy',\n", + " 'Japan', 'United Kingdom', 'United States'],\n", + " dtype=np.float,\n", + " name='G7 GDP in millions')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 1,785,387.00\n", + "France 2,833,687.00\n", + "Germany 3,874,437.00\n", + "Italy 2,167,744.00\n", + "Japan 4,602,367.00\n", + "United Kingdom 2,950,039.00\n", + "United States 17,348,075.00\n", + "Name: G7 GDP in millions, dtype: float64" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gdp" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.47\n", + "France 63.95\n", + "Germany 80.94\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Japan 127.06\n", + "United Kingdom 64.51\n", + "United States 318.52\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.tail(3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## `Series` vectorized operations" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35,467,000.00\n", + "France 63,951,000.00\n", + "Germany 80,940,000.00\n", + "Italy 60,665,000.00\n", + "Japan 127,061,000.00\n", + "United Kingdom 64,511,000.00\n", + "United States 318,523,000.00\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop * 1_000_000" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 1,000,035.47\n", + "France 1,000,063.95\n", + "Germany 1,000,080.94\n", + "Italy 1,000,060.67\n", + "Japan 1,000,127.06\n", + "United Kingdom 1,000,064.51\n", + "United States 1,000,318.52\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop + 1_000_000" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 1,785,387,000,000.00\n", + "France 2,833,687,000,000.00\n", + "Germany 3,874,437,000,000.00\n", + "Italy 2,167,744,000,000.00\n", + "Japan 4,602,367,000,000.00\n", + "United Kingdom 2,950,039,000,000.00\n", + "United States 17,348,075,000,000.00\n", + "Name: G7 GDP in millions, dtype: float64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gdp * 1_000_000" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Operation between Series:**" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 50,339.39\n", + "France 44,310.28\n", + "Germany 47,868.01\n", + "Italy 35,733.03\n", + "Japan 36,221.71\n", + "United Kingdom 45,729.24\n", + "United States 54,464.12\n", + "dtype: float64" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gdp / g7_pop" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 50,339.39\n", + "France 44,310.28\n", + "Germany 47,868.01\n", + "Italy 35,733.03\n", + "Japan 36,221.71\n", + "United Kingdom 45,729.24\n", + "United States 54,464.12\n", + "dtype: float64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(gdp * 1_000_000) / (g7_pop * 1_000_000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## Using _Universal Functions (Ufuncs)_ to obtain statistical info\n", + "\n", + "We can apply any _Universal Function_ to a Series.\n", + "\n", + "Another useful method is `describe`, which gives you a good \"summary\" of the `Series`. Let's explore other methods in more detail:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 7.00\n", + "mean 107.30\n", + "std 97.25\n", + "min 35.47\n", + "25% 62.31\n", + "50% 64.51\n", + "75% 104.00\n", + "max 318.52\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "318.523" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.max()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "35.467" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.min()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "107.30257142857144" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "97.24996987121581" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.std()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "61.3222" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.quantile(.2)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "117.83680000000004" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.quantile(.8)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 3.57\n", + "France 4.16\n", + "Germany 4.39\n", + "Italy 4.11\n", + "Japan 4.84\n", + "United Kingdom 4.17\n", + "United States 5.76\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.log(g7_pop)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![rmotr](https://user-images.githubusercontent.com/7065401/52071918-bda15380-2562-11e9-828c-7f95297e4a82.png)\n", + "
\n", + "\n", + "\n", + "\n", + "# Conditional Selection & Filtering on Pandas Series\n", + "\n", + "In conditional selection (also known as **boolean selection**), we will select subsets of data based on the actual values of the data in the Series by using a boolean vector to filter the data." + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)\n", + "\n", + "## Hands on!" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 1, + "source": [ + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "The first thing we'll do is create again the `Series` from our previous lecture:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 2, + "source": [ + "data_dic = {\n", + " 'Canada': 35.467,\n", + " 'France': 63.951,\n", + " 'Germany': 80.94,\n", + " 'Italy': 60.665,\n", + " 'Japan': 127.061,\n", + " 'United Kingdom': 64.511,\n", + " 'United States': 318.523\n", + "}\n", + "\n", + "g7_pop = pd.Series(data_dic,\n", + " name='G7 Population in millions')" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 3, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Summary of selection (from previous lesson):" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "63.951" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 4, + "source": "g7_pop['France']" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "63.951" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 5, + "source": "g7_pop.loc['France']" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "35.467" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 6, + "source": "g7_pop.iloc[0]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## Conditional selection ( boolean arrays)\n", + "\n", + "The same boolean array techniques we saw applied to numpy arrays can be used for Pandas `Series`.\n", + "\n", + "On previous lecture we saw that we can index our `Series` using a list of boolean values:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 7, + "source": "g7_pop[[False, True, True, True, False, False, False]]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "More documented:" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 8, + "source": [ + "g7_pop[[\n", + " False, # CA\n", + " True, # Fr\n", + " True, # GE\n", + " True, # IT\n", + " False, # JA\n", + " False, # UK\n", + " False #US\n", + "]]" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Now we'll go a step further and use a real condition to generate these list of boolean values:" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada False\n", + "France False\n", + "Germany True\n", + "Italy False\n", + "Japan True\n", + "United Kingdom False\n", + "United States True\n", + "Name: G7 Population in millions, dtype: bool" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 9, + "source": [ + "condition = g7_pop > 70\n", + "\n", + "condition" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Germany 80.940\n", + "Japan 127.061\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 10, + "source": "g7_pop[condition]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Germany 80.940\n", + "Japan 127.061\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 11, + "source": "g7_pop.loc[g7_pop > 70]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "107.30257142857144" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 12, + "source": "g7_pop.mean()" + }, + { + "metadata": { + "scrolled": true + }, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Japan 127.061\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 13, + "source": "g7_pop[g7_pop > g7_pop.mean()]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Japan 127.061\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 14, + "source": "g7_pop.loc[g7_pop > g7_pop.mean()]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 15, + "source": "g7_pop.loc[g7_pop > g7_pop.mean()].size" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "### Operators" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "#### `or`" + }, + { + "metadata": { + "scrolled": true + }, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "Germany 80.940\n", + "Japan 127.061\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 16, + "source": "g7_pop[(g7_pop > 70) | (g7_pop < 40)]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "#### `and`" + }, + { + "metadata": { + "scrolled": true + }, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Germany 80.940\n", + "Japan 127.061\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 17, + "source": "g7_pop[(g7_pop > 80) & (g7_pop < 200)]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "#### `not`" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Italy 60.665\n", + "United Kingdom 64.511\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 18, + "source": "g7_pop.loc[~(g7_pop > 80)]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Germany 80.940\n", + "Japan 127.061\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 19, + "source": "g7_pop.loc[g7_pop > 80]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Japan 127.061\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 20, + "source": "g7_pop[g7_pop > g7_pop.mean()]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "97.24996987121581" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 21, + "source": "g7_pop.std()" + }, + { + "metadata": { + "scrolled": true + }, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 22, + "source": "g7_pop[(g7_pop > g7_pop.mean() - g7_pop.std() / 2) | (g7_pop > g7_pop.mean() + g7_pop.std() / 2)]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "### Indexing with isin\n", + "\n", + "Consider the `isin()` method of `Series`, which returns a boolean vector that is true wherever the Series elements exist in the passed list. This allows you to select rows where one or more columns have values you want:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 23, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "Germany 80.940\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 24, + "source": "g7_pop[g7_pop.isin([80, 80.940, 60.451, 35.467])]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "Italy 60.665\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 25, + "source": "g7_pop[g7_pop.index.isin(['Canada', 'Italy'])]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "### Modifying series using conditional selection" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 99.990\n", + "France 99.990\n", + "Germany 80.940\n", + "Italy 99.990\n", + "Japan 127.061\n", + "United Kingdom 99.990\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 26, + "source": [ + "g7_pop[g7_pop < 70] = 99.99\n", + "\n", + "g7_pop" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "Also we can combine `+=`, `-=`, `*=` operations while modifying values.\n", + "\n", + "Lets remove 5 million from countries with population >100M:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 99.990\n", + "France 99.990\n", + "Germany 80.940\n", + "Italy 99.990\n", + "Japan 132.061\n", + "United Kingdom 99.990\n", + "United States 323.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 27, + "source": [ + "g7_pop[g7_pop > 100] += 5\n", + "\n", + "g7_pop" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![rmotr](https://user-images.githubusercontent.com/7065401/52071918-bda15380-2562-11e9-828c-7f95297e4a82.png)\n", + "
\n", + "\n", + "\n", + "\n", + "# Pandas Series - Sorting\n", + "\n", + "In many use cases `Series` values need to be sorted.\n", + "\n", + "Sorting in Pandas is extremely easy. There are two important methods to be used for Series and DataFrames that will take care of the job: `sort_values` and `sort_index`." + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)\n", + "\n", + "## Hands on!" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 1, + "source": [ + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 2, + "source": "pd.options.display.float_format = '{:,.2f}'.format" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "The first thing we'll do is create again the `Series` from our previous lecture:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 3, + "source": [ + "g7_pop = pd.Series({\n", + " 'Canada': 35.467,\n", + " 'France': 63.951,\n", + " 'Germany': 80.94,\n", + " 'Italy': 60.665,\n", + " 'Japan': 127.061,\n", + " 'United Kingdom': 64.511,\n", + " 'United States': 318.523\n", + "}, dtype=np.float, name='G7 Population in millions')" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.47\n", + "France 63.95\n", + "Germany 80.94\n", + "Italy 60.66\n", + "Japan 127.06\n", + "United Kingdom 64.51\n", + "United States 318.52\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 4, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 5, + "source": [ + "gdp = pd.Series(\n", + " [1785387, 2833687, 3874437, 2167744, 4602367, 2950039, 17348075],\n", + " index=['Canada', 'France', 'Germany', 'Italy',\n", + " 'Japan', 'United Kingdom', 'United States'],\n", + " dtype=np.float,\n", + " name='G7 GDP in millions')" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "### Sorting values" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.47\n", + "France 63.95\n", + "Germany 80.94\n", + "Italy 60.66\n", + "Japan 127.06\n", + "United Kingdom 64.51\n", + "United States 318.52\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 6, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.47\n", + "Italy 60.66\n", + "France 63.95\n", + "United Kingdom 64.51\n", + "Germany 80.94\n", + "Japan 127.06\n", + "United States 318.52\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 7, + "source": "g7_pop.sort_values()" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "As you can see, sorting is as simple as invoking the `sort_values` method. By default, values are sorted in ascending order, which you can customize with the `ascending` parameter." + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "United States 318.52\n", + "Japan 127.06\n", + "Germany 80.94\n", + "United Kingdom 64.51\n", + "France 63.95\n", + "Italy 60.66\n", + "Canada 35.47\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 8, + "source": "g7_pop.sort_values(ascending=False)" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.47\n", + "France 63.95\n", + "Germany 80.94\n", + "Italy 60.66\n", + "Japan 127.06\n", + "United Kingdom 64.51\n", + "United States 318.52\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 9, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 10, + "source": "g7_pop.sort_values(ascending=False, inplace=True)" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "United States 318.52\n", + "Japan 127.06\n", + "Germany 80.94\n", + "United Kingdom 64.51\n", + "France 63.95\n", + "Italy 60.66\n", + "Canada 35.47\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 11, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "### Sorting index\n", + "\n", + "`sort_index` works exactly in the same way:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.47\n", + "France 63.95\n", + "Germany 80.94\n", + "Italy 60.66\n", + "Japan 127.06\n", + "United Kingdom 64.51\n", + "United States 318.52\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 12, + "source": "g7_pop.sort_index()" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pandas/series.ipynb b/pandas/series.ipynb new file mode 100644 index 0000000..d3c399a --- /dev/null +++ b/pandas/series.ipynb @@ -0,0 +1,2235 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![rmotr](https://user-images.githubusercontent.com/7065401/52071918-bda15380-2562-11e9-828c-7f95297e4a82.png)\n", + "
\n", + "\n", + "\n", + "\n", + "# Intro to Pandas Series\n", + "\n", + "A Series is a one-dimensional array-like object containing a _typed_ sequence of values and an associated array of data labels, called its _index_." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)\n", + "\n", + "## Hands on!\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## Series creation\n", + "\n", + "`pd.Series`' constructor accepts the following parameters:\n", + "\n", + "- **data**: (required) has all the data we want to store on the Series and could be an scalar value, a Python sequence or an unidimensional NumPy ndarray.\n", + "- **index**: (optional), has all the labels that we want to assign to our data values and could be a Python sequence or an unidimensional NumPy ndarray. Default value: `np.arange(0, len(data))`.\n", + "- **dtype**: (optional) any NumPy data type." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 1\n", + "1 2\n", + "2 3\n", + "3 4\n", + "4 5\n", + "dtype: int64" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "series = pd.Series([1, 2, 3, 4, 5])\n", + "series" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Series have an associated type:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 1\n", + "1 2\n", + "2 3\n", + "3 4\n", + "4 5\n", + "dtype: int64" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Show first values of our Series\n", + "series.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dtype('int64')" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "series.dtype" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 1.0\n", + "1 2.0\n", + "2 3.0\n", + "3 4.0\n", + "4 5.0\n", + "dtype: float64" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "series = pd.Series([1, 2, 3, 4, 5], dtype=np.float)\n", + "series" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dtype('float64')" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "series.dtype" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 a\n", + "1 b\n", + "2 c\n", + "3 d\n", + "4 e\n", + "dtype: object" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "series = pd.Series(['a', 'b', 'c', 'd', 'e'])\n", + "series" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 2\n", + "1 4\n", + "2 6\n", + "3 8\n", + "4 10\n", + "dtype: int64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Using a ndarraynp.array([2, 4, 6, 8, 10\n", + "array = np.array([2, 4, 6, 8, 10])\n", + "series = pd.Series(array)\n", + "series" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "a 1\n", + "b 2\n", + "c 3\n", + "d 4\n", + "e 5\n", + "dtype: int64" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# With predefined index\n", + "series = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])\n", + "series" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "a 1.0\n", + "b 2.0\n", + "c 3.0\n", + "d 4.0\n", + "e 5.0\n", + "dtype: float64" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Using a dictionary (index will be defined using keys)\n", + "series = pd.Series({'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}, dtype=np.float64)\n", + "series" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## Series attributes\n", + "\n", + "These are the most common attributes to get information about a `Series`:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "a 1.0\n", + "b 2.0\n", + "c 3.0\n", + "d 4.0\n", + "e 5.0\n", + "dtype: float64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "series = pd.Series(data=[1, 2, 3, 4, 5],\n", + " index=['a', 'b', 'c', 'd', 'e'],\n", + " dtype=np.float64)\n", + "series" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dtype('float64')" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Type of our Series\n", + "series.dtype" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1., 2., 3., 4., 5.])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Values of a series\n", + "series.values" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(series.values)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['a', 'b', 'c', 'd', 'e'], dtype='object')" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Index of a series\n", + "series.index" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Dimension of the Series\n", + "series.ndim" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5,)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Shape of the Series\n", + "series.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Number of Series elements\n", + "series.size" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## The Group of Seven\n", + "\n", + "We'll start analyzing \"[The Group of Seven](https://en.wikipedia.org/wiki/Group_of_Seven)\". Which is a political formed by Canada, France, Germany, Italy, Japan, the United Kingdom and the United States. We'll start by analyzing population, and for that, we'll use a `pandas.Series` object." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 35.467\n", + "1 63.951\n", + "2 80.940\n", + "3 60.665\n", + "4 127.061\n", + "5 64.511\n", + "6 318.523\n", + "dtype: float64" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# In millions\n", + "g7_pop = pd.Series([35.467, 63.951, 80.940, 60.665, 127.061, 64.511, 318.523])\n", + "\n", + "g7_pop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Someone might not know we're representing population in millions of inhabitants. Series can have a `name`, to better document the purpose of the Series:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 35.467\n", + "1 63.951\n", + "2 80.940\n", + "3 60.665\n", + "4 127.061\n", + "5 64.511\n", + "6 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.name = 'G7 Population in millions'\n", + "\n", + "g7_pop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Series are pretty similar to numpy arrays:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dtype('float64')" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.dtype" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(series.values)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.ndim" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(7,)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "7" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.size" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And they _look_ like simple Python lists or Numpy Arrays. But they're actually more similar to Python `dict`s." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 35.467\n", + "1 63.951\n", + "2 80.940\n", + "3 60.665\n", + "4 127.061\n", + "5 64.511\n", + "6 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RangeIndex(start=0, stop=7, step=1)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.index" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Assigning `Series` indexes\n", + "\n", + "In contrast to lists, we can explicitly define the index:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "g7_pop.index = [\n", + " 'Canada',\n", + " 'France',\n", + " 'Germany',\n", + " 'Italy',\n", + " 'Japan',\n", + " 'United Kingdom',\n", + " 'United States',\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compare it with the [following table](https://docs.google.com/spreadsheets/d/1IlorV2-Oh9Da1JAZ7weVw86PQrQydSMp-ydVMH135iI/edit?usp=sharing): \n", + "\n", + "![image](https://user-images.githubusercontent.com/872296/38149656-b5ce9816-3431-11e8-88e4-195756e25355.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Removing indexes\n", + "\n", + "We can also remove current indexes from our `Series`, going back to the original indexes. To do that we use the `reset_index()` method with `drop=True` parameter:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 35.467\n", + "1 63.951\n", + "2 80.940\n", + "3 60.665\n", + "4 127.061\n", + "5 64.511\n", + "6 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop.reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that `reset_index()` will return a new `Series`, so if we want to keep it we need to assign it to a variable, or use `inplace=True` parameter to modify the original `Series`." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "g7_pop.reset_index(drop=True, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 35.467\n", + "1 63.951\n", + "2 80.940\n", + "3 60.665\n", + "4 127.061\n", + "5 64.511\n", + "6 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating a `Series` with indexes already\n", + "\n", + "We can create a new `Series` with its indexes labels in a single step:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "values = [35.467, 63.951, 80.94, 60.665, 127.061, 64.511, 318.523]\n", + "indexes = ['Canada', 'France', 'Germany', 'Italy',\n", + " 'Japan', 'United Kingdom', 'United States']\n", + "\n", + "pd.Series(values,\n", + " index=indexes,\n", + " name='G7 Population in millions')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating a `Series` from a data dictionary\n", + "We can say that Series look like \"ordered dictionaries\". We can actually create Series out of dictionaries:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "data_dic = {\n", + " 'Canada': 35.467,\n", + " 'France': 63.951,\n", + " 'Germany': 80.94,\n", + " 'Italy': 60.665,\n", + " 'Japan': 127.061,\n", + " 'United Kingdom': 64.511,\n", + " 'United States': 318.523\n", + "}\n", + "\n", + "g7_pop = pd.Series(data_dic,\n", + " name='G7 Population in millions')" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g7_pop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating a `Series` out of other `Series`\n", + "\n", + "You can also create Series out of other series, specifying indexes:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Spain NaN\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.Series(g7_pop,\n", + " index=['France', 'Germany', 'Italy', 'Spain'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![rmotr](https://user-images.githubusercontent.com/7065401/52071918-bda15380-2562-11e9-828c-7f95297e4a82.png)\n", + "
\n", + "\n", + "\n", + "\n", + "# Pandas Series - Selection and Indexing\n", + "\n", + "Pandas Series object acts in many ways like a one-dimensional NumPy array, and in many ways like a standard Python dictionary. If we keep these two overlapping analogies in mind, it will help us to understand the patterns of data indexing and selection in these data structures." + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)\n", + "\n", + "## Hands on!" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 1, + "source": [ + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "The first thing we'll do is create again the `Series` from our previous lecture:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 2, + "source": [ + "data_dic = {\n", + " 'Canada': 35.467,\n", + " 'France': 63.951,\n", + " 'Germany': 80.94,\n", + " 'Italy': 60.665,\n", + " 'Japan': 127.061,\n", + " 'United Kingdom': 64.511,\n", + " 'United States': 318.523\n", + "}\n", + "\n", + "g7_pop = pd.Series(data_dic,\n", + " name='G7 Population in millions')" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 3, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## Indexing\n", + "\n", + "Indexing works similarly to lists and dictionaries.\n", + "\n", + "### Indexing by index\n", + "\n", + "you use the **index** of the element you're looking for:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "35.467" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 4, + "source": "g7_pop['Canada']" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "127.061" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 5, + "source": "g7_pop['Japan']" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "64.511" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 6, + "source": "g7_pop['United Kingdom']" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "The following also works, but it's **NOT** recommended:" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "127.061" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 7, + "source": "g7_pop.Japan" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "### Slicing and multi-selection\n", + "\n", + "Slicing also works, but **important**, in Pandas, the upper limit is also included:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 8, + "source": "g7_pop['Germany': 'Japan']" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Multi indexing also works (similarly to numpy):" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Italy 60.665\n", + "France 63.951\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 9, + "source": "g7_pop[['Italy', 'France', 'United States']]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "### Indexing by sequential position\n", + "\n", + "Indexing elements by their sequential position also works. In this case pandas evaluates the object received; if it doesn't exist as an index, it'll try by sequential position.\n", + "\n", + "With sequential position the upper limit is not included." + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 10, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "35.467" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 11, + "source": "g7_pop.iloc[0] # First element" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "318.523" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 12, + "source": "g7_pop.iloc[-1] # Last element" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Other examples:" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "80.94" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 13, + "source": "g7_pop.iloc[2]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "127.061" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 14, + "source": "g7_pop.iloc[4]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Germany 80.940\n", + "Italy 60.665\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 15, + "source": "g7_pop.iloc[2:4]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Italy 60.665\n", + "France 63.951\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 16, + "source": "g7_pop.iloc[[3, 1, 6]]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "### Adding new elements to a `Series`\n", + "\n", + "In many cases we'll want to add new values to our `Series`, to do that we can just simply index our `Series` using the new index and then assigning a value to that index. Let's add two new records:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": 17, + "source": [ + "g7_pop['Brazil'] = 20.124\n", + "g7_pop['India'] = 32.235" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 35.467\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Brazil 20.124\n", + "India 32.235\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 18, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "### Modifying `Series` elements" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.500\n", + "France 63.951\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Brazil 20.124\n", + "India 32.235\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 19, + "source": [ + "g7_pop['Canada'] = 40.5\n", + "\n", + "g7_pop" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.500\n", + "France NaN\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Brazil 20.124\n", + "India 32.235\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 20, + "source": [ + "g7_pop['France'] = np.nan\n", + "\n", + "g7_pop" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "### Removing elements from a `Series`" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.500\n", + "France NaN\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "India 32.235\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 21, + "source": [ + "del g7_pop['Brazil']\n", + "\n", + "g7_pop" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.500\n", + "France NaN\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 22, + "source": [ + "del g7_pop['India']\n", + "\n", + "g7_pop" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "### Checking existance of a key (membership)" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 23, + "source": "'France' in g7_pop" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 24, + "source": "'Brazil' in g7_pop" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## Introducing **`loc`** & **`iloc`**\n", + "\n", + "What's the problem with the indexing we've seen? It's not explicit. Pandas receives an element to index and it tries figuring out if we meant to select an element by its key, or its sequential position. Check out the following example:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "1 a\n", + "2 b\n", + "3 c\n", + "dtype: object" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 25, + "source": [ + "s = pd.Series(\n", + " ['a', 'b', 'c'],\n", + " index=[1, 2, 3])\n", + "s" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "1 a\n", + "2 b\n", + "3 c\n", + "dtype: object" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 26, + "source": "s" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "What happens if we try indexing `s[1]`, what should it return? `a` or `b`?" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "'a'" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 27, + "source": "s[1]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "In this case, the returned object is worked out by the index, not by the sequential position. But again, it's not intuitive or explicit.\n", + "\n", + "Enter `loc` and `iloc`:\n", + "* `loc` is the preferred way to select elements in Series (and Dataframes) by their index\n", + "* `iloc` is the preferred way to select by sequential position" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "'a'" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 28, + "source": "s.loc[1]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "'b'" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 29, + "source": "s.iloc[1]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.500\n", + "France NaN\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 30, + "source": "g7_pop" + }, + { + "metadata": { + "scrolled": true + }, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "318.523" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 31, + "source": "g7_pop.iloc[-1]" + }, + { + "metadata": { + "scrolled": true + }, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.5\n", + "France NaN\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 32, + "source": "g7_pop.iloc[[0, 1]]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Using our previous series:" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.500\n", + "France NaN\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 33, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "127.061" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 34, + "source": "g7_pop.loc['Japan']" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "318.523" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 35, + "source": "g7_pop.iloc[-1]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.500\n", + "France NaN\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 36, + "source": "g7_pop" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "40.5" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 37, + "source": "g7_pop.loc['Canada']" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "40.5" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 38, + "source": "g7_pop.iloc[0]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "318.523" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 39, + "source": "g7_pop.iloc[-1]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Japan 127.061\n", + "Canada 40.500\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 40, + "source": "g7_pop.loc[['Japan', 'Canada']]" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.500\n", + "United States 318.523\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 41, + "source": "g7_pop.iloc[[0, -1]]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "#### **`loc`** & **`iloc`** to modify `Series`" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.500\n", + "France NaN\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 1000.000\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 42, + "source": [ + "g7_pop.loc['United States'] = 1000\n", + "\n", + "g7_pop" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada 40.500\n", + "France NaN\n", + "Germany 80.940\n", + "Italy 60.665\n", + "Japan 127.061\n", + "United Kingdom 64.511\n", + "United States 500.000\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 43, + "source": [ + "g7_pop.iloc[-1] = 500\n", + "\n", + "g7_pop" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "![green-divider](https://user-images.githubusercontent.com/7065401/52071924-c003ad80-2562-11e9-8297-1c6595f8a7ff.png)\n", + "\n", + "## Introducing to Boolean arrays\n", + "\n", + "Another way to select certain values within a `Series` is using **boolean arrays**, also known as **Conditional selection**.\n", + "\n", + "We can index our `Series` using a list of boolean values:" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Germany 80.940\n", + "Japan 127.061\n", + "United States 500.000\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 44, + "source": "g7_pop[[False, False, True, False, True, False, True]]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Or we can index our `Series` using another `Series` with boolean values:" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Canada False\n", + "France False\n", + "Germany True\n", + "Italy False\n", + "Japan True\n", + "United Kingdom False\n", + "United States True\n", + "dtype: bool" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 45, + "source": [ + "condition = pd.Series([\n", + " False, False, True, False, True, False, True\n", + "], index=[\n", + " 'Canada', 'France', 'Germany', 'Italy', 'Japan', 'United Kingdom', 'United States'\n", + "])\n", + "\n", + "condition" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": [ + "Germany 80.940\n", + "Japan 127.061\n", + "United States 500.000\n", + "Name: G7 Population in millions, dtype: float64" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 46, + "source": "g7_pop[condition]" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "> On upcoming lectures we'll see how to use more complex **conditional selections**." + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "![purple-divider](https://user-images.githubusercontent.com/7065401/52071927-c1cd7100-2562-11e9-908a-dde91ba14e59.png)" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pandas/utils.py b/pandas/utils.py new file mode 100644 index 0000000..1e9771e --- /dev/null +++ b/pandas/utils.py @@ -0,0 +1,27 @@ +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import seaborn as sns + +def apply_theme(): + pd.set_option('display.max_columns', 500) + pd.set_option('display.width', 1000) + pd.set_option('display.max_colwidth', 1000) + pd.set_option('display.float_format', '{:,.3f}'.format) + + flatui = ["#2e86de", "#ff4757", "#feca57", "#2ed573", "#ff7f50", "#00cec9", "#fd79a8", "#a4b0be"] + flatui_palette = sns.color_palette(flatui) + sns.palplot(flatui_palette) + sns.set_palette(flatui_palette) + + sns.set_style("darkgrid", { + 'axes.edgecolor': '#2b2b2b', + 'axes.facecolor': '#2b2b2b', + 'axes.labelcolor': '#919191', + 'figure.facecolor': '#2b2b2b', + 'grid.color': '#545454', + 'patch.edgecolor': '#2b2b2b', + 'text.color': '#bababa', + 'xtick.color': '#bababa', + 'ytick.color': '#bababa' + }) \ No newline at end of file