GithubHelp home page GithubHelp logo

wglab / phenosv Goto Github PK

View Code? Open in Web Editor NEW
14.0 4.0 3.0 15.88 MB

PhenoSV: Interpretable phenotype-aware model for the prioritization of genes affected by structural variants.

License: MIT License

Python 97.52% Shell 2.48%
phenotyping structural-variants transformer variant-interpretation

phenosv's Introduction

PhenoSV: Interpretable phenotype-aware model for the prioritization of genes affected by structural variants.

DOI

Background

Structural variants (SVs) represent a major source of genetic variation and may be associated with phenotypic diversity and disease susceptibility. Recent advancements in long-read sequencing have revolutionized the field of SV detection, enabling the discovery of over 20,000 SVs per human genome. However, identifying and prioritizing disease-related SVs and assessing their functional impacts on individual genes remains challenging, especially for noncoding SVs.

PhenoSV is a phenotype-aware machine-learning model to predict pathogenicity of all types of structural variants (SVs) that disrupt either coding or noncoding genome regions, including deletions, duplications, insertions, inversions, and translocations. PhenoSV segments SVs and annotates each segment using hundreds of genomic features, then adopts a transformer-based architecture to predict functional impacts of SVs under a multiple-instance learning framework. When phenotype information is available, PhenoSV further utilizes gene-phenotype associations to prioritize disease-related SVs.

Web server

For SVs that affect less than 30 protein-coding genes (10 protein-coding genes each for batch predictions), we provide a web server at https://phenosv.wglab.org for easy applications of PhenoSV. If you want to score SVs that affect more than 30 genes or make batch predictions, please install PhenoSV and run offline.

Installation

Step1: install sources

To avoid package version conflicts, we strongly recommand to use conda to set up the environment. If you don't have conda installed, you can run codes below in linux to install.

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh 
bash Miniconda3-latest-Linux-x86_64.sh

After installing conda, PhenoSV sources can be downloaded:

git clone https://github.com/WGLab/PhenoSV.git
cd PhenoSV
conda env create --name phenosv --file phenosv.yml
conda activate phenosv

Step2: download and set up required files

Some files are required by PhenoSV, including genomic feature files, the pre-trained PhenoSV model, Phen2Gene knowledgebases, etc. All of these files required by the full version of PhenoSV have been packed together and can be downloaded using codes below. The packed file takes about 160G storage, please make sure to store these files under a directory with enough space. This directory can be different from the one used to save PhenoSV source codes. Due to the large size of feature files, this step might take some time. Simply run codes below to set up everything.

bash setup.sh /path/to/folder

We also offered a light-weight version of PhenoSV as a highly efficient alternative of PhenoSV. PhenoSV-light consists of only 42 features with much improved annotation efficiency without compromising predictive accuracy except for translocations. The packed file takes about 50G storage. Run the codes below to set up PhenoSV-light.

bash setup.sh /path/to/folder 'light'

Note that, users who downloaded the full set of required files using can excute both PhenoSV and PhenoSV-light. Users who downloaded the light version files can only excute PhenoSV-light.

If users need to change the path for storing required data files and would like to make changes for the config file, below codes can be excuted.

bash update_config.sh /path/to/newfolder 

Step3: install PhenoSV as a python package (optional)

This step is not required. If you want to integrate PhenoSV into your own python scripts, you can install PhenoSV as a python package following the steps above.

pip install -e .

Run PhenoSV in linux

In linux, PhenoSV can be used to:

  • score a single SV with or without prior phenotype knowledge
  • score a list of SVs in .bed, .csv, or .bedpe format with or without prior phenotype knowledge.

Type python3 phenosv/model/phenosv.py -h to see all options.

options:
  -h, --help            show this help message and exit
  --genome GENOME       choose genome build between hg38 (default) and hg19
  --alpha ALPHA         A positive value with larger value representing more contribution of phenotype information in refining PhenoSV
                        scores. Default is 1
  --inference INFERENCE
                        leave it blank (default) if only considering direct impacts of coding SVs. Set to `full` if inferring both
                        direct and indirect impacts of coding SVs
  --model MODEL         choose between PhenoSV (default) and PhenoSV-light
  --c C                 chromosome, e.g. chr1
  --s S                 start, e.g. 2378909
  --e E                 end, e.g. 2379909
  --c2 C2               chromosome2, e.g. chr1, only for translocation
  --s2 S2               start2, e.g. 2378909, only for translocation
  --strand1 STRAND1     strand1, + or - , only for translocation
  --strand2 STRAND2     strand2, + or - , only for translocation
  --svtype SVTYPE       deletion, duplication, insertion, inversion, translocation
  --noncoding NONCODING
                        inference mode, choose from distance and tad
  --HPO HPO             HPO terms should in the format of HP:digits, e.g., HP:0000707, separated by semicolons, commas, or
                        spaces.
  --sv_file SV_FILE     path to SV file (.csv, .bed, .bedpe)
  --target_folder TARGET_FOLDER
                        enter the folder path to save PhenoSV results, leave it blank if you only want to print out the results
  --target_file_name TARGET_FILE_NAME
                        enter the file name to save PhenoSV results

Score a single SV

The running time of PhenoSV to score a single SV depends on the number of genes it impacted. For the examples below, PhenoSV is expected to generate results within a few seconds.

deletion, duplication, insertion, inversion

Example1

You can use the following codes to score a single SV (deletion, duplication, insertion, inversion) easily by providing the SV location and type. The arguments required are: --c: chromosome, --s: start position, --e: end position (can be ignored by insertions), --svtype: types of SV.

python3 phenosv/model/phenosv.py --c chr6 --s 156994830 --e 157006982 --svtype 'deletion'
Example2

Since this example SV is a noncoding SV, PhenoSV's default setting is to consider genes within 1Mbp upstream and downstream impacted. PhenoSV can also consider genes based on consensus TAD annotation by setting --noncoding argument as 'tad'. Prior phenotype information can be added using --HPO argument. Here is an example:

python3 phenosv/model/phenosv.py --c chr6 --s 156994830 --e 157006982 --svtype 'deletion' --noncoding 'tad' --HPO 'HP:0000707,HP:0007598'

PhenoSV will output results below. Without considering phenotype information, PhenoSV predicts the SV-level pathogenicity as 0.65. The gene-level pathogenicity scores are 0.82 for ARID1B by disrupting its introns, 0.05 for NOX3, and 0.53 for TFB1M by indirectly altering their regulatory elements. After adding phenotype information, PhenoSV scores are 0.65 for the whole SV and 0.82 for ARID1B gene.

  Elements  Pathogenicity           Type  Phen2Gene   PhenoSV
0       SV       0.664912  Non-coding SV   0.999126  0.664331
1   ARID1B       0.823556       Intronic   0.999126  0.822836
2     NOX3       0.045648     Regulatory   0.837460  0.038229
3    TFB1M       0.533431     Regulatory   0.544762  0.290593

Example3

Another example as shown in the paper, we investigated the SV that indirectly impacting SOX9 (Kurth et al. 2009, GRCh38, chr17: 70134929-71339950, duplication). This is a coding SV impacting exons of gene KCNJ16 and KCNJ2, as seen below. The model only predict direct impacts of coding SVs on genes within the SV region by default, and the pathogenicity score is 0.07, very likely to be benign.

python3 phenosv/model/phenosv.py --c chr17 --s 70134929 --e 71339950 --svtype 'duplication'
  Elements  Pathogenicity           Type
0       SV       0.066281      Coding SV
1   KCNJ16       0.016484         Exonic
2    KCNJ2       0.088711         Exonic

We can set add argument of --inference 'full' to infer both direct and indirect impacts of coding SVs. Here the model predict the SV pathogenicity score as 0.69 throught impacting genes indirectly, whereas the gene-level pathogenicity scores for MAP2K6 and SOX9 are 0.59 and 0.61 respectively.

python3 phenosv/model/phenosv.py --c chr17 --s 70134929 --e 71339950 --svtype 'duplication' --inference 'full' --noncoding 'tad'
  Elements  Pathogenicity                Type
0       SV       0.066281           Coding SV
1   KCNJ16       0.016484              Exonic
2    KCNJ2       0.088711              Exonic
3       SV       0.688360  Coding SV indirect
4   MAP2K6       0.594582          Regulatory
5     SOX9       0.610116          Regulatory

Example4

To run the PhenoSV-light model, simply add --model 'PhenoSV-light' as shown below.

python3 phenosv/model/phenosv.py --c chr6 --s 156994830 --e 157006982 --svtype 'deletion' --model 'PhenoSV-light'

translocation

PhenoSV can also be used to interpret translocations. The arguments required are: --c: 5' chromosome, --s: 5' breakpoint, --c2: 3' chromosome, --s2: 3' breakpoint, --svtype: types of SV (translocation); --strand1: 5' strand and --strand2: 3' strand are optional with '+' as default.

python3 phenosv/model/phenosv.py --c chr6 --s 156994830 --strand1 '+' --c2 chr7 --s2 156994830 --strand2 '+' --svtype 'translocation'

PhenoSV will output results below. The SV-level pathogenicity is 0.98, generating a fusion ARID1B-MNX1 gene with PhenoSV scores being 0.98 and 0.95 for ARID1B and MNX1, respectively.

  Elements  Pathogenicity       Type                             ID
0       SV       0.975636  Coding SV  chr6:156994830-chr7:156994830
1   ARID1B       0.975636     Exonic  chr6:156994830-chr7:156994830
2     MNX1       0.947925     Exonic  chr6:156994830-chr7:156994830

Score multiple SVs

PhenoSV accepts csv, bed, and bedpe files as input to score multiple SVs. Some examples are provided at data/. csv and bed files can be used to score deletion, duplication, inversion, and insertion. bedpe files can be used to score translocations. Fields of csv and bed files should be: chromosome, start, end, ID, svtype, HPO (optional). Fields of bedpe files should be: chromosome1, start1, end1, chromosome2, start2, end2, strand1, strand2, ID. start1 and start2 will be treated as breakpoints, whereas end1 and end2 will not be used by PhenoSV. Note that, if input files do not have HPO terms, you can use the --HPO argument to add phenotype information by treating the same HPO terms for all SVs in the file. If HPO terms are present in input files, the --HPO argument will be ignored.

To score multiple SVs using a single process, run:

python3 phenosv/model/phenosv.py --sv_file data/sampledata.bed --target_folder data/ --target_file_name sample_bed_out

You can also score multiple SVs in parallel to speed up. Below is an example of running PhenoSV with 4 processes in parallel. Leave the HPO terms blank if they are already in the input file or you don't have prior phenotype information.

bash phenosv/model/phenosv.sh 'path/to/sv/data.csv' 'folder/path/to/store/results' 4 'HP:0000707,HP:0007598'

Similarly, run codes below for PhenoSV-light model.

bash phenosv/model/phenosv_light.sh 'path/to/sv/data.csv' 'folder/path/to/store/results' 4 'HP:0000707,HP:0007598'

Run PhenoSV in Python

You can run PhenoSV in Python and the output will be a pandas dataframe with the SV-level and the gene-level predictions for a given SV.

#import packages
import os
import phenosv
from phenosv.model.phenosv import init as init
import phenosv.model.operation_function as of

#get configurations, use the light argument for choosing between PhenoSV and PhenoSV-light
config_path = os.path.join(os.path.dirname(phenosv.__file__), '..', 'lib', 'fpath.config')
configs, ckpt = init(config_path, ckpt = True, light = False)

# set 'tad_path' as None to consider genes within 1Mbp uptream and downstream a noncoding SV.
# do not run this line if you want to use TAD annotations to interpret noncoding SVs
configs['tad_path']=None

# users can also specify tissue-specific TAD annotations based on research goals
# simply assign TAD annotation path using configs['tad_path']='path/to/tad_annotation.bed'

#load model
model = of.prepare_model(ckpt)

#to interpret a single SV that is not translocation
of.phenosv(CHR='chr6', START=156994830, END=157006982, svtype='deletion', model=model, HPO=None, **configs)

#to interpret a single SV that is translocation
of.phenosv(CHR='chr6', START=156994830,END=None,svtype='translocation', model=model, HPO=None,
           CHR2='chr11', START2=111728347, strand1='+',strand2='+',**configs)

#liftover if using hg19 build
from liftover import get_lifter
import phenosv.utilities.utility as u
converter = get_lifter('hg19', 'hg38')

#SV in hg19
CHR, START, END ='chr6',157315964, 157328116 
#liftover to hg38
START = u.liftover(CHR, START, converter)
END = u.liftover(CHR, END, converter)
of.phenosv(CHR=CHR, START=START, END=END, svtype='deletion', model=model, HPO=None, **configs)

User defined TAD annotations

PhenoSV relies on pre-determined sets of candidate genes when interpreting the impacts of noncoding SVs, either by distance or TAD annotations. We already included an aggregated version of TAD annotation file with PhenoSV. This annotation file is tissue-unspecific. Users can access to this file under the data folder at pre-assigned path (saved in lib/fpath.config). The file name is tad_w_boundary_08.bed

Since TAD annotations are tissue specific, users can also use their own TAD annotations depending on different study goals. The annotation file should be in bed format. Run codes below to assign different annotation files.

python3 phenosv/model/phenosv.py --c chr6 --s 156994830 --e 157006982 --svtype 'deletion' --noncoding 'path/to/tad_annotation.bed'

Here is an example showing the format of the TAD annotation file. Four columns are 'CHR', 'START','END', and 'Indicators' (0 means TAD domain, 1 means TAD boundaries).

chr1    0       724620  0
chr1    724620  764620  1
chr1    764620  3423436 0
chr1    3423436 3463436 1
chr1    3463436 3783436 0
chr1    3783436 3823436 1

Annotate SVs

Using the above codes, PhenoSV annotates SVs with hundreds of genomic features on the fly and then feeds into the pre-trained model to make pathogenicity calls. Users can also save SV annotations forehead and make predictions afterward using the codes below.

#Annotate SVs using a single CPU core
python3 phenosv/model/annotation.py --sv_file data/sampledata.csv --target data/

#Annotate SVs using multiple CPU cores in parallel (4 cores in the example)
bash annotation.sh data/sampledata.csv path/to/output/folder/ 4

Archived datasets

We deposited simulated patients' SV profiles used in manuscript for prioritizations. Several things to notice:

  • Each file corresponds to one patient's SV profile after filtering out all common SVs
  • Within each SV profile, the first row is the real disease-associated SV, the rest SVs are noise rare SVs.
  • We hided the coordinates of all SVs from DECIPHER, but one can query the information from https://www.deciphergenomics.org
  • The column of Pathogenicity represents general pathogenicity scores predicted by PhenoSV ($p_{sv}$), Phen2Gene represents gene-phenotype associations, and PhenoSV represents SV pathogenicity associated with given phenotype information ($p_{sv}^{pheno}$) when setting $\alpha=1$.

Use the codes below to download the simulation data.

wget https://www.openbioinformatics.org/PhenoSV/prioritization_simulation_benchmark.tar.gz

Souce data of the paper used to generate all figures can be found here

phenosv's People

Contributors

jakehagen avatar kaichop avatar karenxzr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

phenosv's Issues

unable to create conda environment

Hi,

I was trying to install PhenoSV following the instruction in README but have encountered the issue to create conda environment when running conda env create --name phenosv --file phenosv.yml
It seems like the packages in the phenosv.yml are incompatible.

Solving environment: -
Found conflicts! Looking for incompatible packages.
Could not solve for environment specs
The following packages are incompatible
├─ pybedtools 0.9.0** is installable with the potential options
│ ├─ pybedtools 0.9.0 would require
│ │ └─ libgcc-ng >=12 , which conflicts with any installable versions previously reported;
│ ├─ pybedtools 0.9.0 would require
│ │ └─ python >=3.6,<3.7.0a0 with the potential options
│ │ ├─ python [3.6.0|3.6.1|...|3.6.9], which can be installed;
│ │ └─ python [3.6.7|3.7.1] would require
│ │ └─ openssl >=1.1.1,<1.1.2.0a0 , which does not exist (perhaps a missing channel);
│ ├─ pybedtools 0.9.0 would require
│ │ └─ python >=3.7,<3.8.0a0 with the potential options
│ │ ├─ python [3.6.7|3.7.1], which cannot be installed (as previously explained);
│ │ └─ python [3.7.0|3.7.1|...|3.7.9], which can be installed;
│ ├─ pybedtools 0.9.0 would require
│ │ └─ python >=3.8,<3.9.0a0 , which can be installed;
│ └─ pybedtools 0.9.0 would require
│ └─ python >=3.9,<3.10.0a0 , which can be installed;
├─ pysam 0.19.1** is uninstallable because there are no viable options
│ ├─ pysam 0.19.1 would require
│ │ └─ libdeflate >=1.13,<1.14.0a0 , which conflicts with any installable versions previously reported;
│ └─ pysam 0.19.1 would require
│ └─ libdeflate >=1.10,<1.11.0a0 , which conflicts with any installable versions previously reported;
├─ python 3.10.4** is uninstallable because it conflicts with any installable versions previously reported;
├─ pytorch-lightning 1.6.4** is uninstallable because it conflicts with any installable versions previously reported;
├─ tensorboard 2.10.1** is uninstallable because it conflicts with any installable versions previously reported;
└─ torchmetrics 0.10.0** is uninstallable because it conflicts with any installable versions previously reported.

I attached a more detailed log of the package conflicts here.
conda.log

Is there a possible fix for the version of packages?
Thank you.
Zih-Hua

Insertion marked as "Exonic" but start position is in an Intron

Hi,
thank you for the incredible tool!

While reviewing my results table, I noticed that certain insertions marked as exonic actually start in an intronic position. Considering both the start and end positions, these insertions potentially "cover" an exonic region.

However, in my understanding, an insertion that begins in an intron should be classified as intronic, as it "pushes" the exon further away rather than spanning it. Is there a specific notion behind which PhenoSV marks those insertions as exonic?

I'm using the terminal version of the PhenoSV tool for annotating multiple SVs, and the web version gives me the same results.

Example:

chrom	start		end		length	svtype		Elements	Type
chr14	39064016	39067194	3178	insertion	SEC23A		Exonic

Start position on an intronic region:
image

Range of SV (Start position marked with the blue line, SV spans on the right):
image

Thank you!

Why is PhenoSV score always `0.0`?

Hi,

I have tried to score the examples in the README using PhenoSV-light, but the Phen2Gene and PhenoSV scores are always 0. What could be the reason for this?

I would appreciate your guidance.
Thanks

python phenosv/model/phenosv.py --model PhenoSV-light \
--c chr6 --s 156994830 --e 157006982 --svtype 'deletion' \
--noncoding 'tad' \
--HPO 'HP:0000707,HP:0007598'

  Elements  Pathogenicity           Type  Phen2Gene  PhenoSV
0       SV       0.607864  Non-coding SV          0      0.0
1   ARID1B       0.550785       Intronic          0      0.0
2     NOX3       0.155716     Regulatory          0      0.0
3    TFB1M       0.249238     Regulatory          0      0.0

`setup.sh` downloads full set even if 'light' is selected

Thanks for this helpful tool 😀

Can you please update the link in the setup.sh file
from: https://www.openbioinformatics.org/PhenoSV/PhenosvFile.tar
to: https://www.openbioinformatics.org/PhenoSV/PhenosvlightFile.tar?

Currently, regardless of whether the 'light' option is specified, the link is the same.

Thanks 😄

Code excerpt
if [[ -z "$version" ]]
then
  if ! test -f "$fpath/PhenosvFile.tar"; then
  echo "downloading PhenoSV files........"
  wget https://www.openbioinformatics.org/PhenoSV/PhenosvFile.tar
  fi
  echo "unzipping PhenosvFile.tar........"
  tar -xvf "$fpath/PhenosvFile.tar"
  rm "$fpath/PhenosvFile.tar"
else
  if ! test -f "$fpath/PhenosvlightFile.tar"; then
  echo "downloading PhenoSV-light files........"
  wget https://www.openbioinformatics.org/PhenoSV/PhenosvFile.tar   # <------- OFFENDING LINE
  fi
  echo "unzipping PhenosvlightFile.tar........"
  tar -xvf "$fpath/PhenosvlightFile.tar"
  rm "$fpath/PhenosvlightFile.tar"
fi

Error in calculating scores in phen2gene program

'''
File "phenosv/model/phenosv.py", line 177, in
main()
File "phenosv/model/phenosv.py", line 168, in main
feature_subset=feature_subset)
File "phenosv/model/../model/operation_function.py", line 568, in phenosv
full_mode=full_mode, truncation=None, feature_subset=feature_subset)
File "phenosv/model/../model/operation_function.py", line 594, in single_sv
genescores = pg.phen2gene(HPO,KBpath, scale_score=True)
File "phenosv/model/../utilities/../Phen2Gene/phen2gene.py", line 34, in phen2gene
score = stats.percentileofscore(score,score)/100
File "/mnt/B2C_USER/luoxiaomei/Software/miniconda3/lib/python3.7/site-packages/scipy/stats/stats.py", line 1942, in percentileofscore
if np.isnan(score):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
'''

I don't know what 's wrong in calculating the score,it's working when i use python3 phenosv/model/phenosv.py --c chr6 --s 156994830 --e 157006982 --svtype 'deletion' but python3 phenosv/model/phenosv.py --c chr6 --s 156994830 --e 157006982 --svtype 'deletion' --noncoding 'tad' --HPO 'HP:0000707,HP:0007598'.I have tried Use a.any() or a.all() ,but it would caused

“ File "phenosv/model/../utilities/../Phen2Gene/phen2gene.py", line 35, in phen2gene
df['Score'] = score.tolist()
AttributeError: 'float' object has no attribute 'tolist'”

Please help me and Looking forward to your answer!

Error for inversion

Hi,

Thank you for developing this useful tool!
I had successfully ran PhenoSV offline for DELs and DUPs. While I had a problem when using PhenoSV for inversions, please see the error message bellow. Using the same test bed file, I can use the web version without any problem. I'd like to use PhenoSV for more inversions, so really hope the command line tool can work. Please give me some suggestions on what I can do to solve the problem. Thank you a lot for your time and help!

Traceback (most recent call last):
File "/scratch/gq19/tg2182/PhenoSV/phenosv/model/phenosv.py", line 175, in
main()
File "/scratch/gq19/tg2182/PhenoSV/phenosv/model/phenosv.py", line 148, in main
pred = of.phenosv(None, None, None, None, sv_df, annotation_path, model, elements_path, feature_files, scaler_file,
File "/scratch/gq19/tg2182/PhenoSV/phenosv/model/../model/operation_function.py", line 548, in phenosv
sv = sv_transformation(CHR, START, END, svtype,ID,elements_path, annotation_path, None, None, full_mode = full_mode)
File "/scratch/gq19/tg2182/PhenoSV/phenosv/model/../model/operation_function.py", line 237, in sv_transformation
df1, anno1 = bke_to_sv(CHR, START, ID, elements_path, annotation_path,'inversion')
File "/scratch/gq19/tg2182/PhenoSV/phenosv/model/../model/operation_function.py", line 170, in bke_to_sv
end = int(start+1)
TypeError: can only concatenate str (not "int") to str

Here is the test file I had used (sorry, github does not allow me to upload bed file, so just attached here):
chr1 2785692 2786126 graphtyper_75_1_75 inversion
chr1 12833357 13345613 graphtyper_307_1_307 inversion
chr1 19578330 19611985 graphtyper_412_1_412 inversion

Add argument for data cache

Hello

Is there a reason the location of the data cache is fed into the program by reading PhenoSV/lib/fpath.config ? It would be a lot more flexible if we could specify the location with a command line argument. If you are open to this, I could add this and submit a pull request

Annotation Script Bug

On line 30 of annotation.py you have:

feature_files, scaler_file, _, elements_path, annotation_path, tad_path, _ = list(configs.values())

I think it should be

feature_files, scaler_file, _, elements_path, annotation_path, tad_path, _, _ = list(configs.values())

to ignore feature_subset. When making this change it seems to work as expected

Feature Array has size of 0?

Hello, I'm running the program for the first time in Python and there is a ValueError for the basic running of the algorithm becaus of a size 0 feature array.

Screenshot 2024-04-14 at 11 15 19 PM

Can you help identify what went wrong?

Processing a large number of sv

Hello, a great job, I tried to use your tools. There are no problems running 10 SVs, but I will report an error when I have more than 3,000 SV. What is the SV of this tool at the same time? This command is running: Bash Phenosv/Model/Phenosv.sh 'Path/to/SV/Data.csv' 'Folder/PATH/TO/Store/Results' 4. And the error is the picture below:Very much looking forward to your reply.
419f13aef563dbf6ee6c78b68d42699

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.