Hvordan jeg kombinerede webskrapning, landbrugsvidenskab og NOAA API til at skabe et værktøj, der optimerer kvægfoderomkostninger baseret på miljødata Ranching er en forretning af barber-tynde marginer. To af de største variabler, der kan gøre eller bryde et år, er omkostningerne ved foder langt den største driftsomkostning og vejret. Som udvikler med baggrund i landbruget så jeg en mulighed for at forbinde disse to domæner. Hvad hvis jeg kunne opbygge et værktøj, der ikke kun finder det mest omkostningseffektive foder, men også begynder at lægge grundlaget for justering af anbefalinger baseret på virkelige miljødata? Så jeg byggede en prototype. Det er en samling af Python scripts, der fungerer som en data-drevet assistent for en rancher. Det har to kerne moduler: en for at optimere fødevarekostnaderne og Her kan du finde kritiske vejrdata: Sådan fungerer det Economic Engine Environmental Monitor Modul 1: Den økonomiske motor - skrabning for besparelser Den første opgave var at besvare et grundlæggende spørgsmål: "I betragtning af min flok ernæringsmæssige behov, hvad er den billigste måde at fodre dem på?" Dette krævede to dele: en videnskabelig kalkulator og en webskraber. Del A: Oversættelse af landbrugsvidenskab til Python Først var jeg nødt til at beregne "Dry Matter Intake" (DMI) - et videnskabeligt mål for, hvor meget mad en ko har brug for. Dette er ikke et simpelt tal; det afhænger af koens vægt, livsstil (laktation, vækst, graviditet), mælkeproduktion og meget mere. cows_2.py - A Glimpse into the DMI Formulas # Formula for lactating cow DMI, based on scientific papers dmi_lac = ((3.7 + int(lac_par) * 5.7) + .305 * 624 + .022 * int(lac_weght) + \ (-.689 - 1.87 * int(lac_par)) * 3) * \ (1 - (2.12 + int(lac_par) * .136)**(-.053*int(lac_day))) # Total feed needed is the DMI multiplied by the number of cows and days all_feed_needed = (dmi_lac_needed + dmi_grow_needed + final_preg) * int(days_of_feed) Dette script beder brugeren om detaljer om deres flok og beregner de samlede pund af foder, der kræves. Dernæst havde jeg brug for den . Efterspørgsel Levering af Del B: Web Scraper til realtidspriser Jeg skrev en webskraber ved hjælp af anmodninger og BeautifulSoup til at trække produktnavne og priser direkte fra en lokal foderbutik hjemmeside. cow_save_scrape.py - The Scraper Logic import requests from bs4 import BeautifulSoup as soup from urllib.request import Request, urlopen websiteurl = 'https://shop.berendbros.com/departments/calf-|70|P35|P351.html' req = Request(websiteurl, headers={"User-Agent": 'Mozilla/5.0'}) webpage = urlopen(req).read() soups = soup(webpage,'html.parser') calf_name = [] calf_price = [] for link in soups.find_all('div', class_='card-body'): for product in link.find_all('div', class_='product_link'): calf_name.append(product.text) for price in link.find_all('div', class_='product_price'): # Clean the price string (e.g., "$24.99\n" -> 24.99) price_text = price.text.strip().strip('$') calf_price.append(float(price_text)) Skriptet beregner de samlede omkostninger for at opfylde flokens DMI for hvert foderprodukt og sorterer derefter listen for at finde de billigste og dyreste muligheder. Modul 2: Miljøovervågningen - Tapping ind i NOAA API Foderomkostningerne er kun halvdelen af ligningen.Miljøstress, især varme, har en massiv indvirkning på kvæg.En ko, der lider af varmestress, spiser mindre, producerer mindre mælk og har lavere frugtbarhed. Jeg henvendte mig til National Oceanic and Atmospheric Administration (NOAA), som tilbyder en fantastisk, gratis API til historiske og aktuelle vejrdata fra tusindvis af stationer. Mit script, weather_1.py, er designet til at trække centrale datapunkter til en liste over specifikke vejrstationer i mit område af interesse (College Station, TX). weather_1.py - Fetching Key Climate Data import requests import json token = 'YOUR_NOAA_API_TOKEN' # Get this from the NOAA website base_url = 'https://www.ncei.noaa.gov/cdo-web/api/v2/data' start_date = '2024-04-01' end_date = '2024-04-03' # List of data types we want to fetch data_types = [ 'TMAX', # Maximum Temperature 'TMIN', # Minimum Temperature 'RH_AVG', # Average Relative Humidity 'WIND_SPEED_AVG', ] for station_id in us1tx_codes: print(f"--- Processing station: {station_id} ---") params = { 'datasetid': 'USCRNS', # A specific, high-quality dataset 'stationid': f'USCRNS:{station_id}', 'startdate': start_date, 'enddate': end_date, 'limit': 1000, 'datatypeid': data_types } # ... make the requests.get() call ... Skriptet spørger systematisk API'en for hver station og gemmer resultaterne i JSON-filer, hvilket skaber en lokal database over seneste miljøforhold. Næste skridt: Tilslutning af dots I øjeblikket er disse to moduler adskilt. Men kraften ligger i at forbinde dem. Den næste udvikling af dette projekt er at bruge vejrdataene som en dynamisk input til DMI-regnemaskinen. Du kan beregne den Som THI stiger over en vis tærskel (omkring 72 for mejerikøer), begynder DMI at falde. Temperature-Humidity Index (THI) Den næste version af DMI-formlen ville se sådan ud: adjusted_dmi = beregnet_dmi * get_heat_stress_factor(THI) Dette ville give værktøjet mulighed for at lave smartere, mere realistiske anbefalinger.For eksempel kunne det rådgive en rancher om, at under en forudsagt varmebølge vil deres hjordes indtag sandsynligvis falde med 10%, hvilket giver dem mulighed for at justere foderkøb og undgå affald. Hvad jeg lærte Offentlige API'er er Goldmines: Regeringsorganer som NOAA leverer en utrolig mængde gratis data af høj kvalitet. Web Scraping er en supermagt: For økonomiske data, der ikke er tilgængelige via en API, kan et simpelt Python-skript gøre et websted til en struktureret datakilde. Men ved at kombinere de økonomiske data (feedpriser) med de miljømæssige data (vejr), skaber du et værktøj, der er langt mere kraftfuldt og tættere på, hvordan den virkelige verden rent faktisk fungerer. Dette projekt er et udgangspunkt, men det demonstrerer det enorme potentiale for udviklere til at opbygge værktøjer, der bringer datalogi og automatisering til traditionelle industrier, skaber reel værdi og løser håndgribelige problemer.