2016-12-05 10 views
2

私のコードはpython 2.7にあり、私はPandas, Numpy, PyQt, Matplotlibを使用しています。以下の関数で数値とアルファベット順のリストを生成しています。コードの最適化/操作時間の短縮

正常に動作していますが、大きなファイルの場合は実行に時間がかかります。

def generate_num_alph(self, tx): 
    df1 = pd.DataFrame(self.df['result']) 
    df2 = pd.to_numeric(df1['result'], errors='coerce') 
    df1['result'] = df2 
    # number list 
    t = self.df.ix[df1.dropna().index.values] 
    t['result'] = t.result.astype('float') 

    # alpha list 

    index = df1['result'].index[df1['result'].apply(np.isnan)] 
    df_index = df1.index.values.tolist() 
    x = [df_index.index(i) for i in index] 

    z = self.df.ix[x] 

    # Selecting data according to test number (tx) 
    q = t[t['test_number'] == float(tx)].groupby('result')['Count'].sum() 
    plot_scat_val = pd.DataFrame(q, columns=['Count']) 
    plot_bar_val = z[z['test_number'] == float(tx)] 

    self.plot_scat.print_g1(fnum=plot_scat_val) 
    plot_bar_val['Description'] = pd.Series([i for i in range(len(plot_bar_val))], index=plot_bar_val.index) 
    print plot_bar_val 
    model = PandasModel(plot_bar_val[['result', 'Count', 'Description']]) 

    self.draw_table(model) 

    self.f_alph = plot_bar_val 

私はそれが2075個の要素を与えるxを印刷:

をここで
x = [df_index.index(i) for i in index] 

は全体の機能である:それは大規模なデータに長い時間がかかるですので 私は、この特定のコード行を最適化したいですここ
[0, 135, 179, 223, 235, 246, 278, 298, 313, 315, 318, 324, 337, 339, 353, 389, 395, 433, 464, 510, 570, 627, 641, 659, 678, 711, 860, 884, 1019, 1034, 1087, 1109, 1127, 1150, 1153, 1157, 1187, 1195, 1232, 1242, 1248, 1251, 1261, 1343, 1364, 1387, 1425, 1428, 1512, 1519, 1530, 1538, 1541, 1602, 1603, 1678, 1679, 1702, 1715, 1741, 1751, 1779, 1817, 1827, 1840, 1841, 1900, 1903, 1921, 1932, 1934, 1954, 1998, 2003, 2008, 2013, 2025, 2038, 2039, 2079, 2134, 2140, 2173, 2204, 2206, 2207, 2217, 2222, 2229, 2243, 2250, 2257, 2271, 2277, 2284, 2320, 2327, 2345, 2362, 2368, 2369, 2371, 2375, 2382, 2389, 2395, 2405, 2413, 2435, 2438, 2451, 2477, 2497, 2500, 2505, 2532, 2536, 2540, 2544, 2551, 2576, 2579, 2604, 2605, 2608, 2619, 2622, 2623, 2629, 2637, 2651, 2676, 2681, 2693, 2694, 2719, 2723, 2737, 2744, 2746, 2753, 2769, 2779, 2784, 2797, 2818, 2844, 2845, 2866, 2880, 2890, 2900, 2923, 2948, 2958, 2960, 3026, 3029, 3035, 3043, 3154, 3161, 3214, 3246, 3262, 3263, 3283, 3321, 3331, 3429, 3450, 3465, 3467, 3485, 3487, 3517, 3529, 3589, 3593, 3600, 3646, 3710, 3727, 3771, 3839, 3854, 3918, 3955, 3958, 3960, 3970, 4004, 4034, 4160, 4371, 4373, 4392, 4475, 4491, 4503, 4517, 4520, 4686, 4697, 4744, 4853, 4890, 4895, 4911, 4923, 4976, 5082, 5160, 5167, 5251, 5303, 5380, 5407, 5413, 5507, 5524, 5553, 5657, 5759, 5845, 6021, 6099, 6146, 6212, 6214, 6215, 6453, 6470, 6485, 6487, 6622, 6668, 6676, 6784, 6824, 6838, 6990, 6999, 7094, 7134, 7262, 7337, 7471, 7479, 7497, 7645, 7666, 7873, 7890, 7899, 7907, 7993, 8121, 8132, 8192, 8350, 8378, 8403, 8447, 8534, 8575, 8728, 8756, 8893, 9064, 9206, 9274, 9284, 9486, 9492, 9522, 9616, 9660, 9671, 9684, 9710, 9861, 9940, 9956, 10080, 10167, 10170, 10174, 10223, 10284, 10320, 10648, 10653, 10663, 10793, 10865, 10904, 11161, 11174, 11196, 11466, 11608, 11618, 11679, 11697, 11761, 11781, 11795, 11825, 11847, 11877, 12290, 12328, 12421, 12606, 12664, 12748, 12915, 13062, 13411, 13425, 13561, 13656, 13798, 13867, 13868, 13934, 14081, 14140, 14162, 14231, 14266, 14285, 14324, 14435, 14515, 14538, 14611, 14639, 14649, 14773, 14778, 14798, 14850, 14975, 15020, 15045, 15143, 15246, 15375, 15423, 15569, 15609, 15753, 15825, 15840, 16094, 16157, 16188, 16216, 16226, 16249, 16388, 16402, 16464, 16866, 16945, 17038, 17108, 17148, 17192, 17549, 17564, 17618, 17627, 17683, 17762, 17868, 18029, 18057, 18077, 18168, 18197, 18221, 18320, 18357, 18510, 18518, 18562, 18577, 18581, 18705, 18770, 18865, 18884, 18926, 18934, 19036, 19087, 19123, 19128, 19194, 19302, 19495, 19518, 19554, 19701, 19789, 19833, 19863, 19878, 19896, 19914, 19974, 20026, 20029, 20074, 20086, 20191, 20193, 20230, 20267, 20276, 20428, 20446, 20473, 20738, 20828, 20888, 20896, 21359, 21412, 21466, 21520, 21560, 21589, 21606, 21718, 21752, 21788, 21820, 21862, 21946, 21947, 21948, 21949, 21950, 21951, 21952, 21953, 21954, 21955, 21956, 21957, 21958, 21960, 21961, 21962, 21963, 21964, 21965, 21968, 21970, 21976, 21980, 21981, 21998, 22011, 22015, 22016, 22021, 22023, 22025, 22033, 22043, 22046, 22056, 22058, 22060, 22065, 22066, 22069, 22075, 22078, 22080, 22085, 22089, 22092, 22093, 22098, 22100, 22108, 22116, 22124, 22127, 22128, 22131, 22134, 22135, 22136, 22139, 22142, 22147, 22149, 22152, 22154, 22164, 22165, 22170, 22177, 22189, 22209, 22210, 22217, 22218, 22229, 22232, 22252, 22259, 22270, 22271, 22279, 22286, 22313, 22322, 22341, 22344, 22362, 22368, 22369, 22372, 22380, 22396, 22398, 22419, 22422, 22426, 22427, 22456, 22469, 22482, 22492, 22504, 22510, 22517, 22545, 22551, 22581, 22586, 22615, 22625, 22631, 22644, 22662, 22681, 22746, 22773, 22779, 22846, 22862, 22872, 22890, 22917, 22927, 22948, 22951, 22976, 23012, 23016, 23038, 23058, 23067, 23089, 23137, 23176, 23206, 23215, 23220, 23226, 23231, 23270, 23290, 23311, 23348, 23383, 23385, 23473, 23492, 23533, 23538, 23574, 23659, 23760, 23856, 23925, 23980, 24045, 24113, 24119, 24328, 24375, 24439, 24467, 24486, 24506, 24530, 24554, 24610, 24644, 24681, 24751, 24776, 24831, 25106, 25266, 25316, 25323, 25352, 25376, 25399, 25511, 25524, 25535, 25775, 25939, 26020, 26143, 26237, 26276, 26291, 26446, 26492, 26516, 26795, 26859, 27012, 27279, 27482, 27862, 28447, 28449, 28458, 28586, 28853, 29176, 29208, 29670, 29713, 29751, 29943, 29973, 30396, 30542, 30794, 31333, 31476, 31679, 31781, 31854, 32052,8, 32286, 32290, 32506, 32892, 33073, 33354, 33787, 33882, 33905, 34060, 34061, 34070, 34074, 34076, 34077, 34078, 34081, 34082, 34088, 34090, 34091, 34092, 34093, 34097, 34099, 34101, 34103, 34104, 34105, 34106, 34107, 34108, 34111, 34116, 34121, 34124, 34125, 34126, 34130, 34133, 34134, 34142, 34147, 34151, 34152, 34153, 34155, 34156, 34157, 34161, 34166, 34175, 34178, 34189, 34190, 34191, 34193, 34198, 34206, 34210, 34212, 34218, 34219, 34238, 34239, 34246, 34250, 34251, 34254, 34257, 34259, 34265, 34272, 34283, 34284, 34296, 34303, 34310, 34312, 34321, 34323, 34339, 34342, 34344, 34353, 34366, 34370, 34371, 34372, 34374, 34375, 34380, 34382, 34392, 34398, 34400, 34410, 34415, 34426, 34434, 34441, 34443, 34446, 34447, 34458, 34459, 34467, 34476, 34500, 34512, 34515, 34522, 34523, 34529, 34538, 34553, 34564, 34592, 34596, 34603, 34617, 34631, 34655, 34659, 34661, 34662, 34700, 34717, 34724, 34737, 34746, 34747, 34750, 34759, 34777, 34817, 34820, 34824, 34836, 34860, 34889, 34899, 34905, 34937, 34959, 34976, 34982, 35000, 35016, 35032, 35038, 35040, 35049, 35055, 35056, 35060, 35068, 35095, 35101, 35102, 35107, 35129, 35133, 35153, 35177, 35188, 35199, 35213, 35220, 35237, 35270, 35279, 35289, 35309, 35375, 35434, 35543, 35594, 35605, 35662, 35723, 35745, 35795, 35805, 35820, 35841, 35950, 35986, 36113, 36125, 36138, 36191, 36194, 36304, 36361, 36368, 36450, 36466, 36521, 36589, 36600, 36726, 36728, 36801, 36859, 36906, 36924, 36978, 36983, 37013, 37228, 37296, 37335, 37349, 37365, 37443, 37471, 37474, 37475, 37476, 37477, 37478, 37479, 37480, 37481, 37482, 37484, 37485, 37489, 37492, 37495, 37497, 37499, 37507, 37512, 37517, 37519, 37521, 37528, 37530, 37531, 37538, 37540, 37542, 37543, 37544, 37547, 37549, 37551, 37552, 37553, 37566, 37567, 37569, 37572, 37575, 37577, 37581, 37583, 37584, 37602, 37605, 37610, 37612, 37613, 37619, 37629, 37631, 37634, 37641, 37645, 37649, 37650, 37651, 37676, 37680, 37715, 37721, 37739, 37756, 37781, 37797, 37802, 37804, 37808, 37825, 37829, 37878, 37917, 37934, 37949, 37975, 37980, 38057, 38095, 38100, 38109, 38133, 38183, 38235, 38271, 38321, 38464, 38475, 38597, 38607, 38632, 38679, 38688, 38693, 38709, 38727, 38789, 38807, 38874, 38897, 38902, 38935, 38937, 38955, 38998, 39001, 39042, 39069, 39149, 39150, 39152, 39153, 39154, 39156, 39158, 39161, 39162, 39164, 39165, 39167, 39169, 39172, 39176, 39177, 39178, 39180, 39183, 39185, 39189, 39192, 39194, 39197, 39201, 39203, 39213, 39214, 39229, 39238, 39239, 39240, 39247, 39250, 39253, 39261, 39269, 39271, 39272, 39280, 39285, 39289, 39290, 39307, 39309, 39310, 39312, 39332, 39335, 39336, 39337, 39338, 39340, 39355, 39362, 39365, 39366, 39367, 39373, 39395, 39407, 39408, 39409, 39410, 39411, 39412, 39413, 39414, 39416, 39417, 39454, 39459, 39462, 39465, 39467, 39468, 39469, 39471, 39472, 39475, 39478, 39515, 39528, 39547, 39548, 39552, 39554, 39557, 39558, 39559, 39562, 39563, 39565, 39567, 39572, 39573, 39575, 39576, 39578, 39580, 39583, 39585, 39588, 39591, 39607, 39616, 39642, 39702, 39711, 39716, 39717, 39719, 39720, 39725, 39729, 39732, 39733, 39734, 39736, 39737, 39738, 39741, 39742, 39750, 39751, 39753, 39759, 39764, 39766, 39769, 39773, 39777, 39779, 39781, 39782, 39788, 39792, 39803, 39804, 39826, 39840, 39869, 40072, 40112, 40114, 40119, 40125, 40128, 40129, 40133, 40135, 40136, 40140, 40143, 40144, 40148, 40154, 40155, 40177, 40178, 40181, 40182, 40183, 40185, 40187, 40192, 40193, 40205, 40211, 40217, 40220, 40224, 40226, 40230, 40231, 40236, 40239, 40241, 40248, 40257, 40261, 40262, 40277, 40279, 40287, 40289, 40290, 40293, 40302, 40305, 40314, 40315, 40324, 40325, 40333, 40336, 40339, 40356, 40359, 40361, 40365, 40375, 40387, 40398, 40410, 40422, 40427, 40430, 40439, 40446, 40486, 40490, 40497, 40504, 40507, 40517, 40520, 40525, 40529, 40534, 40544, 40548, 40572, 40580, 40602, 40606, 40623, 40643, 40649, 40684, 40690, 40700, 40713, 40756, 40763, 40769, 40777, 40786, 40823, 40842, 40854, 40868, 40885, 40908, 40947, 40969, 40971, 40979, 41010, 41042, 41096, 41097, 41107, 41157, 41158, 41255, 41265, 41282, 41365, 41395, 41439, 41452, 41560, 41604, 41608, 41712, 41790, 41797, 41827, 41838, 42013, 42064, 42072, 42209, 42346, 42463, 42496, 42499, 42692, 42743, 42781, 42788, 42898, 43038, 43143, 43202, 43283, 43297, 43392, 43454, 43494, 43498, 43608, 43702, 43734, 43749, 43813, 43986, 44071, 44503, 44531, 44566, 44962, 44986, 45117, 45240, 45339, 45564, 45727, 45792, 45945, 46058, 46157, 46242, 46477, 46517, 46625, 46941, 47277, 47644, 47660, 47705, 48086, 48092, 49058, 49920, 50107, 50258, 50449, 51226, 51544, 52473, 52920, 53562, 53718, 53933, 54083, 54384, 54425, 54582, 54650, 54718, 55037, 55265, 55755, 55773, 56246, 56437, 56825, 57304, 57527, 57695, 58780, 59127, 59459, 59817, 60429, 60801, 60897, 60935, 61489, 61925, 61950, 62442, 62605, 62625, 62712, 63068, 63300, 65077, 66698, 66834, 67539, 67717, 69126, 69153, 69719, 70164, 70496, 70757, 70856, 70954, 71559, 72747, 72792, 72913, 74191, 74734, 74831, 75091, 75607, 75618, 75806, 75889, 75951, 76179, 76709, 77006, 77123, 77483, 77639, 77703, 77857, 78501, 78538, 78599, 78624, 78904, 78943, 79376, 79572, 79630, 79915, 79981, 80006, 80224, 80493, 80642, 80777, 81145, 81225, 81229, 81364, 81890, 82035, 82308, 82379, 82589, 82754, 83214, 83318, 83402, 83426, 83646, 83696, 83699, 83798, 83972, 84162, 84254, 84356, 85334, 85481, 85768, 86181, 86298, 86300, 86403, 86464, 86692, 87273, 87547, 87593, 87619, 87721, 87767, 87871, 88071, 88253, 88530, 88578, 88664, 88726, 88906, 89037, 89102, 89219, 89493, 89546, 89582, 89614, 89871, 90145, 90317, 90333, 90343, 90438, 90666, 90827, 91305, 91407, 91574, 91666, 91696, 91794, 92110, 92153, 92179, 92262, 92342, 92375, 92885, 93302, 93405, 93761, 93886, 93928, 94083, 94125, 94230, 94333, 94355, 94515, 94571, 94793, 94801, 94806, 95118, 95589, 95947, 96030, 96390, 96440, 96513, 96787, 96855, 97541, 98314, 98547, 98668, 98716, 98796, 98798, 98963, 99016, 99073, 99147, 99161, 99347, 99453, 99459, 99476, 99826, 99948, 99979, 100185, 100247, 100256, 100323, 100389, 100398, 100415, 100868, 101093, 101257, 101357, 101644, 102032, 102312, 102380, 102409, 102584, 102819, 102829, 102988, 103114, 103269, 103421, 103490, 103529, 104087, 104292, 104376, 104405, 104824, 105025, 105036, 105134, 105279, 105343, 105379, 105496, 105640, 105653, 105670, 105768, 105827, 105888, 105943, 106185, 106537, 106558, 106665, 107010, 107054, 107121, 107399, 107459, 107549, 107588, 108025, 108117, 108198, 108342, 108349, 108524, 108679, 108734, 108746, 108885, 109053, 109165, 109247, 109320, 109570, 109598, 109730, 110020, 110029, 110035, 110132, 110267, 110614, 110727, 110955, 111180, 111215, 111252, 111399, 111552, 111567, 111766, 111969, 111986, 112201, 112437, 112489, 112507, 112550, 112699, 112842, 112986, 113071, 113281, 113341, 113425, 113556, 113790, 113849, 113887, 114937, 115120, 115506, 115597, 115936, 116042, 116063, 116090, 116205, 116340, 116524, 116727, 116901, 116906, 116928, 117074, 117077, 117398, 117471, 117761, 117894, 117962, 118035, 118049, 118106, 118108, 118543, 118627, 118999, 119279, 119326, 119353, 119836, 119956, 120220, 120277, 120372, 120459, 120485, 120913, 120957, 121022, 121239, 121269, 121419, 121459, 121578, 121759, 121824, 121879, 121955, 122006, 122066, 122228, 122330, 122479, 122492, 122635, 122666, 122678, 122755, 122954, 122994, 123327, 123398, 123455, 123557, 123592, 123638, 123781, 123849, 124065, 124082, 124305, 124328, 124352, 124693, 124696, 124698, 124709, 124805, 124855, 124867, 124925, 124936, 125110, 125153, 125330, 125406, 125674, 125885, 126169, 126429, 126803, 126957, 127064, 127312, 127561, 127578, 127836, 127988, 128121, 128203, 128324, 128435, 128587, 128659, 128931, 128991, 129210, 129329, 129445, 129466, 129667, 130093, 130320, 130576, 130667, 131183, 131233, 131352, 131438, 131506, 131565, 131581, 131589, 131759, 131824, 131970, 132259, 132396, 132453, 132557, 132925, 133119, 133166, 133196, 133354, 133426, 133485, 133902, 134381, 134553, 134668, 134690, 135022, 135105, 135224, 135393, 135735, 136697, 137689, 137961, 138111, 138200, 138387, 139089, 139142, 139438, 139531, 139579, 139662, 139664, 140061, 140306, 140439, 140865, 140880, 141205, 141209, 141210, 141220, 141247, 142024, 142053, 142260, 142415, 142528, 142607, 142638, 142706, 143039, 143084, 143206, 143369, 143496, 143790, 143839, 143917, 143954, 143974, 144257, 144564, 144679, 144706, 145234, 145320, 145656, 145660, 145703, 145730, 145764, 145765, 145821, 146099, 146494, 146675, 146786, 147077, 147090, 147335, 147368, 147482, 147536, 147553, 147633, 147748, 147823, 147962, 147989, 148039, 148389, 148491, 148723, 148735, 148934, 149081, 149345, 149435, 149478, 149654, 149716, 149762, 149773, 150764, 150814, 150839, 150857, 150929, 151041, 151118, 151175, 151219, 151633, 151644, 151651, 151840, 152040, 152165, 152291, 152429, 152686, 152802, 152977, 153171, 153401, 153408, 153436, 153774, 153913, 154124, 154176, 154553, 154554, 154555, 154556, 154557, 154559, 154562, 154563, 154564, 154569, 154570, 154574, 154578, 154585, 154586, 154589, 154590, 154592, 154593, 154595, 154596, 154597, 154599, 154604, 154610, 154611, 154612, 154614, 154615, 154619, 154625, 154626, 154627, 154628, 154630, 154631, 154632, 154636, 154638, 154639, 154640, 154642, 154643, 154644, 154645, 154648, 154649, 154654, 154657, 154658, 154663, 154664, 154666, 154668, 154669, 154672, 154676, 154677, 154679, 154681, 154682, 154684, 154685, 154688, 154691, 154694, 154696, 154698, 154699, 154700, 154702, 154707, 154708, 154712, 154714, 154715, 154718, 154720, 154721, 154722, 154723, 154725, 154727, 154733, 154738, 154739, 154744, 154748, 154751, 154752, 154755, 154758, 154760, 154765, 154770, 154773, 154776, 154785, 154786, 154788, 154789, 154798, 154799, 154801, 154804, 154805, 154813, 154823, 154828, 154834, 154835, 154836, 154841, 154846, 154857, 154859, 154864, 154876, 154886, 154892, 154893, 154898, 154903, 154925, 154935, 154939, 154948, 154950, 154954, 154955, 154967, 154974, 154999, 155006, 155011, 155028, 155031, 155065, 155073, 155081, 155144, 155234, 155272, 155282, 155327, 155458, 155522, 155531, 155556, 155559, 155569, 155586, 155599, 155633, 155703, 155773, 155791, 155853, 155884, 155934, 155956, 155964, 155975, 155978, 155986, 156001, 156017, 156046, 156049, 156125, 156128, 156184, 156185, 156186, 156189, 156263, 156269, 156291, 156346, 156370, 156388, 156390, 156399, 156429, 156449, 156495, 156502, 156553] 
+0

何が 'index'ですか?実際には、単一の線を最適化するように指示するのではなく、何を達成しようとしているのかを教えてください。 –

+0

プロンプトの提案に感謝します。私はあなたのソリューションを試しましたが、私のプログラムはグラフを生成するのに約8〜10秒かかりました。 –

+0

'df1 ['result']。apply(np.isnan)'は理想的ではありません。 df1 ['result']を使用してください。isnull() ' –

答えて

2

あなたのコード:

index = df1['result'].index[df1['result'].apply(np.isnan)] 
df_index = df1.index.values.tolist() 
x = [df_index.index(i) for i in index] 

リストのindexメソッドが毎回先頭から繰り返されるので、2次の時間になります。また、要素の発生がの最初のの結果を返し、ブール値のリストがあるため、間違っている可能性があります。おそらく、あなたは望みます:

np.where(index) 
+0

ありがとう、これは働いた。 –

関連する問題