{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":91844,"databundleVersionId":11361821,"sourceType":"competition"},{"sourceId":11177155,"sourceType":"datasetVersion","datasetId":6976177}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:37:45.788149Z","iopub.execute_input":"2025-03-27T07:37:45.788630Z","iopub.status.idle":"2025-03-27T07:37:46.142719Z","shell.execute_reply.started":"2025-03-27T07:37:45.788589Z","shell.execute_reply":"2025-03-27T07:37:46.141547Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train  = pd.read_csv(\"/kaggle/input/birdclef-2025/train.csv\")\ndf_train.head(5)","metadata":{"trusted":true,"_kg_hide-input":true,"execution":{"iopub.status.busy":"2025-03-27T07:53:56.903294Z","iopub.execute_input":"2025-03-27T07:53:56.903665Z","iopub.status.idle":"2025-03-27T07:53:57.060741Z","shell.execute_reply.started":"2025-03-27T07:53:56.903638Z","shell.execute_reply":"2025-03-27T07:53:57.059565Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:53:58.096110Z","iopub.execute_input":"2025-03-27T07:53:58.096470Z","iopub.status.idle":"2025-03-27T07:53:58.126151Z","shell.execute_reply.started":"2025-03-27T07:53:58.096444Z","shell.execute_reply":"2025-03-27T07:53:58.125000Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install reverse_geocoder\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:53:59.621016Z","iopub.execute_input":"2025-03-27T07:53:59.621424Z","iopub.status.idle":"2025-03-27T07:54:03.927881Z","shell.execute_reply.started":"2025-03-27T07:53:59.621369Z","shell.execute_reply":"2025-03-27T07:54:03.926620Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import reverse_geocoder as rg\n\ndf_train.dropna(inplace=True)\n\n# Convert DataFrame to a list of (lat, lon) tuples\ncoordinates = list(zip(df_train['latitude'], df_train['longitude']))\n\n# Perform reverse geocoding\nresults = rg.search(coordinates)\n\n# Extract city names from the results\ndf_train['city'] = [result['name'] for result in results]\n\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:54:03.929591Z","iopub.execute_input":"2025-03-27T07:54:03.929916Z","iopub.status.idle":"2025-03-27T07:54:04.229153Z","shell.execute_reply.started":"2025-03-27T07:54:03.929888Z","shell.execute_reply":"2025-03-27T07:54:04.227713Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.city.value_counts()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:54:04.587812Z","iopub.execute_input":"2025-03-27T07:54:04.588190Z","iopub.status.idle":"2025-03-27T07:54:04.604269Z","shell.execute_reply.started":"2025-03-27T07:54:04.588162Z","shell.execute_reply":"2025-03-27T07:54:04.603361Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install resampy","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:37:57.176288Z","iopub.execute_input":"2025-03-27T07:37:57.176698Z","iopub.status.idle":"2025-03-27T07:38:01.416095Z","shell.execute_reply.started":"2025-03-27T07:37:57.176669Z","shell.execute_reply":"2025-03-27T07:38:01.414847Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from folium.plugins import HeatMap\n\n# Initialize map\nfolium_map = folium.Map(location=map_center, zoom_start=2)\n\n# Add heatmap layer\nHeatMap(df_train[['latitude', 'longitude']].values).add_to(folium_map)\n\n# Save map\nfolium_map.save('map.html')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:54:10.965576Z","iopub.execute_input":"2025-03-27T07:54:10.965909Z","iopub.status.idle":"2025-03-27T07:54:11.416330Z","shell.execute_reply.started":"2025-03-27T07:54:10.965884Z","shell.execute_reply":"2025-03-27T07:54:11.415231Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"## heatmap visulization ## \nfrom IPython.core.display import display\n\ndisplay(folium_map)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:56:37.812121Z","iopub.execute_input":"2025-03-27T07:56:37.812513Z","iopub.status.idle":"2025-03-27T07:56:37.955938Z","shell.execute_reply.started":"2025-03-27T07:56:37.812481Z","shell.execute_reply":"2025-03-27T07:56:37.954405Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install  resampy","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:39:45.608150Z","iopub.execute_input":"2025-03-27T07:39:45.608833Z","iopub.status.idle":"2025-03-27T07:39:49.801773Z","shell.execute_reply.started":"2025-03-27T07:39:45.608801Z","shell.execute_reply":"2025-03-27T07:39:49.800444Z"},"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import gc\ngc.collect()\ndel df_train","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:39:49.803581Z","iopub.execute_input":"2025-03-27T07:39:49.803879Z","iopub.status.idle":"2025-03-27T07:39:50.437940Z","shell.execute_reply.started":"2025-03-27T07:39:49.803855Z","shell.execute_reply":"2025-03-27T07:39:50.436872Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os \nclass_labels = sorted(os.listdir('/kaggle/input/birdclef-2025/train_audio/'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:40:13.005044Z","iopub.execute_input":"2025-03-27T07:40:13.005436Z","iopub.status.idle":"2025-03-27T07:40:13.015829Z","shell.execute_reply.started":"2025-03-27T07:40:13.005369Z","shell.execute_reply":"2025-03-27T07:40:13.014673Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"## creating Dataframe which contains class names and filename paths \nimport os\nimport pandas as pd\n\nfile_paths = []  # List to store file paths\nbase_path = \"/kaggle/input/birdclef-2025/train_audio\"\nsub_dir = []\n# Iterate over each subdirectory and list its files\nfor subdir in os.listdir(base_path):\n    subdir_path = os.path.join(base_path, subdir)  # Full path to subdirectory\n    if os.path.isdir(subdir_path):  # Ensure it's a directory\n        for file in os.listdir(subdir_path):  # Iterate over files in subdir\n            file_paths.append(f\"{subdir}/{file}\")  # Store relative path\n            sub_dir.append(subdir)\n\n# Convert list to DataFrame\ndf = pd.DataFrame({'class_names' : sub_dir , 'filename' : file_paths})\n\nprint(df.head())  # Display first few rows\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-27T07:50:38.678145Z","iopub.execute_input":"2025-03-27T07:50:38.678511Z","iopub.status.idle":"2025-03-27T07:50:41.676078Z","shell.execute_reply.started":"2025-03-27T07:50:38.678483Z","shell.execute_reply":"2025-03-27T07:50:41.675085Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"## Using Librosa to convert audio files to numerical values \n\nimport numpy as np\nfrom tqdm import tqdm\nimport os\nimport librosa\nfrom joblib import Parallel, delayed\n\n# Function to extract MFCC features\ndef features_extractor(file):\n    try:\n        # Load audio file\n        audio, sample_rate = librosa.load(file, res_type='kaiser_fast')\n        \n        # Extract MFCC features\n        mfccs_features = librosa.feature.mfcc(y=audio, sr=sample_rate, n_mfcc=40)\n        mfccs_scaled_features = np.mean(mfccs_features.T, axis=0)\n        \n        return mfccs_scaled_features\n    except Exception as e:\n        # Handle errors (e.g., missing or corrupted files)\n        print(f\"Error processing file {file}: {e}\")\n        return None\n\n# Function to process a single file\ndef process_file(filename, base_path):\n    file_path = os.path.join(base_path, filename)\n    features = features_extractor(file_path)\n    return features\n\n# Main function to extract features in parallel\ndef extract_features_parallel(df_train, base_path, n_jobs=4):\n    # Use joblib to parallelize feature extraction\n    extracted_features = Parallel(n_jobs=n_jobs)(\n        delayed(process_file)(filename, base_path) for filename in tqdm(df['filename'])\n    )\n    \n    # Filter out None values (failed extractions)\n    extracted_features = [features for features in extracted_features if features is not None]\n    \n    return extracted_features\n\n# Example usage\nbase_path = '/kaggle/input/birdclef-2025/train_audio'\nextracted_features = extract_features_parallel(df, base_path, n_jobs=4)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-26T16:36:37.000569Z","iopub.execute_input":"2025-03-26T16:36:37.001094Z","iopub.status.idle":"2025-03-26T17:50:24.100079Z","shell.execute_reply.started":"2025-03-26T16:36:37.001052Z","shell.execute_reply":"2025-03-26T17:50:24.098407Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\n# Assuming extracted_features is a list of arrays, each with 40 MFCC features\nextracted_features = np.array(extracted_features)  # Shape: (27755, 40)\n\n# Create a DataFrame with 40 columns\nextracted_features_df = pd.DataFrame(\n    extracted_features,\n    columns=[f'mfcc_{i+1}' for i in range(extracted_features.shape[1])]  # Column names: mfcc_1, mfcc_2, ..., mfcc_40\n)\n\n# Display the first few rows\nextracted_features_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-26T17:50:48.372097Z","iopub.execute_input":"2025-03-26T17:50:48.372532Z","iopub.status.idle":"2025-03-26T17:50:48.475681Z","shell.execute_reply.started":"2025-03-26T17:50:48.372489Z","shell.execute_reply":"2025-03-26T17:50:48.474560Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"extracted_features_df['class_names'] = df['class_names']\nextracted_features_df.to_csv(\"df_melfrequencies.csv\" , index = False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-26T17:53:24.594651Z","iopub.execute_input":"2025-03-26T17:53:24.595095Z","iopub.status.idle":"2025-03-26T17:53:25.707979Z","shell.execute_reply.started":"2025-03-26T17:53:24.595060Z","shell.execute_reply":"2025-03-26T17:53:25.706924Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data = pd.read_csv(\"/kaggle/input/birdclef-2025-melfreq-data/df_melfrequencies.csv\")\ndata.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-26T15:26:16.080246Z","iopub.execute_input":"2025-03-26T15:26:16.080654Z","iopub.status.idle":"2025-03-26T15:26:16.515725Z","shell.execute_reply.started":"2025-03-26T15:26:16.080625Z","shell.execute_reply":"2025-03-26T15:26:16.513886Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"You can use this above DF and train , Experiment models on different Algorithms like LightGbm , DeepNeuralNetwork etc..","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}