{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom glob import glob\nimport random\nimport os\nimport time\nimport torch\nimport torchaudio\nimport librosa","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Sample Submission\n\nThis notebook without model. It will help for making submission without Exception (jump start)","metadata":{}},{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in :\n#         print(os.path.join(dirname, filename))\ndirs = [x[0] for x in os.walk('/kaggle/input')]\nfor d in dirs:\n    print(os.path.join('/kaggle/input/', d))\n\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Custom Dataset for Check Phase\n\nI am feeling secondhand embarrassment for our competition hosts... I think they [forgot about how should work with hidden test in code competition](https://www.kaggle.com/c/birdsong-recognition/discussion/158987#892424). So, I have created [custom dataset](https://www.kaggle.com/shonenkov/birdcall-check) for making check phase. It is hardcode, but it will help you avoid many bugs without button \"submission\". \n\n","metadata":{}},{"cell_type":"code","source":"BASE_TEST_DIR = '../input/birdsong-recognition' if os.path.exists('../input/birdsong-recognition/test_audio') else '../input/birdcall-check'\nprint(BASE_TEST_DIR)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = pd.read_csv(f'{BASE_TEST_DIR}/test.csv')\ndf_train = pd.read_csv('../input/birdsong-recognition/train.csv')\nall_birds = df_train['ebird_code'].unique()","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def random_predict():\n    birds = random.choices(all_birds, k=random.randint(0,2)) or ['nocall']\n    return ' '.join(birds)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_test_12 = df_test[df_test.site.isin(['site_1', 'site_2'])]\nsub_test_3 = df_test[df_test.site.isin(['site_3'])]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TEST_FOLDER = f'{BASE_TEST_DIR}/test_audio'\n\ndef custom_read_audio(audio_path, sr=44100):\n    \"\"\"\n    author: @shonenkov \n    \n    Super fast method, without exceptions. \n    return waveform <torch.tensor>, sample_rate <number>\n    \"\"\"\n    try:\n        waveform, sample_rate = torchaudio.load(audio_path, normalization=True)\n        if sample_rate != sr:\n            waveform = torchaudio.transforms.Resample(sample_rate, sr)(waveform)\n            sample_rate = sr\n    except RuntimeError:\n        waveform, sample_rate = librosa.load(audio_path, sr=sr, mono=False)\n        waveform = torch.from_numpy(waveform)\n        if waveform.shape[0] not in [1, 2]:\n            waveform = waveform.unsqueeze(0)\n    return waveform, sample_rate","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = {'row_id': [], 'birds': []}\n\nfor audio_id, data in sub_test_12.groupby('audio_id'):\n    waveform, sample_rate = custom_read_audio(f'{TEST_FOLDER}/{audio_id}.mp3')\n    submission['row_id'].extend(data['row_id'].values)\n    submission['birds'].extend([random_predict() for i in range(data.shape[0])])\n\nfor _, row in sub_test_3.iterrows():\n    row_id, audio_id = row['row_id'], row['audio_id']\n    waveform, sample_rate = custom_read_audio(f'{TEST_FOLDER}/{audio_id}.mp3')\n    submission['row_id'].append(row_id)\n    submission['birds'].append(random_predict())\n\nsubmission = pd.DataFrame(submission)\nsubmission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}