Seite 1 von 2

Datenimport

Verfasst: Mo Okt 09, 2017 11:52 am
von Kalypso
Hallo,

bislang kam ich mit dem Datenimport ganz gut zurecht, in dem ich zum Erstellen einer .csv Datei Open Office Org benutzte.
Ich machte diese Exceldatei mit dem Programm auf und konnte dann eine saubere ,csv Datei erstellen, die ich anschließend z. B. mit
test<- readSeries(file.choose(), format = "%Y-%m-%d", sep = ",")
in R hochladen und bearbeiten konnte.
Mein Problem ist, die nun wesentlich größeren Datenmengen und Open Office Org kann eine Datei mit schlappen 20 MB noch nicht mal mehr öffnen und mit Excel kriege ich das Format nicht hin. Ich habe zwar dem Programm den max. Arbeitsspeicher zugefügt, aber nichts geht mehr.
Ein Datenbeispiel habe ich mal eingefügt, die Spaltenanzahl kann schon mal 3.000 Werte betragen, zusammen mit einer 5 jährigen Historie kommen halt leider größere Mengen hinzu.
Kennt jemand noch eine andere Alternative um Daten fehlerfrei einlesen zu können und was muss ich dabei beachten?

Grüße
Kalypso

Re: Datenimport

Verfasst: Mo Okt 09, 2017 12:10 pm
von EDi
Mein Problem ist, die nun wesentlich größeren Datenmengen
Ähemm... Excel ist dafür auch nicht gedacht / gut.
Schonmal an einen Datenbanklösung gedacht?

Ich kenne readSeries() jetzt nicht, aber das readxl package kann wunderbar Exceldateien einlesen.
Wenn du unbedingt ein timeSeries-Objekt brauchts, musst du den data.frame nur noch in so eines umwandeln.

Re: Datenimport

Verfasst: Mo Okt 09, 2017 1:56 pm
von student
Hallo Kalypso,

wie hast Du die csv-Datei erstellt? Denkst Du an das Dezimalkomma und an das Semikolon als Trennzeichen? Wenn ich in Deinem Code das Trennzeichen "," sehe, frage ich mich, welche read.csv-Funktion Du benutzt? Dann sollte es auch kein Problem mit dem Datum geben...

Re: Datenimport

Verfasst: Mo Okt 09, 2017 2:16 pm
von bigben
Hallo!

5 Jahre täglich ein Wert sind 5 * 365,25 also unter 2000 Zeilen. Ein Dataframe mit 2000 Zeilen und 3000 Spalten sollte für R keine nennenswerte Belastung darstellen. Kannst ja mal schnell testen:

Code: Alles auswählen

daten <- as.data.frame(matrix(rnorm(2000*3000), nrow=2000))
Sollte kein Problem sein.

Also vermute ich ein Problem in OpenOffice oder Excel - beides hier nur bedingt on topic. Vielleicht kann man ja nach 4 Jahren einen Schnitt machen, eine OpenOffice-Datei mit den Daten der ersten 4 Jahre erstellen, eine zweite mit den Daten danach und dann beide Dateien in R zusammenfügen?

Nochmal zeigen, dass R damit kein Problem hat:

Code: Alles auswählen

daten2 <- rbind(daten, daten)
dim(daten2)
Vielleicht habe ich das Problem auch nicht ausreichend verstanden.

LG,
Bernhard

Re: Datenimport

Verfasst: Mo Okt 09, 2017 6:38 pm
von Kalypso
@EDi,

hi, eigentlich kann man aus der Größe einer Datei nicht die Notwendigkeit einer Datenbanklösung schließen, die hat andere Funktionen.
ich hab mich mit dem Packet auseinander gesetzt, leider bin ich nicht schlau geworden:

> read_excel("SUP_USD_Vorbereitung csv_teil1.xlsx", col_names = TRUE, col_types = NULL)
# A tibble: 1,754 x 475
date SuP500_TR `3M Company` `Abbott Laboratories` `Accenture plc` `Activision Blizzard` `Acuity Brands Inc` `Adobe Systems Incorporated` `Advance Auto Parts Inc` `Advanced Micro Devices`
<dttm> <dttm> <dttm> <dttm> <dttm> <dttm> <dttm> <dttm> <dttm> <dttm>
1 2010-12-28 1899-12-31 00:00:00 1899-12-31 00:00:00 1899-12-31 00:00:00 1899-12-31 00:00:00 1899-12-31 00:00:00 1899-12-31 00:00:00 1899-12-31 00:00:00 1899-12-31 00:00:00 1899-12-31 00:00:00
2 2010-12-29 1899-12-31 00:01:43 1899-12-31 00:00:20 1899-12-31 00:00:55 1899-12-31 00:19:13 1899-12-31 00:09:15 1899-12-30 23:59:46 1899-12-31 00:02:20 1899-12-31 00:04:21 1899-12-30 23:58:14
3 2010-12-30 1899-12-30 23:57:53 1899-12-30 23:56:21 1899-12-31 00:04:34 1899-12-30 23:54:05 1899-12-31 00:02:18 1899-12-30 23:54:09 1899-12-30 23:41:25 1899-12-31 00:05:52 1899-12-31 00:10:42
4 2010-12-31 1899-12-30 23:59:44 1899-12-30 23:56:01 1899-12-31 00:10:18 1899-12-31 00:02:05 1899-12-30 23:45:07 1899-12-30 23:34:16 1899-12-31 00:09:54 1899-12-30 23:47:42 1899-12-31 00:07:05
5 2011-01-03 1899-12-31 00:16:22 1899-12-31 00:08:11 1899-12-30 23:57:18 1899-12-31 00:02:59 1899-12-31 00:09:16 1899-12-31 00:42:12 1899-12-31 00:23:52 1899-12-30 23:45:52 1899-12-31 00:51:04
6 2011-01-04 1899-12-30 23:58:09 1899-12-30 23:58:01 1899-12-31 00:13:34 1899-12-30 23:50:31 1899-12-31 00:01:10 1899-12-30 23:42:03 1899-12-31 00:10:08 1899-12-30 22:48:20 1899-12-31 00:51:01
7 2011-01-05 1899-12-31 00:07:24 1899-12-31 00:00:00 1899-12-31 00:00:00 1899-12-31 00:00:18 1899-12-30 23:32:26 1899-12-30 23:54:36 1899-12-31 00:32:27 1899-12-31 00:01:52 1899-12-31 00:23:00
8 2011-01-06 1899-12-30 23:57:30 1899-12-30 23:51:12 1899-12-30 23:57:02 1899-12-31 00:05:23 1899-12-30 23:56:30 1899-12-31 00:40:12 1899-12-31 00:02:15 1899-12-30 23:12:38 1899-12-30 23:24:27
9 2011-01-07 1899-12-30 23:57:21 1899-12-31 00:01:31 1899-12-31 00:05:59 1899-12-31 00:02:23 1899-12-30 23:41:13 1899-12-30 23:53:46 1899-12-30 23:49:45 1899-12-31 00:38:29 1899-12-31 00:23:12
10 2011-01-10 1899-12-30 23:58:01 1899-12-31 00:15:22 1899-12-30 23:47:12 1899-12-30 23:47:15 1899-12-30 23:44:32 1899-12-30 22:30:09 1899-12-31 00:41:21 1899-12-31 00:10:43 1899-12-31 00:58:43
# ... with 1,744 more rows, and 465 more variables: `Aetna Inc` <dttm>, `Affiliated Managers Group` <dttm>, `Aflac Incorporated` <dttm>, `Agilent Technologies` <dttm>, `Air Products and Chemicals` <dttm>, `Akamai Technologies` <dttm>,
# `Alaska Air Group` <dttm>, `Albemarle Corporation` <dttm>, `Alexandria Real Estate Equities` <dttm>, `Alexion Pharmaceuticals` <dttm>, `Align Technology` <dttm>, `Allergan plc` <dttm>, `Alliance Data Systems Corporation` <dttm>,
# `Alliant Energy Corporation` <dttm>, `Allstate Corporation` <dttm>, `Alphabet Inc` <dttm>, `Altria Group` <dttm>, Amazoncom <dttm>, `Ameren Corporation` <dttm>, `American Airlines Group` <dttm>, `American Electric Power
# Company` <dttm>, `American Express Company` <dttm>, `American International Group` <dttm>, `American Tower Corporation REIT` <dttm>, `American Water Works` <dttm>, `AMERIPRISE FINANCIAL SERVICES` <dttm>, `AmerisourceBergen
# Corporation Holding` <dttm>, `Amgen Inc` <dttm>, `Amphenol Corporation` <dttm>, AMTEK <dttm>, `Anadarko Petroleum Corporation` <dttm>, `Analog Devices` <dttm>, Andeavor <dttm>, ANSYS <dttm>, Anthem <dttm>, `Aon plc` <dttm>, `Apache
# Corporation` <dttm>,


@student

ich hatte mit der bisherigen vorgehensweise überhaupt keine Probleme, nur durch die Größe in Excel lässt sich Open Office nicht mehr öffnen und nur deshalb kann ich keine csv Datei mehr erstellen.

@bigben
an die Leistungsfähigkeit an R verschwende ich keine Gedanken. dass passt alles.

Gibt es irgendwo ein Beispiel wie ich diese Tabellenform einlesen kann?

Alternativ bleibt mir dann nur aus einer großen Datei 15 Kleinere zu machen und diese mit cbind wieder in r zu vereinen, aber mein Stolz nagt daran...

Re: Datenimport

Verfasst: Mo Okt 09, 2017 7:33 pm
von EDi
ich hab mich mit dem Packet auseinander gesetzt, leider bin ich nicht schlau geworden:

> read_excel("SUP_USD_Vorbereitung csv_teil1.xlsx", col_names = TRUE, col_types = NULL)
# A tibble: 1,754 x 475
date SuP500_TR `3M Company` `Abbott Laboratories` `Accenture plc` `Activision Blizzard` `Acuity Brands Inc` `Adobe Systems Incorporated` `Advance Auto Parts Inc` `Advanced Micro Devices`
<dttm> <dttm> <dttm> <dttm> <dttm> <dttm> <dttm> <dttm> <dttm> <dttm>
Irgendwie erkennt read_excel alle Spalten als Datumsfelder (automatisch, da col_types = NULL).
Ich würde mal versuchen, den Typ expliziz zu übergeben (col_types = c('date', rep('numeric', <ncols>)).

Re: Datenimport

Verfasst: Mo Okt 09, 2017 7:43 pm
von EDi
readxl, hat tatsächlich Probleme...
openxlsx scheint aber zu funktionieren....

Code: Alles auswählen

## download file
tmp <- tempfile(fileext = '.xlsx')
download.file('http://forum.r-statistik.de/download/file.php?id=146', tmp)
tmp

# load into R
library(readxl)
df <- read_excel(tmp)
str(df)
## doesn't work :()


df <- read_excel(tmp, col_types = c('date', rep('numeric', 661)))
str(df)
# looks much better...


## now with openxlsx
library(openxlsx)
df <- read.xlsx(tmp)
str(df)
eigentlich kann man aus der Größe einer Datei nicht die Notwendigkeit einer Datenbanklösung schließen, die hat andere Funktionen.
Trotzdem würde ich sagen, dass das Excel-Forment kein besonders gutes Format ist um Daten zu speichern.

Re: Datenimport

Verfasst: Mo Okt 09, 2017 7:55 pm
von student
Wenn ich tibble lese, denke ich sofort an Flat is better than nested (aus Zen of Python). :roll:

Re: Datenimport

Verfasst: Do Okt 12, 2017 10:48 pm
von Kalypso
Hallo EDi,

ich quäle mich schon seit Tagen damit

zu
df <- read_excel(tmp, col_types = c('date', rep('numeric', 661)))
str(df)
# looks much better...

woher kommen die "661" und das "_", hat das bei Dir funktioniert?

Code: Alles auswählen

> ## download file
> tmp <- tempfile(fileext = '.xlsx')
> download.file('http://forum.r-statistik.de/download/file.php?id=146', tmp)
versuche URL 'http://forum.r-statistik.de/download/file.php?id=146'
Content type 'application/octet-stream' length 260254 bytes (254 KB)
downloaded 254 KB

> tmp
[1] "C:\\Users\\ALEXAN~1\\AppData\\Local\\Temp\\Rtmp6LNDIJ\\file11246b704547.xlsx"
> df <- read_excel(tmp, col_types = c('date', rep('numeric', 661)))
Fehler in read_fun(path = path, sheet = sheet, limits = limits, shim = shim,  : 
  Evaluation error: error -103 with zipfile in unzGetCurrentFileInfo
.
> df
function (x, df1, df2, ncp, log = FALSE) 
{
    if (missing(ncp)) 
        .Call(C_df, x, df1, df2, log)
    else .Call(C_dnf, x, df1, df2, ncp, log)
}
<bytecode: 0x00000000237cf0a8>
<environment: namespace:stats>
> 
> 
> 
> 
> ## now with openxlsx
> library(openxlsx)
Fehler: package or namespace load failed for ‘openxlsx’ in inDL(x, as.logical(local), as.logical(now), ...):
 kann shared object 'C:/Users/Alexander/Documents/R/win-library/3.4/openxlsx/libs/x64/openxlsx.dll' nicht laden:
  maximale Zahl von DLLs erreicht...
> df <- read.xlsx(tmp)
Fehler in read.xlsx(tmp) : konnte Funktion "read.xlsx" nicht finden
> str(df)
function (x, df1, df2, ncp, log = FALSE)  

Re: Datenimport

Verfasst: Do Okt 12, 2017 11:44 pm
von EDi
woher kommen die "661" und das "_", hat das bei Dir funktioniert?
Das ist die Anzahl der spalten-1 die read_excel einliest. Bei mir funktioniert der Code.


Schonmal die openxlsx variante ausprobiert?