Skip to content

Instantly share code, notes, and snippets.

@zxdawn
Created March 15, 2022 14:52
Show Gist options
  • Save zxdawn/a20d049300c382f289a2e2b0f786b124 to your computer and use it in GitHub Desktop.
Save zxdawn/a20d049300c382f289a2e2b0f786b124 to your computer and use it in GitHub Desktop.
The notebook of cluster lightning stroke data into flash data.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook aims to cluster the GLD360 lightning stroke data into flash data."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from sklearn.cluster import DBSCAN\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Read daily GLD360 density data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv('../data/gld360/Arctic Lightning August 10-13.csv')\n",
"df['time'] = pd.to_datetime(df['time'])\n",
"\n",
"# convert datetime into seconds\n",
"df['delta'] = (df['time']-df['time'].min()).dt.total_seconds()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cluster by time (500 ms)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"db = DBSCAN(eps=0.5, min_samples=1, algorithm='ball_tree').fit(df['delta'].values.reshape(-1, 1))\n",
"cluster_labels = db.labels_\n",
"# save to new column named \"time_label\"\n",
"df['time_label'] = cluster_labels"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cluster by location (20 km)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def db_loc(df):\n",
" coords = df[['latitude', 'longitude']].values\n",
" kms_per_radian = 6371.0088\n",
"\n",
" # search for 20km around each lightning dots\n",
" epsilon = 20/kms_per_radian\n",
"\n",
" db = DBSCAN(eps=epsilon, min_samples=1, algorithm='ball_tree').fit(np.radians(coords))\n",
" cluster_labels = db.labels_\n",
" return pd.Series(cluster_labels)\n",
"\n",
"# save to new column named \"loc_label\"\n",
"df['loc_label'] = df.groupby('time_label').apply(lambda row: db_loc(row)).reset_index(drop=True)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# group by two condition\n",
"comb_grp = df.groupby(['time_label','loc_label'])\n",
"\n",
"# use the first datetime of stroke as the flash time\n",
"df_flash = comb_grp[['time','longitude','latitude']].nth(0).reset_index(drop=True)\n",
"\n",
"# if any stroke is CG, the flash is CG\n",
"cloud_flag = comb_grp['cloud'].all().reset_index(drop=True).rename('cloud')\n",
"df_flash['cloud'] = cloud_flag"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# # save the data\n",
"# df_flash.to_csv('arctic_flash_test.csv', index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Case"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>time</th>\n",
" <th>longitude</th>\n",
" <th>latitude</th>\n",
" <th>signalStrengthKA</th>\n",
" <th>cloud</th>\n",
" <th>delta</th>\n",
" <th>time_label</th>\n",
" <th>loc_label</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1600</th>\n",
" <td>2019-08-12 13:22:35.924000+00:00</td>\n",
" <td>90.0627</td>\n",
" <td>78.8102</td>\n",
" <td>-36.4</td>\n",
" <td>False</td>\n",
" <td>219810.582</td>\n",
" <td>848</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1601</th>\n",
" <td>2019-08-12 13:22:35.954000+00:00</td>\n",
" <td>89.9164</td>\n",
" <td>78.7724</td>\n",
" <td>-8.1</td>\n",
" <td>False</td>\n",
" <td>219810.612</td>\n",
" <td>848</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1602</th>\n",
" <td>2019-08-12 13:22:35.993000+00:00</td>\n",
" <td>89.7954</td>\n",
" <td>78.8150</td>\n",
" <td>-17.0</td>\n",
" <td>False</td>\n",
" <td>219810.651</td>\n",
" <td>848</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1603</th>\n",
" <td>2019-08-12 13:22:36.020000+00:00</td>\n",
" <td>89.9286</td>\n",
" <td>78.7988</td>\n",
" <td>-27.5</td>\n",
" <td>False</td>\n",
" <td>219810.678</td>\n",
" <td>848</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1604</th>\n",
" <td>2019-08-12 13:22:36.047000+00:00</td>\n",
" <td>89.8578</td>\n",
" <td>78.7879</td>\n",
" <td>-14.4</td>\n",
" <td>False</td>\n",
" <td>219810.705</td>\n",
" <td>848</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1605</th>\n",
" <td>2019-08-12 13:22:36.093000+00:00</td>\n",
" <td>89.1329</td>\n",
" <td>78.7320</td>\n",
" <td>22.5</td>\n",
" <td>False</td>\n",
" <td>219810.751</td>\n",
" <td>848</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1606</th>\n",
" <td>2019-08-12 13:22:36.107000+00:00</td>\n",
" <td>89.8719</td>\n",
" <td>78.7802</td>\n",
" <td>5.5</td>\n",
" <td>True</td>\n",
" <td>219810.765</td>\n",
" <td>848</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" time longitude latitude signalStrengthKA \\\n",
"1600 2019-08-12 13:22:35.924000+00:00 90.0627 78.8102 -36.4 \n",
"1601 2019-08-12 13:22:35.954000+00:00 89.9164 78.7724 -8.1 \n",
"1602 2019-08-12 13:22:35.993000+00:00 89.7954 78.8150 -17.0 \n",
"1603 2019-08-12 13:22:36.020000+00:00 89.9286 78.7988 -27.5 \n",
"1604 2019-08-12 13:22:36.047000+00:00 89.8578 78.7879 -14.4 \n",
"1605 2019-08-12 13:22:36.093000+00:00 89.1329 78.7320 22.5 \n",
"1606 2019-08-12 13:22:36.107000+00:00 89.8719 78.7802 5.5 \n",
"\n",
" cloud delta time_label loc_label \n",
"1600 False 219810.582 848 0 \n",
"1601 False 219810.612 848 0 \n",
"1602 False 219810.651 848 0 \n",
"1603 False 219810.678 848 0 \n",
"1604 False 219810.705 848 0 \n",
"1605 False 219810.751 848 1 \n",
"1606 True 219810.765 848 0 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[df['time_label']==848]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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7O7D2rodHYmmf+WU9OrehQWTM+jaOY4eXeLp2jmOBZMzlFBFRGj5B+qLRE3M6svIlAsprz5EUs9zlVBFRAJKqvKV9OreRclUROQYmv4VERGJESVVERGRGFFSFRERiRElVRERkRhRUhUREYkRJVUREZEYUVIVERGJESVVERGRGFFSFRERiRElVRERkRhRUhUREYkRJVUREZEYUVIVERGJESVVERGRGFFSFRERiRElVRERkRhRUhUREYkRJVUREZEYUVIVERGJESVVERGRGFFSFRERiRElVRERkRhRUhUREYkRJVUREZEYUVKVNjVz5kx69+7NkCFDomX3338/GRkZZGVlMWbMGCorK5vElZWVcfXVV5OWlkYoFGLRokXRunvuuYfBgweTkZHBDTfcwOeff94kvqamhuzsbDIzMwmFQsyZM6dR/a9//WsGDRpEKBQiPz+/xW0H2LNnD7m5uaSmppKbm0t1dTUAS5cuJSsrK7rFxcVRUlICQHFxMenp6aSkpHDHHXfg7gDU1tYybdo0UlJSyMnJobS0NHqdgoICUlNTSU1NpaCg4PhvsoicPu5+xm9Dhw51aZ9efvllLy4u9lAoFC3bu3dvdH/RokV+6623NomrrKz04uJid3fft2+fp6am+vbt293dfc2aNR4Oh93dPT8/3/Pz85vE19XV+f79+93d/fDhw56dne2vv/66u7uvX7/er7nmGq+pqXF3908++aTFbXd3v+eee/yhhx5yd/eHHnqo2eu//fbbPmDAgOjr4cOH+2uvveZ1dXU+btw4LywsdHf3Rx99NNr/ZcuW+dSpU93dvaqqygcMGOBVVVW+Z88eHzBggO/Zs6fZdop8VcAWbwf/hnekTSNVaVOjRo0iISGhUdl5550X3T948CBm1iQuMTGRyy+/HIAePXqQlpZGRUUFAGPGjCE+Ph6AESNGUF5e3iTezOjevTsA4XCYcDgcvc5jjz3GvffeS5cuXQDo3bt3i9sOsHLlSmbMmAHAjBkzeP7555scs2zZMm688UYAdu3axb59+7jiiiswM2655ZZoTMNzTZkyhXXr1uHurFmzhtzcXBISEujZsye5ubkUFRU1204ROX2UVKVduu++++jXrx9Lly7lgQceAKCyspIJEyY0Oba0tJS33nqLnJycJnVLlixh/PjxzcYfPXqUrKwsevfuTW5ubjT+gw8+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",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"\n",
"test = df[(df['time_label']==848)&(df['loc_label']==0)]\n",
"\n",
"# plot the flash location\n",
"df_flash.loc[df_flash['time']==test.iloc[0]['time']].plot.scatter(ax=ax, x='longitude', y='latitude', c='r', s=50)\n",
"\n",
"# plot the stroke location and time\n",
"test.plot.scatter(x='longitude', y='latitude', ax=ax)\n",
"for i, point in test.iterrows():\n",
" ax.text(point['longitude'], point['latitude'], point['time'].strftime('%H:%M:%S:%f'))"
]
}
],
"metadata": {
"interpreter": {
"hash": "5c59143dddf9bb7cb19cf5c4e65abac3edd3adb579b9c354e95a8774ecff661b"
},
"kernelspec": {
"display_name": "Python 3.9.7 ('base')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment