diff --git a/2024-Wrapped.ipynb b/2024-Wrapped.ipynb new file mode 100644 index 0000000..dd89032 --- /dev/null +++ b/2024-Wrapped.ipynb @@ -0,0 +1,882 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Binärgewitter 2024\n", + "\n", + "Tagline?\n", + "Let's take a look:\n", + "Zuerst müssen wir alle librarys importieren und Daten laden." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import calmap" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "podcasts = pd.read_csv(\"data/2024.csv\", sep=\",\", index_col=1)\n", + "podcasts.index = pd.to_datetime(podcasts.index, format=\"%Y-%m-%d\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Übersicht\n", + "\n", + "Diese Jahr habe wir einige Sendungen veröffentlicht:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Talk: 22\n", + "Westcoast: 0\n", + "Total: 22\n" + ] + } + ], + "source": [ + "total_count = len(podcasts.index)\n", + "talk_count = len(podcasts[podcasts.Type == \"Talk\"].index)\n", + "westcoast_count = len(podcasts[podcasts.Type == \"Westcoast\"].index)\n", + "\n", + "print(f\"Talk: {talk_count}\")\n", + "print(f\"Westcoast: {westcoast_count}\")\n", + "print(f\"Total: {total_count}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2024 haben wir 22 Sendungen gemacht! Das letzte mal als wir so viele Sendungen hatten war 2020." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Binärgewitter Talk" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Für Binärgewitter Talk sind das alle 2.3636363636363638 Wochen eine Sendung.\n" + ] + } + ], + "source": [ + "distance_between_recordings = 52 / talk_count\n", + "print(f\"Für Binärgewitter Talk sind das alle {distance_between_recordings} Wochen eine Sendung.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wir machen ein Kopie und schauen uns nur die BGT Talk Sendungen genauer an." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "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", + " \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", + " \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", + " \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", + " \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", + "
NameRecord DateTypeDurationingol33tnamemadmasmakefu
Release Date
2024-12-28Binärgewitter Talk #350: Wir haben doch keine ...2024-12-28Talk01:02:241011
2024-12-11Binärgewitter Talk #349: Blauhelm Browser2024-11-10Talk02:23:121111
2024-11-20Binärgewitter Talk #348: Nicht mehr ganz Knusper2024-11-19Talk02:02:421110
2024-11-09Binärgewitter Talk #347: DRM Brennstäbe2024-11-08Talk01:15:081011
2024-10-26Binärgewitter Talk #346: Duoingo2024-10-25Talk02:07:341101
2024-10-14Binärgewitter Talk #345: zu Ingos Studienzeiten2024-10-13Talk02:35:361111
2024-10-01Binärgewitter Talk #344: Das Internet ist rund2024-09-30Talk02:24:531111
2024-09-12Binärgewitter Talk #343: Alle 10 Jahre updaten2024-09-10Talk02:26:241111
2024-08-21Binärgewitter Talk #342: Doppeldiskettenbrief2024-08-19Talk02:24:040111
2024-08-03Binärgewitter Talk #341: Meister Aider2024-08-02Talk02:29:471111
2024-06-28Binärgewitter Talk #340: the crowd strikes back2024-07-19Talk02:06:021001
2024-06-28Binärgewitter Talk #339: Extention Blast2024-06-27Talk02:02:111110
2024-06-12Binärgewitter Talk #338: neu in eurem apt store2024-06-11Talk02:36:131111
2024-05-21Binärgewitter Talk #337: Saubere Studenten2024-05-20Talk02:38:201101
2024-05-10Binärgewitter Talk #336: 18 Euro Mediathek2024-05-09Talk03:21:201111
2024-04-20Binärgewitter Talk #335: KaPutty2024-04-19Talk02:51:261011
2024-03-29Binärgewitter Talk #334: Die Adobe Lightroom D...2024-03-28Talk02:45:181111
2024-03-07Binärgewitter Talk #333: systemd expansion pack2024-03-05Talk02:06:301101
2024-02-17Binärgewitter Talk #332: Der kleine Felix möch...2024-02-16Talk01:57:371101
2024-02-03Binärgewitter Talk #331: Atlassian Klaut Leben...2024-02-02Talk02:16:480111
2024-01-20Binärgewitter Talk #330: OpenSource Plus2024-01-19Talk02:30:161111
2024-01-05Binärgewitter Talk #329: Turbo Niklaus2024-01-04Talk02:25:061111
\n", + "
" + ], + "text/plain": [ + " Name Record Date \\\n", + "Release Date \n", + "2024-12-28 Binärgewitter Talk #350: Wir haben doch keine ... 2024-12-28 \n", + "2024-12-11 Binärgewitter Talk #349: Blauhelm Browser 2024-11-10 \n", + "2024-11-20 Binärgewitter Talk #348: Nicht mehr ganz Knusper 2024-11-19 \n", + "2024-11-09 Binärgewitter Talk #347: DRM Brennstäbe 2024-11-08 \n", + "2024-10-26 Binärgewitter Talk #346: Duoingo 2024-10-25 \n", + "2024-10-14 Binärgewitter Talk #345: zu Ingos Studienzeiten 2024-10-13 \n", + "2024-10-01 Binärgewitter Talk #344: Das Internet ist rund 2024-09-30 \n", + "2024-09-12 Binärgewitter Talk #343: Alle 10 Jahre updaten 2024-09-10 \n", + "2024-08-21 Binärgewitter Talk #342: Doppeldiskettenbrief 2024-08-19 \n", + "2024-08-03 Binärgewitter Talk #341: Meister Aider 2024-08-02 \n", + "2024-06-28 Binärgewitter Talk #340: the crowd strikes back 2024-07-19 \n", + "2024-06-28 Binärgewitter Talk #339: Extention Blast 2024-06-27 \n", + "2024-06-12 Binärgewitter Talk #338: neu in eurem apt store 2024-06-11 \n", + "2024-05-21 Binärgewitter Talk #337: Saubere Studenten 2024-05-20 \n", + "2024-05-10 Binärgewitter Talk #336: 18 Euro Mediathek 2024-05-09 \n", + "2024-04-20 Binärgewitter Talk #335: KaPutty 2024-04-19 \n", + "2024-03-29 Binärgewitter Talk #334: Die Adobe Lightroom D... 2024-03-28 \n", + "2024-03-07 Binärgewitter Talk #333: systemd expansion pack 2024-03-05 \n", + "2024-02-17 Binärgewitter Talk #332: Der kleine Felix möch... 2024-02-16 \n", + "2024-02-03 Binärgewitter Talk #331: Atlassian Klaut Leben... 2024-02-02 \n", + "2024-01-20 Binärgewitter Talk #330: OpenSource Plus 2024-01-19 \n", + "2024-01-05 Binärgewitter Talk #329: Turbo Niklaus 2024-01-04 \n", + "\n", + " Type Duration ingo l33tname madmas makefu \n", + "Release Date \n", + "2024-12-28 Talk 01:02:24 1 0 1 1 \n", + "2024-12-11 Talk 02:23:12 1 1 1 1 \n", + "2024-11-20 Talk 02:02:42 1 1 1 0 \n", + "2024-11-09 Talk 01:15:08 1 0 1 1 \n", + "2024-10-26 Talk 02:07:34 1 1 0 1 \n", + "2024-10-14 Talk 02:35:36 1 1 1 1 \n", + "2024-10-01 Talk 02:24:53 1 1 1 1 \n", + "2024-09-12 Talk 02:26:24 1 1 1 1 \n", + "2024-08-21 Talk 02:24:04 0 1 1 1 \n", + "2024-08-03 Talk 02:29:47 1 1 1 1 \n", + "2024-06-28 Talk 02:06:02 1 0 0 1 \n", + "2024-06-28 Talk 02:02:11 1 1 1 0 \n", + "2024-06-12 Talk 02:36:13 1 1 1 1 \n", + "2024-05-21 Talk 02:38:20 1 1 0 1 \n", + "2024-05-10 Talk 03:21:20 1 1 1 1 \n", + "2024-04-20 Talk 02:51:26 1 0 1 1 \n", + "2024-03-29 Talk 02:45:18 1 1 1 1 \n", + "2024-03-07 Talk 02:06:30 1 1 0 1 \n", + "2024-02-17 Talk 01:57:37 1 1 0 1 \n", + "2024-02-03 Talk 02:16:48 0 1 1 1 \n", + "2024-01-20 Talk 02:30:16 1 1 1 1 \n", + "2024-01-05 Talk 02:25:06 1 1 1 1 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "talk = podcasts[podcasts.Type == \"Talk\"]\n", + "talk.drop(columns=['pfleidi', 'marc'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sendungen pro Host:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ingo: 20\n", + "l33tname: 18\n", + "madmas: 17\n", + "makefu: 20\n" + ] + } + ], + "source": [ + "ingo_count = talk[\"ingo\"].sum()\n", + "l33tname_count = talk[\"l33tname\"].sum()\n", + "madmas_count = talk[\"madmas\"].sum()\n", + "makefu_count = talk[\"makefu\"].sum()\n", + "\n", + "\n", + "print(f\"ingo: {ingo_count}\")\n", + "print(f\"l33tname: {l33tname_count}\")\n", + "print(f\"madmas: {madmas_count}\")\n", + "print(f\"makefu: {makefu_count}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Prozen sind das:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ingo: 91%\n", + "makefu: 91%\n", + "l33tname: 82%\n", + "madmas: 77%\n" + ] + } + ], + "source": [ + "print(f\"ingo: {ingo_count/talk_count:.0%}\")\n", + "print(f\"makefu: {makefu_count/talk_count:.0%}\")\n", + "print(f\"l33tname: {l33tname_count/talk_count:.0%}\")\n", + "print(f\"madmas: {madmas_count/talk_count:.0%}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Niemand war fuer alle Sendungen hier, alle haben die eine oder andere Sendung verpasst." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Duration" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Da der feed jetzt eine duration pro Sendung angibt kann man jetzt auch interessante Auswertungen machen." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import datetime\n", + "\n", + "convert_duration_to_sec = lambda v: (int(v.split(\":\")[0]) * 60*60) + (int(v.split(\":\")[1]) * 60) + int(v.split(\":\")[2])\n", + "talk['Duration_sec'] = talk['Duration'].transform(convert_duration_to_sec)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Unsere totale Sendezeit war diese Jahr:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2 days, 2:48:51'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "total_sec = int(talk['Duration_sec'].sum())\n", + "str(datetime.timedelta(seconds=total_sec))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Im Durchschnitt ist eine Sendung:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2:18:35'" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "avg_sec = int(talk['Duration_sec'].mean())\n", + "str(datetime.timedelta(seconds=avg_sec))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Die kürzeste Sendung die wir diese Jahr gemacht haben:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "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", + "
NameRecord DateTypeDurationingol33tnamemadmasmakefupfleidimarcDuration_sec
Release Date
2024-12-28Binärgewitter Talk #350: Wir haben doch keine ...2024-12-28Talk01:02:241011003744
\n", + "
" + ], + "text/plain": [ + " Name Record Date \\\n", + "Release Date \n", + "2024-12-28 Binärgewitter Talk #350: Wir haben doch keine ... 2024-12-28 \n", + "\n", + " Type Duration ingo l33tname madmas makefu pfleidi marc \\\n", + "Release Date \n", + "2024-12-28 Talk 01:02:24 1 0 1 1 0 0 \n", + "\n", + " Duration_sec \n", + "Release Date \n", + "2024-12-28 3744 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "shortes_episode = talk[talk['Duration_sec'] == talk['Duration_sec'].min()]\n", + "shortes_episode" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Und nicht zuletzt die längste Sendung:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "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", + "
NameRecord DateTypeDurationingol33tnamemadmasmakefupfleidimarcDuration_sec
Release Date
2024-05-10Binärgewitter Talk #336: 18 Euro Mediathek2024-05-09Talk03:21:2011110012080
\n", + "
" + ], + "text/plain": [ + " Name Record Date Type \\\n", + "Release Date \n", + "2024-05-10 Binärgewitter Talk #336: 18 Euro Mediathek 2024-05-09 Talk \n", + "\n", + " Duration ingo l33tname madmas makefu pfleidi marc \\\n", + "Release Date \n", + "2024-05-10 03:21:20 1 1 1 1 0 0 \n", + "\n", + " Duration_sec \n", + "Release Date \n", + "2024-05-10 12080 " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "longest_episode = talk[talk['Duration_sec'] == talk['Duration_sec'].max()]\n", + "longest_episode" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Recording datum\n", + "\n", + "Hier sehen wir, an welchen Tagen wir aufnehmen." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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rrgiBx98cPbaa69MmDAhp59+eq688sr069cv3/jGNzJ16tTstddeueGGGzJlypR66xg8eHDGjRuX448/Ph06dMi0adMapLaqBlkLAAAAAABAktatW2fKlCmbNDo2du655+bcc8+tN3bSSSfVu33VVVflqquuatDaHCkCAAAAAABUBE0RAAAAAACgImiKAAAAAAAAFUFTBAAAAAAAqAiaIgAAAAAAQEXQFAEAAAAAACqCpggAAAAAAFARNEUAAAAAAICKUCgWi8VyFwEAAAAAANDYHCkCAAAAAABUBE0RAAAAAACgIlRt7h1Wr17dOJW8Rdu2bSsis1y5Mptfrszmlyuz+eXKbH65Mptfrszmlyuz+eXKbH65Mptf7saZf+63R5Nkdn7k/ytNe0wbN3PVkfs3SWbNTx4oTXtMZW5NmeXK3TiTd+ZIEQAAAAAAoCJoigAAAAAAABVBUwQAAAAAAKgImiIAAAAAAEBF0BQBAAAAAAAqgqYIAAAAAABQETRFAAAAAACABvXSSy/ljDPOSJcuXdK6det07NgxI0aMyIIFC8paV1VZ0wEAAAAAgGbnmGOOybp16zJnzpx07949f/nLXzJv3rysWLGirHU5UgQAAAAAAGgwL7/8cu69995MnTo1tbW16dq1a/bbb79ccMEF+cQnPpFly5alUChk8eLF9e5TKBRSV1eXJKmrq0uhUMi8efMycODAtG3bNoMHD87SpUs/UG2aIgAAAAAAQIOpqalJTU1N5s6dm9dee+0Dreuiiy7K9OnTs2jRolRVVWXMmDEfaH2aIgAAAAAAQIOpqqrK7NmzM2fOnGy//fY58MADc+GFF+bRRx/d7HVddtllGTJkSPr06ZPx48fnvvvuy9q1a993bZoiAAAAAABAgzrmmGPy/PPP54477sjIkSNTV1eXAQMGZPbs2Zu1nr59+5amO3XqlCR58cUX33ddmiIAAAAAAECDq66uzvDhwzNhwoTcd999GT16dCZOnJgWLf6vNVEsFkvLrl+//m3Xsc0225SmC4VCkmTDhg3vuyZNEQAAAAAAoNH16dMnr776ajp06JAkWb58eWnexhddb0xVTZICAAAAAABUhBUrVuTTn/50xowZk759+2bbbbfNokWLMm3atBx11FFp06ZN9t9//1x++eXp1q1bXnzxxXzlK19pkto0RQAAAAAAgAZTU1OT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d+6c2267LUmydOnSLF++PP/5n/9Zpi2iZcuW+drXvpZvfetbee655zaZ/9BDD+W4447LCSeckMceeyyTJk3KhAkTSl+Qjxo1Kg8++GC9H0E98cQTefTRR/OZz3ymSbeFxjFs2LD069ev9OO4d9vn/+xnP8snP/nJHHbYYXn44Yczb9687LfffmXeCppEkffklFNOKR511FFvO++ll14qJik+9thjxWKxWHz66aeLSYrXXnttaZknnniimKS4ZMmSJquZt3fKKacUW7ZsWWzXrl3p79hjjy0ecsghxa997Wv1lv3e975X7NSpU+l2kuK4cePqLTNo0KDiGWec0WT1U9+br80XX3yx2Lp16+KyZcuKy5YtK1ZXVxdfeuml4lFHHVU85ZRT3va+/+y1+81vfrOJt4ItxeDBg0uP//r164s777xzcf78+cVisVicP39+MUnx5ptvLi2/YsWKYps2bYq33HJLsVgsFmfNmlVMUly8eHGZtoBiA+8X1qxZU9xhhx1Kj3GxWCz27du3OGnSpCbbHja18eeyrl27Fq+44op68/v161ecOHFi6XaS4le+8pXS7VWrVhWTFO+6664mrJot1ft5Pv3oRz9q8jr5597p/XvWrFnF7bbbrt7yP/rRj4ob/1d40KBBxbPOOqveMgceeGCxX79+TVI/DevWW28t7rDDDsXq6uri4MGDixdccEHxkUceKRaLxeK9995bbN++fXHt2rX17tOjR4/i1VdfXSwWi8WJEycWW7ZsWXzuuedK8++6665iixYtisuXL2/ireGDeOCBB95xn/2Nb3yjmKT429/+tpik+Mtf/vJtl3vz/wErV65s5Ip5Jxu/X++///7FMWPGFItv2ad/5jOfKQ4fPrze/c4///xinz59Srf79etXvOSSS0q3L7jgguKgQYOaaCtoKO/0Pe3xxx9f3HPPPd/TPv+AAw4ojho1qklqZsviSJH34cknn8yJJ56Y7t27p3379tl9992TZJNTpPTt27c03alTpyTJiy++2MTV8nZqa2uzePHi0t+MGTPyyCOP5JJLLin9uqimpiann356li9fntWrV5fue8ABB9Rb1wEHHOBIkS1Ahw4dSqdLmDVrVg4//PDsvPPO9ZZ5r6/dgQMHNmntbBmWLl2aBx98MCeeeGKSpKqqKscff3yuu+66esttvA/Ycccd07t373r7gFatWtXb/1M+DbFfqK6uzkknnZTrr78+SfK73/0ujz/+uNMmbIU2fl22a9cu7du397kMmoH3+v79but4669C/Up063XMMcfk+eefzx133JGRI0emrq4uAwYMyOzZs/PII49k1apV2Wmnner9v+/pp5+u98vxLl26ZLfddivdPuCAA7Jhw4YsXbq0TFvFB/FuR44tW7YsLVu2zJAhQ5qsJj6YqVOnZs6cOZt8F7NkyZIceOCB9cYOPPDAPPnkk3njjTeSfxwtcuONNyb/eG7cdNNNGTVqVBNWT2MrFospFArvaZ+/ePHiHHLIIeUumTKoKncBW6MjjzwyXbt2zTXXXJNdd901GzZsyF577ZV169bVW26bbbYpTb95zloX3N0ytGvXLj179qw3tmrVqkyePDmf+tSnNlm+urq6Cavj/RozZkzp3P/f/va3N5n/Xl+77dq1a7Ka2XJcd911ef3117PrrruWxorFYlq3bp0rr7zyPa+nTZs2m5ynnPJpiP3C2LFj079//zz33HOZNWtWhg0blq5duzbpdvDPtWjRYpMvOzY+pd2bNv5cln98NvO5jLd6r88nthzv9v7tMa1M1dXVGT58eIYPH54JEyZk7NixmThxYs4888x06tQpdXV1m9znrdeeYevXs2fPFAqFLFmy5G2vEbBkyZLssMMOm5xaiy3fwQcfnBEjRuSCCy7Y7B8rnXjiifnyl7+c3/3ud1mzZk3+/Oc/5/jjj2+0Wml6S5YsSbdu3bJq1ap33ed7/VcuTZHNtGLFiixdujTXXHNN/vVf/zVJ8pvf/KbcZdEABgwYkKVLl27SLHmrBx54ICeffHK92xtftJfyGTlyZNatW5dCobDJtUC8dnknr7/+er773e9m+vTp+djHPlZv3tFHH52bbrope+yxR/KP13yXLl2SJCtXrswf/vCH7LnnnmWpm3fXEPuFvffeOwMHDsw111yTG2+8cbOaZDS+Dh06ZPny5aXbf//73/P000+XtSa2Xp5PW5f38v7dtWvXvPLKK3n11VdLP3xZvHhxvWV79+6dhQsX1vuMv3DhwibaCppCnz59Mnfu3AwYMCAvvPBCqqqqSkeHvp1nn302zz//fKnZ9sADD6RFixbp3bt3E1bNB7XTTjtl+PDh+c53vpNzzz233pefL7zwQm644YacfPLJ2XvvvbNhw4b8+te/zqGHHrrJelq1apUkpSMN2DJcfvnl6d+/f73X5Z577pkFCxbUW27BggXp1atXWrZsmST58Ic/nCFDhuSGG27ImjVrMnz4cNeBbEZ+9atf5bHHHsu5556bD3/4w++6z+/bt2/mzZu3ybUnaf40RTbTDjvskJ122in/9V//lU6dOuXZZ5/N+PHjy10WDeDiiy/OEUcckS5duuTYY49NixYt8sgjj+Txxx/PpZdeWlruhz/8YQYOHJiDDjooN9xwQx588MHNOjyfxtOyZcvS4bNvfuB5k9cu7+SnP/1pVq5cmdNOOy3bbbddvXnHHHNMrrvuunz9619PklxyySXZaaedsssuu+Siiy7KzjvvnKOPPrpMlfNuGmq/MHbs2Jx99tlp167d2/7SkPIZNmxYZs+enSOPPDLbb799Lr744k0ea3ivPJ+2Lu/l/fvnP/952rZtmwsvvDCf//zn89vf/rZ0wd03fe5zn8vpp5+egQMHZvDgwbnlllvy6KOPpnv37k28RXxQK1asyKc//emMGTMmffv2zbbbbptFixZl2rRpOeqoo3LooYfmgAMOyNFHH51p06alV69eef7550sX2n3zNLrV1dU55ZRT8h//8R/5+9//ns9//vM57rjj0rFjx3JvIpvpyiuvzODBgzNixIhceuml6datW5544omcf/752W233XLZZZdlxx13zCmnnJIxY8ZkxowZ6devX5555pm8+OKLOe6449K1a9cUCoX89Kc/zWGHHZY2bdqkpqam3JtW8fbee++MGjUqM2bMKI39+7//e/bdd9989atfzfHHH5/7778/V155Zb7zne/Uu++oUaMyceLErFu3LldccUUZqqchvPbaa3nhhRfyxhtv5C9/+UvuvvvuTJkyJUcccUROPvnktGjR4l33+RMnTswhhxySHj165IQTTsjrr7+eO++8M1/+8pfLvXk0MtcUeY82bNiQqqqqtGjRIjfffHMeeuih7LXXXjn33HNLX5SxdRsxYkR++tOf5he/+EX23Xff7L///rniiis2OUXK5MmTc/PNN6dv37757ne/m5tuuil9+vQpW93U1759+7Rv336Tca9d3sl1112XQw89dJMvVPKPL1UWLVqURx99NPnHL5LOOeecfPSjH80LL7yQn/zkJ6Vfj7Flaoj9woknnpiqqqqceOKJTqm4BXjzc1mSXHDBBRkyZEiOOOKIHH744Tn66KPTo0ePcpfIVsTzaev1Xt6/n3vuuXz/+9/PnXfemb333js33XRTJk2aVG/ZUaNG5YILLsh5552XAQMG5Omnn87o0aPt77dCNTU1GTRoUK644oocfPDB2WuvvTJhwoScfvrpufLKK1MoFHLnnXfm4IMPzqmnnppevXrlhBNOyDPPPJNddtmltJ6ePXvmU5/6VA477LB87GMfS9++fTf5UpWtw0c+8pEsWrQo3bt3z3HHHZcePXrk3/7t31JbW5v7778/O+64Y5LkqquuyrHHHpszzzwze+yxR04//fS8+uqrSZLddtstkydPzvjx47PLLruUTs1K+V1yySX1Toc6YMCA/OAHP8jNN9+cvfbaKxdffHEuueSSTU6xdeyxx2bFihVZvXq1H7htxe6+++506tQpu+++e0aOHJn58+dnxowZ+fGPf5yWLVu+p33+0KFD88Mf/jB33HFH+vfvn2HDhuXBBx8s96bRBArFd7viFMk/Tr/Rs2dPp8wAqFB1dXWpra3NypUrnXO6Ai1btiw9evTIwoULM2DAgHKXU/F8LqMheT7xdoYPH56OHTvme9/7XrlLoYlNmjQpc+fO3eQ0awBA8+H0We9i5cqVWbBgQerq6jJu3LhylwMANKH169dnxYoV+cpXvpL9999fQ6TMfC6jIXk+8abVq1dn5syZGTFiRFq2bJmbbrop99xzT375y1+WuzQAABqBpsi7GDNmTBYuXJh///d/z1FHHVXucgCAJrRgwYLU1tamV69eufXWW8tdTsXzuYyG5PnEm948vcZll12WtWvXpnfv3rntttve9oLLAABs/Zw+CwAAAAAAqAgutA4AAAAAAFQETREAAAAAAKAiaIoAAAAAAAAVQVMEAAAAAACoCJoiAAAAAABARdAUAQAAAAAAKoKmCAAAAAAAUBE0RQAAAAAAgIrw/wOV1Dpg8KUgpQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.rcParams[\"figure.figsize\"]=20,20\n", + "\n", + "release_date = talk\n", + "release_date.index = pd.to_datetime(release_date[\"Record Date\"], format=\"%Y-%m-%d\")\n", + "calmap.yearplot(release_date['Duration_sec']);" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.12.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/README.md b/README.md index 00e00be..9995da5 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,9 @@ Some basic stats about the published episodes of the ## Getting started -You need [jupyter notebook](https://jupyter.org/install) -and [pandas](https://pandas.pydata.org/pandas-docs/stable/getting_started/install.html). +You need [jupyter notebook](https://jupyter.org/install), +[pandas](https://pandas.pydata.org/pandas-docs/stable/getting_started/install.html) and +[calmap](https://pythonhosted.org/calmap/). All data can be found inside `data/$YEAR.csv`. diff --git a/data/2024.csv b/data/2024.csv new file mode 100644 index 0000000..0e1f48d --- /dev/null +++ b/data/2024.csv @@ -0,0 +1,24 @@ +Name,Release Date,Record Date,Type,Duration,ingo,l33tname,madmas,makefu,pfleidi,marc +"Binärgewitter Talk #350: Wir haben doch keine Zeit",2024-12-28,2024-12-28,Talk,01:02:24,1,0,1,1,0,0 +"Binärgewitter Talk #349: Blauhelm Browser",2024-12-11,2024-11-10,Talk,02:23:12,1,1,1,1,0,0 +"Binärgewitter Talk #348: Nicht mehr ganz Knusper",2024-11-20,2024-11-19,Talk,02:02:42,1,1,1,0,0,0 +"Binärgewitter Talk #347: DRM Brennstäbe",2024-11-09,2024-11-08,Talk,01:15:08,1,0,1,1,0,0 +"Binärgewitter Talk #346: Duoingo",2024-10-26,2024-10-25,Talk,02:07:34,1,1,0,1,0,0 +"Binärgewitter Talk #345: zu Ingos Studienzeiten",2024-10-14,2024-10-13,Talk,02:35:36,1,1,1,1,0,0 +"Binärgewitter Talk #344: Das Internet ist rund",2024-10-01,2024-09-30,Talk,02:24:53,1,1,1,1,0,0 +"Binärgewitter Talk #343: Alle 10 Jahre updaten",2024-09-12,2024-09-10,Talk,02:26:24,1,1,1,1,0,0 +"Binärgewitter Talk #342: Doppeldiskettenbrief",2024-08-21,2024-08-19,Talk,02:24:04,0,1,1,1,0,0 +"Binärgewitter Talk #341: Meister Aider",2024-08-03,2024-08-02,Talk,02:29:47,1,1,1,1,0,0 +"Binärgewitter Talk #340: the crowd strikes back",2024-06-28,2024-07-19,Talk,02:06:02,1,0,0,1,0,0 +"Binärgewitter Talk #339: Extention Blast",2024-06-28,2024-06-27,Talk,02:02:11,1,1,1,0,0,0 +"Binärgewitter Talk #338: neu in eurem apt store",2024-06-12,2024-06-11,Talk,02:36:13,1,1,1,1,0,0 +"Binärgewitter Talk #337: Saubere Studenten",2024-05-21,2024-05-20,Talk,02:38:20,1,1,0,1,0,0 +"Binärgewitter Talk #336: 18 Euro Mediathek",2024-05-10,2024-05-09,Talk,03:21:20,1,1,1,1,0,0 +"Binärgewitter Talk #335: KaPutty",2024-04-20,2024-04-19,Talk,02:51:26,1,0,1,1,0,0 +"Binärgewitter Talk #334: Die Adobe Lightroom Downloader App",2024-03-29,2024-03-28,Talk,02:45:18,1,1,1,1,0,0 +"Binärgewitter Talk #333: systemd expansion pack",2024-03-07,2024-03-05,Talk,02:06:30,1,1,0,1,0,0 +"Binärgewitter Talk #332: Der kleine Felix möchte gerne aus dem Div Center abgeholt werden",2024-02-17,2024-02-16,Talk,01:57:37,1,1,0,1,0,0 +"Binärgewitter Talk #331: Atlassian Klaut Lebenszeit",2024-02-03,2024-02-02,Talk,02:16:48,0,1,1,1,0,0 +"Binärgewitter Talk #330: OpenSource Plus",2024-01-20,2024-01-19,Talk,02:30:16,1,1,1,1,0,0 +"Binärgewitter Talk #329: Turbo Niklaus",2024-01-05,2024-01-04,Talk,02:25:06,1,1,1,1,0,0 + diff --git a/scripts/crawler.py b/scripts/crawler.py index 996d27a..2af30c3 100644 --- a/scripts/crawler.py +++ b/scripts/crawler.py @@ -10,7 +10,7 @@ "Name,Release Date,Record Date,Type,Duration,ingo,l33tname,madmas,makefu,pfleidi,marc" ) for e in PodcastFeed.entries: - if e.published_parsed.tm_year == 2023: + if e.published_parsed.tm_year == 2024: release_date_str = f"{e.published_parsed.tm_year}-{e.published_parsed.tm_mon:02}-{e.published_parsed.tm_mday:02}" # Parse Date from download file as this contains the recording date @@ -24,7 +24,7 @@ ingo = int("ingo" in e.podcast_person) l33tname = int("l33tname" in e.podcast_person) madmas = int("madmas" in e.podcast_person) - makefu = int("makefu" in e.podcast_person) + makefu = int("felix" in e.podcast_person) print( f'"{e.title}",{release_date_str},{record_date_str},Talk,{e.itunes_duration},{ingo},{l33tname},{madmas},{makefu},0,0' )