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
...
tags
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.

