IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Générer des couples de devises inexistante à partir d'autres


Sujet :

SAS Base

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 44
    Points : 43
    Points
    43
    Par défaut Générer des couples de devises inexistante à partir d'autres
    Bonjour
    j'ai une base avec les variables devise1, devise2, date, cours. il y beaucoup de couple de devises renseignés mais certain sont à construire à partir des existantes et n'existe pas, ce sont les fameux cours croisés :

    exemple : j'ai USD/EUR=1.3 et EUR/LIVRE=0.8, et je veux USD/LIVRE=USD/EUR//EUR/LIVRE, soit 1.3/0.8=1.625(USD/LIvre),si et seulement si le couple USD/LIVRE ou LIVRE/USD n'existe pas.

    Donc les étapes

    1: générer les couple inexistant et trouver toutes les possibilités dans une table
    2: lui associer les cours

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonsoir,

    je pense que ta demande nécessite une précision pour être correctement traitée : tu compte construire des couples inexistants, cependant il peut avoir plusieurs choix possibles.

    Bon je met n'importe quoi mais c'est pour te faire comprendre de ce quoi je parle

    Dans ton exemple

    USD/EUR=1.3 et EUR/LIVRE=0.8 tu veux reconstruire USD/LIVRE comme ceci

    USD/LIVRE=USD/EUR//EUR/LIVRE, soit 1.3/0.8=1.625(USD/LIvre via EUR)

    Cependant si tu as

    USD/YUAN=13 et YUAN/LIVRE=8.5

    on a aussi le choix de calculer USD/LIVRE comme ceci

    USD/LIVRE=USD/YUAN/YUAN/LIVRE=13/8.5=1,529 (USD/LIVRE via YUAN)

    Quels sont tes critères de sélection dans ces cas là , (USD/LIVRE via EUR contre USD/LIVRE via YUAN).

    Peut-être veux tu aussi toutes les possibilité de créé ces cours, mais dans ce cas il te manque dans ta description de ta table de sortie une variable précisant la devise de passage (devise3 ? ) correspondant au cours (YUAN dans USD/LIVRE via YUAN et EUR dans USD/LIVRE via EUR).
    Est-ce bien cela que tu souhaite faire ?

    Par ailleurs concernant tes notations, la logique voudrait que l'on écrive

    USD/EURO * EURO/LIVRE = USD/LIVRE

    je ne comprend pas ta notation

    USD/LIVRE=USD/EUR//EUR/LIVRE


    Par ailleurs dans ta table lorsque tu as un cours

    par exemple USD/EUR=1.3
    est-il obligatoire par construction de ta table que si tu as également le couple
    EUR/USD il est obligatoirement égal à 1/(USD/EUR) , proche c'est sûr, mais égal exactement à l'inverse est-ce certain ?

    Je pose peut-être des questions bêtes mais c'est pour bien comprendre.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    voici un code un peu poussif,
    je n'ai pas géré les dates différentes, mais tu dois pouvoir t'inspirer du code ci-dessous sans trop de problèmes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    data cours;
    length devise1 $10. devise2 $10. cours 8. ;
    devise1='USD';devise2='EUR';cours=1.3;output;
    devise1='LIVRE';devise2='EUR';cours=0.8;output;
    devise1='USD';devise2='YUAN';cours=13;output;
    devise1='YUAN';devise2='LIVRE';cours=1/8.5;output;
    run;
     
    data cours2;
    set cours;
    natif="OUI";
    output;
    drop inter;
    inter=devise1;
    devise1=devise2;
    devise2=inter;
    cours=1/cours;
    natif="NON";
    output;
    run;
     
    proc sort data=cours2; by devise1 devise2 descending natif;run;
     
    data cours2; set cours2;
    by devise1 devise2;
    if first.devise2 then output;
    run;
     
    proc sql;
    create table listedevise1 
    as select unique devise1 as devise
    from cours;
    quit;
     
    proc sql;
    create table listedevise2 
    as select unique devise2 as devise
    from cours;
    quit;
     
    data listedevise;
    set listedevise1 listedevise2;
    run;
     
    proc sort data=listedevise nodupkey; by devise;run;
     
    proc sql;
    create table croisementdevise
    as select tab1.devise as devise1,tab2.devise as devise2
    from listedevise as tab1,listedevise as tab2
    where tab1.devise^=tab2.devise;
    quit;
     
     
    proc sql;
    create table croisementdevise
    as select tab1.*
    from croisementdevise as tab1
    where compress(tab1.devise1!!"*"!!tab1.devise2)
    not in (select compress(devise1!!"*"!!devise2) from cours2);
    quit;
     
     
     
     
     
    data croisementdevise;
    merge croisementdevise(in=id) cours2(rename=(devise2=devise3 cours=cours13)) ;
    by devise1 ;
    if id=1;
    run;
     
     
     
     
    proc sql;
    create table croisementdevise2
    as select tab1.*,tab2.cours as cours32
    from croisementdevise as tab1
    left join cours2 as tab2
    on (tab1.devise3=tab2.devise1 and tab1.devise2=tab2.devise2);
    run;
     
    proc sort data=croisementdevise2; by devise1 devise2;run;
     
     
     
    data croisementdevise2;
    set croisementdevise2; cours=cours13*cours32;
    run;
     
     
    data croisementdevisefin;
    set croisementdevise2 cours2;
    keep devise1 devise2 devise3 cours;
    run;
    proc sort data=croisementdevisefin;
    by devise1 devise2 ;
    run;
     
     
     
     
    proc print data=croisementdevisefin;run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
                                        The SAS System       20:18 Tuesday, January 21, 2014   1
     
                             Obs    devise1    devise2    devise3     cours
     
                               1     EUR        LIVRE                 1.2500
                               2     EUR        USD                   0.7692
                               3     EUR        YUAN       LIVRE     10.6250
                               4     EUR        YUAN       USD       10.0000
                               5     LIVRE      EUR                   0.8000
                               6     LIVRE      USD        EUR        0.6154
                               7     LIVRE      USD        YUAN       0.6538
                               8     LIVRE      YUAN                  8.5000
                               9     USD        EUR                   1.3000
                              10     USD        LIVRE      EUR        1.6250
                              11     USD        LIVRE      YUAN       1.5294
                              12     USD        YUAN                 13.0000
                              13     YUAN       EUR        LIVRE      0.0941
                              14     YUAN       EUR        USD        0.1000
                              15     YUAN       LIVRE                 0.1176
                              16     YUAN       USD                   0.0769

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 44
    Points : 43
    Points
    43
    Par défaut
    bonjour et un grand merci pour ta réponse;
    pour répondre à tes question :

    En effet il me faut toutes les possibilités en sortie et ok pour ta notation tu as raison.

    il me faut générer uniquement les couples inexistants dans les deux sans. et oui il faut que l'inverse soit égale à 1/cours.

    je suis en train de modifier le programme pour faire en fonction de la date de cotation.



    un grand merci

  5. #5
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Ok, regarde quand même plus en détail le programme, je pense que ce ne sera pas suffisant dans un certain nombres de cas, je te laisse le soin de regarder et de t'en inspirer pour voir ce qu'il manque et y remédier (il est possible que tu ai besoin de relancer les calculs plusieurs fois pour certaines devises peu répandues).


    Eventuellement je laisse le soin à d'autres de reprendre le flambeau...

    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    data cours;
    length devise1 $10. devise2 $10. cours 8. ;
    devise1='USD';devise2='EUR';cours=1.3;output;
    devise1='LIVRE';devise2='EUR';cours=0.8;output;
    devise1='USD';devise2='YUAN';cours=13;output;
    devise1='YUAN';devise2='LIVRE';cours=1/8.5;output;
    devise1='YUAN';devise2='ROUPIE';cours=3;output;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
                             Obs    devise1    devise2    devise3     cours
     
                               1    EUR        LIVRE                  1.2500
                               2    EUR        ROUPIE     LIVRE        .
                               3    EUR        USD                    0.7692
                               4    EUR        YUAN       USD        10.0000
                               5    LIVRE      EUR                    0.8000
                               6    LIVRE      ROUPIE     EUR          .
                               7    LIVRE      USD        YUAN        0.6538
                               8    LIVRE      YUAN                   8.5000
                               9    ROUPIE     EUR        YUAN         .
                              10    ROUPIE     LIVRE      YUAN        0.0392
                              11    ROUPIE     USD        YUAN        0.0256
                              12    ROUPIE     YUAN                   0.3333
                              13    USD        EUR                    1.3000
                              14    USD        LIVRE      EUR         1.6250
                              15    USD        ROUPIE     YUAN       39.0000
                              16    USD        YUAN                  13.0000
                              17    YUAN       EUR        LIVRE       0.0941
                              18    YUAN       EUR        ROUPIE       .
                              19    YUAN       EUR        USD         0.1000
                              20    YUAN       LIVRE                  0.1176
                              21    YUAN       ROUPIE                 3.0000
                              22    YUAN       USD                    0.0769

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 44
    Points : 43
    Points
    43
    Par défaut avec les dates
    Bonjour,
    je ressort ce topic car j'ai un problème:
    JE veux faire la même chose mais avec pour chaque taux de change une date.
    je coince completement

    Imaginons en entré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DATA cours;
    length devise1 $10. devise2 $10. cours 8. date date9.;
    devise1='USD';devise2='EUR';cours=1.3; date 10apr2014;output;
    devise1='USD';devise2='EUR';cours=1.4; date 11apr2014;output;
    devise1='LIVRE';devise2='EUR';cours=0.8;date 10apr2014;output;
    devise1='LIVRE';devise2='EUR';cours=0.7;date 11apr2014;output;
    devise1='USD';devise2='YUAN';cours=13; date 10apr2014;output;
    devise1='USD';devise2='YUAN';cours=15; date 11apr2014;output;
    devise1='YUAN';devise2='LIVRE';cours=1/8.5;date 10apr2014;output;
    devise1='YUAN';devise2='LIVRE';cours=1/8.7;date 11apr2014;output;
    devise1='YUAN';devise2='ROUPIE';cours=3;date 10apr2014;output;
    devise1='YUAN';devise2='ROUPIE';cours=2;date 11apr2014;output;
    run;
    voici le code générant les autres paires de devise et toutes les possibilités :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    DATA cours2;
    SET cours;
    natif="OUI";
    output;
    DROP inter;
    inter=devise1;
    devise1=devise2;
    devise2=inter;
    cours=1/cours;
    natif="NON";
    output;
    run;
     
    proc sort DATA=cours2; BY devise1 devise2 descending natif;run;
     
    DATA cours3; 
    SET cours2;
    BY devise1 devise2;
    IF first.devise2 then output;
    run;
     
    proc sql;
    CREATE TABLE listedevise1 
    AS SELECT UNIQUE devise1 AS devise
    FROM cours;
    quit;
     
    proc sql;
    CREATE TABLE listedevise2 
    AS SELECT UNIQUE devise2 AS devise
    FROM cours;
    quit;
     
    DATA listedevise;
    SET listedevise1 listedevise2;
    run;
     
    proc sort DATA=listedevise nodupkey; BY devise;run;
     
    proc sql;
    CREATE TABLE croisementdevise
    AS SELECT tab1.devise AS devise1,tab2.devise AS devise2
    FROM listedevise AS tab1, listedevise AS tab2
    WHERE tab1.devise^=tab2.devise;
    quit;
     
     
    proc sql;
    CREATE TABLE croisementdevise
    AS SELECT tab1.*
    FROM croisementdevise AS tab1
    WHERE compress(tab1.devise1!!"*"!!tab1.devise2)
    NOT IN (SELECT compress(devise1!!"*"!!devise2) FROM cours3);
    quit;
     
     
     
     
     
    DATA croisementdevise;
    merge croisementdevise(IN=id) cours3(RENAME=(devise2=devise3 cours=cours13)) ;
    BY devise1 ;
    IF id=1;
    run;
     
     
     
     
    proc sql;
    CREATE TABLE croisementdevise2
    AS SELECT tab1.*,tab2.cours AS cours32
    FROM croisementdevise AS tab1
    LEFT JOIN cours2 AS tab2
    ON (tab1.devise3=tab2.devise1 AND tab1.devise2=tab2.devise2);
    run;
     
    proc sort DATA=croisementdevise2; BY devise1 devise2;run;
     
     
    DATA croisementdevise2;
    SET croisementdevise2; cours=cours13*cours32;
    run;
     
     
    DATA croisementdevisefin;
    SET croisementdevise2 cours3;
     
    run;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Générer des rendez-vous sur outlook à partir d'un fichier excel
    Par cbaby dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/09/2014, 18h35
  2. générer des listes deroulantes qui decoule d'1 autre liste
    Par amarcil dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/04/2006, 10h44
  3. Comment générer des interfaces garphiques à partir de XML
    Par @yoyo dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 31/03/2006, 10h40
  4. Réponses: 9
    Dernier message: 14/12/2005, 18h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo