 OK, so my name is Hugo, I work for a company called Continuum Analytics. Who here does anything with like, who here does anything with like data or scientific computing with Python? Can I see if this is a show of hands? OK, so some, not that many. All right, so I'm going to give a very brief introduction into what scientific computing with Python is like. There you go, that's the problem. But before we do that, OK, so, OK, so Continuum Analytics, we focus on Python technologies for scientific computing. A lot of our products are open source and we're still in the process of figuring out like with a lot of open source companies figuring out what parts you have to keep open source to build the community and what parts you can sort of make closed source or sell or profit off of some other way, right? Because we are a business, we have to make money. And that is tricky, right? But that's sort of our business model is to figure out how to sell products around Python technologies and also supplement that with training and consulting and stuff like that. Who here has heard of NumPy? OK, so most people. So our CEO is the author of NumPy, so that's sort of the background that we come in. We're all big fans of array-oriented computing. And this company started because we wanted to take NumPy and scale it up to larger data sets. One of the big things that we're trying to push is to bring domain experts closer to their data and to sort of remove technology problems. So right now, this typical problem is that, let's say I'm a domain expert. I used to be actually, but now I'm a technologist. So I have a problem I want to solve, but I don't have the technology resources to do it, so I have to work with three tech teams to figure out how they can build me the thing I need. They don't understand what I'm doing. There are lots of problems, right? So we want to try to eliminate a lot of the middle stuff as possible and connect domain experts to their data, to the algorithms that they're trying to do on their data. We have a variety of open-source projects. What I'm talking about today is called Bokeh, which is our visualization tool. And actually, Bokeh was the reason Continuum was created, because we wanted to have a way to visualize large data sets. Turns out, to do that, you have to have a scalable array computation engine, a Python compiler, a good way to distribute Python packages like lots of other stuff. So that's why we do so many things. Personally, just a little bit of background for me so that you understand where I'm coming from. I used to work in statistical medical imagery construction. I did all my stuff in MATLAB. And then I started working in finance where I had to do analysis and then turn that into production systems. So MATLAB is not really good at that. And most of the things that other people are using are stuff with the same problem, which is why a lot of banks and a lot of hedge funds and people with oil and gas and lots of other places are standardizing on Python as a solution for these problems. Personally, I did not used to be a software person. I think I've taken, like, three computer science courses. But because I was tired of, like, having this dependency on someone else, I just learned it. And so that's, anyways. And I never looked back. So MATLAB, Java, no more. Python all the way. So briefly, for those of you who are not familiar with scientific computing with Python. Okay. So this, first of all, this is the IPython notebook. Basically, it's a web interface that sort of talks to a Python interpreter. So you can execute commands here and you can get the output. But you can also do other things like embed markdown, which gets translated into HTML. You can embed LaTeX, which gets translated into, you know, rendering mathematical expressions. And so it's a good way to present code and documentation and present analysis that other people can reproduce. So why do people use Python for science? You can do lots of scientific stuff, linear algebra, machine learning, statistics, solving differential equations. It's really good at interfacing with CNC plus plus. And that's the reason why it's been popularly adopted, because lots of groups have existing CNC plus plus toolkits that they have to hook up to. It plays nicely with every technology almost. So except for Java maybe, that's the only problem. But basically, like, you're in a company, they have all this heterogenous environment of technologies. You need to work with it. Python is like a really great way to do that. Okay, tools you should know about. Ipython notebook, that's what I'm using to show all my stuff. NumPy and pandas, which are sort of like the array, data operations libraries. For doing analysis, there's lots of libraries. So that's why it says dot dot dot. But scipy, stats models, scikits learn. And Matplotlib is sort of the dominant technology for doing visualization, and it's fantastic, but we're trying to make it better, or make something that's better or can augment it. So just some real quick stuff. Lots of scientific computing is focused on vectorized operations. So you can see here what I'm doing is I'm defining a linear space from negative 2 pi to pi of 2,000 samples, computing the sine of that linear space, and then also taking that sine wave and adding some random noise, and then plotting it. And you'll see that I'm doing these vectorized operations. I'm generating these vectors, essentially. But there are no for loops here. There are no for loops at all. So the key point is vectorize things. It's good for a few reasons. One, it makes your code more concise, and it makes it look more like math, so that people who don't want to learn programming can understand it. And two, because all this stuff is pushed into C and C++ or Fortran, it's really fast. And then just a more complex example, this is like an automile per gallon data set. So it's cars, right? What year they're built, what their miles per gallon is. And PANIS lets you do cool things like you can group by the year, take the miles per gallon and compute the mean. So this is mile per gallon by year, right? You can also do filtering operations here. So I'm pulling out all cars that are made by Toyota and computing the mean by the year. Mean of the mile per gallon by year, right? You can see that. I'm doing the same thing for everything that's not Toyota. I can combine that all into one data set and then plot them. So you can see that Toyota is slightly better than other people at miles per gallon from that time period. 72 to 82, which is very outdated, right? Okay, so that's a little background in why people care about Python in scientific computing. Now, to talk about Bokeh, which is why I'm here. So what is Bokeh? And there are several answers to this question. One, Bokeh is a web-based data visualization library driven from Python. That's like the basis to answer for what is Bokeh. And actually, before I continue, if anyone has questions or if I'm talking too fast, they tend to be like a fast presenter, please raise your hand and interrupt me. It's fine. I would like to take questions now because I'll forget later. Okay, first, web is a natural target. Most plotting toolkits target rich clients, right? They target just like you execute a plotting command, you get some window. And how do you share that? You have to save it to a PNG email to someone. Okay, so the web is a natural target for these things because analysis is becoming more shared, right? There's more of an emphasis on reproducible scientific analysis. And then why Python? Well, first of all, if you want to do web stuff, you have to use JavaScript, right? That's sort of the only way. Most data scientists and quantists and geologists, I say geologists because that's like another target area for people who use Python to do scientific computing, they don't know and they don't want to learn JavaScript. I used to be a quantist. I learned JavaScript and I'm not happy about it, but I have to because of my job. So it turns out that Python is also really good at data analysis, so it's a natural choice. If you can do these visualizations from Python in the web without writing JavaScript, then big win. Second point, Bokeh and the way that we think visualization should be driven are from a language-based toolkit. And what I mean by that is you use a programming language, Python, to construct visualizations. That is contrary to what you would do in Excel because in Excel you would pop up in a little wizard, right? This column, this column, make the scatterplot do this thing. And there's a lot of reasons why we think a language-based toolkit is better than a GUI toolkit. First, at Continuum we think that layers are super, super important. So I said super, that says really, super is like even more emphatic. And why? Because data scientists fit into this broad spectrum, right? You have some people who are like hardcore C++ quantists who've been writing C++ for 20 minutes, and then you have some people who are like, well, I kind of know Excel and that's about it, right? They have various levels of insertion points for people depending on their comfort level with technology. And so we like to build lots of layers so that if you're super crazy, you can do super crazy stuff. If you're not so crazy, you can do some still useful but less crazy stuff. Now, for people who are really crazy, they like to do crazy things. And typically if you build a user interface for someone who does crazy things, you end up with like 50 menus and like lots of checkboxes and it's just not usable, right? I'm not saying you can't be done. I think it's really hard and I don't want to do it. So our view is build a stripping layer first. That way anyone who's sort of sophisticated can do complex stuff and if you're so ambitious, we can build a GUI layer on top of that. But that's secondary. Interactivity and streaming is a fundamental goal for Bokeh. Current technologies are really great. So let's go through a couple. This is Matplotlib. So who's used Matplotlib? Okay, lots, yeah. It's great, right? Like you can issue a few commands and you'll get these nice graphs. They're not necessarily the most attractive ones, but they're functional. The problem is that they're typically not very interactive. You can do some basic stuff, but they're not that interactive. And they don't handle streaming data well, right? Handling streaming data with Matplotlib is just sort of do the plot over again. Actually, you can actually go in there and execute some drawing commands, but it's pretty basic. On the R side, the dominant technology is GGplot. GGplot is really great. It still has the same problem. It's primarily geared towards static visualizations, but GGplot is really good because it'll let you make complex statistical visualizations. So visualizations that are geared towards the things that statisticians want to know. For example, if you have lots of factors, you can do like scatterplot matrices and stuff like that very easily with GGplot. But stuff is the same problem, right? So our goal was to build a library for Python where you can do all this cool GGplot stuff, all the cool Matplotlib stuff, but have it be on the web interactive and streaming by default. So that's pretty ambitious. Oh, yeah, and big data. That's the other part. Nobody's going to be checking. I know. And actually, we have no monetization strategy for Bokeh directly yet. We have others, but... Okay, so one key thing in Bokeh, so we're still on the what is Bokeh part, is that there's like this cool object model, and it's a cool cross Python, cross JavaScript object model. So the reason you need that is because you want to be able to do stuff in the browser and have that reflected on the Python side. So we have basically classes in the JavaScript world and in the Python world that can all be serialized to JSON and a WebSocket channel that will synchronize both of them. So who knows JavaScript here? Okay, who's heard of Meteor? So it's kind of like that, but less full-featured and you have to deal with two languages on different sides. So I guess it's not that similar, but it's same idea, right? Okay, the other thing is that Bokeh operates on a glyph-based architecture. That probably means nothing to most people. It didn't mean anything to me until my president was like, you guys, we need to use glyphs. And I was like, what? So what that means is that instead of saying, I want a scatter plot and I want a line plot, which you can also do at a higher level, there's a lower level of glyphs. And glyphs are just shapes, right? So they're like squares, rectangles, diamonds, crosses, lines. And the point is that with glyphs, if you have a glyph-based architecture, data scientists can create novel visualizations, right? So let's say we didn't write a candlestick plot. So who has seen candlesticks? Okay, well, here they are. So that's just a rectangle with a line segment, right? So if we didn't have a thing for candlesticks, you can build it using the rectangle glyph and the line segment glyph, right? The idea is that if we didn't make it, you can compose these things together to do that. And I would be sort of a bad person if I didn't also mention D3. No, because D3, a lot of the inspiration comes from D3. So D3 by far has like the best website, right? But D3 is an SVG-based library for mapping data to SVG attributes. And it's all JavaScript. But a lot of these glyph concepts come from D3 and protobisks. That's where they're centered. Okay, finally, the other part of what is Bokeh, before we get into like some of the things that you can do, Bokeh is focused on big data. So big data visualization in the browser is kind of like a weird thing, right? Like what does that mean? Because first of all, usually when you do visualization in JavaScript on the client, you usually have the data in the browser, right? That's how you usually do most visualizations. Well, I think the definition, one of the definitions of big data, there are lots of people talk about like scalability and speed and all this other stuff. But I think one defining characteristic is you can't have people downloading big data into their web browser. Then it's like not big data anymore. Okay, so how do you do that? And actually the other question is how do you even visualize big data? So has anyone ever looked at a scatter plot of like 10 billion points? No? That's good because it's useless. Because you just see this like massive cloud of garbage, okay? Like we have an example, it's not quite 10 billion, but it's, I'm going to talk about this later, but you'll see. Okay, that's like, that's what you see. You see no relationships, right? And so one thing, so there are two questions. How do you deal with big data without sending it to the client? Right? And how do you deal with big data when like the visualization that you used to do is meaningless? The answer is abstract rendering, but I'm not going to tell you what that is right now. So, okay, so one example just to, let's get our feet wet. This is what Bokeh looks like. Here's the line plot. So this notebook sets up Bokeh, it just imports a bunch of stuff. It connects to our Bokeh server. Bokeh doesn't have to be run with a server, but it can be. And that's, basically we have lots of different ways that Bokeh and they range from levels of power to like, power as in like capability, not like electrical power, to very simple ones that are more limited. But I'm using the full view version now. So I'm putting it into the IPython notebook, connecting to the Bokeh server. I'm setting up some data here. So I'm just setting up a linear space from zero to four pi and computing sine, right? So I'm here, this command. I'm creating a line glyph, right? It's 200 by 300 pixels. It's interactive. I can pan it. I can zoom it, right? So that's nothing fancy. You can do this in most things, although in the notebook, interactivity in the notebook is actually not that straightforward. So it's kind of nice that we can do this out of the box. All right. I mentioned layers, so let's get into that a little bit. So the lowest level that we have, so what I just showed you is a fairly, actually it's a medium level example because you're working with glyphs, but it's just one function call. It sets up a glyph and sets up a plot. There's a lower level that you don't see, which is an object level. And I mentioned this like Python, JavaScript object bridge, which lets you do all sorts of cool stuff. If you want to do really custom things, you can bypass our custom plotting functions and just instantiate the objects and hook them up and send them to the server and they'll get rendered. And I want to talk about this really quick so that you understand how Bokeh plots are constructed. Because the object model is directly related to the kind of cool stuff that you can do. So at the top, we have plotting containers. So there's the basic plot and then there's the grid plot. The GMAT plot is like a specialized plot class because we had to do some weird stuff to handle Google Maps, but don't worry about that. Then we have a variety of data sources. So one of the cool... So data sources is how a lot of the interactivity comes from because you can have multiple plots linked, pointing at the same data source. The two main things that are important for doing interactivity are data sources and ranges. Ranges sound really boring, but what they are, they're screen ranges. So screen ranges typically define pixel ranges on the screen. So the plot that I just showed you went from 0 to 301, accessed in 0 to 300 and another. And then there's data ranges. So most visualizations do things where they map data space to screen space. And so that's why you want access from a programmatic perspective to the data source objects and the range objects. And that way you can control lots of things. You can auto-scale the plot boundaries. You can make the plot auto-pan as new data comes in and stuff like that. Finally, down here we have some of the glyphs. So there's circles, lines, racks, wedges, image glyphs, quads, text glyphs, line segments, et cetera. We have the other things called markers, which are basically glyphs, but they're glyphs used in a special case where one shape maps to one data point. So scattered plots use marker glyphs. But line plots don't, right? Because there's one line, but many points. And then we have guides and we have annotations. So guides are things like the axes. So we have a linear axis and a daytime axis. And log is coming, but people haven't really asked for that. And then the grid lines. The grid lines are another form of annotations. I know the annotations stuff is kind of like, it's like boring, but if you don't have them, we'll use your plotting library because they don't know what any of your data points mean. And then finally, actually sorry, guides. Finally, annotations. We have the legend, right? Legends on plots are useful annotations. And then a bunch of tools. And that's where the interactive stuff comes in. Zooms, pans, embedding it. So all these bokeh plots, particularly the ones that are on the server, you can use the embed tool to generate a link, paste it somewhere else, and then you'll have it in a web page wherever you stuck it. The plot structure looks like this. Each plot typically has two data ranges, although that's not long term, that's not really a requirement because there are a lot of times where you want to plot two sets of data on the same plot with different ranges, like twin axes, for example. But a plot generally consists of a set of data ranges, a bunch of tools, and a bunch of renderers. And those renderers have pointers to data sources. So that's the lowest object level. From the Python side, we present glyph functions so that you can just say, I want this plot to have these glyphs, and then it'll make them. And then there's also schematic functions on top. So a scanner plot is a schematized plot composing glyphs together. And so there are other ones that we're going to come up with. And then another version of that is like, ggplot2 is sort of a schema. Well, you can create lots of schematized plots using ggplot2. So there's actually a Matpotlib project called C-Born which lets you do ggplot in Matpotlib. And so we're going to either take that and make that work with bokeh or something like that. But there's going to be ggplot2 with bokeh. OK, let's skip some of these details. OK, so let's talk about interactivity. I wanted to present a simple example to show you how interactivity works in the default case. So this is the auto mile per gallon data that I showed you. And here you can see I'm just calling the scatter twice. But I'm passing in an explicit data source. So here I have a scatter plot of the year of the car on the x-axis and the miles per gallon on the y-axis. And here I have a scatter plot of, well, the x-axis is not very legible there. But it's weight, and it's weight, and miles per gallon again. But they're pointing at the same data source. And so if I do a selection, so this is classic, right, linked brushing. We didn't invent this, although I wish we did. But you do a selection. That selection persists on a data source. Let's just know how to render that selection. In this case, the default system that we have right now for rendering selections is by alpha. So if something's not selected, you increase the transparency. And if something is selected, then you don't have any transparency. Now, that's not that hard to do in lots of stuff. But no one can do this. So what did I do? I just took the data source object, and I told it to update itself from the server, because of the points that are selected. So I'm not sure if everyone sees, maybe knows why you want to do that. But the reason why I want to do that is because I want to know, I want to look at the auto mile per gallon data that I selected on the graph. I just sort of arbitrarily accepted. Let's pick something that we actually care about. So these are the cars that have the best miles per gallon above 40. So I have to do this again. And so it's these. It's this Mazda GLC, this Volkswagen Rabbit, and this Honda Civic. But what's cool is that we can go the other way, too. So here I have a Pandas expression that basically does a filtering operation to tell you all cars that are Chevy's and convert that to a list of integer indexes. I'm updating the selection field on the data source and pushing that to the server. And then this last line is just, I'm just displaying it in the table so you can see what the Chevy data looks like. And actually, let's make this more interesting. Let's change it to Toyota. So that way you can see it actually changed. And then the plot shows you the points that are Toyota. So this is what I mean when you really want to synchronize these two worlds from the visualization to the programmatic world. And no one really does that because it's hard. But it's not that hard. It's just that it's a pain. It's a real pain to set up all this infrastructure. So the default form of interactivity, and there's other ways that we can do this, but the default form to make it easy, the case that people want to do is they want multiple views on the same data set. And the way you do that, you pass the same data set to multiple visualizations. All the selections are connected. The second case that's commonly used in interactivity is just linked to panning. This isn't super sexy because lots of people can do this. But I mean, I just want to make sure that you understand that the two important things for like the top 90% of interactive things you need to do, something with data ranges and something with the data source. So I just showed you the link brushing with the data source. This is link panning. And all that means is that you need to, when you construct the plots, you need to make sure that they're both using the same data range objects. But you can do lots of other stuff. Once you have access to the data range object, you can do lots of other cool stuff. For example, as time takes by, if you're having an updating time series plots, auto adjust the plot to show the current day. Things like that are useful when you have access to data ranges. Any questions yet? We're good? Okay. So in this conversation, I talk a lot about interactivity and streaming data as the same thing. They're actually totally different. You can have interactivity without streaming data, and you can have streaming data without interactivity. But the reason why I grouped them together is because they're all easy when you have a reactive object model. And so the way that the stuff works here is that you have these objects, right? If something changes, other objects get notifications that those things changed, and they can do computations. They can change things. They can re-render, et cetera. And so once you know that, then updating a data source and having the rest of the plot change is not that far-fetched. It's quite normal. And so streaming data is sort of, that's why I connected two together, because it's the same infrastructure that enables both things. So here is a streaming data example. So I'm computing a random walk that's centered at 100, and then I have it here. It's not doing anything interesting. I have this loop here, which I interrupted earlier, but essentially all it does is while true, it computes a new random value, and then it sleeps for a second. So if I execute this, and I hope this still works, it's gonna run, and there we go. I can zoom in on the thing that's updating. Uh-oh. Oh, it did stop. No, it's still like, it's just not very, yeah. And I mean, in reality, you would never do this, right? Because you only do this loop here when you have fake data that you're fabricating, right? But if you had data updating from somewhere, they just have to update the data source, and then all your plots update. So we want to make sure that if you're like a data scientist, you're building a dashboard for your company. You can do map-pot-lib style interactive analysis, construct some plot, look at it for static data, and someone says, I want to turn this into a live application. Okay. So I can just click the link to embed my plot, give you a little snippet, you put it in your website, and then you write a little script that pulls new data, updates the data source, and you have your dashboard. Let's interrupt this. This is a more complex case, so I don't know why you'd want to do this, but we're just showing you that there's no limits, right? You can do crazy plots like this, and you can animate them. So data comes in and it rotates, right? And it's just, the loop is doing the same thing. It's pulling out the data source object, and it's manipulating these fields, and as a result, the graph updates. And I mean, it's completely interactive. You can pan and zoom in. You can pan it, and you can zoom it, and all sorts of stuff, right? So it's super powerful for building dashboards and other things. Okay. So I already talked a little bit about the glyph stuff, right? The candlesticks being composed of rect and line, segment glyphs. I just wanted to show you one super complex example. Just so you can see that there's like, once you have glyphs, you can do lots of crazy stuff. So this is, I don't actually completely understand this because I'm not a biologist, but it's, from what I gather, it's different bacteria and how they react to different antibiotics expressed as wedge plots. And so all you need to construct this, I mean, this is a pile of code, so I'm not gonna, pretend like this is easy, right? Depending on how crazy you want to get, it can get hard, right? But the point is you can do it. And so this is just, like these bands, these are annular wedges. These other things that radiate outwards, those are just wedge glyphs. And then we have a bunch of text glyphs scattered around. So glyphs are really powerful. That's the thing. Like if you need to do something really custom, having access to glyphs makes your life a lot easier. And could you imagine trying to do this by executing canvas drawing commands? Like arc, line segment, arc, draw text here, like it's, so. Okay, finally, the big data portion, an abstract rendering. So from a high level, abstract rendering means you have a, so I'm a data scientist. I did a plot. That plot resulted in this glyph specification of objects. Abstract rendering says, okay, data scientist, you said what you wanted, but I know what your data looks like. So I'm gonna take your specification and I'm gonna monkey with it. And then on the other side, you're gonna get something that you didn't ask for. But it's gonna be what you really wanted. At least that's the ambition. And so one common case, we're gonna return to the scatter plot of one billion points example. So in this case, pixels are bins. So if you did a scatter plot and you used square glyphs, most of the time, they're gonna overlap in some sort of fashion. And so once you have this overlapping pattern, you can compute the counts that reside on any pixel. And so here, you see that the ones that have most, there are four, and there are some that have one, and there are some that have zero. So you have a geometry. The geometry is the specification of the plot. You reduce that into these abstract pixels or these counts. And then you apply a transfer function and then you get the actual pixels that you want to render. And this transfer function is where the magic happens. So if you don't apply any transfer function, you get something crazy like this. If you take it and you say, well, okay, I can do way better than that point cloud. Let's just take the max counts and set that to an alpha of one. Quick question. If I say alpha, do you guys know what that means? So alpha of one means it's not transparent at all. And alpha of zero means you can't see anything. And so you can set it up. Once you know the max number of counts, you can set it up so that your the point of maximum intensity is at one and your other values are just sort of linear, depending on the number of counts. And then from that, you can get the middle image, which is like, that's much more reasonable, right? But we have this, this is another thing. So you can experiment with transfer functions and some of these transforms are nonlinear. And we have one called high death alpha. And essentially it accentuates points. And when you do that, you can see structure in your data that you didn't have before. Here is sort of a, I'm actually not sure what the underlying data is, but obviously that's the United States and there's some geographic data, right? But it's the same approach applied to a real data set. You have this mass, which like sort of, I mean, that's kind of a picture that you'd expect, given like the migration patterns across the United States historically. And then you sort of get the urban centers, but you get, actually that data is probably population that would seem to make sense. But once you apply abstract rendering, you can get lots more information. Of course, I'm not saying that abstract rendering will always produce something that's useful for you, right? But that's why you have control over the transfer function that's applied. So this is one incarnation of abstract rendering. Abstract rendering is very general. It's just that you express something, we know what the data looks like. We're going to do something else to present to you what we think you really want and make that transformation transparent. There are some other approaches that we are going to pursue. To make Bokeh and other visualization technologies work for big data, the two most common cases that people are doing, scatter plots and line plots. And so this is our approach for scatter plots. The approach for line plots is actually quite straightforward. You have a line plot, you know what someone's resolution is on their screen, and so you can sort of down sample the data selectively so that the plot retains all the interesting components, where interesting is defined as like preserving the maximum and minima over different ranges or something like that, right? But, you know, envision the candlestick example. For the candlestick example, candlesticks are aggregate statistics of some quantity over a certain time window, right? So most people look at daily candlesticks. You have weekly candlesticks, hourly candlesticks, one minute candlesticks, whatever, right? So one simple case application of abstract rendering is a candlestick plot that auto bins depending on its zoom level, right? Other things that we're doing, like for massive line plots, like for, we work in finance, we do lots of Monte Carlo simulations, and so you get like, if you plot those as line plots, you just get these like, these like line funnels that are not that useful. And so what we can do there is you can do things like for regions where you know that the lines that are being drawn are too dense for anyone to see anything, you can do things like add trend lines or add error bars or something so that people get some intuition into what they wouldn't normally see before. And that's a fairly transparent process. But that's the reason why we built this like Python JavaScript object model so we could have access to these transformations on the Python side. And that's the reason why we built this glyph architecture so that when we're doing these transforms we can actually construct new glyphs that give the user more information about the plot that they're looking at. So that's it for what, so that's all I had planned for what bokeh is, we're almost at nine, for what bokeh is and what it can do. And actually I'm talking about the abstract rendering in a very sort of general hypothetical case and the reason is we have an implementation of abstract rendering in the sense that we have a Python function that will take like a specification of scatter plots and produce an image but we don't have it hooked up to the bokeh library yet. So that's actually coming in January and the reason why I talk about it hypothetically is because we're going to be slowly adding different forms of abstract rendering depending on the use case. So that's like the big open playing field for bokeh. And it's going to be super fun. So are there any other questions? Yes. Just one question. Any work with roster data? Image? You mean like being able to render an image? Yeah. And actually I also have the panning and zooming. Yes. So I believe we have an image with and that should work. Yes. I think people did overlay like image data that say satellite and actually calculate. Yes. So we have, well we have that in various forms. In our plot, plot specification we have different levels of rendering. There are, so there are underlays. There are, I forget what it's called. There's an underlay, there's something in between there and there's an overlay. And generally the, like the scatter plots go into the middle area but image backgrounds and stuff like that would go into the underlay. But we've done Google map examples where you synchronize the coordinate system between the tile that you're displaying in the image layer and the data that you're displaying and that way when you pan them they synchronize and like we actually have that's why the GMAP plot is so like separate and weird because for that we had to handle the extra case where like as you pan you have to grab new tiles from the server and like use Google map API to do stuff. So I don't know if that answers your question. Do you have an mapping example? I don't have an mapping example here. I don't have one that currently works on my computer. I might have it's helpful. I can show this. Okay. Well, let me see if I can bring up the picture while people are talking about stuff. Are there any other questions? I should. Okay. Don't bother me. Yeah. Well, I just realized that that slide maybe I can't share yet. So the last thing I was going to talk was any other questions? Because I was just going to go into the technologies we use because let's talk about technology. Sorry, I do have two questions. Okay. Two questions, actually. One is that in my organization we use commercial solutions. Okay. Like Tableau? Yeah. I guess we don't have enough crazy data scientists around. So we use Tableau as well as ClickView. Yeah. Right? And it does all the stuff that you say. Maybe a subset of it, I guess. The linked brushes. Right. Right. And all that. How do you think it compares to something? Okay. The second one is we are looking at Shining, the R Shining. Yes. Yeah. And how does this sort of work? Okay. So first of all, so Tableau is definitely much more mature than Bohei. Right? Like I wasn't sure if these demos would all function on my computer today. Right. But the... Try and drop. Yeah. Yeah. Sure. So... So I'm not personally use Tableau. The only thing I can do, well first is expensive. Yes. Right. This is free. But that's not... I would never say that's the only reason you should use something. But you have to code this. The other one just... We have it coded. Oh, that's right. Yeah. That's true. Well, on that I would say that being able to code it, maybe for people, for a lot of people that's not an advantage. But for what we're targeting, that is the one primary advantage. This is from what I understand. I don't think that Tableau has anything in terms of the abstract rendering stuff. And that's the main thing that we're trying to push. We actually built all this infrastructure so that we could do the abstract rendering piece. So that's where I think the real power of Bokeh is coming from. We have those software made for eight users. So our finance guys will just be able to visualize their financial information using Tableau. Yes. Without any training, any coding experience. Right. Just drag and drop. No, I understand. So that is the biggest advantage to people to do. Yeah. So I think that's the end user space. You need a folder, right? You definitely need someone. You need a descriptor. You need somewhere because I'm emphasizing that because people always talk about it like it's one or the other. My whole point is that I've been in the middle my entire life. So there is a middle. But yeah, absolutely. For the end user case, we're not targeting that right now. I think we may and actually you have most. Typical dashboard, you know, a string of four or five. I don't. You know, those Tableau click views. Yeah. I don't have a demo. The stuff that I showed you. The filters and stuff. At the moment. I can show you stuff later or I can email you some stuff. The sorry. There's actually we are partnering. Well, we so one of the reasons why we do this is because we were funded by the U.S. Department of Defense and they have other groups. So we were we participated in this weird program called X data where it's weird weird in that it's great. But did weird in that they what they did was they like gave a lot of organizations small chunks of money and then had them all develop solutions that kind of overlapped. And so there's actually group out there like it were who's sort of doing what you're talking about. They're building the UI for designing plots and like drag and drop stuff like that. And that outputs to Vega which then gets rendered to D3. And one thing that we've talked about is being able to consume the Vega intermediate representation and then turning that into both people. So I guess my answer is no, we're not going to have a drag and drop solution for that very soon but in the long term we may. And so that may or may not suit their needs, right? Like that's just second question. Are shiny? So I don't think that what this is, while this can be compared to are shiny it's on a different level. So for those of you who don't know and actually you should but I've only seen little things that people do with are shiny but I don't know very well. But for people who haven't used are shiny before it's essentially you can easily construct widget UIs. UIs with like little inputs that in essence calls an R function. Right, that calls an R function which does some stuff and then that gets rendered. And so while you could do that with Bokeh that's and we've done some examples of that that's sort of that's we have that in mind but that's not what and actually the I Python notebook has something that's really great for that. So the I Python notebook it's not released that interactive feature isn't released yet but they're building something where you can basically define an input widget output that to a notebook and then define some function and that function gets called as when you move the sliders around. So there are Python technologies that do what you're talking about. You could do that kind of stuff with Bokeh although it would be harder. If I was going to do that you might not need it. So any other questions? Before I move on to the technologies used well actually it's well yeah do you guys want to talk? I think we can wrap it up first and then we can figure something out. If, okay let's wrap it up if you want to talk about technologies we use they're there you can come chat with me and I'll tell you what I like about these and what I hate before I just want to say that talk a little bit about how we make money because I want to make money from you guys eventually at some point in time. You can pay for so Anaconda is a Python distribution that's free and it's really great because you can get it and get all the scientific Python packages but we have add-ons to that which are not free and they make your Python stuff way faster including one of our key products is NUMBA which is a Python to LLVM compiler which can make your Python code as fast as C and C plus plus and we are giving that away for free the thing that we're selling is the thing that makes that automatically work on GPU and multi-core architectures. We're trying to target side licenses. No, per year. We're trying to target so we're not going to make a lot of money off of people at home going, I want to do GPU stuff, right? It's like I work for DBS and I want all of DBS to use that stuff and then the other thing is that we have we have a cloud-based solution for hosting web applications Bokeh plots called Bukhari and so if you need to go to Bokeh and the cloud you should go to Bukhari and then sign up for the free account but of course upgrade to the paid account because we want to make some money and so that's and actually but the main thing is that we also want to sell it into enterprises because enterprises want to share iPython notebooks with people and that's what we're doing. So if you're a work for organization that needs iPython notebooks shared with amongst people we can help you with that. So that's it. Okay, so chat with me