diff --git a/examples/using_fastdb_client.ipynb b/examples/using_fastdb_client.ipynb index 4779a50..8881270 100644 --- a/examples/using_fastdb_client.ipynb +++ b/examples/using_fastdb_client.ipynb @@ -91,7 +91,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "id": "9dc7702b-5b4b-4782-9775-034d5cc6fac6", "metadata": {}, "outputs": [], @@ -112,7 +112,8 @@ "import io\n", "import time\n", "import pandas\n", - "import json\n" + "import json\n", + "import nested_pandas" ] }, { @@ -149,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "72ccb52f-4dce-43d1-90c6-a871e927a1ee", "metadata": {}, "outputs": [ @@ -171,7 +172,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 4, "id": "1d7d14f0-e96c-468a-b196-3dd63bbd31a3", "metadata": {}, "outputs": [ @@ -179,7 +180,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "/ltcv/getltcv took 0.17 seconds\n", + "/ltcv/getltcv took 12.28 seconds\n", "Got back ltcvdict with keys dict_keys(['status', 'objinfo', 'ltcv'])\n", "Object info: {\n", " \"diaobjectid\": 5181140,\n", @@ -249,7 +250,7 @@ " 0\n", " z\n", " 61192.4111\n", - " 1260.143100\n", + " 1260.14310\n", " 1053.7013\n", " 0\n", " 0\n", @@ -258,39 +259,12 @@ " 1\n", " z\n", " 61198.4183\n", - " 242.518360\n", + " 242.51836\n", " 734.2954\n", " 0\n", " 0\n", " \n", " \n", - " 2\n", - " Y\n", - " 61198.4291\n", - " 2645.191700\n", - " 1485.7095\n", - " 0\n", - " 0\n", - " \n", - " \n", - " 3\n", - " i\n", - " 61216.3992\n", - " -317.903750\n", - " 622.8550\n", - " 0\n", - " 0\n", - " \n", - " \n", - " 4\n", - " Y\n", - " 61221.4205\n", - " 16.699959\n", - " 1142.3867\n", - " 0\n", - " 0\n", - " \n", - " \n", " ...\n", " ...\n", " ...\n", @@ -300,37 +274,10 @@ " ...\n", " \n", " \n", - " 284\n", - " z\n", - " 61844.0071\n", - " -755.588100\n", - " 1307.2695\n", - " 0\n", - " 0\n", - " \n", - " \n", - " 285\n", - " z\n", - " 61847.9946\n", - " -760.066650\n", - " 2444.9230\n", - " 0\n", - " 0\n", - " \n", - " \n", - " 286\n", - " z\n", - " 61847.9977\n", - " -1882.978300\n", - " 1955.9896\n", - " 0\n", - " 0\n", - " \n", - " \n", " 287\n", " z\n", " 61848.0008\n", - " -344.120760\n", + " -344.12076\n", " 1371.1421\n", " 0\n", " 0\n", @@ -339,7 +286,7 @@ " 288\n", " z\n", " 61848.0039\n", - " 1460.280800\n", + " 1460.28080\n", " 1307.4806\n", " 0\n", " 0\n", @@ -350,23 +297,17 @@ "" ], "text/plain": [ - " band mjd psfflux psffluxerr isdet ispatch\n", - "0 z 61192.4111 1260.143100 1053.7013 0 0\n", - "1 z 61198.4183 242.518360 734.2954 0 0\n", - "2 Y 61198.4291 2645.191700 1485.7095 0 0\n", - "3 i 61216.3992 -317.903750 622.8550 0 0\n", - "4 Y 61221.4205 16.699959 1142.3867 0 0\n", - ".. ... ... ... ... ... ...\n", - "284 z 61844.0071 -755.588100 1307.2695 0 0\n", - "285 z 61847.9946 -760.066650 2444.9230 0 0\n", - "286 z 61847.9977 -1882.978300 1955.9896 0 0\n", - "287 z 61848.0008 -344.120760 1371.1421 0 0\n", - "288 z 61848.0039 1460.280800 1307.4806 0 0\n", + " band mjd psfflux psffluxerr isdet ispatch\n", + "0 z 61192.4111 1260.14310 1053.7013 0 0\n", + "1 z 61198.4183 242.51836 734.2954 0 0\n", + ".. ... ... ... ... ... ...\n", + "287 z 61848.0008 -344.12076 1371.1421 0 0\n", + "288 z 61848.0039 1460.28080 1307.4806 0 0\n", "\n", "[289 rows x 6 columns]" ] }, - "execution_count": 13, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -390,7 +331,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 5, "id": "6f8f62fa-057c-4e4f-9458-123ec2932abf", "metadata": {}, "outputs": [ @@ -839,7 +780,7 @@ "16 z " ] }, - "execution_count": 15, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -871,7 +812,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 6, "id": "533ba52a-dc5a-48e4-8eda-888eb74b0f45", "metadata": {}, "outputs": [ @@ -901,7 +842,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 7, "id": "e2d2c19e-f526-47d4-a97d-7553ba4d0ca2", "metadata": {}, "outputs": [ @@ -927,7 +868,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 8, "id": "2210cdcf-7bda-4b89-86e6-3ab58cdd6547", "metadata": {}, "outputs": [ @@ -957,7 +898,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 9, "id": "efdbeed1-aa96-4b76-b3f6-3260b3c8301a", "metadata": {}, "outputs": [ @@ -1163,7 +1104,7 @@ "[5 rows x 30 columns]" ] }, - "execution_count": 19, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -1201,7 +1142,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 10, "id": "5ddea3a9-d1d0-4834-bdd4-7f0a0c9ce04c", "metadata": {}, "outputs": [ @@ -1209,23 +1150,19 @@ "name": "stderr", "output_type": "stream", "text": [ - "[2025-07-16 09:55:47 - FASTDB - INFO] - Submitted query 34567a54-2392-445a-a3f8-4b966c8b0df6\n", - "[2025-07-16 09:56:17 - FASTDB - INFO] - Long query is queued, not yet started.\n", - "[2025-07-16 09:56:47 - FASTDB - INFO] - Long query is queued, not yet started.\n", - "[2025-07-16 09:57:18 - FASTDB - INFO] - Long query is queued, not yet started.\n", - "[2025-07-16 09:57:48 - FASTDB - INFO] - Long query started at 2025-07-16T16:57:29.075495+00:00 and is still in progress.\n", - "[2025-07-16 09:58:18 - FASTDB - INFO] - Long query started at 2025-07-16T16:57:29.075495+00:00 and finished at 2025-07-16T16:57:59.721218+00:00\n", - "[2025-07-16 09:58:18 - FASTDB - INFO] - Got long query result after 150.9964954298921 seconds.\n", - "synchronous long query returned after 151.4 seconds." + "[2025-07-17 10:50:48 - FASTDB - INFO] - Submitted query d2bbccd9-0fc8-4f46-9c81-e7451fcd9e1d\n", + "[2025-07-17 10:51:18 - FASTDB - INFO] - Long query started at 2025-07-17T15:50:55.281432+00:00 and finished at 2025-07-17T15:50:59.597065+00:00\n", + "[2025-07-17 10:51:18 - FASTDB - INFO] - Got long query result after 30.170630250009708 seconds.\n", + "synchronous long query returned after 31.4 seconds." ] }, { "data": { "text/plain": [ - "52" + "51" ] }, - "execution_count": 20, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -1294,7 +1231,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 11, "id": "00fa06e3-fab0-425c-a9bc-a9d5d147f8fa", "metadata": {}, "outputs": [ @@ -1335,7 +1272,7 @@ " 60936.3934\n", " r\n", " 449.98105\n", - " 915.24490\n", + " 915.2449\n", " \n", " \n", " 1\n", @@ -1344,34 +1281,7 @@ " 60936.3934\n", " r\n", " 449.98105\n", - " 915.24490\n", - " \n", - " \n", - " 2\n", - " 2\n", - " 1001305\n", - " 60936.3964\n", - " r\n", - " -1908.21410\n", - " 1227.92310\n", - " \n", - " \n", - " 3\n", - " 3\n", - " 1001305\n", - " 60936.3964\n", - " r\n", - " -1908.21410\n", - " 1227.92310\n", - " \n", - " \n", - " 4\n", - " 4\n", - " 1001305\n", - " 60936.3995\n", - " r\n", - " 1484.39820\n", - " 1467.50100\n", + " 915.2449\n", " \n", " \n", " ...\n", @@ -1383,40 +1293,13 @@ " ...\n", " \n", " \n", - " 245726\n", - " 245726\n", - " 1318524\n", - " 61885.1355\n", - " i\n", - " 237189.10000\n", - " 1589.69520\n", - " \n", - " \n", - " 245727\n", - " 245727\n", - " 1318524\n", - " 61886.1086\n", - " g\n", - " 142149.53000\n", - " 1200.65780\n", - " \n", - " \n", - " 245728\n", - " 245728\n", - " 1318524\n", - " 61886.1325\n", - " r\n", - " 60388.47000\n", - " 971.03064\n", - " \n", - " \n", " 245729\n", " 245729\n", " 1318524\n", " 61887.0485\n", " r\n", " 150215.86000\n", - " 1193.25650\n", + " 1193.2565\n", " \n", " \n", " 245730\n", @@ -1425,7 +1308,7 @@ " 61891.0451\n", " i\n", " -190875.64000\n", - " 1214.88680\n", + " 1214.8868\n", " \n", " \n", "\n", @@ -1434,22 +1317,16 @@ ], "text/plain": [ " Unnamed: 0 diaobjectid midpointmjdtai band psfflux psffluxerr\n", - "0 0 1001305 60936.3934 r 449.98105 915.24490\n", - "1 1 1001305 60936.3934 r 449.98105 915.24490\n", - "2 2 1001305 60936.3964 r -1908.21410 1227.92310\n", - "3 3 1001305 60936.3964 r -1908.21410 1227.92310\n", - "4 4 1001305 60936.3995 r 1484.39820 1467.50100\n", + "0 0 1001305 60936.3934 r 449.98105 915.2449\n", + "1 1 1001305 60936.3934 r 449.98105 915.2449\n", "... ... ... ... ... ... ...\n", - "245726 245726 1318524 61885.1355 i 237189.10000 1589.69520\n", - "245727 245727 1318524 61886.1086 g 142149.53000 1200.65780\n", - "245728 245728 1318524 61886.1325 r 60388.47000 971.03064\n", - "245729 245729 1318524 61887.0485 r 150215.86000 1193.25650\n", - "245730 245730 1318524 61891.0451 i -190875.64000 1214.88680\n", + "245729 245729 1318524 61887.0485 r 150215.86000 1193.2565\n", + "245730 245730 1318524 61891.0451 i -190875.64000 1214.8868\n", "\n", "[245731 rows x 6 columns]" ] }, - "execution_count": 21, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -1464,7 +1341,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 12, "id": "b4b36e00-7074-4ab0-a317-de1f9cc310f9", "metadata": {}, "outputs": [ @@ -1481,10 +1358,445 @@ "print( f\"Found {len(blah)} different diaobjects\" )" ] }, + { + "cell_type": "markdown", + "id": "46e46670-e0b9-4f65-b335-ec6cd0de2c97", + "metadata": {}, + "source": [ + "### Use `nested-pandas`\n", + "\n", + "You can also pack the same frame into Nested Pandas. This would give us a nice representation of the data, and easy access to individual light curves" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "859fdc43-1299-47cb-9ba7-e875701650fc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: nested-pandas in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (0.4.6)\n", + "Requirement already satisfied: matplotlib in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (3.10.3)\n", + "Requirement already satisfied: numpy>=2 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from nested-pandas) (2.3.1)\n", + "Requirement already satisfied: pandas<2.4,>=2.2.3 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from nested-pandas) (2.3.1)\n", + "Requirement already satisfied: pyarrow>=18 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from nested-pandas) (20.0.0)\n", + "Requirement already satisfied: universal_pathlib>=0.2 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from nested-pandas) (0.2.6)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from pandas<2.4,>=2.2.3->nested-pandas) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from pandas<2.4,>=2.2.3->nested-pandas) (2025.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from pandas<2.4,>=2.2.3->nested-pandas) (2025.2)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from matplotlib) (1.3.2)\n", + "Requirement already satisfied: cycler>=0.10 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from matplotlib) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from matplotlib) (4.59.0)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from matplotlib) (1.4.8)\n", + "Requirement already satisfied: packaging>=20.0 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from matplotlib) (25.0)\n", + "Requirement already satisfied: pillow>=8 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from matplotlib) (11.3.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from matplotlib) (3.2.3)\n", + "Requirement already satisfied: six>=1.5 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from python-dateutil>=2.8.2->pandas<2.4,>=2.2.3->nested-pandas) (1.17.0)\n", + "Requirement already satisfied: fsspec!=2024.3.1,>=2022.1.0 in /Users/hombit/.virtualenvs/FASTDB/lib/python3.13/site-packages (from universal_pathlib>=0.2->nested-pandas) (2025.7.0)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "# Install nested-pandas and matplotlib\n", + "%pip install nested-pandas matplotlib" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "44f6325c-584f-4ede-8cc8-785cdfca34ed", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 lc
1001305\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0midpointmjdtaibandpsffluxpsffluxerr
060936.3934r449.98105915.2449
+273 rows............
1003071\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0midpointmjdtaibandpsffluxpsffluxerr
27461021.3486z5748.6875638.8006
+791 rows............
1003342\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0midpointmjdtaibandpsffluxpsffluxerr
106660956.3376i74.852295490.88196
+464 rows............
1004217\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0midpointmjdtaibandpsffluxpsffluxerr
153161023.3544z562.10596779.13824
+737 rows............
1005817\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0midpointmjdtaibandpsffluxpsffluxerr
226960954.329Y-62299.6761619.7021
+1094 rows............
......
\n", + "420 rows x 1 columns" + ], + "text/plain": [ + " lc\n", + "diaobjectid \n", + "1001305 [{Unnamed: 0: 0, midpointmjdtai: 60936.3934, b...\n", + "1003071 [{Unnamed: 0: 274, midpointmjdtai: 61021.3486,...\n", + "... ...\n", + "1317643 [{Unnamed: 0: 245168, midpointmjdtai: 61063.34...\n", + "1318524 [{Unnamed: 0: 245450, midpointmjdtai: 60799.97...\n", + "\n", + "[420 rows x 1 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import nested_pandas\n", + "\n", + "# Pack the data into a \"nested\" frame\n", + "nf = nested_pandas.NestedFrame.from_flat(\n", + " df, # input data frame\n", + " on='diaobjectid', # group by DIA object ID\n", + " base_columns=['diaobjectid'], # the only non-light-curve column is diaobjectid\n", + " name='lc', # call nested column \"lc\"\n", + ")\n", + "nf" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "6df20606-22a9-469f-85a1-4be4add8eb5f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0midpointmjdtaibandpsffluxpsffluxerr
0153161023.3544z562.10596779.13824
1153261023.3544z562.10596779.13824
..................
736226761603.0095Y4686.065004058.80880
737226861603.0095Y4686.065004058.80880
\n", + "

738 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 midpointmjdtai band psfflux psffluxerr\n", + "0 1531 61023.3544 z 562.10596 779.13824\n", + "1 1532 61023.3544 z 562.10596 779.13824\n", + ".. ... ... ... ... ...\n", + "736 2267 61603.0095 Y 4686.06500 4058.80880\n", + "737 2268 61603.0095 Y 4686.06500 4058.80880\n", + "\n", + "[738 rows x 5 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'PSF Flux, $r$ band')" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Select a single light curve\n", + "\n", + "# This is a pandas data frame\n", + "lc = nf.iloc[3].lc\n", + "display(lc)\n", + "\n", + "# Plot r-band light-curve\n", + "r_lc = lc[lc['band'] == 'r']\n", + "plt.errorbar(r_lc.midpointmjdtai, r_lc.psfflux, r_lc.psffluxerr, fmt='o', color='r')\n", + "plt.xlabel('MJD')\n", + "plt.ylabel('PSF Flux, $r$ band')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "a89ca91f-34f3-439c-bb55-977a15545b30", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Number of objects')" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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SfLcc8+Z69T8+fOlevXqppWpd+/eV33frKwss7lkZmYWy/cDAAACZOq53ibiySefNF1Gumkri+vWEd50xx13mFakb775xux/+eWX8tlnn0nnzp3N/sGDByUtLc2UwUVbfdq0aSOpqal5vq/e6kKvc23R0dFeLzsAAAjQsLNq1SqJjY01rStNmzY126ZNm0w30+rVq71auFGjRpnWmQYNGpibjbZo0UKGDRsmffr0Mec16ChtyclN913nrmb06NGSkZHh3vTO7QAAwE4hhQkgw4cPv+IO53r8mWeekd///vdeK9y7774rCxYskIULF5owtXPnThN2atasKf369Sv0+4aGhpoNAADYr8AtO7rmTmJi4hXHH3vsMTMo2Juefvppd+uO3nT0kUceMUFLu6FUVFSUeTx+/LjH63TfdQ4AAJRsBQ47VatWNS0sl9Nj3p6hpSs16+yv3G644Qb3IGmdfaWhRsf15B5srN1qcXFxXi0LAAAoId1YSUlJMmDAAPn+++/NAGL1+eefm2niI0aM8GrhunXrJmPHjpVatWqZbqwdO3bIxIkTTSuS0jV/tFvr1VdflXr16rmnnms3V48ePbxaFgAAUELCjoaJihUryuuvv24G+ioNFy+++KJ77RtvmTp1qvl6AwcOlBMnTpiv8/jjj3us0jxy5EhzKwsNYOnp6WaV55UrV7LGDgAAMIKc3MsRF9Dp06fNo4afQKZdXzoFXWdmhYWFefW9Y0Z9WOjXHkr+v/WFAABA4T+/C9yyk1ughxwAAGC/Qi0qCAAAECgIOwAAwGqEHQAAYLUChZ3s7Gzp2LGjHDhwoOhKBAAA4Kuwo/en2rVrlze/PgAAgH91Yz388MMye/bsoikNAACAlxV46vnFixdlzpw58vHHH0urVq2kfPnyHud1hWMAAICADTu7d++Wli1bmufffPONxzm9fQMAAEBAh51169YVTUkAAAD8aer5t99+K6tWrZJff/3V7F/HXScAAAD8J+z85z//MdPPb731VunSpYv89NNP5nhiYqI89dRTRVFGAACA4gs7w4cPN1PQjxw5IuXKlXMff/DBB83dxgEAAAJ6zM5HH31kuq9uuukmj+P16tWTw4cPe7NsAAAAxd+yc/bsWY8WHZeTJ09KaGjo9ZcIAADAiwocdu666y6ZP3++x3TznJwcmTBhgnTo0MGbZQMAACj+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/bPPPjOz5GyfMp1bv379nBtvvNE99VynUetSBiNHjnRfQz3mPatSl3/QTT+eJ06caJ4fPnzYa/WWnp5upp4/8sgjZuq5flbpv3OmnqPQpk6daj5kdL0dnYqu6x7g/+gP8tU2XXvHRX+ABw4caKZJ6g/jH//4RxOIcjt06JDTuXNns06E/kJ96qmnnOzsbKckuzzsUI/5t2zZMhP89A+VBg0aOG+++abHeZ3+O2bMGPNhodd07NjR2b9/v8c1//nPf8yHi64to9P3+/fvbz7ESorMzEzz709/95UpU8a5+eabzdoxuac6U49Xt27duqv+XtQA6c16+/LLL80yC/oeGkw1RNkuSP/j69YlAACAosKYHQAAYDXCDgAAsBphBwAAWI2wAwAArEbYAQAAViPsAAAAqxF2AACA1Qg7AADAaoQdAAFp3rx5EhERIf7gxRdflObNm/u6GADyQNgBkKdHH31UgoKCzKY3FNW7qP/+97+XOXPmuG/sWBxiYmJk0qRJHscefPBBc6NOAPgthB0A19SpUyf56aef5NChQ7JixQrp0KGDDB06VP7whz/IxYsXC/2+eqea63l92bJlpVq1aoV+PYCSg7AD4JpCQ0MlKipKbrzxRmnZsqU8++yz8v7775vgo11JSoOQtv7s3LnT/br09HRz7JNPPjH7+qj7+rpWrVqZ9/3ss8/ku+++k+7du5tWowoVKshtt90mH3/8sft92rdvL4cPH5bhw4e7W5ny6saaMWOG1K1bV0qXLi3169eX//mf//E4r6/95z//KX/84x+lXLlyUq9ePfnggw8KXCfJycmmvBUrVpTExEQ5f/68x/ktW7aYFrAqVapIeHi43H333bJ9+3b3+ccee8yExdyys7NNeJs9e7bZf++996RJkyYm1EVGRkp8fLycPXu2wGUFQNgBUAj33HOPNGvWTJYsWVLg144aNcqEhX379knTpk3lzJkz0qVLF1mzZo3s2LHDtCR169ZNjhw5Yq7Xr3HTTTfJyy+/bFqYdLualJQU0+L01FNPye7du+Xxxx+X/v37y7p16zyue+mll+SBBx6QXbt2ma/bp08fOXnyZL7L/+6775oxOq+99pps3bpVatSoIdOnT/e45vTp09KvXz8T5jZu3GhClX4tPa7+/Oc/y8qVKz2+l+XLl8u5c+dM95wef+ihh0wo0nrSoNizZ0/TGgagEHx923UA/qtfv35O9+7dr3ruwQcfdBo2bGieHzx4UD+FnR07drjPnzp1yhxbt26d2ddH3V+6dOlvft1GjRo5U6dOde/Xrl3beeONNzyumTt3rhMeHu7ev+OOO5ykpCSPa+6//36nS5cu7n39+s8995x7/8yZM+bYihUrnPyKi4tzBg4c6HGsTZs2TrNmzfJ8zaVLl5yKFSs6y5Ytcx+LjY11xo8f797v1q2b8+ijj5rn27ZtM+U6dOhQvssFIG+07AAoFM0Ori6lgmjdurXHvrbs/PWvf5WGDRuabintytLWDFfLTn7pa+68806PY7qvx3PT1iSX8uXLS1hYmJw4caJAX6dNmzYex+Li4jz2jx8/LklJSaZFR7ux9Gvo95n7e9LWnblz57qv1+49bclR2mrWsWNH0411//33y6xZs+TUqVP5LiMAT4QdAIWiH/p16tQxz4OD/+9XSe5uFh2DcjUaMHLToKNdUNot9Omnn5pxP/ohf+HChSIpt84qy00Dm7dnlmkXln4fkydPli+++MI813E3ub+nvn37yvfffy+pqanyr3/9y9TlXXfdZc7dcMMNsnr1ahOAYmNjZerUqWYM0sGDB71aTqCkIOwAKLC1a9fKV199Jb169TL7VatWNY+5x6DkHqx8LZ9//rmZ4q6DhjXk6GBoHfCcmw44vnTp0jXfR1uG9L0uf28NC96kX2fTpk0ex3RczuVfd8iQIWacTqNGjcxg7F9++cXjGg0/PXr0MK07OthaxxddHsK0ZUrHGOlYJq0DDYUACi6kEK8BUIJkZWVJWlqaCRva3aIDa8eNG2dmE2nrhNIZQ23btjUDj7WFQruFnnvuuXy9v3b16CBkHZSsH/Bjxoy5oqVF19nZsGGD9O7d2wQHneV0uaefftoMPG7RooWZubRs2TLzvrlndnmDDoLWcKbdcRpGFixYIHv27JGbb77Z43vSmWB6TWZmpimb1tHltCtL61HrVluDXDRM6YDte++918zQ0v2ff/7ZBC0AhXCN8TwASjgdoKy/JnQLCQlxqlat6sTHxztz5swxg25z27t3rxm8W7ZsWad58+bORx99dNUByjpwOTcd3NyhQwfzuujoaOe///u/nbvvvtsZOnSo+5rU1FSnadOmTmhoqHmPqw1QVtOnT3duvvlmp1SpUs6tt97qzJ8/3+O8vjYlJcXjmL6HvlfuwdAvvPDCNetl7NixTpUqVZwKFSqYOho5cqTHAOXt27c7rVu3dsqUKePUq1fPWbx48VUHWefk5JjjuQdRu+oyISHB1Ld+z/q95B6wDaBggvQ/hQlJAGAbnfqt3Us6VkbX9ylqOmhZ1y/SriydWg6gaNCNBQD/H12TR9cQKuqgo910Oobn9ddfNzPQ7rvvviL9ekBJR8sOABQzHYCtY5t0sUQdnKzTzAEUHcIOAACwGlPPAQCA1Qg7AADAaoQdAABgNcIOAACwGmEHAABYjbADAACsRtgBAABWI+wAAACx2f8DCNIq7g1D9rYAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the destribution of durations\n", + "\n", + "def duration(t, flux, fluxerr):\n", + " s2n = flux / fluxerr\n", + " t_det = t[s2n >= 5.0]\n", + " if t_det.shape[0] == 0:\n", + " return 0.0\n", + " return np.ptp(t_det)\n", + "\n", + "durations = nf.reduce(\n", + " # function to apply to each object\n", + " duration,\n", + " # list of column names for function arguments. \"dot\"-notation is used for nested columns\n", + " \"lc.midpointmjdtai\",\n", + " \"lc.psfflux\",\n", + " \"lc.psffluxerr\",\n", + ")\n", + "plt.hist(durations, bins=31)\n", + "plt.xlabel('Duration, days')\n", + "plt.ylabel('Number of objects')" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "145243c9-1eab-44e8-87b7-21bda1fe9734", + "id": "3d0cedfb-bdef-4de4-aa5a-c8e8f3004531", "metadata": {}, "outputs": [], "source": [] @@ -1492,9 +1804,9 @@ ], "metadata": { "kernelspec": { - "display_name": "fastdb-client-env", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "fastdb-client" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -1506,7 +1818,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.13.5" } }, "nbformat": 4,