Giter Club home page Giter Club logo

vein's Introduction

VEIN

  • build: AppVeyor Build Status Coverage Status
  • cran: CRAN_Status_Badge CRAN Downloads Package Status CRAN/METACRAN
  • doi: DOI
  • github: Github Stars GitHub code size in bytes GitHub issues GitHub commit activity R build status

Vehicular Emissions INventories (VEIN)

vein

vein

TODO

  • Include speed functions with Fortran
  • Include CB6
  • Add EF from HBEFA?
  • See issues GitHub

System requirements

vein imports functions from spatial packages listed below. In order to install these packages, firstly the user must install the requirements mentioned here.

Installation

CRAN

VEIN can be installed via CRAN or github

install.packages("vein")

GitHub

remotes::install_github("atmoschem/vein")

or if you have a 32 bits machine

install_github("atmoschem/vein",
INSTALL_opts = "--no-multiarch")

demo

Then, if you want, run the demo

library(vein) 
demo(VEIN)

Approaches

1. get a project (easier)

At the moment, most of the projects covers Brazilian regions, but I will include China, Europe or USA approaches as soon as I can.

Use the function get_project and read the documentation, there you can see more projects as well.

Check the projects here: (https://atmoschem.github.io/vein/reference/get_project.html)[https://atmoschem.github.io/vein/reference/get_project.html]

library(vein)
?get_project
get_project(directory = "awesome_city")

The structure of the new directory “awesome_city” is:

awesome_city
├── config
│   ├── clean.R
│   ├── config.R
│   ├── inventory.xlsx
│   └── packages.R
├── main.R
├── main.Rproj
├── network
│   ├── net.gpkg
│   └── net.rds
├── scripts
│   ├── evaporatives.R
│   ├── exhaust.R
│   ├── fuel_eval.R
│   ├── net.R
│   ├── pavedroads.R
│   ├── plots.R
│   ├── post.R
│   ├── traffic.R
│   └── wrf.R
└── wrf
└── wrfinput_d02

You have to open the file main.Rproj with Rstudio and then open and run main.R

To run main.R you will need these extra packages:

  • ggplot2
  • readxl
  • eixport (If you plan to generate WRF Chem emissions file)

If you do not have them already, you can install:

install.packages(c("ggplot2", "readxl", "eixport"))

Too complicated? Watch a YouTube

<iframe width="560" height="315" src="https://www.youtube.com/embed/tHSWIjg26vg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen> </iframe>

English

<iframe width="560" height="315" src="https://www.youtube.com/embed/6-07Y0Eimng" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen> </iframe>

Portuguese

2. Use inventory (a bit not so easy)

Read the instruction of inventory

?inventory

1) Examples with traffic data:

  1. If you know the distribution of the vehicles by age of use , use: my_age
  2. If you know the sales of vehicles or better the registry of new vehicles, use age to apply a survival function.
  3. If you know the theoretical shape of the circulating fleet and you can use age_ldv, age_hdv or age_moto. For instance, you dont know the sales or registry of vehicles, but somehow you know the shape of this curve.
  4. You can use/merge/transform/adapt any of these functions.
library(vein)
data("net")
PC_E25_1400 <- age_ldv( x = net$ldv)

plot(PC_E25_1400)
#> Weighted mean =  11.17

If you want to know the vehicles per street and by age of use, just add the net. Age functions now returns ‘sf’ objects if the net argument is present.

PC_E25_1400net <- age_ldv(
  x = net$ldv, 
  net = net
)
plot(PC_E25_1400net, 
  key.pos = 4, 
  pal = cptcity::cpt(
    colorRampPalette = T, 
    rev = T))
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> Warning: plotting the first 9 out of 50 attributes; use max.plot = 50 to plot
#> all
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()

temporal factors and netspeed

data("net")
data("pc_profile")
pc_week <- temp_fact(
  net$ldv + net$hdv, 
  pc_profile
)
dfspeed <- netspeed(
  q = pc_week, 
  ps = net$ps, 
  ffs = net$ffs, 
  cap = net$capacity, 
  lkm = net$lkm, 
  alpha = 1.5
)
plot(dfspeed)
#> Weighted mean =  44.16

If you want ot check the speed at different hours by street, just add net:

dfspeednet <- netspeed(
  q = pc_week, 
  ps = net$ps, 
  ffs = net$ffs, 
  cap = net$capacity, 
  lkm = net$lkm,
  alpha = 1.5, 
  net = net
)
plot(
  dfspeednet[, c("S1", "S9")], 
  key.pos = 4, 
  pal = cptcity::cpt(colorRampPalette = T, 
                     rev = T), 
  axes = T
)
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()

#### 2) Emission Factors

V <- 0:150
ef1 <- ef_ldv_speed(
  v = "PC",
  t = "4S", 
  cc = "<=1400", 
  f = "G",
  eu = "PRE",
  p = "CO"
)
ef2 <- ef_ldv_speed(
  v = "PC",
  t = "4S", 
  cc = "<=1400", 
  f = "G",
  eu = "III",
  p = "CO"
)

ef1 <- EmissionFactors(ef1(1:150))
ef2 <- EmissionFactors(ef2(1:150))
colplot(data.frame(PRE = ef1, III = ef2))

3) Estimation of emissions

euro <- c(
  rep("V", 5), 
  rep("IV", 5), 
  rep("III", 5), 
  rep("II", 5),
  rep("I", 5), 
  rep("PRE", 15)
)
lef <- lapply(1:40, function(i) {
  ef_ldv_speed(
    v = "PC", 
    t = "4S",
    cc = "<=1400", 
    f = "G",
    eu = euro[i], 
    p = "CO", 
    show.equation = FALSE
  ) 
})
E_CO <- emis(
  veh = PC_E25_1400, 
  lkm = net$lkm, 
  ef = lef, 
  speed = dfspeed,
  profile = pc_profile
)

4) Post Emissions

  • emis_post
  • When the argument by = “veh” the emissions are aggregated by age and hour.
  • When the argument by = “streets_wide”, aggregated the emissions by street. In this cae, if you add the argument net with the respective streets, it returns an spatial net with the hourly emissions.
E_CO_DF <- emis_post(
  arra = E_CO,  
  veh = "PC", 
  size = "<1400", 
  fuel = "G",
  pollutant = "CO", 
  by = "veh", 
  type_emi = "exhaust"
)
E_CO_STREETS <- emis_post(
  arra = E_CO, 
  pollutant = "CO", 
  by = "streets", 
  net = net
)
plot(
  E_CO_STREETS[, c("V1", "V9")], 
  key.pos = 4, 
  pal = cptcity::cpt(colorRampPalette = T, 
                     rev = T), 
  axes = T)
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()

Grids

  1. Create a grid using make_grid.The spobj is the spatial net. The size of the grid has the size of the net. You have to specify the grid spacing.
  2. Create a grid using a path to wrfinput file instead a net. The grid will have the size of the wrf_input. You don’t have to specify the grid spacing.
data(net)
E_CO_STREETSnet <- emis_post(
  arra = E_CO, 
  pollutant = "CO",
  by = "streets_wide",
  net = net
)
g <- make_grid(
  spobj = net, 
  width = 1/102.47
)
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> Number of lon points: 12
#> Number of lat points: 10
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
E_CO_g <- emis_grid(
  spobj = E_CO_STREETSnet, 
  g = g, 
  sr= 31983
)
#> Your units are:
#> g
#> Transforming spatial objects to 'sr'
#> old-style crs object detected; please recreate object with a recent sf::st_crs()
#> Sum of street emissions 148791715.29
#> Sum of gridded emissions 148791715.29
na <- paste0("V", 1:168)
for(i in 1:168) E_CO_g[[na[i]]] <- E_CO_g[[na[i]]] * units::set_units(1, "1/h")
plot(
  E_CO_g[, c("V1", "V9")], 
  key.pos = 4, 
  pal = cptcity::cpt(colorRampPalette = T, 
                     rev = T,
                     pal = "mpl_viridis"), 
  axes = T, 
  lty = 0
)

Creating a WRFChem Input file using eixport:

  1. Create a grid using make_grid and a wrfinput file
  2. Run emis_grid to grid your emissions.
  3. Create a GriddedEmissionsArray.
  4. Create a wrfchem input file [eixport::wrf_create](https://atmoschem.github.io/eixport/reference/wrf_create.html.
  5. Put the GriddedEmissionsArray into the wrf chem input file using eixport::wrf_put.
library(eixport)
dir.create(file.path(tempdir(), "EMISS"))
wrf_create(wrfinput_dir         = system.file("extdata", package = "eixport"),
wrfchemi_dir         = file.path(tempdir(), "EMISS"),
domains              = 2,
frames_per_auxinput5 = 1, #hours
auxinput5_interval_m = 60,
verbose              = TRUE)
path_to_wrfi <- paste0(system.file("extdata", package = "eixport"), "/wrfinput_d02")
path_to_wrfc <- list.files(file.path(tempdir(), "EMISS"), full.names = TRUE)[1]
gwrf <- eixport::wrf_grid(path_to_wrfi)
E_CO_gwrf <- emis_grid(spobj = E_CO_STREETSnet, g = gwrf)
gr <- GriddedEmissionsArray(E_CO_gwrf, rows = 51, cols = 63, times = 1)
eixport::wrf_put(file = path_to_wrfc, name = "E_CO", POL = gr)

Creating a WRFChem Input file using AS4WRF

  1. Create a grid using make_grid and your net.
  2. Run emis_grid to grid your emissions.
  3. Run eixport::to_as4wrf to create a data.frame the specifications for AS4WRF.ncl.
  4. Export data.frame to a text.file. Recall that AS4WRF requires all the lumped species.
  5. Contact the developer of AS4WRF Angel Vara [email protected] to get a copy and run AS4WRF.ncl.

Thanks and enjoy VEIN!

Citation

If you use VEIN, please, cite it (BIBTEX, ENDNOTE):

Ibarra-Espinosa, S., Ynoue, R., O’Sullivan, S., Pebesma, E., Andrade, M. D. F., and Osses, M.: VEIN v0.2.2: an R package for bottom-up vehicular emissions inventories, Geosci. Model Dev., 11, 2209-2229, https://doi.org/10.5194/gmd-11-2209-2018, 2018.

@article{gmd-11-2209-2018,
author = {Ibarra-Espinosa, S. and Ynoue, R. and O'Sullivan, S. and Pebesma, E. and Andrade, M. D. F. and Osses, M.},
title = {VEIN v0.2.2: an R package for bottom--up vehicular emissions inventories},
journal = {Geoscientific Model Development},
volume = {11},
year = {2018},
number = {6},
pages = {2209--2229},
url = {https://gmd.copernicus.org/articles/11/2209/2018/},
doi = {10.5194/gmd-11-2209-2018}
}

Special thanks to all the contributors

Contributors

Communications, doubts etc

Issues

If you encounter any issues while using VEIN, please submit your issues to: https://github.com/atmoschem/vein/issues/ If you have any suggestions just let me know to [email protected].

Contributing

Please, read this guide. Contributions of all sorts are welcome, issues and pull requests are the preferred ways of sharing them. When contributing pull requests, please follow the Google’s R Style Guide. This project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

Note for non-english and anaconda users

Sometimes you need to install R and all dependencies and a way for doing that is using anaconda. Well, as my system is in portuguese, after installing R using anaconda it changed the decimal character to ‘,’. In order to change it back to english meaning decimal separator as ‘.’, I added this variable into the .bashrc

nano ~/.bashrc
export Lang=C

More details on StackOverflow

vein's People

Contributors

aadler avatar edzer avatar iaradasilva avatar ibarraespinosa avatar joaobazzo avatar karlropkins avatar pedro-andrade-inpe avatar quishqa avatar raisantana avatar ramespada avatar salvatirehbein avatar schuch666 avatar yingw1014 avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar

vein's Issues

improve time in emis_wrf and change name?

time in wmis_wrf should use attr(x, "tzone") <- "tz". Therefore, the argument "utc" is not necesary anymore. Also, the name 'wrf' it is no t necessary because it could be used with different models. This function l probably will be deprecated once it is ready the package eix, which will export emissions to different, models, including WRF.

pc_profile

I was wondering why the emissions profile does not add 24 * 7 = 168.
I always thought that the sum of the emissions of all hours of the day of the week should add up to the total emissions for that week with a uniform profile.
Thanks in advance,
Mel

add emis_topdown

This function would allow estimating top-down vehicular emissions. Possible features:

  • It allows estimations with mileage by age of use.
  • Read spatial polygons with fleet by type of vehicle and/or mileage by age of use.
  • If it is used average hourly mileage, it could be used directly inside emis.
  • Reads emission factors for n pollutants
  • Produces an EmissionsArray which could be processed with emis_post to produce a data-base.

EmissionsArray, maybe 3 dimensions??

An EmissionsArray has 4 dimensions, number of streets, the category of vehicles, hours and days. However, as the last two dimensions represent time, maybe it could be better to eliminate the last dimension and the third dimensions could be only the total number of hours.

vein should not depend on sp

According to Writting R Extensions, in DESCRIPTION, the field Depends should be nowadays used rarely, only for packages which are intended to be put on the search path to make their facilities available to the end user, for instance, latticeExtra depends on *lattice. In the case of vein, few times sp functions are called therefore it is not justified.

add flexibility in age functions

Age functions allow producing age distribution of vehicles in circulation. The functions are base on scrapping functions of the National Emissions Inventory for Brazil, 1996 and 2001. These functions can be restrictive and need to be updated. The goal is to have functions that can represent on average, a specific vehicular market.

Support for sf

sf is an R package of spatial features. VEIN needs to migrate its dependencies from sp to sf

inventory

linha 46 e 47 deveria ter deparse para o tipo de veiculo

adt?

Average Daily Traffic (ADT) is a common metric in transportation studies, used also as input for estimating emissions. It should be included

Add summary in emis_wrf output

The user must convert the emissions from grams to mol before using emis_wrf. It would be convenient to add a summary of the output when using emis_wrf.

mechanism for emis_wrf need to be updated

emis_Wrf depends on AAS4WRF (Vera, 2015) configuration. This configuration has changed. Now it is for mechanism CBMZ. The pollutants 36 species. The output of emis_wrf should contain one column per pollutant and in the case that there are no emissions, the column should have filled with 0.
Compounds:

  • "E_SO2"
  • "E_NO"
  • "E_ALD"
  • "E_HCHO"
  • "E_ORA2"
  • "E_NH3"
  • "E_HC3"
  • "E_HC5"
  • "E_HC8"
  • "E_ETH"
  • "E_CO"
  • "E_OL2"
  • "E_OLT"
  • "E_OLI"
  • "E_TOL"
  • "E_XYL"
  • "E_KET"
  • "E_CSL"
  • "E_ISO"
  • "E_NO2"
  • "E_CH3OH"
  • "E_C2H5OH"
  • "E_PM25I"
  • "E_PM25J"
  • "E_SO4I"
  • "E_SO4J"
  • "E_NO3I"
  • "E_NO3J"
  • "E_ORGI"
  • "E_ORGJ"
  • "E_ECI"
  • "E_ECJ"
  • "E_SO4C"
  • "E_NO3C"
  • "E_ORGC"
  • "E_ECC"

speciate IAG needs to be fixed

the updated speciation of IAG excluded CH3OH and KET incorrectly added. This implies to change the function speciate.

dataframe for storing emi_post df outputs?

It would be good to include an argument in emis_post that point to a path with a data-frame to rbind newer results. This can wotk like a data-base with newer dependencies, only base.

Deberia emis_post incluir otra clasificación?

los argumentos de emis_post son:

args(emis_post)
function (arra, veh, size, fuel, pollutant, by = "veh") 

veh, size, fuel y pollutant son strings para generar una base de datos clasificada. Sin embargo, podria ser mejor incluir una classificación desde lo mas general a lo mas particular:

  • fam (family): PC, LCV, HGV, Bus o MC
  • subfam: HGV-A (A de Articulado), HGV-R (R de Rigido), Coach.
  • fuel: fuel
  • size: cilindradas del motor o peso bruto del camión
  • vehcomp: nombre compuesto de la composición vehicular. Por ejemplo: PC_E25_1400.

Generará una base de datos mas pesada pero mejor clasificada.

Output of emis_wrf according to 6 hours meteorological data

When running WRF-Chem or other atmospheric models it is necessary meteorological data as input. This data has different temporal resolution and must match with UTC hourly emissions, in general.
A common database is NCAR/UCAR Global Forcast System https://rda.ucar.edu/datasets/ds335.0 but time resolution is each 6 hours. There are other datasets of 3 hours time resolution. Therefore, it would be convenient to have an argument in emis_wrf to match the hours of the emissions to the hours UTC of the meteorological data.

Improve plots

Plots should be spatial and temporal. These plots will be improved after migrating to sf

emis_merge

Emissions are estimated for each type of vehicle, street different hour. Also, emis_post generates
three type of files. At the end there are a lot of files. Hence, an emis_merge function would be useful. This function will not be related with the base::merge functions, but, it will load all emissions according to an specific format and mergte,rbind,cbind them (see #36).

It is important to preserve any spatial attribute, so this function would work better with sf objects (see #5 )

ef_* accepts vectorized arguments

ed_* emission factors functions are useful but when integrating into a street reality, lacks flexibility. For instance, there are arguments to account for load and gradient but one at the time. It would be good that these functions accept vectorized values, for example:
gradient <- c(0, 0.2, 0.4, 0.6) Representing streets with gradient 0, 0.2, 0.4 and 0.6. The length of this vectorized arguments should be equal to the number of streets. This function should allow having different values at different hours, for example, for evaluating the hourly variation of load in urban buses or trucks.

Function to work with units in data.frames

Sometimes it is necessary to convert to units or unclass several columns of dataframes. In other occasions, it is necessary to add units. It would be convenient to create a function to do that.

skeleton function needed

It is needed an 'skeleton' function to create folders fir i/o in a known structure, or skeleton. This functons could be named vein::vein and will use dir.create and other file functions.

This functions must be flexible in order to produce folders and/or files.

data.table?

VEIN functions could include the dependency on data.table functions so that it produces faster estimations. This could imply in modification in all function but these modifications should be only internal, they must preserve the same arguments

NMHC Speciation IAG incorrect

The speciation of NMHC from tunnel studie of IAG/USP is incorrect. There is no emissions of methanol. New table will be fixed in next commit

filter by na in my_age?

if
veh <- veh$PC <- c(0, 0, 0, 1, 2, 3 , NA, NA)
0 means that vehicles produced at first and second age (index). Last two NA indicates that the didnt exist vehicles at age 7 and 8. For instance, these type of vehicles started being produced at age 6 but the data already includes the last two NA.

Maybe, it could be a good idea include a filter for excluding NA in this parameter

veh$PC[!is.na(veh$PC)]

ef_nitro error form some categories

ef_nitro presents an error when filtering for some parameters. The problem is that there are still some values "ALL" that need to be changed at internal data.

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.