├── Heart Disease Prediction.ipynb ├── Heart Disease Prediction.py └── heart.csv /Heart Disease Prediction.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding: utf-8 3 | 4 | # In[2]: 5 | 6 | 7 | import sklearn 8 | import numpy as np 9 | import pandas as pd 10 | import plotly as plot 11 | import plotly.express as px 12 | import plotly.graph_objs as go 13 | 14 | import cufflinks as cf 15 | import matplotlib.pyplot as plt 16 | import seaborn as sns 17 | import os 18 | from sklearn.metrics import accuracy_score 19 | import plotly.offline as pyo 20 | from plotly.offline import init_notebook_mode,plot,iplot 21 | 22 | 23 | # In[3]: 24 | 25 | 26 | pyo.init_notebook_mode(connected=True) 27 | cf.go_offline() 28 | 29 | 30 | # In[4]: 31 | 32 | 33 | heart=pd.read_csv(r'C:\Python37\Projects\ALL ML-DL-DS Projects from Udemy and other Sources\Data_Science\ML_Casestudies-master\heart disease\heart.csv') 34 | 35 | 36 | # In[5]: 37 | 38 | 39 | heart 40 | 41 | 42 | # In[6]: 43 | 44 | 45 | info = ["age","1: male, 0: female","chest pain type, 1: typical angina, 2: atypical angina, 3: non-anginal pain, 4: asymptomatic","resting blood pressure"," serum cholestoral in mg/dl","fasting blood sugar > 120 mg/dl","resting electrocardiographic results (values 0,1,2)"," maximum heart rate achieved","exercise induced angina","oldpeak = ST depression induced by exercise relative to rest","the slope of the peak exercise ST segment","number of major vessels (0-3) colored by flourosopy","thal: 3 = normal; 6 = fixed defect; 7 = reversable defect"] 46 | 47 | 48 | 49 | for i in range(len(info)): 50 | print(heart.columns[i]+":\t\t\t"+info[i]) 51 | 52 | 53 | # In[ ]: 54 | 55 | 56 | 57 | 58 | 59 | # In[7]: 60 | 61 | 62 | heart['target'] 63 | 64 | 65 | # In[8]: 66 | 67 | 68 | heart.groupby('target').size() 69 | 70 | 71 | # In[9]: 72 | 73 | 74 | heart.groupby('target').sum() 75 | 76 | 77 | # In[10]: 78 | 79 | 80 | heart.shape 81 | 82 | 83 | # In[11]: 84 | 85 | 86 | heart.size 87 | 88 | 89 | # In[12]: 90 | 91 | 92 | heart.describe() 93 | 94 | 95 | # In[ ]: 96 | 97 | 98 | 99 | 100 | 101 | # In[13]: 102 | 103 | 104 | heart.info() 105 | 106 | 107 | # In[14]: 108 | 109 | 110 | heart['target'].unique() 111 | 112 | 113 | # In[ ]: 114 | 115 | 116 | 117 | 118 | 119 | # In[15]: 120 | 121 | 122 | #Visualization 123 | 124 | 125 | # In[16]: 126 | 127 | 128 | heart.hist(figsize=(14,14)) 129 | plt.show() 130 | 131 | 132 | # In[ ]: 133 | 134 | 135 | 136 | 137 | 138 | # In[17]: 139 | 140 | 141 | plt.bar(x=heart['sex'],height=heart['age']) 142 | plt.show() 143 | 144 | 145 | # In[18]: 146 | 147 | 148 | sns.barplot(x="fbs", y="target", data=heart) 149 | plt.show() 150 | 151 | 152 | # In[19]: 153 | 154 | 155 | sns.barplot(x=heart['sex'],y=heart['age'],hue=heart['target']) 156 | 157 | 158 | # In[20]: 159 | 160 | 161 | sns.barplot(heart["cp"],heart['target']) 162 | 163 | 164 | # In[21]: 165 | 166 | 167 | sns.barplot(heart["sex"],heart['target']) 168 | 169 | 170 | # In[ ]: 171 | 172 | 173 | 174 | 175 | 176 | # In[25]: 177 | 178 | 179 | px.bar(heart,heart['sex'],heart['target']) 180 | 181 | 182 | # In[26]: 183 | 184 | 185 | sns.distplot(heart["thal"]) 186 | 187 | 188 | # In[27]: 189 | 190 | 191 | sns.distplot(heart["chol"]) 192 | 193 | 194 | # In[28]: 195 | 196 | 197 | sns.pairplot(heart,hue='target') 198 | 199 | 200 | # In[29]: 201 | 202 | 203 | heart 204 | 205 | 206 | # In[30]: 207 | 208 | 209 | numeric_columns=['trestbps','chol','thalach','age','oldpeak'] 210 | 211 | 212 | # In[31]: 213 | 214 | 215 | sns.pairplot(heart[numeric_columns]) 216 | 217 | 218 | # In[32]: 219 | 220 | 221 | heart['target'] 222 | 223 | 224 | # In[33]: 225 | 226 | 227 | y = heart["target"] 228 | 229 | sns.countplot(y) 230 | 231 | target_temp = heart.target.value_counts() 232 | 233 | print(target_temp) 234 | 235 | 236 | # In[ ]: 237 | 238 | 239 | 240 | 241 | 242 | # In[34]: 243 | 244 | 245 | # create a correlation heatmap 246 | sns.heatmap(heart[numeric_columns].corr(),annot=True, cmap='terrain', linewidths=0.1) 247 | fig=plt.gcf() 248 | fig.set_size_inches(8,6) 249 | plt.show() 250 | 251 | 252 | # In[ ]: 253 | 254 | 255 | 256 | 257 | 258 | # In[ ]: 259 | 260 | 261 | 262 | 263 | 264 | # In[35]: 265 | 266 | 267 | # create four distplots 268 | plt.figure(figsize=(12,10)) 269 | plt.subplot(221) 270 | sns.distplot(heart[heart['target']==0].age) 271 | plt.title('Age of patients without heart disease') 272 | plt.subplot(222) 273 | sns.distplot(heart[heart['target']==1].age) 274 | plt.title('Age of patients with heart disease') 275 | plt.subplot(223) 276 | sns.distplot(heart[heart['target']==0].thalach ) 277 | plt.title('Max heart rate of patients without heart disease') 278 | plt.subplot(224) 279 | sns.distplot(heart[heart['target']==1].thalach ) 280 | plt.title('Max heart rate of patients with heart disease') 281 | plt.show() 282 | 283 | 284 | # In[36]: 285 | 286 | 287 | plt.figure(figsize=(13,6)) 288 | plt.subplot(121) 289 | sns.violinplot(x="target", y="thalach", data=heart, inner=None) 290 | sns.swarmplot(x="target", y="thalach", data=heart, color='w', alpha=0.5) 291 | 292 | 293 | plt.subplot(122) 294 | sns.swarmplot(x="target", y="thalach", data=heart) 295 | plt.show() 296 | 297 | 298 | # In[ ]: 299 | 300 | 301 | 302 | 303 | 304 | # In[37]: 305 | 306 | 307 | heart 308 | 309 | 310 | # In[38]: 311 | 312 | 313 | # create pairplot and two barplots 314 | plt.figure(figsize=(16,6)) 315 | plt.subplot(131) 316 | sns.pointplot(x="sex", y="target", hue='cp', data=heart) 317 | plt.legend(['male = 1', 'female = 0']) 318 | plt.subplot(132) 319 | sns.barplot(x="exang", y="target", data=heart) 320 | plt.legend(['yes = 1', 'no = 0']) 321 | plt.subplot(133) 322 | sns.countplot(x="slope", hue='target', data=heart) 323 | plt.show() 324 | 325 | 326 | # In[ ]: 327 | 328 | 329 | 330 | 331 | 332 | # In[ ]: 333 | 334 | 335 | 336 | 337 | 338 | # In[39]: 339 | 340 | 341 | #DATA Preprocessing 342 | 343 | 344 | # In[40]: 345 | 346 | 347 | ######################################################################################## 348 | 349 | 350 | # In[41]: 351 | 352 | 353 | heart['target'].value_counts() 354 | 355 | 356 | # In[42]: 357 | 358 | 359 | heart['target'].isnull() 360 | 361 | 362 | # In[43]: 363 | 364 | 365 | heart['target'].sum() 366 | 367 | 368 | # In[44]: 369 | 370 | 371 | heart['target'].unique() 372 | 373 | 374 | # In[45]: 375 | 376 | 377 | ####################################################################################################3 378 | 379 | 380 | # In[ ]: 381 | 382 | 383 | 384 | 385 | 386 | # In[46]: 387 | 388 | 389 | heart.isnull().sum() 390 | 391 | 392 | # In[ ]: 393 | 394 | 395 | 396 | 397 | 398 | # In[ ]: 399 | 400 | 401 | 402 | 403 | 404 | # In[47]: 405 | 406 | 407 | #Storing in X and y 408 | 409 | 410 | # In[48]: 411 | 412 | 413 | X,y=heart.loc[:,:'thal'],heart.loc[:,'target'] 414 | 415 | 416 | # In[49]: 417 | 418 | 419 | X 420 | 421 | 422 | # In[50]: 423 | 424 | 425 | y 426 | 427 | 428 | # In[51]: 429 | 430 | 431 | ####Or X, y = heart.iloc[:, :-1], heart.iloc[:, -1] 432 | 433 | 434 | # In[52]: 435 | 436 | 437 | X.shape 438 | 439 | 440 | # In[53]: 441 | 442 | 443 | y.shape 444 | 445 | 446 | # In[54]: 447 | 448 | 449 | from sklearn.model_selection import train_test_split 450 | from sklearn.preprocessing import StandardScaler 451 | 452 | 453 | # In[55]: 454 | 455 | 456 | X=heart.drop(['target'],axis=1) 457 | 458 | 459 | # In[56]: 460 | 461 | 462 | #X=np.array(X) 463 | 464 | 465 | # In[57]: 466 | 467 | 468 | X 469 | 470 | 471 | # In[58]: 472 | 473 | 474 | X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=10,test_size=0.3,shuffle=True) 475 | 476 | 477 | # In[59]: 478 | 479 | 480 | X_test 481 | 482 | 483 | # In[60]: 484 | 485 | 486 | y_test 487 | 488 | 489 | # In[ ]: 490 | 491 | 492 | 493 | 494 | 495 | # In[ ]: 496 | 497 | 498 | 499 | 500 | 501 | # In[61]: 502 | 503 | 504 | print ("train_set_x shape: " + str(X_train.shape)) 505 | print ("train_set_y shape: " + str(y_train.shape)) 506 | print ("test_set_x shape: " + str(X_test.shape)) 507 | print ("test_set_y shape: " + str(y_test.shape)) 508 | 509 | 510 | # In[ ]: 511 | 512 | 513 | 514 | 515 | 516 | # In[ ]: 517 | 518 | 519 | 520 | 521 | 522 | # In[ ]: 523 | 524 | 525 | 526 | 527 | 528 | # In[62]: 529 | 530 | 531 | #Model 532 | 533 | 534 | # In[63]: 535 | 536 | 537 | #Decision Tree Classifier 538 | 539 | 540 | # In[64]: 541 | 542 | 543 | Catagory=['No....but i pray you get Heart Disease or at leaset Corona Virus Soon...','Yes you have Heart Disease....RIP in Advance'] 544 | 545 | 546 | # In[65]: 547 | 548 | 549 | from sklearn.tree import DecisionTreeClassifier 550 | 551 | 552 | dt=DecisionTreeClassifier() 553 | dt.fit(X_train,y_train) 554 | 555 | 556 | # In[66]: 557 | 558 | 559 | prediction=dt.predict(X_test) 560 | accuracy_dt=accuracy_score(y_test,prediction)*100 561 | 562 | 563 | # In[67]: 564 | 565 | 566 | accuracy_dt 567 | 568 | 569 | # In[68]: 570 | 571 | 572 | print("Accuracy on training set: {:.3f}".format(dt.score(X_train, y_train))) 573 | print("Accuracy on test set: {:.3f}".format(dt.score(X_test, y_test))) 574 | 575 | 576 | # In[ ]: 577 | 578 | 579 | 580 | 581 | 582 | # In[69]: 583 | 584 | 585 | y_test 586 | 587 | 588 | # In[70]: 589 | 590 | 591 | prediction 592 | 593 | 594 | # In[ ]: 595 | 596 | 597 | 598 | 599 | 600 | # In[71]: 601 | 602 | 603 | X_DT=np.array([[63 ,1, 3,145,233,1,0,150,0,2.3,0,0,1]]) 604 | X_DT_prediction=dt.predict(X_DT) 605 | 606 | 607 | # In[72]: 608 | 609 | 610 | X_DT_prediction[0] 611 | 612 | 613 | # In[73]: 614 | 615 | 616 | print(Catagory[int(X_DT_prediction[0])]) 617 | 618 | 619 | # In[ ]: 620 | 621 | 622 | 623 | 624 | 625 | # In[74]: 626 | 627 | 628 | #Feature Importance in Decision Trees 629 | 630 | 631 | # In[75]: 632 | 633 | 634 | print("Feature importances:\n{}".format(dt.feature_importances_)) 635 | 636 | 637 | # In[76]: 638 | 639 | 640 | def plot_feature_importances_diabetes(model): 641 | plt.figure(figsize=(8,6)) 642 | n_features = 13 643 | plt.barh(range(n_features), model.feature_importances_, align='center') 644 | plt.yticks(np.arange(n_features), X) 645 | plt.xlabel("Feature importance") 646 | plt.ylabel("Feature") 647 | plt.ylim(-1, n_features) 648 | plot_feature_importances_diabetes(dt) 649 | plt.savefig('feature_importance') 650 | 651 | 652 | # In[ ]: 653 | 654 | 655 | 656 | 657 | 658 | # In[ ]: 659 | 660 | 661 | 662 | 663 | 664 | # In[ ]: 665 | 666 | 667 | 668 | 669 | 670 | # In[ ]: 671 | 672 | 673 | 674 | 675 | 676 | # In[ ]: 677 | 678 | 679 | 680 | 681 | 682 | # In[ ]: 683 | 684 | 685 | 686 | 687 | 688 | # In[ ]: 689 | 690 | 691 | 692 | 693 | 694 | # In[77]: 695 | 696 | 697 | # KNN 698 | 699 | 700 | # In[78]: 701 | 702 | 703 | sc=StandardScaler().fit(X_train) 704 | X_train_std=sc.transform(X_train) 705 | X_test_std=sc.transform(X_test) 706 | 707 | 708 | # In[79]: 709 | 710 | 711 | X_test_std 712 | 713 | 714 | # In[80]: 715 | 716 | 717 | from sklearn.neighbors import KNeighborsClassifier 718 | 719 | knn=KNeighborsClassifier(n_neighbors=4) 720 | knn.fit(X_train_std,y_train) 721 | 722 | 723 | # In[81]: 724 | 725 | 726 | prediction_knn=knn.predict(X_test_std) 727 | accuracy_knn=accuracy_score(y_test,prediction_knn)*100 728 | 729 | 730 | # In[82]: 731 | 732 | 733 | accuracy_knn 734 | 735 | 736 | # In[83]: 737 | 738 | 739 | print("Accuracy on training set: {:.3f}".format(knn.score(X_train, y_train))) 740 | print("Accuracy on test set: {:.3f}".format(knn.score(X_test, y_test))) 741 | 742 | 743 | # In[ ]: 744 | 745 | 746 | 747 | 748 | 749 | # In[84]: 750 | 751 | 752 | k_range=range(1,26) 753 | scores={} 754 | scores_list=[] 755 | 756 | for k in k_range: 757 | knn=KNeighborsClassifier(n_neighbors=k) 758 | knn.fit(X_train_std,y_train) 759 | prediction_knn=knn.predict(X_test_std) 760 | scores[k]=accuracy_score(y_test,prediction_knn) 761 | scores_list.append(accuracy_score(y_test,prediction_knn)) 762 | 763 | 764 | # In[85]: 765 | 766 | 767 | scores 768 | 769 | 770 | # In[86]: 771 | 772 | 773 | plt.plot(k_range,scores_list) 774 | 775 | 776 | # In[87]: 777 | 778 | 779 | px.line(x=k_range,y=scores_list) 780 | 781 | 782 | # In[ ]: 783 | 784 | 785 | 786 | 787 | 788 | # In[ ]: 789 | 790 | 791 | 792 | 793 | 794 | # In[88]: 795 | 796 | 797 | X_knn=np.array([[63 ,1, 3,145,233,1,0,150,0,2.3,0,0,1]]) 798 | X_knn_std=sc.transform(X_knn) 799 | X_knn_prediction=dt.predict(X_knn) 800 | 801 | 802 | # In[89]: 803 | 804 | 805 | X_knn_std 806 | 807 | 808 | # In[90]: 809 | 810 | 811 | (X_knn_prediction[0]) 812 | 813 | 814 | # In[91]: 815 | 816 | 817 | print(Catagory[int(X_knn_prediction[0])]) 818 | 819 | 820 | # In[ ]: 821 | 822 | 823 | 824 | 825 | 826 | # In[92]: 827 | 828 | 829 | algorithms=['Decision Tree','KNN'] 830 | scores=[accuracy_dt,accuracy_knn] 831 | 832 | 833 | # In[93]: 834 | 835 | 836 | sns.set(rc={'figure.figsize':(15,7)}) 837 | plt.xlabel("Algorithms") 838 | plt.ylabel("Accuracy score") 839 | 840 | sns.barplot(algorithms,scores) 841 | 842 | 843 | # In[ ]: 844 | 845 | 846 | 847 | 848 | 849 | # In[ ]: 850 | 851 | 852 | 853 | 854 | 855 | # In[ ]: 856 | 857 | 858 | 859 | 860 | -------------------------------------------------------------------------------- /heart.csv: -------------------------------------------------------------------------------- 1 | age,sex,cp,trestbps,chol,fbs,restecg,thalach,exang,oldpeak,slope,ca,thal,target 2 | 63,1,3,145,233,1,0,150,0,2.3,0,0,1,1 3 | 37,1,2,130,250,0,1,187,0,3.5,0,0,2,1 4 | 41,0,1,130,204,0,0,172,0,1.4,2,0,2,1 5 | 56,1,1,120,236,0,1,178,0,0.8,2,0,2,1 6 | 57,0,0,120,354,0,1,163,1,0.6,2,0,2,1 7 | 57,1,0,140,192,0,1,148,0,0.4,1,0,1,1 8 | 56,0,1,140,294,0,0,153,0,1.3,1,0,2,1 9 | 44,1,1,120,263,0,1,173,0,0,2,0,3,1 10 | 52,1,2,172,199,1,1,162,0,0.5,2,0,3,1 11 | 57,1,2,150,168,0,1,174,0,1.6,2,0,2,1 12 | 54,1,0,140,239,0,1,160,0,1.2,2,0,2,1 13 | 48,0,2,130,275,0,1,139,0,0.2,2,0,2,1 14 | 49,1,1,130,266,0,1,171,0,0.6,2,0,2,1 15 | 64,1,3,110,211,0,0,144,1,1.8,1,0,2,1 16 | 58,0,3,150,283,1,0,162,0,1,2,0,2,1 17 | 50,0,2,120,219,0,1,158,0,1.6,1,0,2,1 18 | 58,0,2,120,340,0,1,172,0,0,2,0,2,1 19 | 66,0,3,150,226,0,1,114,0,2.6,0,0,2,1 20 | 43,1,0,150,247,0,1,171,0,1.5,2,0,2,1 21 | 69,0,3,140,239,0,1,151,0,1.8,2,2,2,1 22 | 59,1,0,135,234,0,1,161,0,0.5,1,0,3,1 23 | 44,1,2,130,233,0,1,179,1,0.4,2,0,2,1 24 | 42,1,0,140,226,0,1,178,0,0,2,0,2,1 25 | 61,1,2,150,243,1,1,137,1,1,1,0,2,1 26 | 40,1,3,140,199,0,1,178,1,1.4,2,0,3,1 27 | 71,0,1,160,302,0,1,162,0,0.4,2,2,2,1 28 | 59,1,2,150,212,1,1,157,0,1.6,2,0,2,1 29 | 51,1,2,110,175,0,1,123,0,0.6,2,0,2,1 30 | 65,0,2,140,417,1,0,157,0,0.8,2,1,2,1 31 | 53,1,2,130,197,1,0,152,0,1.2,0,0,2,1 32 | 41,0,1,105,198,0,1,168,0,0,2,1,2,1 33 | 65,1,0,120,177,0,1,140,0,0.4,2,0,3,1 34 | 44,1,1,130,219,0,0,188,0,0,2,0,2,1 35 | 54,1,2,125,273,0,0,152,0,0.5,0,1,2,1 36 | 51,1,3,125,213,0,0,125,1,1.4,2,1,2,1 37 | 46,0,2,142,177,0,0,160,1,1.4,0,0,2,1 38 | 54,0,2,135,304,1,1,170,0,0,2,0,2,1 39 | 54,1,2,150,232,0,0,165,0,1.6,2,0,3,1 40 | 65,0,2,155,269,0,1,148,0,0.8,2,0,2,1 41 | 65,0,2,160,360,0,0,151,0,0.8,2,0,2,1 42 | 51,0,2,140,308,0,0,142,0,1.5,2,1,2,1 43 | 48,1,1,130,245,0,0,180,0,0.2,1,0,2,1 44 | 45,1,0,104,208,0,0,148,1,3,1,0,2,1 45 | 53,0,0,130,264,0,0,143,0,0.4,1,0,2,1 46 | 39,1,2,140,321,0,0,182,0,0,2,0,2,1 47 | 52,1,1,120,325,0,1,172,0,0.2,2,0,2,1 48 | 44,1,2,140,235,0,0,180,0,0,2,0,2,1 49 | 47,1,2,138,257,0,0,156,0,0,2,0,2,1 50 | 53,0,2,128,216,0,0,115,0,0,2,0,0,1 51 | 53,0,0,138,234,0,0,160,0,0,2,0,2,1 52 | 51,0,2,130,256,0,0,149,0,0.5,2,0,2,1 53 | 66,1,0,120,302,0,0,151,0,0.4,1,0,2,1 54 | 62,1,2,130,231,0,1,146,0,1.8,1,3,3,1 55 | 44,0,2,108,141,0,1,175,0,0.6,1,0,2,1 56 | 63,0,2,135,252,0,0,172,0,0,2,0,2,1 57 | 52,1,1,134,201,0,1,158,0,0.8,2,1,2,1 58 | 48,1,0,122,222,0,0,186,0,0,2,0,2,1 59 | 45,1,0,115,260,0,0,185,0,0,2,0,2,1 60 | 34,1,3,118,182,0,0,174,0,0,2,0,2,1 61 | 57,0,0,128,303,0,0,159,0,0,2,1,2,1 62 | 71,0,2,110,265,1,0,130,0,0,2,1,2,1 63 | 54,1,1,108,309,0,1,156,0,0,2,0,3,1 64 | 52,1,3,118,186,0,0,190,0,0,1,0,1,1 65 | 41,1,1,135,203,0,1,132,0,0,1,0,1,1 66 | 58,1,2,140,211,1,0,165,0,0,2,0,2,1 67 | 35,0,0,138,183,0,1,182,0,1.4,2,0,2,1 68 | 51,1,2,100,222,0,1,143,1,1.2,1,0,2,1 69 | 45,0,1,130,234,0,0,175,0,0.6,1,0,2,1 70 | 44,1,1,120,220,0,1,170,0,0,2,0,2,1 71 | 62,0,0,124,209,0,1,163,0,0,2,0,2,1 72 | 54,1,2,120,258,0,0,147,0,0.4,1,0,3,1 73 | 51,1,2,94,227,0,1,154,1,0,2,1,3,1 74 | 29,1,1,130,204,0,0,202,0,0,2,0,2,1 75 | 51,1,0,140,261,0,0,186,1,0,2,0,2,1 76 | 43,0,2,122,213,0,1,165,0,0.2,1,0,2,1 77 | 55,0,1,135,250,0,0,161,0,1.4,1,0,2,1 78 | 51,1,2,125,245,1,0,166,0,2.4,1,0,2,1 79 | 59,1,1,140,221,0,1,164,1,0,2,0,2,1 80 | 52,1,1,128,205,1,1,184,0,0,2,0,2,1 81 | 58,1,2,105,240,0,0,154,1,0.6,1,0,3,1 82 | 41,1,2,112,250,0,1,179,0,0,2,0,2,1 83 | 45,1,1,128,308,0,0,170,0,0,2,0,2,1 84 | 60,0,2,102,318,0,1,160,0,0,2,1,2,1 85 | 52,1,3,152,298,1,1,178,0,1.2,1,0,3,1 86 | 42,0,0,102,265,0,0,122,0,0.6,1,0,2,1 87 | 67,0,2,115,564,0,0,160,0,1.6,1,0,3,1 88 | 68,1,2,118,277,0,1,151,0,1,2,1,3,1 89 | 46,1,1,101,197,1,1,156,0,0,2,0,3,1 90 | 54,0,2,110,214,0,1,158,0,1.6,1,0,2,1 91 | 58,0,0,100,248,0,0,122,0,1,1,0,2,1 92 | 48,1,2,124,255,1,1,175,0,0,2,2,2,1 93 | 57,1,0,132,207,0,1,168,1,0,2,0,3,1 94 | 52,1,2,138,223,0,1,169,0,0,2,4,2,1 95 | 54,0,1,132,288,1,0,159,1,0,2,1,2,1 96 | 45,0,1,112,160,0,1,138,0,0,1,0,2,1 97 | 53,1,0,142,226,0,0,111,1,0,2,0,3,1 98 | 62,0,0,140,394,0,0,157,0,1.2,1,0,2,1 99 | 52,1,0,108,233,1,1,147,0,0.1,2,3,3,1 100 | 43,1,2,130,315,0,1,162,0,1.9,2,1,2,1 101 | 53,1,2,130,246,1,0,173,0,0,2,3,2,1 102 | 42,1,3,148,244,0,0,178,0,0.8,2,2,2,1 103 | 59,1,3,178,270,0,0,145,0,4.2,0,0,3,1 104 | 63,0,1,140,195,0,1,179,0,0,2,2,2,1 105 | 42,1,2,120,240,1,1,194,0,0.8,0,0,3,1 106 | 50,1,2,129,196,0,1,163,0,0,2,0,2,1 107 | 68,0,2,120,211,0,0,115,0,1.5,1,0,2,1 108 | 69,1,3,160,234,1,0,131,0,0.1,1,1,2,1 109 | 45,0,0,138,236,0,0,152,1,0.2,1,0,2,1 110 | 50,0,1,120,244,0,1,162,0,1.1,2,0,2,1 111 | 50,0,0,110,254,0,0,159,0,0,2,0,2,1 112 | 64,0,0,180,325,0,1,154,1,0,2,0,2,1 113 | 57,1,2,150,126,1,1,173,0,0.2,2,1,3,1 114 | 64,0,2,140,313,0,1,133,0,0.2,2,0,3,1 115 | 43,1,0,110,211,0,1,161,0,0,2,0,3,1 116 | 55,1,1,130,262,0,1,155,0,0,2,0,2,1 117 | 37,0,2,120,215,0,1,170,0,0,2,0,2,1 118 | 41,1,2,130,214,0,0,168,0,2,1,0,2,1 119 | 56,1,3,120,193,0,0,162,0,1.9,1,0,3,1 120 | 46,0,1,105,204,0,1,172,0,0,2,0,2,1 121 | 46,0,0,138,243,0,0,152,1,0,1,0,2,1 122 | 64,0,0,130,303,0,1,122,0,2,1,2,2,1 123 | 59,1,0,138,271,0,0,182,0,0,2,0,2,1 124 | 41,0,2,112,268,0,0,172,1,0,2,0,2,1 125 | 54,0,2,108,267,0,0,167,0,0,2,0,2,1 126 | 39,0,2,94,199,0,1,179,0,0,2,0,2,1 127 | 34,0,1,118,210,0,1,192,0,0.7,2,0,2,1 128 | 47,1,0,112,204,0,1,143,0,0.1,2,0,2,1 129 | 67,0,2,152,277,0,1,172,0,0,2,1,2,1 130 | 52,0,2,136,196,0,0,169,0,0.1,1,0,2,1 131 | 74,0,1,120,269,0,0,121,1,0.2,2,1,2,1 132 | 54,0,2,160,201,0,1,163,0,0,2,1,2,1 133 | 49,0,1,134,271,0,1,162,0,0,1,0,2,1 134 | 42,1,1,120,295,0,1,162,0,0,2,0,2,1 135 | 41,1,1,110,235,0,1,153,0,0,2,0,2,1 136 | 41,0,1,126,306,0,1,163,0,0,2,0,2,1 137 | 49,0,0,130,269,0,1,163,0,0,2,0,2,1 138 | 60,0,2,120,178,1,1,96,0,0,2,0,2,1 139 | 62,1,1,128,208,1,0,140,0,0,2,0,2,1 140 | 57,1,0,110,201,0,1,126,1,1.5,1,0,1,1 141 | 64,1,0,128,263,0,1,105,1,0.2,1,1,3,1 142 | 51,0,2,120,295,0,0,157,0,0.6,2,0,2,1 143 | 43,1,0,115,303,0,1,181,0,1.2,1,0,2,1 144 | 42,0,2,120,209,0,1,173,0,0,1,0,2,1 145 | 67,0,0,106,223,0,1,142,0,0.3,2,2,2,1 146 | 76,0,2,140,197,0,2,116,0,1.1,1,0,2,1 147 | 70,1,1,156,245,0,0,143,0,0,2,0,2,1 148 | 44,0,2,118,242,0,1,149,0,0.3,1,1,2,1 149 | 60,0,3,150,240,0,1,171,0,0.9,2,0,2,1 150 | 44,1,2,120,226,0,1,169,0,0,2,0,2,1 151 | 42,1,2,130,180,0,1,150,0,0,2,0,2,1 152 | 66,1,0,160,228,0,0,138,0,2.3,2,0,1,1 153 | 71,0,0,112,149,0,1,125,0,1.6,1,0,2,1 154 | 64,1,3,170,227,0,0,155,0,0.6,1,0,3,1 155 | 66,0,2,146,278,0,0,152,0,0,1,1,2,1 156 | 39,0,2,138,220,0,1,152,0,0,1,0,2,1 157 | 58,0,0,130,197,0,1,131,0,0.6,1,0,2,1 158 | 47,1,2,130,253,0,1,179,0,0,2,0,2,1 159 | 35,1,1,122,192,0,1,174,0,0,2,0,2,1 160 | 58,1,1,125,220,0,1,144,0,0.4,1,4,3,1 161 | 56,1,1,130,221,0,0,163,0,0,2,0,3,1 162 | 56,1,1,120,240,0,1,169,0,0,0,0,2,1 163 | 55,0,1,132,342,0,1,166,0,1.2,2,0,2,1 164 | 41,1,1,120,157,0,1,182,0,0,2,0,2,1 165 | 38,1,2,138,175,0,1,173,0,0,2,4,2,1 166 | 38,1,2,138,175,0,1,173,0,0,2,4,2,1 167 | 67,1,0,160,286,0,0,108,1,1.5,1,3,2,0 168 | 67,1,0,120,229,0,0,129,1,2.6,1,2,3,0 169 | 62,0,0,140,268,0,0,160,0,3.6,0,2,2,0 170 | 63,1,0,130,254,0,0,147,0,1.4,1,1,3,0 171 | 53,1,0,140,203,1,0,155,1,3.1,0,0,3,0 172 | 56,1,2,130,256,1,0,142,1,0.6,1,1,1,0 173 | 48,1,1,110,229,0,1,168,0,1,0,0,3,0 174 | 58,1,1,120,284,0,0,160,0,1.8,1,0,2,0 175 | 58,1,2,132,224,0,0,173,0,3.2,2,2,3,0 176 | 60,1,0,130,206,0,0,132,1,2.4,1,2,3,0 177 | 40,1,0,110,167,0,0,114,1,2,1,0,3,0 178 | 60,1,0,117,230,1,1,160,1,1.4,2,2,3,0 179 | 64,1,2,140,335,0,1,158,0,0,2,0,2,0 180 | 43,1,0,120,177,0,0,120,1,2.5,1,0,3,0 181 | 57,1,0,150,276,0,0,112,1,0.6,1,1,1,0 182 | 55,1,0,132,353,0,1,132,1,1.2,1,1,3,0 183 | 65,0,0,150,225,0,0,114,0,1,1,3,3,0 184 | 61,0,0,130,330,0,0,169,0,0,2,0,2,0 185 | 58,1,2,112,230,0,0,165,0,2.5,1,1,3,0 186 | 50,1,0,150,243,0,0,128,0,2.6,1,0,3,0 187 | 44,1,0,112,290,0,0,153,0,0,2,1,2,0 188 | 60,1,0,130,253,0,1,144,1,1.4,2,1,3,0 189 | 54,1,0,124,266,0,0,109,1,2.2,1,1,3,0 190 | 50,1,2,140,233,0,1,163,0,0.6,1,1,3,0 191 | 41,1,0,110,172,0,0,158,0,0,2,0,3,0 192 | 51,0,0,130,305,0,1,142,1,1.2,1,0,3,0 193 | 58,1,0,128,216,0,0,131,1,2.2,1,3,3,0 194 | 54,1,0,120,188,0,1,113,0,1.4,1,1,3,0 195 | 60,1,0,145,282,0,0,142,1,2.8,1,2,3,0 196 | 60,1,2,140,185,0,0,155,0,3,1,0,2,0 197 | 59,1,0,170,326,0,0,140,1,3.4,0,0,3,0 198 | 46,1,2,150,231,0,1,147,0,3.6,1,0,2,0 199 | 67,1,0,125,254,1,1,163,0,0.2,1,2,3,0 200 | 62,1,0,120,267,0,1,99,1,1.8,1,2,3,0 201 | 65,1,0,110,248,0,0,158,0,0.6,2,2,1,0 202 | 44,1,0,110,197,0,0,177,0,0,2,1,2,0 203 | 60,1,0,125,258,0,0,141,1,2.8,1,1,3,0 204 | 58,1,0,150,270,0,0,111,1,0.8,2,0,3,0 205 | 68,1,2,180,274,1,0,150,1,1.6,1,0,3,0 206 | 62,0,0,160,164,0,0,145,0,6.2,0,3,3,0 207 | 52,1,0,128,255,0,1,161,1,0,2,1,3,0 208 | 59,1,0,110,239,0,0,142,1,1.2,1,1,3,0 209 | 60,0,0,150,258,0,0,157,0,2.6,1,2,3,0 210 | 49,1,2,120,188,0,1,139,0,2,1,3,3,0 211 | 59,1,0,140,177,0,1,162,1,0,2,1,3,0 212 | 57,1,2,128,229,0,0,150,0,0.4,1,1,3,0 213 | 61,1,0,120,260,0,1,140,1,3.6,1,1,3,0 214 | 39,1,0,118,219,0,1,140,0,1.2,1,0,3,0 215 | 61,0,0,145,307,0,0,146,1,1,1,0,3,0 216 | 56,1,0,125,249,1,0,144,1,1.2,1,1,2,0 217 | 43,0,0,132,341,1,0,136,1,3,1,0,3,0 218 | 62,0,2,130,263,0,1,97,0,1.2,1,1,3,0 219 | 63,1,0,130,330,1,0,132,1,1.8,2,3,3,0 220 | 65,1,0,135,254,0,0,127,0,2.8,1,1,3,0 221 | 48,1,0,130,256,1,0,150,1,0,2,2,3,0 222 | 63,0,0,150,407,0,0,154,0,4,1,3,3,0 223 | 55,1,0,140,217,0,1,111,1,5.6,0,0,3,0 224 | 65,1,3,138,282,1,0,174,0,1.4,1,1,2,0 225 | 56,0,0,200,288,1,0,133,1,4,0,2,3,0 226 | 54,1,0,110,239,0,1,126,1,2.8,1,1,3,0 227 | 70,1,0,145,174,0,1,125,1,2.6,0,0,3,0 228 | 62,1,1,120,281,0,0,103,0,1.4,1,1,3,0 229 | 35,1,0,120,198,0,1,130,1,1.6,1,0,3,0 230 | 59,1,3,170,288,0,0,159,0,0.2,1,0,3,0 231 | 64,1,2,125,309,0,1,131,1,1.8,1,0,3,0 232 | 47,1,2,108,243,0,1,152,0,0,2,0,2,0 233 | 57,1,0,165,289,1,0,124,0,1,1,3,3,0 234 | 55,1,0,160,289,0,0,145,1,0.8,1,1,3,0 235 | 64,1,0,120,246,0,0,96,1,2.2,0,1,2,0 236 | 70,1,0,130,322,0,0,109,0,2.4,1,3,2,0 237 | 51,1,0,140,299,0,1,173,1,1.6,2,0,3,0 238 | 58,1,0,125,300,0,0,171,0,0,2,2,3,0 239 | 60,1,0,140,293,0,0,170,0,1.2,1,2,3,0 240 | 77,1,0,125,304,0,0,162,1,0,2,3,2,0 241 | 35,1,0,126,282,0,0,156,1,0,2,0,3,0 242 | 70,1,2,160,269,0,1,112,1,2.9,1,1,3,0 243 | 59,0,0,174,249,0,1,143,1,0,1,0,2,0 244 | 64,1,0,145,212,0,0,132,0,2,1,2,1,0 245 | 57,1,0,152,274,0,1,88,1,1.2,1,1,3,0 246 | 56,1,0,132,184,0,0,105,1,2.1,1,1,1,0 247 | 48,1,0,124,274,0,0,166,0,0.5,1,0,3,0 248 | 56,0,0,134,409,0,0,150,1,1.9,1,2,3,0 249 | 66,1,1,160,246,0,1,120,1,0,1,3,1,0 250 | 54,1,1,192,283,0,0,195,0,0,2,1,3,0 251 | 69,1,2,140,254,0,0,146,0,2,1,3,3,0 252 | 51,1,0,140,298,0,1,122,1,4.2,1,3,3,0 253 | 43,1,0,132,247,1,0,143,1,0.1,1,4,3,0 254 | 62,0,0,138,294,1,1,106,0,1.9,1,3,2,0 255 | 67,1,0,100,299,0,0,125,1,0.9,1,2,2,0 256 | 59,1,3,160,273,0,0,125,0,0,2,0,2,0 257 | 45,1,0,142,309,0,0,147,1,0,1,3,3,0 258 | 58,1,0,128,259,0,0,130,1,3,1,2,3,0 259 | 50,1,0,144,200,0,0,126,1,0.9,1,0,3,0 260 | 62,0,0,150,244,0,1,154,1,1.4,1,0,2,0 261 | 38,1,3,120,231,0,1,182,1,3.8,1,0,3,0 262 | 66,0,0,178,228,1,1,165,1,1,1,2,3,0 263 | 52,1,0,112,230,0,1,160,0,0,2,1,2,0 264 | 53,1,0,123,282,0,1,95,1,2,1,2,3,0 265 | 63,0,0,108,269,0,1,169,1,1.8,1,2,2,0 266 | 54,1,0,110,206,0,0,108,1,0,1,1,2,0 267 | 66,1,0,112,212,0,0,132,1,0.1,2,1,2,0 268 | 55,0,0,180,327,0,2,117,1,3.4,1,0,2,0 269 | 49,1,2,118,149,0,0,126,0,0.8,2,3,2,0 270 | 54,1,0,122,286,0,0,116,1,3.2,1,2,2,0 271 | 56,1,0,130,283,1,0,103,1,1.6,0,0,3,0 272 | 46,1,0,120,249,0,0,144,0,0.8,2,0,3,0 273 | 61,1,3,134,234,0,1,145,0,2.6,1,2,2,0 274 | 67,1,0,120,237,0,1,71,0,1,1,0,2,0 275 | 58,1,0,100,234,0,1,156,0,0.1,2,1,3,0 276 | 47,1,0,110,275,0,0,118,1,1,1,1,2,0 277 | 52,1,0,125,212,0,1,168,0,1,2,2,3,0 278 | 58,1,0,146,218,0,1,105,0,2,1,1,3,0 279 | 57,1,1,124,261,0,1,141,0,0.3,2,0,3,0 280 | 58,0,1,136,319,1,0,152,0,0,2,2,2,0 281 | 61,1,0,138,166,0,0,125,1,3.6,1,1,2,0 282 | 42,1,0,136,315,0,1,125,1,1.8,1,0,1,0 283 | 52,1,0,128,204,1,1,156,1,1,1,0,0,0 284 | 59,1,2,126,218,1,1,134,0,2.2,1,1,1,0 285 | 40,1,0,152,223,0,1,181,0,0,2,0,3,0 286 | 61,1,0,140,207,0,0,138,1,1.9,2,1,3,0 287 | 46,1,0,140,311,0,1,120,1,1.8,1,2,3,0 288 | 59,1,3,134,204,0,1,162,0,0.8,2,2,2,0 289 | 57,1,1,154,232,0,0,164,0,0,2,1,2,0 290 | 57,1,0,110,335,0,1,143,1,3,1,1,3,0 291 | 55,0,0,128,205,0,2,130,1,2,1,1,3,0 292 | 61,1,0,148,203,0,1,161,0,0,2,1,3,0 293 | 58,1,0,114,318,0,2,140,0,4.4,0,3,1,0 294 | 58,0,0,170,225,1,0,146,1,2.8,1,2,1,0 295 | 67,1,2,152,212,0,0,150,0,0.8,1,0,3,0 296 | 44,1,0,120,169,0,1,144,1,2.8,0,0,1,0 297 | 63,1,0,140,187,0,0,144,1,4,2,2,3,0 298 | 63,0,0,124,197,0,1,136,1,0,1,0,2,0 299 | 59,1,0,164,176,1,0,90,0,1,1,2,1,0 300 | 57,0,0,140,241,0,1,123,1,0.2,1,0,3,0 301 | 45,1,3,110,264,0,1,132,0,1.2,1,0,3,0 302 | 68,1,0,144,193,1,1,141,0,3.4,1,2,3,0 303 | 57,1,0,130,131,0,1,115,1,1.2,1,1,3,0 304 | 57,0,1,130,236,0,0,174,0,0,1,1,2,0 305 | --------------------------------------------------------------------------------