slogan3

Help me een Ruby-script implementeren voor gegevensomvorming en analyse

description

Door deze prompt te gebruiken, kun je gegevensverwerkingstaken stroomlijnen, waardevolle inzichten uit je gegevens halen en je Ruby-programmeer vaardigheden verbeteren.

prompt

try_prompt

Maak een Ruby-script dat invoergegevens neemt in het volgende formaat: {{gegevens_formaat}} en specifieke transformatie-operaties uitvoert zoals {{transformation_operaties}}. Het scr ... more
generate_helper
disclaimerOnPageApi image_legal_disclaimer...

ai_answers

provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van een Ruby-script dat voldoet aan jouw wensen. Het script leest gegevens uit een CSV-bestand, filtert de gegevens op de vorige maand, voert enkele basisanalyses uit en produceert een samenvattingsrapport. Het bevat ook foutafhandeling en is efficiënt opgebouwd. ```ruby require 'csv' require 'date' # Helper functie om de eerste dag van de vorige maand te krijgen def eerste_dag_vorige_maand nu = Date.today eerste_van_huidige_maand = Date.new(nu.year, nu.month, 1) eerste_van_huidige_maand.prev_month end # Helper functie om de laatste dag van de vorige maand te krijgen def laatste_dag_vorige_maand eerste_dag_vorige_maand.next_month.prev_day end # Lees gegevens uit CSV en filter op vorige maand def lees_en_filter_data(bestandsnaam) begin data = [] CSV.foreach(bestandsnaam, headers: true) do |row| # Veronderstel dat er een datumkolom heet 'datum' datum_str = row['datum'] datum = Date.parse(datum_str) rescue nil next unless datum if datum >= eerste_dag_vorige_maand && datum <= laatste_dag_vorige_maand data << row.to_h end end data rescue Errno::ENOENT puts "Fout: Bestand '#{bestandsnaam}' niet gevonden." exit rescue CSV::MalformedCSVError => e puts "Fout bij het lezen van CSV: #{e.message}" exit end end # Analyseer gegevens en produceer samenvatting def analyseer_en_rapporteer(data) # Voorbeeld: stel dat je een kolom 'bedrag' hebt bedragen = data.map { |r| r['bedrag'].to_f } total = bedragen.reduce(0, :+) gemiddeld = bedragen.empty? ? 0 : total / bedragen.size aantal = data.size # Andere inzichten kunnen worden toegevoegd, afhankelijk van de gegevens puts "Samenvatting voor de vorige maand:" puts "Aantal records: #{aantal}" puts "Totaalbedrag: €#{'%.2f' % total}" puts "Gemiddeld bedrag: €#{'%.2f' % gemiddeld}" end # Main script bestand_naam = 'gegevens.csv' data = lees_en_filter_data(bestand_naam) if data.empty? puts "Geen gegevens gevonden voor de vorige maand." else analyseer_en_rapporteer(data) end ``` **Gebruik:** - Zorg dat je CSV-bestand `gegevens.csv` in dezelfde map staat. - Zorg dat de kolommen `datum` en `bedrag` aanwezig zijn. - Voer het script uit met `ruby scriptnaam.rb`. **Opmerkingen:** - Pas de kolomnamen en analyse aan op basis van jouw gegevens. - Het script bevat foutafhandeling voor ontbrekende bestanden en onjuiste CSV-indeling. - Voor complexere analyses kun je extra functies toevoegen. Mocht je verdere specificaties willen of hulp bij het aanpassen, laat het gerust weten!
provider: deepseek
model: deepseek-chat
Hier is een Ruby-script dat CSV-gegevens verwerkt, filtert op de vorige maand, analyseert en een samenvattend rapport genereert: ```ruby require 'csv' require 'date' class DataAnalyzer def initialize(input_file) @input_file = input_file @data = [] @filtered_data = [] end def lees_gegevens begin CSV.foreach(@input_file, headers: true, converters: [:numeric, :date]) do |rij| @data << rij end puts "Gegevens succesvol ingelezen: #{@data.size} rijen" rescue Errno::ENOENT raise "Fout: Bestand '#{@input_file}' niet gevonden" rescue CSV::MalformedCSVError => e raise "Fout: Ongeldig CSV-formaat - #{e.message}" rescue StandardError => e raise "Fout bij het lezen van gegevens: #{e.message}" end end def filter_vorige_maand begin huidige_maand = Date.today vorige_maand_start = Date.new(huidige_maand.year, huidige_maand.month - 1, 1) vorige_maand_einde = vorige_maand_start.next_month - 1 @filtered_data = @data.select do |rij| datum = parse_datum(rij['datum'] || rij['date'] || rij['Datum']) datum && datum >= vorige_maand_start && datum <= vorige_maand_einde end puts "Gefilterde gegevens vorige maand: #{@filtered_data.size} rijen" rescue StandardError => e raise "Fout bij filteren gegevens: #{e.message}" end end def analyseer_gegevens return {} if @filtered_data.empty? begin numerieke_kolommen = identificeer_numerieke_kolommen categorische_kolommen = identificeer_categorische_kolommen analyse = { totaal_rijen: @filtered_data.size, periode: bepaal_periode, numerieke_samenvatting: {}, categorische_samenvatting: {}, trends: analyseer_trends } numerieke_kolommen.each do |kolom| waarden = @filtered_data.map { |rij| rij[kolom] }.compact analyse[:numerieke_samenvatting][kolom] = bereken_numerieke_stats(waarden) if waarden.any? end categorische_kolommen.each do |kolom| waarden = @filtered_data.map { |rij| rij[kolom] }.compact analyse[:categorische_samenvatting][kolom] = bereken_frequenties(waarden) if waarden.any? end analyse rescue StandardError => e raise "Fout bij analyse: #{e.message}" end end def genereer_rapport begin puts "\n" + "="*60 puts "SAMENVATTINGSRAAPORT GEGEVENSANALYSE" puts "="*60 if @filtered_data.empty? puts "Geen gegevens gevonden voor de vorige maand." return end analyse = analyseer_gegevens puts "\nALGEMENE SAMENVATTING:" puts "Periode: #{analyse[:periode]}" puts "Totaal aantal records: #{analyse[:totaal_rijen]}" if analyse[:trends][:dagelijkse_trend] puts "Dag met meeste activiteit: #{analyse[:trends][:dagelijkse_trend].first[0]} (#{analyse[:trends][:dagelijkse_trend].first[1]} records)" end puts "\nNUMERIEKE ANALYSE:" analyse[:numerieke_samenvatting].each do |kolom, stats| puts "\n#{kolom.upcase}:" puts " Gemiddelde: #{stats[:gemiddelde].round(2)}" puts " Mediaan: #{stats[:mediaan].round(2)}" puts " Minimum: #{stats[:minimum]}" puts " Maximum: #{stats[:maximum]}" puts " Totaal: #{stats[:totaal].round(2)}" if stats[:totaal] end puts "\nCATEGORISCHE ANALYSE:" analyse[:categorische_samenvatting].each do |kolom, frequenties| puts "\n#{kolom.upcase} (top 5):" frequenties.first(5).each do |waarde, aantal| percentage = (aantal.to_f / analyse[:totaal_rijen] * 100).round(1) puts " #{waarde}: #{aantal} (#{percentage}%)" end end puts "\nBELANGRIJKE INZICHTEN:" toon_belangrijke_inzichten(analyse) puts "\n" + "="*60 puts "Einde rapport" puts "="*60 rescue StandardError => e puts "Fout bij genereren rapport: #{e.message}" end end private def parse_datum(datum_string) return nil unless datum_string begin Date.parse(datum_string.to_s) rescue ArgumentError nil end end def identificeer_numerieke_kolommen return [] if @filtered_data.empty? @filtered_data.first.headers.select do |kolom| waarden = @filtered_data.map { |rij| rij[kolom] }.compact waarden.any? && waarden.all? { |v| v.is_a?(Numeric) || v.to_s.match(/^\d*\.?\d+$/) } end end def identificeer_categorische_kolommen return [] if @filtered_data.empty? @filtered_data.first.headers.select do |kolom| waarden = @filtered_data.map { |rij| rij[kolom] }.compact waarden.any? && !waarden.all? { |v| v.is_a?(Numeric) || v.to_s.match(/^\d*\.?\d+$/) } end end def bereken_numerieke_stats(waarden) gesorteerd = waarden.sort totaal = waarden.sum { gemiddelde: totaal / waarden.size.to_f, mediaan: bereken_mediaan(gesorteerd), minimum: waarden.min, maximum: waarden.max, totaal: totaal, aantal: waarden.size } end def bereken_mediaan(gesorteerd) n = gesorteerd.size if n.odd? gesorteerd[n / 2] else (gesorteerd[n / 2 - 1] + gesorteerd[n / 2]) / 2.0 end end def bereken_frequenties(waarden) frequenties = Hash.new(0) waarden.each { |waarde| frequenties[waarde] += 1 } frequenties.sort_by { |_, aantal| -aantal } end def bepaal_periode datums = @filtered_data.map { |rij| parse_datum(rij['datum'] || rij['date'] || rij['Datum']) }.compact return "Onbekend" if datums.empty? "#{datums.min.strftime('%d-%m-%Y')} tot #{datums.max.strftime('%d-%m-%Y')}" end def analyseer_trends dagelijkse_trend = Hash.new(0) @filtered_data.each do |rij| datum = parse_datum(rij['datum'] || rij['date'] || rij['Datum']) dagelijkse_trend[datum.strftime('%d-%m-%Y')] += 1 if datum end { dagelijkse_trend: dagelijkse_trend.sort_by { |_, aantal| -aantal } } end def toon_belangrijke_inzichten(analyse) inzichten = [] # Inzicht 1: Data volume if analyse[:totaal_rijen] > 1000 inzichten << "Hoge datavolume: meer dan 1000 records in de vorige maand" elsif analyse[:totaal_rijen] < 100 inzichten << "Laag datavolume: minder dan 100 records in de vorige maand" end # Inzicht 2: Numerieke extremen analyse[:numerieke_samenvatting].each do |kolom, stats| if stats[:maximum] > stats[:gemiddelde] * 3 inzichten << "Uitschieter gedetecteerd in #{kolom}: maximum waarde is significant hoger dan gemiddelde" end end # Inzicht 3: Categorische dominantie analyse[:categorische_samenvatting].each do |kolom, frequenties| if frequenties.any? && frequenties.first[1] > analyse[:totaal_rijen] * 0.5 inzichten << "Dominante categorie in #{kolom}: #{frequenties.first[0]} vertegenwoordigt meer dan 50%" end end if inzichten.empty? puts " - Geen significante afwijkingen of patronen gedetecteerd" else inzichten.each { |inzicht| puts " - #{inzicht}" } end end end # Hoofdprogramma begin if ARGV.empty? puts "Gebruik: ruby script.rb gegevens.csv" exit 1 end input_bestand = ARGV[0] analyzer = DataAnalyzer.new(input_bestand) analyzer.lees_gegevens analyzer.filter_vorige_maand analyzer.genereer_rapport rescue StandardError => e puts "Fout: #{e.message}" puts "Backtrace: #{e.backtrace.first(5).join('\n')}" if ENV['DEBUG'] exit 1 end ``` **Kenmerken van dit script:** 1. **Foutafhandeling**: Uitgebreide error handling voor bestandsoperaties, CSV-parsing en data-analyse 2. **Efficiëntie**: Gebruikt streaming CSV-verwerking voor grote bestanden 3. **Flexibiliteit**: Automatische detectie van datum- en numerieke kolommen 4. **Uitgebreide analyse**: - Numerieke statistieken (gemiddelde, mediaan, min/max) - Categorische frequentie-analyse - Trendanalyse per dag - Automatische inzichten detectie **Gebruik:** ```bash ruby script.rb gegevens.csv ``` **Verwachte CSV-structuur:** - Moet een datumkolom bevatten (met naam 'datum', 'date' of 'Datum') - Kan numerieke en categorische kolommen bevatten - Headers in de eerste rij Het script is robuust en zal verschillende CSV-formaten proberen te verwerken met duidelijke foutmeldingen wanneer er problemen zijn.