|
32 | 32 | }, |
33 | 33 | "outputs": [], |
34 | 34 | "source": [ |
35 | | - "## Uncomment here to autoreload local modules as you edit them\n", |
36 | | - "# %load_ext autoreload\n", |
37 | | - "# %autoreload 2\n", |
38 | | - "\n", |
39 | 35 | "import datetime as dt\n", |
40 | 36 | "import numpy as np\n", |
41 | 37 | "import pandas as pd\n", |
42 | 38 | "import matplotlib.pyplot as plt\n", |
43 | 39 | "import ipywidgets as widgets\n", |
44 | 40 | "from viresclient import SwarmRequest\n", |
45 | 41 | "\n", |
46 | | - "## Use to make interactive matplotlib plots\n", |
47 | | - "## - doesn't work smoothly\n", |
48 | | - "## - investigating using plotly/bokeh instead\n", |
49 | | - "# %matplotlib widget\n", |
50 | | - "\n", |
51 | 42 | "%load_ext watermark\n", |
52 | 43 | "%watermark -i -v -p numpy,pandas,xarray,matplotlib,ipywidgets,viresclient" |
53 | 44 | ] |
|
116 | 107 | " **kwargs\n", |
117 | 108 | " )\n", |
118 | 109 | " if use_xarray:\n", |
119 | | - " ds = data.as_xarray().drop(\"Spacecraft\")\n", |
120 | | - " return ds\n", |
| 110 | + " return data.as_xarray()\n", |
121 | 111 | " else:\n", |
122 | 112 | " # Load data in Pandas Dataframe with X, Y, Z columns\n", |
123 | | - " df = data.as_dataframe(expand=True).drop(columns=\"Spacecraft\")\n", |
| 113 | + " df = data.as_dataframe(expand=True)\n", |
124 | 114 | " df = df.rename(columns={f\"B_NEC_{i}\": j for i, j in zip(\"NEC\", \"XYZ\")})\n", |
125 | 115 | " return df\n", |
126 | 116 | "\n", |
|
178 | 168 | " Returns:\n", |
179 | 169 | " Figure\n", |
180 | 170 | " \"\"\"\n", |
| 171 | + " observatory = df[\"IAGA_code\"].iloc[0]\n", |
| 172 | + " # Restrict to only the XYZ values so that resampling will work\n", |
| 173 | + " df = df[[\"X\", \"Y\", \"Z\"]].copy()\n", |
181 | 174 | " # Evaluate annual means to use later,\n", |
182 | 175 | " # reindexed with the ending index points for each year\n", |
183 | | - " annual_mean = df.resample(\"1y\").mean()\n", |
| 176 | + " annual_mean = df.resample(\"Y\").mean()\n", |
184 | 177 | " annual_mean.index = [df.loc[str(year)].index[-1] for year in df.index.year.unique()]\n", |
185 | 178 | " # Subset dataframe to selection\n", |
186 | 179 | " df = df.loc[start_date:end_date]\n", |
187 | 180 | " # Cut the annual mean (and reindex) to match df\n", |
188 | 181 | " # so we can use it directly in ax.fill_between\n", |
189 | 182 | " annual_mean = annual_mean.loc[str(start_date.year):str(end_date.year)]\n", |
190 | 183 | " annual_mean = annual_mean.reindex(index=df.index, method=\"backfill\")\n", |
191 | | - " observatory = df[\"IAGA_code\"][0]\n", |
192 | 184 | " title = f\"Minute data from {observatory}\"\n", |
193 | 185 | " if hourly_mean:\n", |
194 | | - " df = df.resample(\"1h\").mean()\n", |
| 186 | + " df = df.resample(\"h\").mean()\n", |
195 | 187 | " annual_mean = annual_mean.reindex(index=df.index)\n", |
196 | 188 | " title += \": averaged over each hour\"\n", |
197 | 189 | " if show_annual_mean:\n", |
|
322 | 314 | "outputs": [], |
323 | 315 | "source": [ |
324 | 316 | "def monthly_means(df=obs_hourly):\n", |
325 | | - " \"\"\"Return MultIndex DataFrame of monthly means over each hourly interval\"\"\"\n", |
| 317 | + " \"\"\"Return MultiIndex DataFrame of monthly means over each hourly interval\"\"\"\n", |
| 318 | + " # Restrict to only the XYZ values so that resampling will work\n", |
| 319 | + " df = df[[\"X\", \"Y\", \"Z\"]].copy()\n", |
| 320 | + " # Append Declination\n", |
| 321 | + " df[\"D\"] = np.rad2deg(np.arctan2(df[\"Y\"], df[\"X\"]))\n", |
326 | 322 | " # Append hour of day, and approx fractional year, to use for plotting\n", |
327 | 323 | " df[\"t_hour\"] = df.index.map(lambda x: x.hour + x.minute/60)\n", |
328 | 324 | " epoch = pd.to_datetime(0, unit='s').to_julian_date()\n", |
|
337 | 333 | " monthly[\"D_variation\"] = monthly['D'].values - monthly_all['D'].values.repeat(24)\n", |
338 | 334 | " return monthly\n", |
339 | 335 | "\n", |
340 | | - "\n", |
341 | | - "obs_hourly[\"D\"] = np.rad2deg(np.arctan2(obs_hourly[\"Y\"], obs_hourly[\"X\"]))\n", |
342 | 336 | "obs_monthly = monthly_means(obs_hourly)\n", |
343 | 337 | "obs_monthly" |
344 | 338 | ] |
|
462 | 456 | " df = df.copy()\n", |
463 | 457 | "\n", |
464 | 458 | " # Evaluate the annual means\n", |
465 | | - " annual_means = df[[\"X\", \"Y\", \"Z\"]].resample(\"1y\").mean()\n", |
| 459 | + " annual_means = df[[\"X\", \"Y\", \"Z\"]].resample(\"Y\").mean()\n", |
466 | 460 | " annual_means = annual_means.rename(columns={\"X\": \"X_mean\", \"Y\": \"Y_mean\", \"Z\": \"Z_mean\"})\n", |
467 | 461 | " # Identify the year-end index times\n", |
468 | 462 | " year_ends = [df.loc[str(year)].index[-1] for year in df.index.year.unique()]\n", |
|
524 | 518 | " (df[\"time\"].dt.day == 1) & (df[\"time\"].dt.hour == 0)\n", |
525 | 519 | " ).dropna()\n", |
526 | 520 | " if bartrot in month_starts.keys():\n", |
527 | | - " bartrotday = float(month_starts.loc[bartrot].index.values)\n", |
| 521 | + " bartrotday = float(month_starts.loc[bartrot].index.values[0])\n", |
528 | 522 | " month = month_starts.loc[bartrot].dt.strftime(\"%b\").values[0]\n", |
529 | 523 | " ax.text(bartrotday, y0.iloc[0] - 85, month, verticalalignment=\"top\")\n", |
530 | 524 | "\n", |
|
592 | 586 | " asynchronous=False,\n", |
593 | 587 | " show_progress=False,\n", |
594 | 588 | " )\n", |
595 | | - " df = df.resample(\"1y\").mean()\n", |
| 589 | + " df = df[[\"X\", \"Y\", \"Z\"]].resample(\"Y\").mean()\n", |
596 | 590 | " df.index = df.index.year\n", |
597 | 591 | " df.index.name = \"Year\"\n", |
598 | 592 | " annual_means[obs] = df\n", |
599 | 593 | " return annual_means\n", |
600 | 594 | "\n", |
601 | 595 | "\n", |
602 | | - "observatories = [\"ESK\", \"NGK\", \"CLF\"]\n", |
| 596 | + "# observatories = [\"ESK\", \"NGK\", \"CLF\"] # Why aren't NGK and CLF working?\n", |
| 597 | + "observatories = [\"ESK\"]\n", |
603 | 598 | "annual_means = fetch_annual_means(observatories)" |
604 | 599 | ] |
605 | 600 | }, |
|
709 | 704 | "name": "python", |
710 | 705 | "nbconvert_exporter": "python", |
711 | 706 | "pygments_lexer": "ipython3", |
712 | | - "version": "3.10.6" |
| 707 | + "version": "3.11.6" |
713 | 708 | }, |
714 | 709 | "toc-autonumbering": true, |
715 | 710 | "toc-showcode": false, |
|
0 commit comments