Code Monkey home page Code Monkey logo

bgen's Introduction

Another bgen parser

bgen

This is a package for reading and writing bgen files.

This package uses cython to wrap c++ code for parsing bgen files. It's fairly quick, it can parse genotypes from 500,000 individuals at ~300 variants per second within a single python process (~450 million probabilities per second with a 3GHz CPU). Decompressing the genotype probabilities can be the slow step, zlib decompression takes 80% of the total time, using zstd compressed genotypes is ~2X faster.

This has been optimized for UKBiobank bgen files (i.e. bgen version 1.2 with zlib compressed 8-bit genotype probabilities, but the other bgen versions and zstd compression have also been tested using example bgen files).

Install

pip install bgen

Usage

from bgen import BgenReader, BgenWriter

bfile = BgenReader(BGEN_PATH)
rsids = bfile.rsids()

# select a variant by indexing
var = bfile[1000]

# pull out genotype probabilities
probs = var.probabilities  # returns 2D numpy array
dosage = var.minor_allele_dosage  # returns 1D numpy array for biallelic variant

# iterate through every variant in the file
with BgenReader(BGEN_PATH, delay_parsing=True) as bfile:
  for var in bfile:
      dosage = var.minor_allele_dosage

# get all variants in a genomic region
variants = bfile.fetch('21', 10000, 5000000)

# or for writing bgen files
import numpy as np
from bgen import BgenWriter

geno = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]).astype(np.float64)
with BgenWriter(BGEN_PATH, n_samples=3) as bfile:
  bfile.add_variant(varid='var1', rsid='rs1', chrom='chr1', pos=1,
                    alleles=['A', 'G'], genotypes=geno)

API documentation

class BgenReader(path, sample_path='', delay_parsing=False)
    # opens a bgen file. If a bgenix index exists for the file, the index file
    # will be opened automatically for quicker access of specific variants.
    Arguments:
      path: path to bgen file
      sample_path: optional path to sample file. Samples will be given integer IDs
          if sample file is not given and sample IDs not found in the bgen file
      delay_parsing: True/False option to allow for not loading all variants into
          memory when the BgenFile is opened. This can save time when iterating
          across variants in the file
  
  Attributes:
    samples: list of sample IDs
    header: BgenHeader with info about the bgen version and compression.
  
  Methods:
    slicing: BgenVars can be accessed by slicing the BgenFile e.g. bfile[1000]
    iteration: variants in a BgenFile can be looped over e.g. for x in bfile: print(x)
    fetch(chrom, start=None, stop=None): get all variants within a genomic region
    drop_variants(list[int]): drops variants by index from being used in analyses
    with_rsid(rsid): returns BgenVar with given rsid
    at_position(pos): returns BgenVar at a given position
    varids(): returns list of varids for variants in the bgen file.
    rsids(): returns list of rsids for variants in the bgen file.
    chroms(): returns list of chromosomes for variants in the bgen file.
    positions(): returns list of positions for variants in the bgen file.

class BgenVar(handle, offset, layout, compression, n_samples):
  # Note: this isn't called directly, but instead returned from BgenFile methods
  Attributes:
    varid: ID for variant
    rsid: reference SNP ID for variant
    chrom: chromosome variant is on
    pos: nucleotide position variant is at
    alleles: list of alleles for variant
    is_phased: True/False for whether variant has phased genotype data
    ploidy: list of ploidy for each sample. Samples are ordered as per BgenFile.samples
    minor_allele: the least common allele (for biallelic variants)
    minor_allele_dosage: 1D numpy array of minor allele dosages for each sample
    alt_dosage: 1D numpy array of alt allele dosages for each sample
    probabilities:  2D numpy array of genotype probabilities, one sample per row
      These are most likely for biallelic diploid variants. In that scenario
      unphased probabilities have three columns, for homozygous first allele 
      (AA), heterozygous (Aa), homozygous second allele (aa).
      In contrast, phased probabilities (for a biallelic diploid variant) would
      have four columns, first two for haplotype 1 (hap1-allele1, hap1-allele2), 
      last two for haplotype 2 (hap2-allele1, hap2-allele2).
  
  BgenVars can be pickled e.g. pickle.dumps(var)


class BgenWriter(path, n_samples, samples=[], compression='zstd' layout=2, metadata=None)
    # opens a bgen file to write variants to. Automatically makes a bgenix index file
    Arguments:
      path: path to write data to
      n_samples: number of samples that you have data for
      samples: list of sample IDs (same length as n_samples)
      compression: compression type: None, 'zstd', or 'zlib' (default='zstd')
      layout: bgen layout format (default=2)
      metadata: any additional metadata you want o include in the file (as str)
    
    Methods:
      add_variant_direct(variant)
        Arguments:
            variant: BgenVar, to be directly copied from one begn file to 
                another. This can be done when the new bgen file is for the same
                set of samples as the one being read from. This is much faster
                due to not having to decode and re-encode the genotype data.
      add_variant(varid, rsid, chrom, pos, alleles, genotypes, ploidy=2, 
                  phased=False, bit_depth=8)
        Arguments:
            varid: variant ID e.g. 'var1'
            rsid: reference SNP ID e.g. 'rs1'
            chrom: chromosome the variant is on e.g 'chr1'
            pos: nucleotide position of the variant e.g. 100
            alleles: list of allele strings e.g. ['A', 'C']
            genotypes: numpy array of genotype probabilities, ordered as per the
                bgen samples e.g. np.array([[0, 0, 1], [0.5, 0.5, 0]])
            ploidy: ploidy state, either as integer to indicate constant ploidy
                (e.g. 2), or numpy array of ploidy values per sample, e.g. np.array([1, 2, 2])
            phased: whether the genotypes are for phased data or not (default=False)
            bit_depth: how many bits to store each genotype as (1-32, default=8)

bgen's People

Contributors

jeremymcrae avatar

Stargazers

Petko Fiziev avatar Tingfeng Xu avatar Mahdi avatar Anastasia Baryshnikova avatar  avatar Chinmay Raut avatar  avatar Sander W. van der Laan avatar Ahmed A. Metwally avatar Seyoon Ko avatar Nicholas Mancuso avatar

Watchers

 avatar

bgen's Issues

BgenVar.minor_allele_dosage mem leak

Hello,

I stumbled across this package when looking for a lightweight bgen parser and it definitely works nicely. However, when repeatedly calling 'BgenVar.minor_allele_dosage,' I end up with a memory leak. It looks like maybe the array constructed to return the dosage is leaving the scope of the garbage collector, but I am not totally sure. It's been awhile since I have written anything in cython (I am using version 0.29.15 with python 3.7 in case this helps). Happy to provide more details if it helps. Overall, great package and definitely quite fast. Thanks for making it public!

Dave Blair

Build errors in building the bgen wheel on a windows 10 machine

When I pip install bgen the process fails when building the wheel for bgen, where it seems to fail on the zlib, where I had installed zlib using:

powershell -Command "(Invoke-WebRequest -Uri https://git.io/JnHTY -OutFile install_zlib.bat)"; ./install_zlib.bat; del install_zlib.bat

from:

https://github.com/horta/zlib.install

the error I get specifically in running pip install bgen from a windows powershell (running as admin) is below. Is this because the '-std=gnu11' and -fPIC options are not set correctly for this compiling under windows with vc++? Or is this not supported on windows machines through powershell? The fatal error is the zlib.h not being found to include in the genotype.cpp file.

pip install bgen
Collecting bgen
Using cached bgen-1.3.1.tar.gz (668 kB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: numpy in c:\users\erics\appdata\local\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\site-packages (from bgen) (1.23.5)
Building wheels for collected packages: bgen
Building wheel for bgen (pyproject.toml) ... error
error: subprocess-exited-with-error

× Building wheel for bgen (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [143 lines of output]
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
debug.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
entropy_common.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
error_private.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
fse_decompress.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
pool.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
threading.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
xxhash.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_common.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
fse_compress.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
hist.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
huf_compress.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstdmt_compress.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_compress.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_compress_literals.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_compress_sequences.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_double_fast.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_fast.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_lazy.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_ldm.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_opt.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
huf_decompress.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_ddict.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_decompress.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_decompress_block.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
cover.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
divsufsort.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
fastcover.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zdict.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zbuff_common.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zbuff_compress.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zbuff_decompress.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_v01.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_v02.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_v03.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_v04.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_v05.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_v06.c
cl : Command line warning D9002 : ignoring unknown option '-std=gnu11'
cl : Command line warning D9002 : ignoring unknown option '-fPIC'
zstd_v07.c
running bdist_wheel
running build
running build_py
creating build
creating build\lib.win32-cpython-310
creating build\lib.win32-cpython-310\bgen
copying src\bgen\index.py -> build\lib.win32-cpython-310\bgen
copying src\bgen_init_.py -> build\lib.win32-cpython-310\bgen
running build_ext
building 'bgen.reader' extension
creating build\temp.win32-cpython-310
creating build\temp.win32-cpython-310\Release
creating build\temp.win32-cpython-310\Release\src
creating build\temp.win32-cpython-310\Release\src\bgen
"C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Isrc/ -Isrc/zstd/lib "-IC:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2544.0_x64__qbz5n2kfra8p0\include" "-IC:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2544.0_x64__qbz5n2kfra8p0\Include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tpsrc/bgen.cpp /Fobuild\temp.win32-cpython-310\Release\src/bgen.obj -std=c++11 -I/usr/include
cl : Command line warning D9002 : ignoring unknown option '-std=c++11'
bgen.cpp
src/bgen.cpp(50): warning C4101: 'e': unreferenced local variable
"C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Isrc/ -Isrc/zstd/lib "-IC:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2544.0_x64__qbz5n2kfra8p0\include" "-IC:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2544.0_x64__qbz5n2kfra8p0\Include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tpsrc/bgen/bgen.cpp /Fobuild\temp.win32-cpython-310\Release\src/bgen/bgen.obj -std=c++11 -I/usr/include
cl : Command line warning D9002 : ignoring unknown option '-std=c++11'
bgen.cpp
src/bgen/bgen.cpp(4222): warning C4244: 'argument': conversion from 'uint64_t' to 'long', possible loss of data
src/bgen/bgen.cpp(6862): warning C4244: '=': conversion from 'uint64_t' to 'long', possible loss of data
src/bgen/bgen.cpp(7314): warning C4244: '=': conversion from 'uint64_t' to 'long', possible loss of data
"C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Isrc/ -Isrc/zstd/lib "-IC:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2544.0_x64__qbz5n2kfra8p0\include" "-IC:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2544.0_x64__qbz5n2kfra8p0\Include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tpsrc/genotypes.cpp /Fobuild\temp.win32-cpython-310\Release\src/genotypes.obj -std=c++11 -I/usr/include
cl : Command line warning D9002 : ignoring unknown option '-std=c++11'
genotypes.cpp
src/genotypes.cpp(15): fatal error C1083: Cannot open include file: 'zlib.h': No such file or directory
error: command 'C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\bin\HostX86\x86\cl.exe' failed with exit code 2
[end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for bgen
Failed to build bgen
ERROR: Could not build wheels for bgen, which is required to install pyproject.toml-based projects

bfile.rsids() variant order is inconsistent with variant order in the bgen file

Hello,

(Thank you for a great package.)

I noticed that bfile.rsids() and bfile.positions() return values in alphabetical order by rsid. This order is different from the order of variants in the bgen file itself (as shown by iteration). If this is intended behavior, it would be great to add a note to the documentation.

Here's an example:

>> bfile = BgenReader(bgen_path, delay_parsing=True)
>> rsids = bfile.rsids()
>> print(rsids) # prints variants in alphabetical order

['rs201106462', 
'rs367896724', 
'rs531646671', 
'rs531730856', 
'rs540538026', 
'rs541940975', 
'rs544419019', 
'rs546169444', 
'rs575272151', 
'rs62028691', 
'rs62635286']

>> for var in bfile:
>>     print(var.rsid) # prints variants in order of storage in the bgen file

rs367896724
rs201106462
rs575272151
rs544419019
rs540538026
rs62635286
rs62028691
rs531730856
rs546169444
rs531646671
rs541940975

Thank you,
A.

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.