diff --git a/.gitignore b/.gitignore index 1d3a733..43129e1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,10 @@ # project specific gitignore entries .venv *.txt -*temp/ *.xlsx *.pdf +*.csv +*temp/ ######################################################################################## # project specific gitignore entries diff --git a/LaTex/Ruder-IDs.csv b/LaTex/Ruder-IDs.csv index 251ae94..3f32545 100644 --- a/LaTex/Ruder-IDs.csv +++ b/LaTex/Ruder-IDs.csv @@ -1,4 +1,3 @@ -Ruder-ID S-C2-M-19XX-01-B/S S-Sw-M-201X-01-B/S S-Sw-M-201X-02-B/S @@ -47,20 +46,34 @@ S-C2-H-201X-26-B/S-sk S-C2-H-202X-01-B/S-sk S-C2-H-202X-02-B/S-sk S-C2-H-202X-03-B/S-sk -R-Em-H-19XX-01/02 -R-Em-H-19XX-03/04 -R-Em-H-19XX-05/06 -R-Em-H-19XX-07/08 -R-Cr-H-200X-01/02 -R-Cr-H-200X-03/04 -R-Cr-H-200X-05/06 -R-Cr-H-200X-07/08 -R-Cr-H-200X-09/10 -R-Cr-H-200X-11/12 -R-Cr-H-200X-13/14 -R-C2-H-201X-01/02-sk -R-C2-H-201X-03/04-sk -R-C2-H-201X-05/06-sk -R-C2-H-201X-07/08-sk -R-C2-H-201X-09/10-sk -R-C2-H-201X-11/12-sk \ No newline at end of file +R-Em-H-19XX-00/01 +R-Em-H-19XX-02/3 +R-Em-H-19XX-02/03 +R-Em-H-19XX-04/5 +R-Em-H-19XX-04/05 +R-Em-H-19XX-06/7 +R-Em-H-19XX-06/07 +R-Em-H-19XX-08/9 +R-Cr-H-200X-00/01 +R-Cr-H-200X-02/3 +R-Cr-H-200X-02/03 +R-Cr-H-200X-04/5 +R-Cr-H-200X-04/05 +R-Cr-H-200X-06/7 +R-Cr-H-200X-06/07 +R-Cr-H-200X-08/9 +R-Cr-H-200X-08/09 +R-Cr-H-200X-10/11 +R-Cr-H-200X-12/13 +R-Cr-H-200X-14/15 +R-C2-H-201X-00/01-sk +R-C2-H-201X-02/3-sk +R-C2-H-201X-02/03-sk +R-C2-H-201X-04/5-sk +R-C2-H-201X-04/05-sk +R-C2-H-201X-06/7-sk +R-C2-H-201X-06/07-sk +R-C2-H-201X-08/9-sk +R-C2-H-201X-08/09-sk +R-C2-H-201X-10/11-sk +R-C2-H-201X-12/13-sk diff --git a/Nextcloud Video Files/create_video_folder_for_all_contacts.ipynb b/Nextcloud Video Files/create_video_folder_for_all_contacts.ipynb index 9d48ebe..044658f 100644 --- a/Nextcloud Video Files/create_video_folder_for_all_contacts.ipynb +++ b/Nextcloud Video Files/create_video_folder_for_all_contacts.ipynb @@ -25,7 +25,7 @@ "\n", "\n", "# Modern Nextcloud WebDAV endpoint format:\n", - "WEBDAV_BASE_URL = f\"{NEXTCLOUD_URL}/remote.php/dav/files/{USERNAME}/Shared/Ruderverein/Videoanalyse\"" + "WEBDAV_BASE_URL = f\"{NEXTCLOUD_URL}/remote.php/dav/files/{USERNAME}/Shared/Ruderverein/02_Athlet:innen/01_Videoanalyse\"" ] }, { diff --git a/Nextcloud_Material/create_Bootsplätze_file.ipynb b/Nextcloud_Material/create_Bootsplätze_file.ipynb index 480fb22..932916b 100644 --- a/Nextcloud_Material/create_Bootsplätze_file.ipynb +++ b/Nextcloud_Material/create_Bootsplätze_file.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "f46948ac", "metadata": {}, "outputs": [], @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "3a1de802", "metadata": {}, "outputs": [], @@ -28,14 +28,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "id": "1fdfef34", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "File loaded successfully!\n" + ] + } + ], "source": [ "# read list of boats\n", "\n", - "FILE_PATH = \"Shared/Ruderverein/Material/Bootsliste.xlsx\"\n", + "FILE_PATH = \"Shared/Ruderverein/01_Material/01_Bootsliste.xlsx\"\n", "\n", "# Build the WebDAV URL\n", "# Note: Path should be URL-encoded if it contains spaces or special characters\n", @@ -55,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "id": "80f97e18", "metadata": {}, "outputs": [], @@ -80,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "70fb2327", "metadata": {}, "outputs": [], @@ -90,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "id": "bf18a0fd", "metadata": {}, "outputs": [], @@ -99,45 +107,65 @@ "variants = []\n", "places = []\n", "\n", - "for boat_name in df['Name'].unique():\n", - " number_seats = df.loc[df['Name']==boat_name,'number_seats'].values[0]\n", - " variable = df.loc[df['Name']==boat_name,'variable'].values[0]\n", + "for boat_name in boats_df['Name'].unique():\n", + " number_seats = boats_df.loc[boats_df['Name']==boat_name,'number_seats'].values[0]\n", + " variable = boats_df.loc[boats_df['Name']==boat_name,'variable'].values[0]\n", "\n", " if bool(variable) is False:\n", " for place in range(1,number_seats+1):\n", - " boat_names.append(boat_name)\n", + " boat_names.append(boat_name.strip())\n", " variants.append(f\"{number_seats}x\")\n", " places.append(place)\n", " elif bool(variable) is True:\n", " for place in range(1,number_seats+1):\n", - " boat_names.append(boat_name)\n", + " boat_names.append(boat_name.strip())\n", " variants.append(f\"{number_seats}x\")\n", " places.append(place)\n", " for place in range(1,number_seats+1):\n", - " boat_names.append(boat_name)\n", + " boat_names.append(boat_name.strip())\n", " variants.append(f\"{number_seats}-\")\n", " places.append(place)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "id": "85059518", "metadata": {}, "outputs": [], "source": [ - "data_dict = {'Bootsname':boat_names,'Trimmung':variants,'Bootsplatz':places,'Ruder-ID':[None for _ in boat_names]}\n", + "data_dict = {'Bootsname':boat_names,'Trimmung':variants,'Bootsplatz':places,'Ruder-ID Macon':[None for _ in boat_names],'Ruder-ID Hacke':[None for _ in boat_names]}\n", "places_df = pd.DataFrame(data_dict)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, + "id": "7c4f5c01", + "metadata": {}, + "outputs": [], + "source": [ + "places_df['sort_value'] = places_df['Bootsname'].str.lower()" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "edd22b3f", + "metadata": {}, + "outputs": [], + "source": [ + "places_df.sort_values(by='sort_value',inplace=True,ignore_index=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, "id": "3071bf52", "metadata": {}, "outputs": [], "source": [ - "places_df.to_excel('temp.xlsx')" + "places_df[['Bootsname','Trimmung','Bootsplatz','Ruder-ID Macon','Ruder-ID Hacke']].to_excel('temp.xlsx')" ] } ], diff --git a/Nextcloud_Material/create_oar_ID_csv_for_printing.ipynb b/Nextcloud_Material/create_oar_ID_csv_for_printing.ipynb index 76c6048..ecec2c3 100644 --- a/Nextcloud_Material/create_oar_ID_csv_for_printing.ipynb +++ b/Nextcloud_Material/create_oar_ID_csv_for_printing.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "id": "3a384a62", "metadata": {}, "outputs": [], @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 10, "id": "05055b94", "metadata": {}, "outputs": [], @@ -44,7 +44,7 @@ "source": [ "# read list of boats\n", "\n", - "FILE_PATH = \"Shared/Ruderverein/Material/Ruderliste.xlsx\"\n", + "FILE_PATH = \"Shared/Ruderverein/01_Material/02_Ruderliste.xlsx\"\n", "\n", "# Build the WebDAV URL\n", "# Note: Path should be URL-encoded if it contains spaces or special characters\n", @@ -56,7 +56,6 @@ "if response.status_code == 200:\n", " # Use BytesIO to turn the raw binary content into a file-like object\n", " oars_df = pd.read_excel(BytesIO(response.content),sheet_name='Ruder')\n", - " places_df = pd.read_excel(BytesIO(response.content),sheet_name='Bootsplatz_Zuordnung')\n", " print(\"File loaded successfully!\")\n", "else:\n", " print(f\"Failed to fetch file. Status code: {response.status_code}\")\n", @@ -65,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 12, "id": "16e39eff", "metadata": {}, "outputs": [], @@ -75,18 +74,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "28fcc50d", "metadata": {}, "outputs": [], "source": [ "def create_label_from_oar_id(row):\n", - " oar_id = row['Ruder-ID']" + " oar_id = row['Ruder-ID']\n", + "\n", + " parts = oar_id.split('-')\n", + " if parts[0] == 'S':\n", + " parts[5] = 'B/S'\n", + " elif parts[0] == 'R':\n", + " if int(parts[4])%2 == 0:\n", + " parts[4] = parts[4] +'/' f'{int(parts[4])+1}'.zfill(2)\n", + " else:\n", + " parts[4] = f'{int(parts[4])-1}'.zfill(2)+'/'+parts[4]\n", + " parts.remove(parts[5])\n", + "\n", + "\n", + " return '-'.join(parts)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "e3992d5c", "metadata": {}, "outputs": [], @@ -96,160 +108,21 @@ }, { "cell_type": "code", - "execution_count": 34, - "id": "43132d73", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
| \n", - " | Ruder-ID | \n", - "label | \n", - "
|---|---|---|
| 0 | \n", - "S-C2-M-19XX-01-B | \n", - "S-C2-M-19XX-01 | \n", - "
| 1 | \n", - "S-C2-M-19XX-01-S | \n", - "S-C2-M-19XX-01 | \n", - "
| 2 | \n", - "S-Sw-M-201X-01-B | \n", - "S-Sw-M-201X-01 | \n", - "
| 3 | \n", - "S-Sw-M-201X-01-S | \n", - "S-Sw-M-201X-01 | \n", - "
| 4 | \n", - "S-Sw-M-201X-02-B | \n", - "S-Sw-M-201X-02 | \n", - "
| ... | \n", - "... | \n", - "... | \n", - "
| 125 | \n", - "R-C2-H-201X-08-B-sk | \n", - "R-C2-H-201X-08-B | \n", - "
| 126 | \n", - "R-C2-H-201X-09-S-sk | \n", - "R-C2-H-201X-09-S | \n", - "
| 127 | \n", - "R-C2-H-201X-10-B-sk | \n", - "R-C2-H-201X-10-B | \n", - "
| 128 | \n", - "R-C2-H-201X-11-S-sk | \n", - "R-C2-H-201X-11-S | \n", - "
| 129 | \n", - "R-C2-H-201X-12-B-sk | \n", - "R-C2-H-201X-12-B | \n", - "
130 rows × 2 columns
\n", - "113 rows × 5 columns
\n", + "134 rows × 9 columns
\n", "" ], "text/plain": [ - " Bootsname Trimmung Bootsplatz Ruder-ID 1 \\\n", - "0 Angie 1x 1 S-Cr-M-200X-07-X \n", - "1 Architekten Lechner 4x 1 S-C2-H-201X-01-X \n", - "2 Architekten Lechner 4x 2 S-C2-H-201X-02-X \n", - "3 Architekten Lechner 4x 3 S-C2-H-201X-03-X \n", - "4 Architekten Lechner 4x 4 S-C2-H-201X-04-X \n", - ".. ... ... ... ... \n", - "108 Villacher Faschingsgilde 2x 1 NaN \n", - "109 Villacher Faschingsgilde 2x 2 NaN \n", - "110 Villacher Faschingsgilde 2- 1 NaN \n", - "111 Villacher Faschingsgilde 2- 2 NaN \n", - "112 Zernatto 1x 1 NaN \n", + " Länge Ruder gesamt Länge Innenhebel Anlage \\\n", + "Ruder-ID \n", + "R-C2-H-201X-01-S-sk 370.5 111.0 +1 \n", + "R-C2-H-201X-02-B-sk 370.0 111.0 -3,5 \n", + "R-C2-H-201X-03-S-sk 370.5 111.5 +1 \n", + "R-C2-H-201X-04-B-sk 370.0 111.5 -2 \n", + "R-C2-H-201X-05-S-sk 374.7 115.0 +2 \n", + "... ... ... ... \n", + "S-Sw-M-201X-02-S 294.0 88.0 NaN \n", + "S-Sw-M-201X-03-B 294.0 88.0 NaN \n", + "S-Sw-M-201X-03-S 294.0 88.0 NaN \n", + "S-Sw-M-201X-04-B 294.0 88.0 NaN \n", + "S-Sw-M-201X-04-S 294.0 88.0 NaN \n", "\n", - " Ruder-ID 2 \n", - "0 S-C2-H-201X-16-X \n", - "1 NaN \n", - "2 NaN \n", - "3 NaN \n", - "4 NaN \n", - ".. ... \n", - "108 NaN \n", - "109 NaN \n", - "110 NaN \n", - "111 NaN \n", - "112 NaN \n", + " Länge Ruder min Länge Ruder max Skinny Typ \\\n", + "Ruder-ID \n", + "R-C2-H-201X-01-S-sk 370.0 375.0 MEDFLEX \n", + "R-C2-H-201X-02-B-sk 370.0 375.0 MEDFLEX \n", + "R-C2-H-201X-03-S-sk 370.0 375.0 MEDFLEX \n", + "R-C2-H-201X-04-B-sk 370.0 375.0 MEDFLEX \n", + "R-C2-H-201X-05-S-sk 373.0 378.0 MEDFLEX \n", + "... ... ... ... \n", + "S-Sw-M-201X-02-S NaN NaN NaN \n", + "S-Sw-M-201X-03-B NaN NaN NaN \n", + "S-Sw-M-201X-03-S NaN NaN NaN \n", + "S-Sw-M-201X-04-B NaN NaN NaN \n", + "S-Sw-M-201X-04-S NaN NaN NaN \n", "\n", - "[113 rows x 5 columns]" + " Bootsplatz 1 Bootsplatz 2 Bootsplatz 3 \n", + "Ruder-ID \n", + "R-C2-H-201X-01-S-sk NaN NaN NaN \n", + "R-C2-H-201X-02-B-sk NaN NaN NaN \n", + "R-C2-H-201X-03-S-sk NaN NaN NaN \n", + "R-C2-H-201X-04-B-sk NaN NaN NaN \n", + "R-C2-H-201X-05-S-sk NaN NaN NaN \n", + "... ... ... ... \n", + "S-Sw-M-201X-02-S NaN NaN NaN \n", + "S-Sw-M-201X-03-B NaN NaN NaN \n", + "S-Sw-M-201X-03-S NaN NaN NaN \n", + "S-Sw-M-201X-04-B NaN NaN NaN \n", + "S-Sw-M-201X-04-S NaN NaN NaN \n", + "\n", + "[134 rows x 9 columns]" ] }, - "execution_count": 12, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], - "source": [] + "source": [ + "oars_df" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "da9397a8", + "metadata": {}, + "outputs": [], + "source": [ + "places_df['Bootsplatz-Label'] = places_df.apply(lambda row: '_'.join(row[['Bootsname','Trimmung','Bootsplatz']].astype(str).to_list()),axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "43ffb028", + "metadata": {}, + "outputs": [], + "source": [ + "my_dict = {key:[] for key in oars_df.index.values}\n", + "\n", + "\n", + "for oar_id in my_dict.keys():\n", + " relevant_part = '-'.join(oar_id.split('-')[:5])\n", + "\n", + " for i,row in places_df.iterrows():\n", + " test_macon = '-'.join(row['Ruder-ID Macon'].split('-')[:5])\n", + " test_hacke = '-'.join(row['Ruder-ID Hacke'].split('-')[:5])\n", + " if (relevant_part == test_macon ) | (relevant_part == test_hacke):\n", + " my_dict[oar_id].append(row['Bootsplatz-Label'])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "0b3f5068", + "metadata": {}, + "outputs": [], + "source": [ + "for oar_id in my_dict.keys():\n", + " places_list = np.array(my_dict[oar_id])\n", + " boat_sizes = [place_label.split('_')[1][0] if len(place_label)>0 else '' for place_label in places_list]\n", + " my_dict[oar_id] = np.flip(places_list[np.argsort(np.array(boat_sizes))])" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "3a7eb82e", + "metadata": {}, + "outputs": [], + "source": [ + "my_df = pd.DataFrame.from_dict(my_dict, orient='index',columns=['Bootsplatz 1','Bootsplatz 2','Bootsplatz 3'])" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "d85765c4", + "metadata": {}, + "outputs": [], + "source": [ + "oars_df[['Bootsplatz 1','Bootsplatz 2','Bootsplatz 3']] = my_df[['Bootsplatz 1','Bootsplatz 2','Bootsplatz 3']]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "b6848ae9", + "metadata": {}, + "outputs": [], + "source": [ + "oars_df.to_csv('temp.csv',index=True,sep=';',decimal=',')" + ] } ], "metadata": { "kernelspec": { - "display_name": ".venv (3.13.7)", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -245,7 +415,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.7" + "version": "3.12.3" } }, "nbformat": 4,