For the interactive tutorial notebook, if you are not already on it, visit binder.

For a detailed reference on any of the things described here, visit the API Reference.

Importing#

[1]:
%load_ext watermark
%reload_ext autoreload
%autoreload 2
# The above two lines are often unnecessary but can be useful if importing code that you are actively editing.
# They make it so that any imported code that you edit is reloaded, so you don't have to restart the kernel or
# anything for changes to take effect when you use that code in the notebook.
from bolides import BolideDataFrame

Making/saving a BolideDataFrame#

From neo-bolide.ndc.nasa.gov#

[2]:
bdf = BolideDataFrame(source='glm')
downloading: 9.43MiB [00:00, 47.2MiB/s]

From USG data#

[3]:
bdf = BolideDataFrame(source='usg')
downloading: 79.2kiB [00:00, 2.44MiB/s]

From pipeline output (advanced)#

[4]:
# bdf = BolideDataFrame(source='glm-pipeline', files=['20220602_bolide_database_G16.fs', '20220602_bolide_database_G17.fs'])

To and from serialized objects#

Due to the (non-plain-text) nature of some of the data types that can occur in a BolideDataFrame, the best way to preserve all of the data structures when saving and loading is to serialize the data with pickle. Note: only open pickled Python objects from people you trust!

[5]:
# saving:
bdf.to_pickle('bolide-data.pkl')
# loading:
bdf = BolideDataFrame(source='pickle', files='bolide-data.pkl')

To and from csv#

Since most of the data is plain-text, and some can be easily stored as plain text and restored into its original data type, bolides also supports saving and loading to csv files. Note that the data in some columns (e.g.Β those that contain a dict or light curves) will not be preserved. Saving to csv lets us look at the data in any spreadsheeting software.

[6]:
bdf = BolideDataFrame(source='glm')
# saving:
bdf.to_csv('bolide-data.csv')
# loading:
bdf = BolideDataFrame(source='csv', files='bolide-data.csv')
downloading: 9.43MiB [00:00, 40.8MiB/s]

Basic BolideDataFrame usage#

The BolideDataFrame class can do anything that a Pandas `DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`__ can. First we might want to get an idea of what’s going on in our BolideDataFrame.

[7]:
bdf
[7]:
datetime longitude latitude source detectedBy confidenceRating lightcurveStructure energy_g16 energy_g17 brightness_g16 brightness_g17 brightness_cat_g16 brightness_cat_g17 _id description groundTrack howFound otherDetectingSources otherInformation nearbyLightningActivity status attachments name duration latitudeDelta longitudeDelta beginningAltitude lastModifiedBy lastModifiedDate enteredBy enteredDate createdAt updatedAt __v submittedBy submittedDate publishedBy publishedDate images csv platform reason rejectedBy rejectedDate geometry phase moon_fullness solarhour sun_alt sun_alt_obs date_retrieved
0 2022-07-24 15:35:23 -164.9 9.6 source GLM-17 low good NaN 1.684982e-15 NaN 9.684022e-15 NaN Faint 62eaef475ea90d4d02ae740f NaN {'GLM-17': {'category': 'Single-Pixel', 'value... {'GLM-17': ['forest']} NaN NaN isolated PUBLISHED [{'location': {'coordinates': [-164.9238586425... NaN 20.0 1 1 NaN jdotson 2022-08-03T22:01:56.486Z rlongenb 2022-08-03T21:57:27.506Z 2022-08-03T21:57:32.020Z 2022-08-03T22:01:56.548Z 0 rlongenb 2022-08-03T21:57:36.356Z jdotson 2022-08-03T22:01:56.486Z [{'name': 'Map', 'url': '/img/62eaef325ea90d4d... ['/csv/62eaef325ea90d4d02ae71ec_OR_GLM-L2-LCFA... GLM-17 NaN NaN NaN POINT (-164.90000 9.60000) 0.861715 0.276569 4.487009 -17.552094 -17.552094 2022-08-07 22:50:49.161728
1 2022-07-24 11:55:46 -127.9 43.9 source GLM-17 low good NaN 2.684862e-15 NaN 6.284430e-15 NaN Faint 62eaee425ea90d4d02ae5ce8 NaN {'GLM-17': {'category': 'Single-Pixel', 'value... {'GLM-17': ['forest']} NaN NaN isolated PUBLISHED [{'location': {'coordinates': [-127.8804244995... NaN 20.0 1 1 NaN jdotson 2022-08-03T22:02:07.376Z rlongenb 2022-08-03T21:53:06.927Z 2022-08-03T21:53:11.111Z 2022-08-03T22:02:07.451Z 1 rlongenb 2022-08-03T21:54:37.654Z jdotson 2022-08-03T22:02:07.376Z [{'name': 'Map', 'url': '/img/62eaee275ea90d4d... ['/csv/62eaee275ea90d4d02ae5961_OR_GLM-L2-LCFA... GLM-17 not iso rlongenb 2022-08-03T21:53:57.689Z POINT (-127.90000 43.90000) 0.856568 0.286864 3.293469 -11.901525 -11.901525 2022-08-07 22:50:49.161728
2 2022-07-24 08:31:45 -61.0 1.7 source GLM-16 low good 1.884958e-15 NaN 1.498339e-14 NaN Fairly Bright NaN 62eaeda15ea90d4d02ae4c73 NaN {'GLM-16': {'category': 'Multi-Pixel', 'value'... {'GLM-16': ['forest']} NaN NaN not isolated PUBLISHED [{'location': {'coordinates': [-61.00012207031... NaN 20.0 1 1 NaN jdotson 2022-08-03T22:02:21.422Z rlongenb 2022-08-03T21:50:25.672Z 2022-08-03T21:50:32.955Z 2022-08-03T22:02:21.628Z 1 rlongenb 2022-08-03T21:56:02.264Z jdotson 2022-08-03T22:02:21.422Z [{'name': 'Map', 'url': '/img/62eaeca75ea90d4d... ['/csv/62eaeca75ea90d4d02ae4037_OR_GLM-L2-LCFA... GLM-16 not iso rlongenb 2022-08-03T21:55:21.954Z POINT (-61.00000 1.70000) 0.851786 0.296429 4.353210 -22.511147 -22.511147 2022-08-07 22:50:49.161728
3 2022-07-24 05:37:45 -37.3 17.8 source GLM-16 low good 2.684862e-15 NaN 6.684382e-15 NaN Faint NaN 62eaec6d5ea90d4d02ae2e6a NaN {'GLM-16': {'category': 'Multi-Pixel', 'value'... {'GLM-16': ['forest']} NaN NaN isolated PUBLISHED [{'location': {'coordinates': [-37.33891677856... NaN 20.0 1 1 NaN jdotson 2022-08-03T22:02:30.895Z rlongenb 2022-08-03T21:45:17.548Z 2022-08-03T21:45:25.417Z 2022-08-03T22:02:31.183Z 0 rlongenb 2022-08-03T21:45:34.172Z jdotson 2022-08-03T22:02:30.895Z [{'name': 'Map', 'url': '/img/62eaec545ea90d4d... ['/csv/62eaec545ea90d4d02ae1d1f_OR_GLM-L2-LCFA... GLM-16 NaN NaN NaN POINT (-37.30000 17.80000) 0.847707 0.304586 3.033283 -31.588795 -31.588795 2022-08-07 22:50:49.161728
4 2022-07-23 11:33:31 -120.1 -4.5 source GLM-17 low good NaN 1.485006e-15 NaN 3.784730e-15 NaN Faint 62eae5765ea90d4d02ae1404 NaN {'GLM-17': {'category': 'Single-Pixel', 'value... {'GLM-17': ['forest']} NaN NaN isolated PUBLISHED [{'location': {'coordinates': [-120.0738830566... NaN 20.0 1 1 NaN jdotson 2022-08-03T22:02:40.929Z rlongenb 2022-08-03T21:15:34.702Z 2022-08-03T21:15:45.304Z 2022-08-03T22:02:41.024Z 0 rlongenb 2022-08-03T21:25:14.162Z jdotson 2022-08-03T22:02:40.929Z [{'name': 'Map', 'url': '/img/62eae55d5ea90d4d... ['/csv/62eae55d5ea90d4d02ae0b25_OR_GLM-L2-LCFA... GLM-17 NaN NaN NaN POINT (-120.10000 -4.50000) 0.822293 0.355414 3.443016 -37.452290 -37.452290 2022-08-07 22:50:49.161728
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
3922 2017-10-08 08:01:06 -80.6 28.1 source GLM-16 high NaN 4.525970e-15 NaN 9.103880e-15 NaN Faint NaN 5d0d4073bceaa433f0427cc9 NaN NaN {'GLM-16': ['all-sky camera correlation']} all-sky GLM-16 was not operational at this time. The G... NaN PUBLISHED [{'location': {'coordinates': [-80.44627380371... Florida fireball 20.0 1 1 NaN jdotson 2019-11-01T05:18:22.762Z rlongenb 2019-06-21T20:39:15.083Z 2019-06-21T20:39:18.616Z 2020-04-28T10:17:22.913Z 3 rlongenb 2019-09-27T15:38:55.162Z jdotson 2019-11-01T05:18:22.762Z [{'name': 'Map', 'url': '/img/5d0d404bbceaa433... ['/csv/5d0d404bbceaa433f0426921_OR_GLM-L2-LCFA... GLM-16 NaN NaN NaN POINT (-80.60000 28.10000) 0.612257 0.775487 2.852754 -43.869024 -43.869024 2022-08-07 22:50:49.161728
3923 2017-10-01 12:43:52 -111.6 35.2 source GLM-16 high NaN 4.525970e-15 NaN 1.062985e-14 NaN Fairly Bright NaN 5d0d3f34bceaa433f0425c04 NaN NaN {'GLM-16': ['all-sky camera correlation']} all-sky GLM-16 was not operational at this time. The G... NaN PUBLISHED [{'location': {'coordinates': [-111.3795318603... Arizona Fireball 20.0 1 1 NaN jdotson 2019-11-01T05:18:43.286Z rlongenb 2019-06-21T20:33:56.480Z 2019-06-21T20:33:59.632Z 2020-04-28T10:17:22.885Z 2 rlongenb 2019-09-27T15:38:49.475Z jdotson 2019-11-01T05:18:43.286Z [{'name': 'Map', 'url': '/img/5d0d3ed0bceaa433... ['/csv/5d0d3ed0bceaa433f0424f20_OR_GLM-L2-LCFA... GLM-16 NaN NaN NaN POINT (-111.60000 35.20000) 0.382178 0.764357 5.464497 -8.511078 -8.511078 2022-08-07 22:50:49.161728
3924 2017-09-05 05:11:25 -116.9 49.3 source GLM-16 high NaN 7.577910e-15 NaN 4.211158e-13 NaN Bright NaN 5d0d3dd0bceaa433f0422b31 NaN NaN {'GLM-16': ['USG sensor data correlation']} USG, all-sky GLM-16 was not operational at this time. The G... NaN PUBLISHED [{'location': {'coordinates': [-117.0855407714... British Columbia Bolide 20.0 1 1 NaN jdotson 2019-11-01T05:18:56.902Z rlongenb 2019-06-21T20:28:00.213Z 2019-06-21T20:28:05.920Z 2020-04-28T10:17:22.836Z 2 rlongenb 2019-09-27T15:38:43.473Z jdotson 2019-11-01T05:18:56.902Z [{'name': 'Map', 'url': '/img/5d0d3d7abceaa433... ['/csv/5d0d3d7abceaa433f0420916_OR_GLM-L2-LCFA... GLM-16 NaN NaN NaN POINT (-116.90000 49.30000) 0.490368 0.980735 21.418475 -24.601580 -24.601580 2022-08-07 22:50:49.161728
3925 2017-07-31 22:01:34 -118.5 24.7 source GLM-16 high NaN 6.051940e-15 NaN 4.897844e-13 NaN Bright NaN 5d0d38b8bceaa433f0416637 NaN NaN {'GLM-16': ['USG sensor data correlation']} USG NaN NaN PUBLISHED [{'location': {'coordinates': [-118.5999984741... NaN 20.0 1 1 NaN jdotson 2019-11-01T05:19:09.231Z rlongenb 2019-06-21T20:06:16.893Z 2019-06-21T20:06:22.017Z 2020-04-28T10:17:22.593Z 1 rlongenb 2019-09-27T15:38:37.710Z jdotson 2019-11-01T05:19:09.231Z [{'name': 'Map', 'url': '/img/5d0d387fbceaa433... ['/csv/5d0d387fbceaa433f04148e7_OR_GLM-L2-LCFA... GLM-16 NaN NaN NaN POINT (-118.50000 24.70000) 0.289845 0.579691 14.020207 61.079233 61.079233 2022-08-07 22:50:49.161728
3926 2017-07-23 06:12:36 -69.7 -6.6 source GLM-16 high NaN 6.051940e-15 NaN 1.555970e-13 NaN Bright NaN 5d0d3737bceaa433f040d8a5 NaN NaN {'GLM-16': ['USG sensor data correlation']} USG GLM-16 was not operational at this time. The G... NaN PUBLISHED [{'location': {'coordinates': [-69.56761932373... NaN 20.0 1 1 NaN jdotson 2019-11-01T05:19:22.527Z rlongenb 2019-06-21T19:59:51.037Z 2019-06-21T19:59:57.411Z 2020-04-28T10:17:22.219Z 3 rlongenb 2019-09-27T15:38:30.233Z jdotson 2019-11-01T05:19:22.527Z [{'name': 'Map', 'url': '/img/5d0d36e9bceaa433... ['/csv/5d0d36e9bceaa433f040b258_OR_GLM-L2-LCFA... GLM-16 NaN NaN NaN POINT (-69.70000 -6.60000) 0.994953 0.010095 1.455125 -64.929766 -64.929766 2022-08-07 22:50:49.161728

3927 rows Γ— 51 columns

What do all these columns mean? The describe method will tell us.

[8]:
bdf.describe()
datetime: Date and time of the bolide detection (UTC)
longitude: Longitude of the bolide (Β°E).
latitude: Latitude of the bolide (Β°N).
source: Source of the data.
detectedBy: Satellite(s) that detected the bolide.
confidenceRating: Human-assigned confidence rating for the detection being a bolide.
lightcurveStructure: Human-assigned description of how bolide-like the observed light curve is.
energy_g16: Uncalibrated integrated energy of the bolide as viewed from GOES-16.
energy_g17: Uncalibrated integrated energy of the bolide as viewed from GOES-17.
brightness_g16: Uncalibrated brightness of the bolide as viewed from GOES-16.
brightness_g17: Uncalibrated brightness of the bolide as viewed from GOES-17.
brightness_cat_g16: Brightness category of the bolide as viewed from GOES-16.
brightness_cat_g17: Brightness category of the bolide as viewed from GOES-17.
_id: Unique identifier assigned to the bolide at neo-bolide.ndc.nasa.gov.
description: A human-written description of the bolide detection
groundTrack: Dict stating, for each sensor, whether or not the bolide was present in more than one pixel, and how far the bolide went.
howFound: The computational method used to find the bolide.
otherDetectingSources: Other non-GLM sources which the bolide is present in.
otherInformation: Human-written notes on the bolide detection.
nearbyLightningActivity: Human-assigned description of how much lightning activity there was nearby at the time of the bolide detection.
status: Publication status of the bolide.
attachments: List of dicts containing extra data from the bolide detection.
name: Name of the bolide, if it has been named in the media.
duration: nan
latitudeDelta: nan
longitudeDelta: nan
beginningAltitude: nan
lastModifiedBy: nan
lastModifiedDate: nan
enteredBy: nan
enteredDate: nan
createdAt: nan
updatedAt: nan
__v: nan
submittedBy: nan
submittedDate: nan
publishedBy: nan
publishedDate: nan
images: Paths to images of the bolide detection at neo-bolide.ndc.nasa.gov.
csv: Paths to csv files of the bolide detection at neo-bolide.ndc.nasa.gov.
platform: nan
reason: nan
rejectedBy: nan
rejectedDate: nan
geometry: Shapely Point object representing the bolide's location on the globe.
phase: The phase of the moon at the time of the bolide detection. 0=new moon, 0.5=full moon, 0.999=almost new moon.
moon_fullness: How full the moon was at the time of the bolide detection. 0=new moon, 1=full moon. ~0.25=waxing or waning crescent
solarhour: The local solar time of the bolide detection.
sun_alt: The altitude of the sun (Β°) at the time and place of the bolide detection
sun_alt_obs:
date_retrieved: Date that the data was retrieved from the source (UTC)

What sort of data does the β€œdatetime” column contain?

[9]:
bdf.datetime
[9]:
0      2022-07-24 15:35:23
1      2022-07-24 11:55:46
2      2022-07-24 08:31:45
3      2022-07-24 05:37:45
4      2022-07-23 11:33:31
               ...
3922   2017-10-08 08:01:06
3923   2017-10-01 12:43:52
3924   2017-09-05 05:11:25
3925   2017-07-31 22:01:34
3926   2017-07-23 06:12:36
Name: datetime, Length: 3927, dtype: datetime64[ns]

Note that, as well as accessing columns (e.g.Β one named interesting_data) via bdf.interesting_data syntax, we can also access them like: bdf['interesting_data']

Maps#

Geospatial data without a map is like an opinion expressed without an analogy. For this reason the BolideDataFrame class has a built-in plotting method, plot_detections().

[19]:
import matplotlib.pyplot as plt
bdf = BolideDataFrame(source='glm')
bdf.plot_detections(boundary='goes')
plt.show()
downloading: 9.43MiB [00:00, 48.4MiB/s]
../_images/tutorials_tutorial_41_1.png

If you are familiar with matplotlib syntax, all of the same sorts of things work. Here is an example taking advantage of matplotlib:

[20]:
fig, ax = bdf.plot_detections(marker='x', alpha=0.5, color='purple', s=15, figsize=(15,9))
plt.title('Descriptive title with fancy math: $\sqrt{\pi}$')  # add a title
plt.savefig('descriptive-filename.png', dpi=300, bbox_inches='tight')  # save to disk
plt.show()
../_images/tutorials_tutorial_43_0.png

Here are some good tutorials on matplotlib.

If we only want to plot detections by GLM-17 and thus only really need the GOES-West position field-of-view boundary, we can do that as follows below. Note how we can filter and plot in the same line.

[21]:
bdf[bdf.detectedBy.str.contains('GLM-17')].plot_detections(boundary='goes-w')
plt.show()
../_images/tutorials_tutorial_45_0.png

This shows us an interesting point in the Atlantic outside of the GOES-West GLM field-of-view. This is from when GOES-17 was not yet in the GOES-West position. If we only want points within the GOES-West GLM field-of-view, we can filter by field of view instead:

[22]:
bdf.filter_boundary(boundary=['goes-w']).plot_detections(boundary='goes-w')
plt.show()
../_images/tutorials_tutorial_47_0.png

What if we don’t like this map projection? plot_detections can accept any map projection in the form of a Cartopy CoordinateReferenceSystem object in the crs argument. Here is a map roughly from the perspective of GOES-16:

[23]:
import cartopy.crs as ccrs
crs = ccrs.Geostationary(central_longitude = -75.2)
bdf.plot_detections(crs=crs, boundary=['goes-e','goes-w'])
plt.show()
../_images/tutorials_tutorial_49_0.png

We can get the same plot by using the built-in GOES_E CRS:

[24]:
import bolides.crs as bcrs
bdf.plot_detections(crs=bcrs.GOES_E(), boundary=['goes-e','goes-w'])
plt.show()
../_images/tutorials_tutorial_51_0.png

Here is the documentation on CoordinateReferenceSystem objects, and here is a handy list of built-in projections. If you are really into map projections you can get some projections defined by an EPSG code using ccrs.epsg. Here is an example on the US National Atlas Equal Area projection (EPSG:2163):

[25]:
crs = ccrs.epsg(2163)
bdf.plot_detections(crs=crs, boundary='goes')
plt.show()
../_images/tutorials_tutorial_53_0.png

In the examples above, it would be nice to see which bolides were detected by which satellite. plot_detections handles automatic coloring of categorical data when a column name is passed in:

[26]:
bdf.plot_detections(crs=bcrs.GOES_E(), category='detectedBy', boundary=['goes-e','goes-w'])
plt.show()
../_images/tutorials_tutorial_55_0.png

Neat. We can also plot quantitative data:

[27]:
import numpy as np
fig, ax = bdf.plot_detections(crs=bcrs.GOES_E(), c=np.log(bdf.energy_g16), boundary='goes-e', figsize=(8,6))
plt.show()
../_images/tutorials_tutorial_57_0.png

The BolideDataFrame class is technically a subclass of the GeoDataFrame class from GeoPandas, so if you are familiar with it you can use their plotting methods too (see here).

We might also be interested in the density of bolides. The handy plot_density method will compute and plot this:

[28]:
fig, ax = bdf.plot_density(boundary='goes', figsize=(8,4))
plt.show()
../_images/tutorials_tutorial_60_0.png

We can change the bandwidth argument to get a finer (and noisier!) density estimate:

[29]:
fig, ax = bdf.plot_density(bandwidth=2, lat_resolution=200, lon_resolution=100, boundary='goes', figsize=(8,4))
plt.show()
../_images/tutorials_tutorial_62_0.png

Date Histograms#

One useful visualization is the number of bolides detected at different dates. The plot_dates method handles this.

[30]:
bdf.plot_dates()
plt.show()
../_images/tutorials_tutorial_65_0.png

Similar to plot_detections, regular matplotlib syntax works. If we are unhappy with the default style used by bolides, (ggplot), we can also pass in any matplotlib style into the style argument (This also works for plot_detections).

[31]:
bdf.plot_dates(color='red', style='dark_background')
plt.title('Bolide detections over time')
plt.show()
../_images/tutorials_tutorial_67_0.png

plot_dates also has a built-in date filter that works similarly to filter_date, and the frequency of the binning can be specified in the freq argument. The argument can take strings like β€œ4D”, β€œ1Y”, β€œ3M”, and so on. The showers argument also allows plotting the dates of meteor showers. Similar to plot_detections, we can also filter and plot in the same line.

[32]:
bdf[bdf.solarhour<12].plot_dates(freq="2D", start="2020-06-13", end="2021-01-01", showers=['LEO', 'PER'])
plt.show()
../_images/tutorials_tutorial_69_0.png

Light curves#

We also have data on bolide light curves, which can be interesting to look at. Let’s first filter a small set of bolides to download light curves for:

[33]:
bdf = BolideDataFrame(source='glm')
bdf = bdf.filter_date(start='2022-06-01',end='2022-06-13')
downloading: 9.43MiB [00:00, 54.2MiB/s]

Now we need to pull some data from the website:

[34]:
bdf.add_website_data()

Exciting. Now we can plot light curves by accessing the lightcurves column:

[35]:
bdf.lightcurves.iloc[2].plot()
plt.show()
../_images/tutorials_tutorial_76_0.png

All of this is handled by the lightkurve package. The plots work similarly to plot_detections and plot_dates in that we can pass in regular matplotlib arguments.

[36]:
bdf.lightcurves.iloc[2].plot(linewidth=2)
plt.title('Light curve of bolide at '+str(bdf.datetime.iloc[6]))
plt.savefig(bdf._id.iloc[2] + '.png', dpi=300, bbox_inches='tight')
plt.show()
../_images/tutorials_tutorial_78_0.png

Augmenting the data#

bolides also supports automatically combining bolide data from multiple sources via the augment method. For instance, we may want to add USG data to GLM data to get additional information.

[37]:
glm = BolideDataFrame(source='glm')
usg = BolideDataFrame(source='usg')

print("columns before augmentation:", len(glm.columns))
print("length before augmentation:", len(glm), 'bolides')

combined = glm.augment(usg)

print("columns after augmentation:", len(combined.columns))
print("length after augmentation:", len(combined), 'bolides')
downloading: 9.43MiB [00:00, 44.1MiB/s]
downloading: 79.2kiB [00:00, 1.20MiB/s]
columns before augmentation: 51
length before augmentation: 3927 bolides
Augmenting data: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 3927/3927 [00:14<00:00, 268.39it/s]
columns after augmentation: 71
length after augmentation: 3927 bolides

Note how the combined BolideDataFrame has more columns. These are coming from USG data. Columns ending in _y are the USG versions of those that existed in both data sets. Note how the length of the BolideDataFrame stays the same. This is because, by default augment keeps detections that only exist in the GLM data. If we instead want to only keep bolides that exist in both BolideDataFrames, we can use the intersection argument:

[38]:
print(len(glm.augment(usg, intersection=True)), 'bolides')
Augmenting data: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 3927/3927 [00:15<00:00, 247.58it/s]
78 bolides

Here is some metadata about this notebook:

[39]:
%watermark -uivm -p cartopy -rb
Last updated: 2022-08-07T22:52:54.627954-07:00

Python implementation: CPython
Python version       : 3.10.4
IPython version      : 8.4.0

cartopy: 0.20.3

Compiler    : GCC 11.2.0
OS          : Linux
Release     : 5.17.15-76051715-generic
Machine     : x86_64
Processor   : x86_64
CPU cores   : 8
Architecture: 64bit

Git repo: https://github.com/jcsmithhere/bolides.git

Git branch: bdf-implementation

[40]:
!proj
Rel. 8.2.1, January 1st, 2022
usage: proj [-bdeEfiIlmorsStTvVwW [args]] [+opt[=arg] ...] [file ...]