Commit d72f403c authored by Mouadh's avatar Mouadh

first fix toxworkdir does not expanduser properly

(run tox tests without expanduser)
parent 46eb911f
************************
* IMPORTANT *
************************
1) Fact table must have 'Facts' name
2) the id columns must have _id at the end (product_id, person_id...)
3) each column name of each table must be unique from the other tables column names
4) the columns name must be in a good order (hierarchy)
5) use a simple star modele with one key and numeric measures ( the other cases not tested yet)
6) verify that data entered in tables does not contains any white spaces at the end
7) if you want to set up some orders to the tables , put the desired order with tables name , for exmple 1Geography.csv , 2Product.csv .... [ useful for excel level display]
8) time dimension must be named 'Time'
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
"store_id";"store_type";"store_name";"store_number";"store_street_address";"store_city";"store_state";"store_postal_code";"store_country";"store_manager";"store_phone";"store_fax";"first_opened_date";"last_remodel_date";"store_sqft";"grocery_sqft";"frozen_sqft";"meat_sqft";"coffee_bar";"video_store";"salad_bar";"prepared_food";"florist"
0;"HeadQuarters";"HQ";0;"1 Alameda Way";"Alameda";"CA";"55555";"USA";"";"";"";"";"";0;0;0;0;0;0;0;0;0
1;"Supermarket";"Store 1";1;"2853 Bailey Rd";"Acapulco";"Guerrero";"55555";"Mexico";"Jones";"262-555-5124";"262-555-5121";"1982-01-09 00:00:00";"1990-12-05 00:00:00";23593;17475;3671;2447;0;0;0;0;0
2;"Small Grocery";"Store 2";2;"5203 Catanzaro Way";"Bellingham";"WA";"55555";"USA";"Smith";"605-555-8203";"605-555-8201";"1970-04-02 00:00:00";"1973-06-04 00:00:00";28206;22271;3561;2374;1;0;0;0;0
3;"Supermarket";"Store 3";3;"1501 Ramsey Circle";"Bremerton";"WA";"55555";"USA";"Davis";"509-555-1596";"509-555-1591";"1959-06-14 00:00:00";"1967-11-19 00:00:00";39696;24390;9184;6122;0;0;1;1;0
4;"Gourmet Supermarket";"Store 4";4;"433 St George Dr";"Camacho";"Zacatecas";"55555";"Mexico";"Johnson";"304-555-1474";"304-555-1471";"1994-09-27 00:00:00";"1995-12-01 00:00:00";23759;16844;4149;2766;1;0;1;1;1
5;"Small Grocery";"Store 5";5;"1250 Coggins Drive";"Guadalajara";"Jalisco";"55555";"Mexico";"Green";"801-555-4324";"801-555-4321";"1978-09-18 00:00:00";"1991-06-29 00:00:00";24597;15012;5751;3834;1;0;0;0;0
6;"Gourmet Supermarket";"Store 6";6;"5495 Mitchell Canyon Road";"Beverly Hills";"CA";"55555";"USA";"Maris";"958-555-5002";"958-555-5001";"1981-01-03 00:00:00";"1991-03-13 00:00:00";23688;15337;5011;3340;1;1;1;1;1
7;"Supermarket";"Store 7";7;"1077 Wharf Drive";"Los Angeles";"CA";"55555";"USA";"White";"477-555-7967";"477-555-7961";"1971-05-21 00:00:00";"1981-10-20 00:00:00";23598;14210;5633;3755;0;0;0;0;1
8;"Deluxe Supermarket";"Store 8";8;"3173 Buena Vista Ave";"Merida";"Yucatan";"55555";"Mexico";"Williams";"797-555-3417";"797-555-3411";"1958-09-23 00:00:00";"1967-11-18 00:00:00";30797;20141;6393;4262;1;1;1;1;1
9;"Mid-Size Grocery";"Store 9";9;"1872 El Pintado Road";"Mexico City";"DF";"55555";"Mexico";"Stuber";"439-555-3524";"439-555-3521";"1955-03-18 00:00:00";"1959-06-07 00:00:00";36509;22450;8435;5624;0;0;0;0;0
10;"Supermarket";"Store 10";10;"7894 Rotherham Dr";"Orizaba";"Veracruz";"55555";"Mexico";"Merz";"212-555-4774";"212-555-4771";"1979-04-13 00:00:00";"1982-01-30 00:00:00";34791;26354;5062;3375;0;0;1;1;0
11;"Supermarket";"Store 11";11;"5371 Holland Circle";"Portland";"OR";"55555";"USA";"Erickson";"685-555-8995";"685-555-8991";"1976-09-17 00:00:00";"1982-05-15 00:00:00";20319;16232;2452;1635;0;0;0;0;0
12;"Deluxe Supermarket";"Store 12";12;"1120 Westchester Pl";"Hidalgo";"Zacatecas";"55555";"Mexico";"Kalman";"151-555-1702";"151-555-1701";"1968-03-25 00:00:00";"1993-12-18 00:00:00";30584;21938;5188;3458;1;1;1;1;1
13;"Deluxe Supermarket";"Store 13";13;"5179 Valley Ave";"Salem";"OR";"55555";"USA";"Inmon";"977-555-2724";"977-555-2721";"1957-04-13 00:00:00";"1997-11-10 00:00:00";27694;18670;5415;3610;1;1;1;1;1
14;"Small Grocery";"Store 14";14;"4365 Indigo Ct";"San Francisco";"CA";"55555";"USA";"Strehlo";"135-555-4888";"135-555-4881";"1957-11-24 00:00:00";"1958-01-07 00:00:00";22478;15321;4294;2863;1;0;0;0;0
15;"Supermarket";"Store 15";15;"5006 Highland Drive";"Seattle";"WA";"55555";"USA";"Ollom";"893-555-1024";"893-555-1021";"1969-07-24 00:00:00";"1973-10-19 00:00:00";21215;13305;4746;3164;1;0;0;0;0
16;"Supermarket";"Store 16";16;"5922 La Salle Ct";"Spokane";"WA";"55555";"USA";"Mantle";"643-555-3645";"643-555-3641";"1974-08-23 00:00:00";"1977-07-13 00:00:00";30268;22063;4923;3282;0;0;0;0;0
17;"Deluxe Supermarket";"Store 17";17;"490 Risdon Road";"Tacoma";"WA";"55555";"USA";"Mays";"855-555-5581";"855-555-5581";"1970-05-30 00:00:00";"1976-06-23 00:00:00";33858;22123;7041;4694;1;0;1;1;1
18;"Mid-Size Grocery";"Store 18";18;"6764 Glen Road";"Hidalgo";"Zacatecas";"55555";"Mexico";"Brown";"528-555-8317";"528-555-8311";"1969-06-28 00:00:00";"1975-08-30 00:00:00";38382;30351;4819;3213;0;0;0;0;0
19;"Deluxe Supermarket";"Store 19";19;"6644 Sudance Drive";"Vancouver";"BC";"55555";"Canada";"Ruth";"862-555-7395";"862-555-7391";"1977-03-27 00:00:00";"1990-10-25 00:00:00";23112;16418;4016;2678;1;1;1;1;1
20;"Mid-Size Grocery";"Store 20";20;"3706 Marvelle Ln";"Victoria";"BC";"55555";"Canada";"Cobb";"897-555-1931";"897-555-1931";"1980-02-06 00:00:00";"1987-04-09 00:00:00";34452;27463;4193;2795;1;0;0;0;1
21;"Deluxe Supermarket";"Store 21";21;"4093 Steven Circle";"San Andres";"DF";"55555";"Mexico";"Jones";"493-555-4781";"493-555-4781";"1986-02-07 00:00:00";"1990-04-16 00:00:00";0;0;0;0;1;0;1;1;1
22;"Small Grocery";"Store 22";22;"9606 Julpum Loop";"Walla Walla";"WA";"55555";"USA";"Byrg";"881-555-5117";"881-555-5111";"1951-01-24 00:00:00";"1969-10-17 00:00:00";0;0;0;0;0;0;0;0;0
23;"Mid-Size Grocery";"Store 23";23;"3920 Noah Court";"Yakima";"WA";"55555";"USA";"Johnson";"170-555-8424";"170-555-8421";"1977-07-16 00:00:00";"1987-07-24 00:00:00";0;0;0;0;0;0;0;0;0
24;"Supermarket";"Store 24";24;"2342 Waltham St.";"San Diego";"CA";"55555";"USA";"Byrd";"111-555-0303";"111-555-0304";"1979-05-22 00:00:00";"1986-04-20 00:00:00";0;0;0;0;1;0;1;0;1
"time_id";"the_date";"the_day";"the_month";"the_year";"day_of_month";"week_of_year";"month_of_year";"quarter";"fiscal_period";"day_of_week"
367;"1997-01-01 00:00:00";"Wednesday";"January";2006;1;2;1;"Q1";"";3
368;"1997-01-02 00:00:00";"Thursday";"January";2006;2;2;1;"Q1";"";4
369;"1997-01-03 00:00:00";"Friday";"January";2006;3;2;1;"Q1";"";5
370;"1997-01-04 00:00:00";"Saturday";"January";2006;4;2;1;"Q1";"";6
371;"1997-01-05 00:00:00";"Sunday";"January";2006;5;3;1;"Q1";"";7
372;"1997-01-06 00:00:00";"Monday";"January";2006;6;3;1;"Q1";"";1
373;"1997-01-07 00:00:00";"Tuesday";"January";2006;7;3;1;"Q1";"";2
374;"1997-01-08 00:00:00";"Wednesday";"January";2006;8;3;1;"Q1";"";3
375;"1997-01-09 00:00:00";"Thursday";"January";2006;9;3;1;"Q1";"";4
376;"1997-01-10 00:00:00";"Friday";"January";2006;10;3;1;"Q1";"";5
377;"1997-01-11 00:00:00";"Saturday";"January";2006;11;3;1;"Q1";"";6
378;"1997-01-12 00:00:00";"Sunday";"January";2006;12;4;1;"Q1";"";7
379;"1997-01-13 00:00:00";"Monday";"January";2006;13;4;1;"Q1";"";1
380;"1997-01-14 00:00:00";"Tuesday";"January";2006;14;4;1;"Q1";"";2
381;"1997-01-15 00:00:00";"Wednesday";"January";2006;15;4;1;"Q1";"";3
382;"1997-01-16 00:00:00";"Thursday";"January";2006;16;4;1;"Q1";"";4
383;"1997-01-17 00:00:00";"Friday";"January";2006;17;4;1;"Q1";"";5
384;"1997-01-18 00:00:00";"Saturday";"January";2006;18;4;1;"Q1";"";6
385;"1997-01-19 00:00:00";"Sunday";"January";2006;19;5;1;"Q1";"";7
386;"1997-01-20 00:00:00";"Monday";"January";2006;20;5;1;"Q1";"";1
387;"1997-01-21 00:00:00";"Tuesday";"January";2006;21;5;1;"Q1";"";2
388;"1997-01-22 00:00:00";"Wednesday";"January";2006;22;5;1;"Q1";"";3
389;"1997-01-23 00:00:00";"Thursday";"January";2006;23;5;1;"Q1";"";4
390;"1997-01-24 00:00:00";"Friday";"January";2006;24;5;1;"Q1";"";5
391;"1997-01-25 00:00:00";"Saturday";"January";2006;25;5;1;"Q1";"";6
392;"1997-01-26 00:00:00";"Sunday";"January";2006;26;6;1;"Q1";"";7
393;"1997-01-27 00:00:00";"Monday";"January";2006;27;6;1;"Q1";"";1
394;"1997-01-28 00:00:00";"Tuesday";"January";2006;28;6;1;"Q1";"";2
395;"1997-01-29 00:00:00";"Wednesday";"January";2006;29;6;1;"Q1";"";3
396;"1997-01-30 00:00:00";"Thursday";"January";2006;30;6;1;"Q1";"";4
397;"1997-01-31 00:00:00";"Friday";"January";2006;31;6;1;"Q1";"";5
398;"1997-02-01 00:00:00";"Saturday";"February";2006;1;6;2;"Q1";"";6
399;"1997-02-02 00:00:00";"Sunday";"February";2006;2;7;2;"Q1";"";7
400;"1997-02-03 00:00:00";"Monday";"February";2006;3;7;2;"Q1";"";1
401;"1997-02-04 00:00:00";"Tuesday";"February";2006;4;7;2;"Q1";"";2
402;"1997-02-05 00:00:00";"Wednesday";"February";2006;5;7;2;"Q1";"";3
403;"1997-02-06 00:00:00";"Thursday";"February";2006;6;7;2;"Q1";"";4
404;"1997-02-07 00:00:00";"Friday";"February";2006;7;7;2;"Q1";"";5
405;"1997-02-08 00:00:00";"Saturday";"February";2006;8;7;2;"Q1";"";6
406;"1997-02-09 00:00:00";"Sunday";"February";2006;9;8;2;"Q1";"";7
407;"1997-02-10 00:00:00";"Monday";"February";2006;10;8;2;"Q1";"";1
408;"1997-02-11 00:00:00";"Tuesday";"February";2006;11;8;2;"Q1";"";2
409;"1997-02-12 00:00:00";"Wednesday";"February";2006;12;8;2;"Q1";"";3
410;"1997-02-13 00:00:00";"Thursday";"February";2006;13;8;2;"Q1";"";4
411;"1997-02-14 00:00:00";"Friday";"February";2006;14;8;2;"Q1";"";5
412;"1997-02-15 00:00:00";"Saturday";"February";2006;15;8;2;"Q1";"";6
413;"1997-02-16 00:00:00";"Sunday";"February";2006;16;9;2;"Q1";"";7
414;"1997-02-17 00:00:00";"Monday";"February";2006;17;9;2;"Q1";"";1
415;"1997-02-18 00:00:00";"Tuesday";"February";2006;18;9;2;"Q1";"";2
416;"1997-02-19 00:00:00";"Wednesday";"February";2006;19;9;2;"Q1";"";3
417;"1997-02-20 00:00:00";"Thursday";"February";2006;20;9;2;"Q1";"";4
418;"1997-02-21 00:00:00";"Friday";"February";2006;21;9;2;"Q1";"";5
419;"1997-02-22 00:00:00";"Saturday";"February";2006;22;9;2;"Q1";"";6
420;"1997-02-23 00:00:00";"Sunday";"February";2006;23;10;2;"Q1";"";7
421;"1997-02-24 00:00:00";"Monday";"February";2006;24;10;2;"Q1";"";1
422;"1997-02-25 00:00:00";"Tuesday";"February";2006;25;10;2;"Q1";"";2
423;"1997-02-26 00:00:00";"Wednesday";"February";2006;26;10;2;"Q1";"";3
424;"1997-02-27 00:00:00";"Thursday";"February";2006;27;10;2;"Q1";"";4
425;"1997-02-28 00:00:00";"Friday";"February";2006;28;10;2;"Q1";"";5
426;"1997-03-01 00:00:00";"Saturday";"March";2006;1;10;3;"Q1";"";6
427;"1997-03-02 00:00:00";"Sunday";"March";2006;2;11;3;"Q1";"";7
428;"1997-03-03 00:00:00";"Monday";"March";2006;3;11;3;"Q1";"";1
429;"1997-03-04 00:00:00";"Tuesday";"March";2006;4;11;3;"Q1";"";2
430;"1997-03-05 00:00:00";"Wednesday";"March";2006;5;11;3;"Q1";"";3
431;"1997-03-06 00:00:00";"Thursday";"March";2006;6;11;3;"Q1";"";4
432;"1997-03-07 00:00:00";"Friday";"March";2006;7;11;3;"Q1";"";5
433;"1997-03-08 00:00:00";"Saturday";"March";2006;8;11;3;"Q1";"";6
434;"1997-03-09 00:00:00";"Sunday";"March";2006;9;12;3;"Q1";"";7
435;"1997-03-10 00:00:00";"Monday";"March";2006;10;12;3;"Q1";"";1
436;"1997-03-11 00:00:00";"Tuesday";"March";2006;11;12;3;"Q1";"";2
437;"1997-03-12 00:00:00";"Wednesday";"March";2006;12;12;3;"Q1";"";3
438;"1997-03-13 00:00:00";"Thursday";"March";2006;13;12;3;"Q1";"";4
439;"1997-03-14 00:00:00";"Friday";"March";2006;14;12;3;"Q1";"";5
440;"1997-03-15 00:00:00";"Saturday";"March";2006;15;12;3;"Q1";"";6
441;"1997-03-16 00:00:00";"Sunday";"March";2006;16;13;3;"Q1";"";7
442;"1997-03-17 00:00:00";"Monday";"March";2006;17;13;3;"Q1";"";1
443;"1997-03-18 00:00:00";"Tuesday";"March";2006;18;13;3;"Q1";"";2
444;"1997-03-19 00:00:00";"Wednesday";"March";2006;19;13;3;"Q1";"";3
445;"1997-03-20 00:00:00";"Thursday";"March";2006;20;13;3;"Q1";"";4
446;"1997-03-21 00:00:00";"Friday";"March";2006;21;13;3;"Q1";"";5
447;"1997-03-22 00:00:00";"Saturday";"March";2006;22;13;3;"Q1";"";6
448;"1997-03-23 00:00:00";"Sunday";"March";2006;23;14;3;"Q1";"";7
449;"1997-03-24 00:00:00";"Monday";"March";2006;24;14;3;"Q1";"";1
450;"1997-03-25 00:00:00";"Tuesday";"March";2006;25;14;3;"Q1";"";2
451;"1997-03-26 00:00:00";"Wednesday";"March";2006;26;14;3;"Q1";"";3
452;"1997-03-27 00:00:00";"Thursday";"March";2006;27;14;3;"Q1";"";4
453;"1997-03-28 00:00:00";"Friday";"March";2006;28;14;3;"Q1";"";5
454;"1997-03-29 00:00:00";"Saturday";"March";2006;29;14;3;"Q1";"";6
455;"1997-03-30 00:00:00";"Sunday";"March";2006;30;15;3;"Q1";"";7
456;"1997-03-31 00:00:00";"Monday";"March";2006;31;15;3;"Q1";"";1
457;"1997-04-01 00:00:00";"Tuesday";"April";2006;1;15;4;"Q2";"";2
458;"1997-04-02 00:00:00";"Wednesday";"April";2006;2;15;4;"Q2";"";3
459;"1997-04-03 00:00:00";"Thursday";"April";2006;3;15;4;"Q2";"";4
460;"1997-04-04 00:00:00";"Friday";"April";2006;4;15;4;"Q2";"";5
461;"1997-04-05 00:00:00";"Saturday";"April";2006;5;15;4;"Q2";"";6
462;"1997-04-06 00:00:00";"Sunday";"April";2006;6;16;4;"Q2";"";7
463;"1997-04-07 00:00:00";"Monday";"April";2006;7;16;4;"Q2";"";1
464;"1997-04-08 00:00:00";"Tuesday";"April";2006;8;16;4;"Q2";"";2
465;"1997-04-09 00:00:00";"Wednesday";"April";2006;9;16;4;"Q2";"";3
466;"1997-04-10 00:00:00";"Thursday";"April";2006;10;16;4;"Q2";"";4
467;"1997-04-11 00:00:00";"Friday";"April";2006;11;16;4;"Q2";"";5
468;"1997-04-12 00:00:00";"Saturday";"April";2006;12;16;4;"Q2";"";6
469;"1997-04-13 00:00:00";"Sunday";"April";2006;13;17;4;"Q2";"";7
470;"1997-04-14 00:00:00";"Monday";"April";2006;14;17;4;"Q2";"";1
471;"1997-04-15 00:00:00";"Tuesday";"April";2006;15;17;4;"Q2";"";2
472;"1997-04-16 00:00:00";"Wednesday";"April";2006;16;17;4;"Q2";"";3
473;"1997-04-17 00:00:00";"Thursday";"April";2006;17;17;4;"Q2";"";4
474;"1997-04-18 00:00:00";"Friday";"April";2006;18;17;4;"Q2";"";5
475;"1997-04-19 00:00:00";"Saturday";"April";2006;19;17;4;"Q2";"";6
476;"1997-04-20 00:00:00";"Sunday";"April";2006;20;18;4;"Q2";"";7
477;"1997-04-21 00:00:00";"Monday";"April";2006;21;18;4;"Q2";"";1
478;"1997-04-22 00:00:00";"Tuesday";"April";2006;22;18;4;"Q2";"";2
479;"1997-04-23 00:00:00";"Wednesday";"April";2006;23;18;4;"Q2";"";3
480;"1997-04-24 00:00:00";"Thursday";"April";2006;24;18;4;"Q2";"";4
481;"1997-04-25 00:00:00";"Friday";"April";2006;25;18;4;"Q2";"";5
482;"1997-04-26 00:00:00";"Saturday";"April";2006;26;18;4;"Q2";"";6
483;"1997-04-27 00:00:00";"Sunday";"April";2006;27;19;4;"Q2";"";7
484;"1997-04-28 00:00:00";"Monday";"April";2006;28;19;4;"Q2";"";1
485;"1997-04-29 00:00:00";"Tuesday";"April";2006;29;19;4;"Q2";"";2
486;"1997-04-30 00:00:00";"Wednesday";"April";2006;30;19;4;"Q2";"";3
487;"1997-05-01 00:00:00";"Thursday";"May";2006;1;19;5;"Q2";"";4
488;"1997-05-02 00:00:00";"Friday";"May";2006;2;19;5;"Q2";"";5
489;"1997-05-03 00:00:00";"Saturday";"May";2006;3;19;5;"Q2";"";6
490;"1997-05-04 00:00:00";"Sunday";"May";2006;4;20;5;"Q2";"";7
491;"1997-05-05 00:00:00";"Monday";"May";2006;5;20;5;"Q2";"";1
492;"1997-05-06 00:00:00";"Tuesday";"May";2006;6;20;5;"Q2";"";2
493;"1997-05-07 00:00:00";"Wednesday";"May";2006;7;20;5;"Q2";"";3
494;"1997-05-08 00:00:00";"Thursday";"May";2006;8;20;5;"Q2";"";4
495;"1997-05-09 00:00:00";"Friday";"May";2006;9;20;5;"Q2";"";5
496;"1997-05-10 00:00:00";"Saturday";"May";2006;10;20;5;"Q2";"";6
497;"1997-05-11 00:00:00";"Sunday";"May";2006;11;21;5;"Q2";"";7
498;"1997-05-12 00:00:00";"Monday";"May";2006;12;21;5;"Q2";"";1
499;"1997-05-13 00:00:00";"Tuesday";"May";2006;13;21;5;"Q2";"";2
500;"1997-05-14 00:00:00";"Wednesday";"May";2006;14;21;5;"Q2";"";3
501;"1997-05-15 00:00:00";"Thursday";"May";2006;15;21;5;"Q2";"";4
502;"1997-05-16 00:00:00";"Friday";"May";2006;16;21;5;"Q2";"";5
503;"1997-05-17 00:00:00";"Saturday";"May";2006;17;21;5;"Q2";"";6
504;"1997-05-18 00:00:00";"Sunday";"May";2006;18;22;5;"Q2";"";7
505;"1997-05-19 00:00:00";"Monday";"May";2006;19;22;5;"Q2";"";1
506;"1997-05-20 00:00:00";"Tuesday";"May";2006;20;22;5;"Q2";"";2
507;"1997-05-21 00:00:00";"Wednesday";"May";2006;21;22;5;"Q2";"";3
508;"1997-05-22 00:00:00";"Thursday";"May";2006;22;22;5;"Q2";"";4
509;"1997-05-23 00:00:00";"Friday";"May";2006;23;22;5;"Q2";"";5
510;"1997-05-24 00:00:00";"Saturday";"May";2006;24;22;5;"Q2";"";6
511;"1997-05-25 00:00:00";"Sunday";"May";2006;25;23;5;"Q2";"";7
512;"1997-05-26 00:00:00";"Monday";"May";2006;26;23;5;"Q2";"";1
513;"1997-05-27 00:00:00";"Tuesday";"May";2006;27;23;5;"Q2";"";2
514;"1997-05-28 00:00:00";"Wednesday";"May";2006;28;23;5;"Q2";"";3
515;"1997-05-29 00:00:00";"Thursday";"May";2006;29;23;5;"Q2";"";4
516;"1997-05-30 00:00:00";"Friday";"May";2006;30;23;5;"Q2";"";5
517;"1997-05-31 00:00:00";"Saturday";"May";2006;31;23;5;"Q2";"";6
518;"1997-06-01 00:00:00";"Sunday";"June";2006;1;24;6;"Q2";"";7
519;"1997-06-02 00:00:00";"Monday";"June";2006;2;24;6;"Q2";"";1
520;"1997-06-03 00:00:00";"Tuesday";"June";2006;3;24;6;"Q2";"";2
521;"1997-06-04 00:00:00";"Wednesday";"June";2006;4;24;6;"Q2";"";3
522;"1997-06-05 00:00:00";"Thursday";"June";2006;5;24;6;"Q2";"";4
523;"1997-06-06 00:00:00";"Friday";"June";2006;6;24;6;"Q2";"";5
524;"1997-06-07 00:00:00";"Saturday";"June";2006;7;24;6;"Q2";"";6
525;"1997-06-08 00:00:00";"Sunday";"June";2006;8;25;6;"Q2";"";7
526;"1997-06-09 00:00:00";"Monday";"June";2006;9;25;6;"Q2";"";1
527;"1997-06-10 00:00:00";"Tuesday";"June";2006;10;25;6;"Q2";"";2
528;"1997-06-11 00:00:00";"Wednesday";"June";2006;11;25;6;"Q2";"";3
529;"1997-06-12 00:00:00";"Thursday";"June";2006;12;25;6;"Q2";"";4
530;"1997-06-13 00:00:00";"Friday";"June";2006;13;25;6;"Q2";"";5
531;"1997-06-14 00:00:00";"Saturday";"June";2006;14;25;6;"Q2";"";6
532;"1997-06-15 00:00:00";"Sunday";"June";2006;15;26;6;"Q2";"";7
533;"1997-06-16 00:00:00";"Monday";"June";2006;16;26;6;"Q2";"";1
534;"1997-06-17 00:00:00";"Tuesday";"June";2006;17;26;6;"Q2";"";2
535;"1997-06-18 00:00:00";"Wednesday";"June";2006;18;26;6;"Q2";"";3
536;"1997-06-19 00:00:00";"Thursday";"June";2006;19;26;6;"Q2";"";4
537;"1997-06-20 00:00:00";"Friday";"June";2006;20;26;6;"Q2";"";5
538;"1997-06-21 00:00:00";"Saturday";"June";2006;21;26;6;"Q2";"";6
539;"1997-06-22 00:00:00";"Sunday";"June";2006;22;27;6;"Q2";"";7
540;"1997-06-23 00:00:00";"Monday";"June";2006;23;27;6;"Q2";"";1
541;"1997-06-24 00:00:00";"Tuesday";"June";2006;24;27;6;"Q2";"";2
542;"1997-06-25 00:00:00";"Wednesday";"June";2006;25;27;6;"Q2";"";3
543;"1997-06-26 00:00:00";"Thursday";"June";2006;26;27;6;"Q2";"";4
544;"1997-06-27 00:00:00";"Friday";"June";2006;27;27;6;"Q2";"";5
545;"1997-06-28 00:00:00";"Saturday";"June";2006;28;27;6;"Q2";"";6
546;"1997-06-29 00:00:00";"Sunday";"June";2006;29;28;6;"Q2";"";7
547;"1997-06-30 00:00:00";"Monday";"June";2006;30;28;6;"Q2";"";1
548;"1997-07-01 00:00:00";"Tuesday";"July";2006;1;28;7;"Q3";"";2
549;"1997-07-02 00:00:00";"Wednesday";"July";2006;2;28;7;"Q3";"";3
550;"1997-07-03 00:00:00";"Thursday";"July";2006;3;28;7;"Q3";"";4
551;"1997-07-04 00:00:00";"Friday";"July";2006;4;28;7;"Q3";"";5
552;"1997-07-05 00:00:00";"Saturday";"July";2006;5;28;7;"Q3";"";6
553;"1997-07-06 00:00:00";"Sunday";"July";2006;6;29;7;"Q3";"";7
554;"1997-07-07 00:00:00";"Monday";"July";2006;7;29;7;"Q3";"";1
555;"1997-07-08 00:00:00";"Tuesday";"July";2006;8;29;7;"Q3";"";2
556;"1997-07-09 00:00:00";"Wednesday";"July";2006;9;29;7;"Q3";"";3
557;"1997-07-10 00:00:00";"Thursday";"July";2006;10;29;7;"Q3";"";4
558;"1997-07-11 00:00:00";"Friday";"July";2006;11;29;7;"Q3";"";5
559;"1997-07-12 00:00:00";"Saturday";"July";2006;12;29;7;"Q3";"";6
560;"1997-07-13 00:00:00";"Sunday";"July";2006;13;30;7;"Q3";"";7
561;"1997-07-14 00:00:00";"Monday";"July";2006;14;30;7;"Q3";"";1
562;"1997-07-15 00:00:00";"Tuesday";"July";2006;15;30;7;"Q3";"";2
563;"1997-07-16 00:00:00";"Wednesday";"July";2006;16;30;7;"Q3";"";3
564;"1997-07-17 00:00:00";"Thursday";"July";2006;17;30;7;"Q3";"";4
565;"1997-07-18 00:00:00";"Friday";"July";2006;18;30;7;"Q3";"";5
566;"1997-07-19 00:00:00";"Saturday";"July";2006;19;30;7;"Q3";"";6
567;"1997-07-20 00:00:00";"Sunday";"July";2006;20;31;7;"Q3";"";7
568;"1997-07-21 00:00:00";"Monday";"July";2006;21;31;7;"Q3";"";1
569;"1997-07-22 00:00:00";"Tuesday";"July";2006;22;31;7;"Q3";"";2
570;"1997-07-23 00:00:00";"Wednesday";"July";2006;23;31;7;"Q3";"";3
571;"1997-07-24 00:00:00";"Thursday";"July";2006;24;31;7;"Q3";"";4
572;"1997-07-25 00:00:00";"Friday";"July";2006;25;31;7;"Q3";"";5
573;"1997-07-26 00:00:00";"Saturday";"July";2006;26;31;7;"Q3";"";6
574;"1997-07-27 00:00:00";"Sunday";"July";2006;27;32;7;"Q3";"";7
575;"1997-07-28 00:00:00";"Monday";"July";2006;28;32;7;"Q3";"";1
576;"1997-07-29 00:00:00";"Tuesday";"July";2006;29;32;7;"Q3";"";2
577;"1997-07-30 00:00:00";"Wednesday";"July";2006;30;32;7;"Q3";"";3
578;"1997-07-31 00:00:00";"Thursday";"July";2006;31;32;7;"Q3";"";4
579;"1997-08-01 00:00:00";"Friday";"August";2006;1;32;8;"Q3";"";5
580;"1997-08-02 00:00:00";"Saturday";"August";2006;2;32;8;"Q3";"";6
581;"1997-08-03 00:00:00";"Sunday";"August";2006;3;33;8;"Q3";"";7
582;"1997-08-04 00:00:00";"Monday";"August";2006;4;33;8;"Q3";"";1
583;"1997-08-05 00:00:00";"Tuesday";"August";2006;5;33;8;"Q3";"";2
584;"1997-08-06 00:00:00";"Wednesday";"August";2006;6;33;8;"Q3";"";3
585;"1997-08-07 00:00:00";"Thursday";"August";2006;7;33;8;"Q3";"";4
586;"1997-08-08 00:00:00";"Friday";"August";2006;8;33;8;"Q3";"";5
587;"1997-08-09 00:00:00";"Saturday";"August";2006;9;33;8;"Q3";"";6
588;"1997-08-10 00:00:00";"Sunday";"August";2006;10;34;8;"Q3";"";7
589;"1997-08-11 00:00:00";"Monday";"August";2006;11;34;8;"Q3";"";1
590;"1997-08-12 00:00:00";"Tuesday";"August";2006;12;34;8;"Q3";"";2
591;"1997-08-13 00:00:00";"Wednesday";"August";2006;13;34;8;"Q3";"";3
592;"1997-08-14 00:00:00";"Thursday";"August";2006;14;34;8;"Q3";"";4
593;"1997-08-15 00:00:00";"Friday";"August";2006;15;34;8;"Q3";"";5
594;"1997-08-16 00:00:00";"Saturday";"August";2006;16;34;8;"Q3";"";6
595;"1997-08-17 00:00:00";"Sunday";"August";2006;17;35;8;"Q3";"";7
596;"1997-08-18 00:00:00";"Monday";"August";2006;18;35;8;"Q3";"";1
597;"1997-08-19 00:00:00";"Tuesday";"August";2006;19;35;8;"Q3";"";2
598;"1997-08-20 00:00:00";"Wednesday";"August";2006;20;35;8;"Q3";"";3
599;"1997-08-21 00:00:00";"Thursday";"August";2006;21;35;8;"Q3";"";4
600;"1997-08-22 00:00:00";"Friday";"August";2006;22;35;8;"Q3";"";5
601;"1997-08-23 00:00:00";"Saturday";"August";2006;23;35;8;"Q3";"";6
602;"1997-08-24 00:00:00";"Sunday";"August";2006;24;36;8;"Q3";"";7
603;"1997-08-25 00:00:00";"Monday";"August";2006;25;36;8;"Q3";"";1
604;"1997-08-26 00:00:00";"Tuesday";"August";2006;26;36;8;"Q3";"";2
605;"1997-08-27 00:00:00";"Wednesday";"August";2006;27;36;8;"Q3";"";3
606;"1997-08-28 00:00:00";"Thursday";"August";2006;28;36;8;"Q3";"";4
607;"1997-08-29 00:00:00";"Friday";"August";2006;29;36;8;"Q3";"";5
608;"1997-08-30 00:00:00";"Saturday";"August";2006;30;36;8;"Q3";"";6
609;"1997-08-31 00:00:00";"Sunday";"August";2006;31;37;8;"Q3";"";7
610;"1997-09-01 00:00:00";"Monday";"September";2006;1;37;9;"Q3";"";1
611;"1997-09-02 00:00:00";"Tuesday";"September";2006;2;37;9;"Q3";"";2
612;"1997-09-03 00:00:00";"Wednesday";"September";2006;3;37;9;"Q3";"";3
613;"1997-09-04 00:00:00";"Thursday";"September";2006;4;37;9;"Q3";"";4
614;"1997-09-05 00:00:00";"Friday";"September";2006;5;37;9;"Q3";"";5
615;"1997-09-06 00:00:00";"Saturday";"September";2006;6;37;9;"Q3";"";6
616;"1997-09-07 00:00:00";"Sunday";"September";2006;7;38;9;"Q3";"";7
617;"1997-09-08 00:00:00";"Monday";"September";2006;8;38;9;"Q3";"";1
618;"1997-09-09 00:00:00";"Tuesday";"September";2006;9;38;9;"Q3";"";2
619;"1997-09-10 00:00:00";"Wednesday";"September";2006;10;38;9;"Q3";"";3
620;"1997-09-11 00:00:00";"Thursday";"September";2006;11;38;9;"Q3";"";4
621;"1997-09-12 00:00:00";"Friday";"September";2006;12;38;9;"Q3";"";5
622;"1997-09-13 00:00:00";"Saturday";"September";2006;13;38;9;"Q3";"";6
623;"1997-09-14 00:00:00";"Sunday";"September";2006;14;39;9;"Q3";"";7
624;"1997-09-15 00:00:00";"Monday";"September";2006;15;39;9;"Q3";"";1
625;"1997-09-16 00:00:00";"Tuesday";"September";2006;16;39;9;"Q3";"";2
626;"1997-09-17 00:00:00";"Wednesday";"September";2006;17;39;9;"Q3";"";3
627;"1997-09-18 00:00:00";"Thursday";"September";2006;18;39;9;"Q3";"";4
628;"1997-09-19 00:00:00";"Friday";"September";2006;19;39;9;"Q3";"";5
629;"1997-09-20 00:00:00";"Saturday";"September";2006;20;39;9;"Q3";"";6
630;"1997-09-21 00:00:00";"Sunday";"September";2006;21;40;9;"Q3";"";7
631;"1997-09-22 00:00:00";"Monday";"September";2006;22;40;9;"Q3";"";1
632;"1997-09-23 00:00:00";"Tuesday";"September";2006;23;40;9;"Q3";"";2
633;"1997-09-24 00:00:00";"Wednesday";"September";2006;24;40;9;"Q3";"";3
634;"1997-09-25 00:00:00";"Thursday";"September";2006;25;40;9;"Q3";"";4
635;"1997-09-26 00:00:00";"Friday";"September";2006;26;40;9;"Q3";"";5
636;"1997-09-27 00:00:00";"Saturday";"September";2006;27;40;9;"Q3";"";6
637;"1997-09-28 00:00:00";"Sunday";"September";2006;28;41;9;"Q3";"";7
638;"1997-09-29 00:00:00";"Monday";"September";2006;29;41;9;"Q3";"";1
639;"1997-09-30 00:00:00";"Tuesday";"September";2006;30;41;9;"Q3";"";2
640;"1997-10-01 00:00:00";"Wednesday";"October";2006;1;41;10;"Q4";"";3
641;"1997-10-02 00:00:00";"Thursday";"October";2006;2;41;10;"Q4";"";4
642;"1997-10-03 00:00:00";"Friday";"October";2006;3;41;10;"Q4";"";5
643;"1997-10-04 00:00:00";"Saturday";"October";2006;4;41;10;"Q4";"";6
644;"1997-10-05 00:00:00";"Sunday";"October";2006;5;42;10;"Q4";"";7
645;"1997-10-06 00:00:00";"Monday";"October";2006;6;42;10;"Q4";"";1
646;"1997-10-07 00:00:00";"Tuesday";"October";2006;7;42;10;"Q4";"";2
647;"1997-10-08 00:00:00";"Wednesday";"October";2006;8;42;10;"Q4";"";3
648;"1997-10-09 00:00:00";"Thursday";"October";2006;9;42;10;"Q4";"";4
649;"1997-10-10 00:00:00";"Friday";"October";2006;10;42;10;"Q4";"";5
650;"1997-10-11 00:00:00";"Saturday";"October";2006;11;42;10;"Q4";"";6
651;"1997-10-12 00:00:00";"Sunday";"October";2006;12;43;10;"Q4";"";7
652;"1997-10-13 00:00:00";"Monday";"October";2006;13;43;10;"Q4";"";1
653;"1997-10-14 00:00:00";"Tuesday";"October";2006;14;43;10;"Q4";"";2
654;"1997-10-15 00:00:00";"Wednesday";"October";2006;15;43;10;"Q4";"";3
655;"1997-10-16 00:00:00";"Thursday";"October";2006;16;43;10;"Q4";"";4
656;"1997-10-17 00:00:00";"Friday";"October";2006;17;43;10;"Q4";"";5
657;"1997-10-18 00:00:00";"Saturday";"October";2006;18;43;10;"Q4";"";6
658;"1997-10-19 00:00:00";"Sunday";"October";2006;19;44;10;"Q4";"";7
659;"1997-10-20 00:00:00";"Monday";"October";2006;20;44;10;"Q4";"";1
660;"1997-10-21 00:00:00";"Tuesday";"October";2006;21;44;10;"Q4";"";2
661;"1997-10-22 00:00:00";"Wednesday";"October";2006;22;44;10;"Q4";"";3
662;"1997-10-23 00:00:00";"Thursday";"October";2006;23;44;10;"Q4";"";4
663;"1997-10-24 00:00:00";"Friday";"October";2006;24;44;10;"Q4";"";5
664;"1997-10-25 00:00:00";"Saturday";"October";2006;25;44;10;"Q4";"";6
665;"1997-10-26 00:00:00";"Sunday";"October";2006;26;45;10;"Q4";"";7
666;"1997-10-27 00:00:00";"Monday";"October";2006;27;45;10;"Q4";"";1
667;"1997-10-28 00:00:00";"Tuesday";"October";2006;28;45;10;"Q4";"";2
668;"1997-10-29 00:00:00";"Wednesday";"October";2006;29;45;10;"Q4";"";3
669;"1997-10-30 00:00:00";"Thursday";"October";2006;30;45;10;"Q4";"";4
670;"1997-10-31 00:00:00";"Friday";"October";2006;31;45;10;"Q4";"";5
671;"1997-11-01 00:00:00";"Saturday";"November";2006;1;45;11;"Q4";"";6
672;"1997-11-02 00:00:00";"Sunday";"November";2006;2;46;11;"Q4";"";7
673;"1997-11-03 00:00:00";"Monday";"November";2006;3;46;11;"Q4";"";1
674;"1997-11-04 00:00:00";"Tuesday";"November";2006;4;46;11;"Q4";"";2
675;"1997-11-05 00:00:00";"Wednesday";"November";2006;5;46;11;"Q4";"";3
676;"1997-11-06 00:00:00";"Thursday";"November";2006;6;46;11;"Q4";"";4
677;"1997-11-07 00:00:00";"Friday";"November";2006;7;46;11;"Q4";"";5
678;"1997-11-08 00:00:00";"Saturday";"November";2006;8;46;11;"Q4";"";6
679;"1997-11-09 00:00:00";"Sunday";"November";2006;9;47;11;"Q4";"";7
680;"1997-11-10 00:00:00";"Monday";"November";2006;10;47;11;"Q4";"";1
681;"1997-11-11 00:00:00";"Tuesday";"November";2006;11;47;11;"Q4";"";2
682;"1997-11-12 00:00:00";"Wednesday";"November";2006;12;47;11;"Q4";"";3
683;"1997-11-13 00:00:00";"Thursday";"November";2006;13;47;11;"Q4";"";4
684;"1997-11-14 00:00:00";"Friday";"November";2006;14;47;11;"Q4";"";5
685;"1997-11-15 00:00:00";"Saturday";"November";2006;15;47;11;"Q4";"";6
686;"1997-11-16 00:00:00";"Sunday";"November";2006;16;48;11;"Q4";"";7
687;"1997-11-17 00:00:00";"Monday";"November";2006;17;48;11;"Q4";"";1
688;"1997-11-18 00:00:00";"Tuesday";"November";2006;18;48;11;"Q4";"";2
689;"1997-11-19 00:00:00";"Wednesday";"November";2006;19;48;11;"Q4";"";3
690;"1997-11-20 00:00:00";"Thursday";"November";2006;20;48;11;"Q4";"";4
691;"1997-11-21 00:00:00";"Friday";"November";2006;21;48;11;"Q4";"";5
692;"1997-11-22 00:00:00";"Saturday";"November";2006;22;48;11;"Q4";"";6
693;"1997-11-23 00:00:00";"Sunday";"November";2006;23;49;11;"Q4";"";7
694;"1997-11-24 00:00:00";"Monday";"November";2006;24;49;11;"Q4";"";1
695;"1997-11-25 00:00:00";"Tuesday";"November";2006;25;49;11;"Q4";"";2
696;"1997-11-26 00:00:00";"Wednesday";"November";2006;26;49;11;"Q4";"";3
697;"1997-11-27 00:00:00";"Thursday";"November";2006;27;49;11;"Q4";"";4
698;"1997-11-28 00:00:00";"Friday";"November";2006;28;49;11;"Q4";"";5
699;"1997-11-29 00:00:00";"Saturday";"November";2006;29;49;11;"Q4";"";6
700;"1997-11-30 00:00:00";"Sunday";"November";2006;30;50;11;"Q4";"";7
701;"1997-12-01 00:00:00";"Monday";"December";2006;1;50;12;"Q4";"";1
702;"1997-12-02 00:00:00";"Tuesday";"December";2006;2;50;12;"Q4";"";2
703;"1997-12-03 00:00:00";"Wednesday";"December";2006;3;50;12;"Q4";"";3
704;"1997-12-04 00:00:00";"Thursday";"December";2006;4;50;12;"Q4";"";4
705;"1997-12-05 00:00:00";"Friday";"December";2006;5;50;12;"Q4";"";5
706;"1997-12-06 00:00:00";"Saturday";"December";2006;6;50;12;"Q4";"";6
707;"1997-12-07 00:00:00";"Sunday";"December";2006;7;51;12;"Q4";"";7
708;"1997-12-08 00:00:00";"Monday";"December";2006;8;51;12;"Q4";"";1
709;"1997-12-09 00:00:00";"Tuesday";"December";2006;9;51;12;"Q4";"";2
710;"1997-12-10 00:00:00";"Wednesday";"December";2006;10;51;12;"Q4";"";3
711;"1997-12-11 00:00:00";"Thursday";"December";2006;11;51;12;"Q4";"";4
712;"1997-12-12 00:00:00";"Friday";"December";2006;12;51;12;"Q4";"";5
713;"1997-12-13 00:00:00";"Saturday";"December";2006;13;51;12;"Q4";"";6
714;"1997-12-14 00:00:00";"Sunday";"December";2006;14;52;12;"Q4";"";7
715;"1997-12-15 00:00:00";"Monday";"December";2006;15;1;12;"Q4";"";1
716;"1997-12-16 00:00:00";"Tuesday";"December";2006;16;1;12;"Q4";"";2
717;"1997-12-17 00:00:00";"Wednesday";"December";2006;17;1;12;"Q4";"";3
718;"1997-12-18 00:00:00";"Thursday";"December";2006;18;1;12;"Q4";"";4
719;"1997-12-19 00:00:00";"Friday";"December";2006;19;1;12;"Q4";"";5
720;"1997-12-20 00:00:00";"Saturday";"December";2006;20;1;12;"Q4";"";6
721;"1997-12-21 00:00:00";"Sunday";"December";2006;21;2;12;"Q4";"";7
722;"1997-12-22 00:00:00";"Monday";"December";2006;22;2;12;"Q4";"";1
723;"1997-12-23 00:00:00";"Tuesday";"December";2006;23;2;12;"Q4";"";2
724;"1997-12-24 00:00:00";"Wednesday";"December";2006;24;2;12;"Q4";"";3
725;"1997-12-25 00:00:00";"Thursday";"December";2006;25;2;12;"Q4";"";4
726;"1997-12-26 00:00:00";"Friday";"December";2006;26;2;12;"Q4";"";5
727;"1997-12-27 00:00:00";"Saturday";"December";2006;27;2;12;"Q4";"";6
728;"1997-12-28 00:00:00";"Sunday";"December";2006;28;3;12;"Q4";"";7
729;"1997-12-29 00:00:00";"Monday";"December";2006;29;3;12;"Q4";"";1
730;"1997-12-30 00:00:00";"Tuesday";"December";2006;30;3;12;"Q4";"";2
731;"1997-12-31 00:00:00";"Wednesday";"December";2006;31;3;12;"Q4";"";3
732;"1998-01-01 00:00:00";"Thursday";"January";2007;1;3;1;"Q1";"";4
733;"1998-01-02 00:00:00";"Friday";"January";2007;2;3;1;"Q1";"";5
734;"1998-01-03 00:00:00";"Saturday";"January";2007;3;3;1;"Q1";"";6
735;"1998-01-04 00:00:00";"Sunday";"January";2007;4;4;1;"Q1";"";7
736;"1998-01-05 00:00:00";"Monday";"January";2007;5;4;1;"Q1";"";1
737;"1998-01-06 00:00:00";"Tuesday";"January";2007;6;4;1;"Q1";"";2
738;"1998-01-07 00:00:00";"Wednesday";"January";2007;7;4;1;"Q1";"";3
739;"1998-01-08 00:00:00";"Thursday";"January";2007;8;4;1;"Q1";"";4
740;"1998-01-09 00:00:00";"Friday";"January";2007;9;4;1;"Q1";"";5
741;"1998-01-10 00:00:00";"Saturday";"January";2007;10;4;1;"Q1";"";6
742;"1998-01-11 00:00:00";"Sunday";"January";2007;11;5;1;"Q1";"";7
743;"1998-01-12 00:00:00";"Monday";"January";2007;12;5;1;"Q1";"";1
744;"1998-01-13 00:00:00";"Tuesday";"January";2007;13;5;1;"Q1";"";2
745;"1998-01-14 00:00:00";"Wednesday";"January";2007;14;5;1;"Q1";"";3
746;"1998-01-15 00:00:00";"Thursday";"January";2007;15;5;1;"Q1";"";4
747;"1998-01-16 00:00:00";"Friday";"January";2007;16;5;1;"Q1";"";5
748;"1998-01-17 00:00:00";"Saturday";"January";2007;17;5;1;"Q1";"";6
749;"1998-01-18 00:00:00";"Sunday";"January";2007;18;6;1;"Q1";"";7
750;"1998-01-19 00:00:00";"Monday";"January";2007;19;6;1;"Q1";"";1
751;"1998-01-20 00:00:00";"Tuesday";"January";2007;20;6;1;"Q1";"";2
752;"1998-01-21 00:00:00";"Wednesday";"January";2007;21;6;1;"Q1";"";3
753;"1998-01-22 00:00:00";"Thursday";"January";2007;22;6;1;"Q1";"";4
754;"1998-01-23 00:00:00";"Friday";"January";2007;23;6;1;"Q1";"";5
755;"1998-01-24 00:00:00";"Saturday";"January";2007;24;6;1;"Q1";"";6
756;"1998-01-25 00:00:00";"Sunday";"January";2007;25;7;1;"Q1";"";7
757;"1998-01-26 00:00:00";"Monday";"January";2007;26;7;1;"Q1";"";1
758;"1998-01-27 00:00:00";"Tuesday";"January";2007;27;7;1;"Q1";"";2
759;"1998-01-28 00:00:00";"Wednesday";"January";2007;28;7;1;"Q1";"";3
760;"1998-01-29 00:00:00";"Thursday";"January";2007;29;7;1;"Q1";"";4
761;"1998-01-30 00:00:00";"Friday";"January";2007;30;7;1;"Q1";"";5
762;"1998-01-31 00:00:00";"Saturday";"January";2007;31;7;1;"Q1";"";6
763;"1998-02-01 00:00:00";"Sunday";"February";2007;1;8;2;"Q1";"";7
764;"1998-02-02 00:00:00";"Monday";"February";2007;2;8;2;"Q1";"";1
765;"1998-02-03 00:00:00";"Tuesday";"February";2007;3;8;2;"Q1";"";2
766;"1998-02-04 00:00:00";"Wednesday";"February";2007;4;8;2;"Q1";"";3
767;"1998-02-05 00:00:00";"Thursday";"February";2007;5;8;2;"Q1";"";4
768;"1998-02-06 00:00:00";"Friday";"February";2007;6;8;2;"Q1";"";5
769;"1998-02-07 00:00:00";"Saturday";"February";2007;7;8;2;"Q1";"";6
770;"1998-02-08 00:00:00";"Sunday";"February";2007;8;9;2;"Q1";"";7
771;"1998-02-09 00:00:00";"Monday";"February";2007;9;9;2;"Q1";"";1
772;"1998-02-10 00:00:00";"Tuesday";"February";2007;10;9;2;"Q1";"";2
773;"1998-02-11 00:00:00";"Wednesday";"February";2007;11;9;2;"Q1";"";3
774;"1998-02-12 00:00:00";"Thursday";"February";2007;12;9;2;"Q1";"";4
775;"1998-02-13 00:00:00";"Friday";"February";2007;13;9;2;"Q1";"";5
776;"1998-02-14 00:00:00";"Saturday";"February";2007;14;9;2;"Q1";"";6
777;"1998-02-15 00:00:00";"Sunday";"February";2007;15;10;2;"Q1";"";7
778;"1998-02-16 00:00:00";"Monday";"February";2007;16;10;2;"Q1";"";1
779;"1998-02-17 00:00:00";"Tuesday";"February";2007;17;10;2;"Q1";"";2
780;"1998-02-18 00:00:00";"Wednesday";"February";2007;18;10;2;"Q1";"";3
781;"1998-02-19 00:00:00";"Thursday";"February";2007;19;10;2;"Q1";"";4
782;"1998-02-20 00:00:00";"Friday";"February";2007;20;10;2;"Q1";"";5
783;"1998-02-21 00:00:00";"Saturday";"February";2007;21;10;2;"Q1";"";6
784;"1998-02-22 00:00:00";"Sunday";"February";2007;22;11;2;"Q1";"";7
785;"1998-02-23 00:00:00";"Monday";"February";2007;23;11;2;"Q1";"";1
786;"1998-02-24 00:00:00";"Tuesday";"February";2007;24;11;2;"Q1";"";2
787;"1998-02-25 00:00:00";"Wednesday";"February";2007;25;11;2;"Q1";"";3
788;"1998-02-26 00:00:00";"Thursday";"February";2007;26;11;2;"Q1";"";4
789;"1998-02-27 00:00:00";"Friday";"February";2007;27;11;2;"Q1";"";5
790;"1998-02-28 00:00:00";"Saturday";"February";2007;28;11;2;"Q1";"";6
791;"1998-03-01 00:00:00";"Sunday";"March";2007;1;12;3;"Q1";"";7
792;"1998-03-02 00:00:00";"Monday";"March";2007;2;12;3;"Q1";"";1
793;"1998-03-03 00:00:00";"Tuesday";"March";2007;3;12;3;"Q1";"";2
794;"1998-03-04 00:00:00";"Wednesday";"March";2007;4;12;3;"Q1";"";3
795;"1998-03-05 00:00:00";"Thursday";"March";2007;5;12;3;"Q1";"";4
796;"1998-03-06 00:00:00";"Friday";"March";2007;6;12;3;"Q1";"";5
797;"1998-03-07 00:00:00";"Saturday";"March";2007;7;12;3;"Q1";"";6
798;"1998-03-08 00:00:00";"Sunday";"March";2007;8;13;3;"Q1";"";7
799;"1998-03-09 00:00:00";"Monday";"March";2007;9;13;3;"Q1";"";1
800;"1998-03-10 00:00:00";"Tuesday";"March";2007;10;13;3;"Q1";"";2
801;"1998-03-11 00:00:00";"Wednesday";"March";2007;11;13;3;"Q1";"";3
802;"1998-03-12 00:00:00";"Thursday";"March";2007;12;13;3;"Q1";"";4
803;"1998-03-13 00:00:00";"Friday";"March";2007;13;13;3;"Q1";"";5
804;"1998-03-14 00:00:00";"Saturday";"March";2007;14;13;3;"Q1";"";6
805;"1998-03-15 00:00:00";"Sunday";"March";2007;15;14;3;"Q1";"";7
806;"1998-03-16 00:00:00";"Monday";"March";2007;16;14;3;"Q1";"";1
807;"1998-03-17 00:00:00";"Tuesday";"March";2007;17;14;3;"Q1";"";2
808;"1998-03-18 00:00:00";"Wednesday";"March";2007;18;14;3;"Q1";"";3
809;"1998-03-19 00:00:00";"Thursday";"March";2007;19;14;3;"Q1";"";4
810;"1998-03-20 00:00:00";"Friday";"March";2007;20;14;3;"Q1";"";5
811;"1998-03-21 00:00:00";"Saturday";"March";2007;21;14;3;"Q1";"";6
812;"1998-03-22 00:00:00";"Sunday";"March";2007;22;15;3;"Q1";"";7
813;"1998-03-23 00:00:00";"Monday";"March";2007;23;15;3;"Q1";"";1
814;"1998-03-24 00:00:00";"Tuesday";"March";2007;24;15;3;"Q1";"";2
815;"1998-03-25 00:00:00";"Wednesday";"March";2007;25;15;3;"Q1";"";3
816;"1998-03-26 00:00:00";"Thursday";"March";2007;26;15;3;"Q1";"";4
817;"1998-03-27 00:00:00";"Friday";"March";2007;27;15;3;"Q1";"";5
818;"1998-03-28 00:00:00";"Saturday";"March";2007;28;15;3;"Q1";"";6
819;"1998-03-29 00:00:00";"Sunday";"March";2007;29;16;3;"Q1";"";7
820;"1998-03-30 00:00:00";"Monday";"March";2007;30;16;3;"Q1";"";1
821;"1998-03-31 00:00:00";"Tuesday";"March";2007;31;16;3;"Q1";"";2
822;"1998-04-01 00:00:00";"Wednesday";"April";2007;1;16;4;"Q2";"";3
823;"1998-04-02 00:00:00";"Thursday";"April";2007;2;16;4;"Q2";"";4
824;"1998-04-03 00:00:00";"Friday";"April";2007;3;16;4;"Q2";"";5
825;"1998-04-04 00:00:00";"Saturday";"April";2007;4;16;4;"Q2";"";6
826;"1998-04-05 00:00:00";"Sunday";"April";2007;5;17;4;"Q2";"";7
827;"1998-04-06 00:00:00";"Monday";"April";2007;6;17;4;"Q2";"";1
828;"1998-04-07 00:00:00";"Tuesday";"April";2007;7;17;4;"Q2";"";2
829;"1998-04-08 00:00:00";"Wednesday";"April";2007;8;17;4;"Q2";"";3
830;"1998-04-09 00:00:00";"Thursday";"April";2007;9;17;4;"Q2";"";4
831;"1998-04-10 00:00:00";"Friday";"April";2007;10;17;4;"Q2";"";5
832;"1998-04-11 00:00:00";"Saturday";"April";2007;11;17;4;"Q2";"";6
833;"1998-04-12 00:00:00";"Sunday";"April";2007;12;18;4;"Q2";"";7
834;"1998-04-13 00:00:00";"Monday";"April";2007;13;18;4;"Q2";"";1
835;"1998-04-14 00:00:00";"Tuesday";"April";2007;14;18;4;"Q2";"";2
836;"1998-04-15 00:00:00";"Wednesday";"April";2007;15;18;4;"Q2";"";3
837;"1998-04-16 00:00:00";"Thursday";"April";2007;16;18;4;"Q2";"";4
838;"1998-04-17 00:00:00";"Friday";"April";2007;17;18;4;"Q2";"";5
839;"1998-04-18 00:00:00";"Saturday";"April";2007;18;18;4;"Q2";"";6
840;"1998-04-19 00:00:00";"Sunday";"April";2007;19;19;4;"Q2";"";7
841;"1998-04-20 00:00:00";"Monday";"April";2007;20;19;4;"Q2";"";1
842;"1998-04-21 00:00:00";"Tuesday";"April";2007;21;19;4;"Q2";"";2
843;"1998-04-22 00:00:00";"Wednesday";"April";2007;22;19;4;"Q2";"";3
844;"1998-04-23 00:00:00";"Thursday";"April";2007;23;19;4;"Q2";"";4
845;"1998-04-24 00:00:00";"Friday";"April";2007;24;19;4;"Q2";"";5
846;"1998-04-25 00:00:00";"Saturday";"April";2007;25;19;4;"Q2";"";6
847;"1998-04-26 00:00:00";"Sunday";"April";2007;26;20;4;"Q2";"";7
848;"1998-04-27 00:00:00";"Monday";"April";2007;27;20;4;"Q2";"";1
849;"1998-04-28 00:00:00";"Tuesday";"April";2007;28;20;4;"Q2";"";2
850;"1998-04-29 00:00:00";"Wednesday";"April";2007;29;20;4;"Q2";"";3
851;"1998-04-30 00:00:00";"Thursday";"April";2007;30;20;4;"Q2";"";4
852;"1998-05-01 00:00:00";"Friday";"May";2007;1;20;5;"Q2";"";5
853;"1998-05-02 00:00:00";"Saturday";"May";2007;2;20;5;"Q2";"";6
854;"1998-05-03 00:00:00";"Sunday";"May";2007;3;21;5;"Q2";"";7
855;"1998-05-04 00:00:00";"Monday";"May";2007;4;21;5;"Q2";"";1
856;"1998-05-05 00:00:00";"Tuesday";"May";2007;5;21;5;"Q2";"";2
857;"1998-05-06 00:00:00";"Wednesday";"May";2007;6;21;5;"Q2";"";3
858;"1998-05-07 00:00:00";"Thursday";"May";2007;7;21;5;"Q2";"";4
859;"1998-05-08 00:00:00";"Friday";"May";2007;8;21;5;"Q2";"";5
860;"1998-05-09 00:00:00";"Saturday";"May";2007;9;21;5;"Q2";"";6
861;"1998-05-10 00:00:00";"Sunday";"May";2007;10;22;5;"Q2";"";7
862;"1998-05-11 00:00:00";"Monday";"May";2007;11;22;5;"Q2";"";1
863;"1998-05-12 00:00:00";"Tuesday";"May";2007;12;22;5;"Q2";"";2
864;"1998-05-13 00:00:00";"Wednesday";"May";2007;13;22;5;"Q2";"";3
865;"1998-05-14 00:00:00";"Thursday";"May";2007;14;22;5;"Q2";"";4
866;"1998-05-15 00:00:00";"Friday";"May";2007;15;22;5;"Q2";"";5
867;"1998-05-16 00:00:00";"Saturday";"May";2007;16;22;5;"Q2";"";6
868;"1998-05-17 00:00:00";"Sunday";"May";2007;17;23;5;"Q2";"";7
869;"1998-05-18 00:00:00";"Monday";"May";2007;18;23;5;"Q2";"";1
870;"1998-05-19 00:00:00";"Tuesday";"May";2007;19;23;5;"Q2";"";2
871;"1998-05-20 00:00:00";"Wednesday";"May";2007;20;23;5;"Q2";"";3
872;"1998-05-21 00:00:00";"Thursday";"May";2007;21;23;5;"Q2";"";4
873;"1998-05-22 00:00:00";"Friday";"May";2007;22;23;5;"Q2";"";5
874;"1998-05-23 00:00:00";"Saturday";"May";2007;23;23;5;"Q2";"";6
875;"1998-05-24 00:00:00";"Sunday";"May";2007;24;24;5;"Q2";"";7
876;"1998-05-25 00:00:00";"Monday";"May";2007;25;24;5;"Q2";"";1
877;"1998-05-26 00:00:00";"Tuesday";"May";2007;26;24;5;"Q2";"";2
878;"1998-05-27 00:00:00";"Wednesday";"May";2007;27;24;5;"Q2";"";3
879;"1998-05-28 00:00:00";"Thursday";"May";2007;28;24;5;"Q2";"";4
880;"1998-05-29 00:00:00";"Friday";"May";2007;29;24;5;"Q2";"";5
881;"1998-05-30 00:00:00";"Saturday";"May";2007;30;24;5;"Q2";"";6
882;"1998-05-31 00:00:00";"Sunday";"May";2007;31;25;5;"Q2";"";7
883;"1998-06-01 00:00:00";"Monday";"June";2007;1;25;6;"Q2";"";1
884;"1998-06-02 00:00:00";"Tuesday";"June";2007;2;25;6;"Q2";"";2
885;"1998-06-03 00:00:00";"Wednesday";"June";2007;3;25;6;"Q2";"";3
886;"1998-06-04 00:00:00";"Thursday";"June";2007;4;25;6;"Q2";"";4
887;"1998-06-05 00:00:00";"Friday";"June";2007;5;25;6;"Q2";"";5
888;"1998-06-06 00:00:00";"Saturday";"June";2007;6;25;6;"Q2";"";6
889;"1998-06-07 00:00:00";"Sunday";"June";2007;7;26;6;"Q2";"";7
890;"1998-06-08 00:00:00";"Monday";"June";2007;8;26;6;"Q2";"";1
891;"1998-06-09 00:00:00";"Tuesday";"June";2007;9;26;6;"Q2";"";2
892;"1998-06-10 00:00:00";"Wednesday";"June";2007;10;26;6;"Q2";"";3
893;"1998-06-11 00:00:00";"Thursday";"June";2007;11;26;6;"Q2";"";4
894;"1998-06-12 00:00:00";"Friday";"June";2007;12;26;6;"Q2";"";5
895;"1998-06-13 00:00:00";"Saturday";"June";2007;13;26;6;"Q2";"";6
896;"1998-06-14 00:00:00";"Sunday";"June";2007;14;27;6;"Q2";"";7
897;"1998-06-15 00:00:00";"Monday";"June";2007;15;27;6;"Q2";"";1
898;"1998-06-16 00:00:00";"Tuesday";"June";2007;16;27;6;"Q2";"";2
899;"1998-06-17 00:00:00";"Wednesday";"June";2007;17;27;6;"Q2";"";3
900;"1998-06-18 00:00:00";"Thursday";"June";2007;18;27;6;"Q2";"";4
901;"1998-06-19 00:00:00";"Friday";"June";2007;19;27;6;"Q2";"";5
902;"1998-06-20 00:00:00";"Saturday";"June";2007;20;27;6;"Q2";"";6
903;"1998-06-21 00:00:00";"Sunday";"June";2007;21;28;6;"Q2";"";7
904;"1998-06-22 00:00:00";"Monday";"June";2007;22;28;6;"Q2";"";1
905;"1998-06-23 00:00:00";"Tuesday";"June";2007;23;28;6;"Q2";"";2
906;"1998-06-24 00:00:00";"Wednesday";"June";2007;24;28;6;"Q2";"";3
907;"1998-06-25 00:00:00";"Thursday";"June";2007;25;28;6;"Q2";"";4
908;"1998-06-26 00:00:00";"Friday";"June";2007;26;28;6;"Q2";"";5
909;"1998-06-27 00:00:00";"Saturday";"June";2007;27;28;6;"Q2";"";6
910;"1998-06-28 00:00:00";"Sunday";"June";2007;28;29;6;"Q2";"";7
911;"1998-06-29 00:00:00";"Monday";"June";2007;29;29;6;"Q2";"";1
912;"1998-06-30 00:00:00";"Tuesday";"June";2007;30;29;6;"Q2";"";2
913;"1998-07-01 00:00:00";"Wednesday";"July";2007;1;29;7;"Q3";"";3
914;"1998-07-02 00:00:00";"Thursday";"July";2007;2;29;7;"Q3";"";4
915;"1998-07-03 00:00:00";"Friday";"July";2007;3;29;7;"Q3";"";5
916;"1998-07-04 00:00:00";"Saturday";"July";2007;4;29;7;"Q3";"";6
917;"1998-07-05 00:00:00";"Sunday";"July";2007;5;30;7;"Q3";"";7
918;"1998-07-06 00:00:00";"Monday";"July";2007;6;30;7;"Q3";"";1
919;"1998-07-07 00:00:00";"Tuesday";"July";2007;7;30;7;"Q3";"";2
920;"1998-07-08 00:00:00";"Wednesday";"July";2007;8;30;7;"Q3";"";3
921;"1998-07-09 00:00:00";"Thursday";"July";2007;9;30;7;"Q3";"";4
922;"1998-07-10 00:00:00";"Friday";"July";2007;10;30;7;"Q3";"";5
923;"1998-07-11 00:00:00";"Saturday";"July";2007;11;30;7;"Q3";"";6
924;"1998-07-12 00:00:00";"Sunday";"July";2007;12;31;7;"Q3";"";7
925;"1998-07-13 00:00:00";"Monday";"July";2007;13;31;7;"Q3";"";1
926;"1998-07-14 00:00:00";"Tuesday";"July";2007;14;31;7;"Q3";"";2
927;"1998-07-15 00:00:00";"Wednesday";"July";2007;15;31;7;"Q3";"";3
928;"1998-07-16 00:00:00";"Thursday";"July";2007;16;31;7;"Q3";"";4
929;"1998-07-17 00:00:00";"Friday";"July";2007;17;31;7;"Q3";"";5
930;"1998-07-18 00:00:00";"Saturday";"July";2007;18;31;7;"Q3";"";6
931;"1998-07-19 00:00:00";"Sunday";"July";2007;19;32;7;"Q3";"";7
932;"1998-07-20 00:00:00";"Monday";"July";2007;20;32;7;"Q3";"";1
933;"1998-07-21 00:00:00";"Tuesday";"July";2007;21;32;7;"Q3";"";2
934;"1998-07-22 00:00:00";"Wednesday";"July";2007;22;32;7;"Q3";"";3
935;"1998-07-23 00:00:00";"Thursday";"July";2007;23;32;7;"Q3";"";4
936;"1998-07-24 00:00:00";"Friday";"July";2007;24;32;7;"Q3";"";5
937;"1998-07-25 00:00:00";"Saturday";"July";2007;25;32;7;"Q3";"";6
938;"1998-07-26 00:00:00";"Sunday";"July";2007;26;33;7;"Q3";"";7
939;"1998-07-27 00:00:00";"Monday";"July";2007;27;33;7;"Q3";"";1
940;"1998-07-28 00:00:00";"Tuesday";"July";2007;28;33;7;"Q3";"";2
941;"1998-07-29 00:00:00";"Wednesday";"July";2007;29;33;7;"Q3";"";3
942;"1998-07-30 00:00:00";"Thursday";"July";2007;30;33;7;"Q3";"";4
943;"1998-07-31 00:00:00";"Friday";"July";2007;31;33;7;"Q3";"";5
944;"1998-08-01 00:00:00";"Saturday";"August";2007;1;33;8;"Q3";"";6
945;"1998-08-02 00:00:00";"Sunday";"August";2007;2;34;8;"Q3";"";7
946;"1998-08-03 00:00:00";"Monday";"August";2007;3;34;8;"Q3";"";1
947;"1998-08-04 00:00:00";"Tuesday";"August";2007;4;34;8;"Q3";"";2
948;"1998-08-05 00:00:00";"Wednesday";"August";2007;5;34;8;"Q3";"";3
949;"1998-08-06 00:00:00";"Thursday";"August";2007;6;34;8;"Q3";"";4
950;"1998-08-07 00:00:00";"Friday";"August";2007;7;34;8;"Q3";"";5
951;"1998-08-08 00:00:00";"Saturday";"August";2007;8;34;8;"Q3";"";6
952;"1998-08-09 00:00:00";"Sunday";"August";2007;9;35;8;"Q3";"";7
953;"1998-08-10 00:00:00";"Monday";"August";2007;10;35;8;"Q3";"";1
954;"1998-08-11 00:00:00";"Tuesday";"August";2007;11;35;8;"Q3";"";2
955;"1998-08-12 00:00:00";"Wednesday";"August";2007;12;35;8;"Q3";"";3
956;"1998-08-13 00:00:00";"Thursday";"August";2007;13;35;8;"Q3";"";4
957;"1998-08-14 00:00:00";"Friday";"August";2007;14;35;8;"Q3";"";5
958;"1998-08-15 00:00:00";"Saturday";"August";2007;15;35;8;"Q3";"";6
959;"1998-08-16 00:00:00";"Sunday";"August";2007;16;36;8;"Q3";"";7
960;"1998-08-17 00:00:00";"Monday";"August";2007;17;36;8;"Q3";"";1
961;"1998-08-18 00:00:00";"Tuesday";"August";2007;18;36;8;"Q3";"";2
962;"1998-08-19 00:00:00";"Wednesday";"August";2007;19;36;8;"Q3";"";3
963;"1998-08-20 00:00:00";"Thursday";"August";2007;20;36;8;"Q3";"";4
964;"1998-08-21 00:00:00";"Friday";"August";2007;21;36;8;"Q3";"";5
965;"1998-08-22 00:00:00";"Saturday";"August";2007;22;36;8;"Q3";"";6
966;"1998-08-23 00:00:00";"Sunday";"August";2007;23;37;8;"Q3";"";7
967;"1998-08-24 00:00:00";"Monday";"August";2007;24;37;8;"Q3";"";1
968;"1998-08-25 00:00:00";"Tuesday";"August";2007;25;37;8;"Q3";"";2
969;"1998-08-26 00:00:00";"Wednesday";"August";2007;26;37;8;"Q3";"";3
970;"1998-08-27 00:00:00";"Thursday";"August";2007;27;37;8;"Q3";"";4
971;"1998-08-28 00:00:00";"Friday";"August";2007;28;37;8;"Q3";"";5
972;"1998-08-29 00:00:00";"Saturday";"August";2007;29;37;8;"Q3";"";6
973;"1998-08-30 00:00:00";"Sunday";"August";2007;30;38;8;"Q3";"";7
974;"1998-08-31 00:00:00";"Monday";"August";2007;31;38;8;"Q3";"";1
975;"1998-09-01 00:00:00";"Tuesday";"September";2007;1;38;9;"Q3";"";2
976;"1998-09-02 00:00:00";"Wednesday";"September";2007;2;38;9;"Q3";"";3
977;"1998-09-03 00:00:00";"Thursday";"September";2007;3;38;9;"Q3";"";4
978;"1998-09-04 00:00:00";"Friday";"September";2007;4;38;9;"Q3";"";5
979;"1998-09-05 00:00:00";"Saturday";"September";2007;5;38;9;"Q3";"";6
980;"1998-09-06 00:00:00";"Sunday";"September";2007;6;39;9;"Q3";"";7
981;"1998-09-07 00:00:00";"Monday";"September";2007;7;39;9;"Q3";"";1
982;"1998-09-08 00:00:00";"Tuesday";"September";2007;8;39;9;"Q3";"";2
983;"1998-09-09 00:00:00";"Wednesday";"September";2007;9;39;9;"Q3";"";3
984;"1998-09-10 00:00:00";"Thursday";"September";2007;10;39;9;"Q3";"";4
985;"1998-09-11 00:00:00";"Friday";"September";2007;11;39;9;"Q3";"";5
986;"1998-09-12 00:00:00";"Saturday";"September";2007;12;39;9;"Q3";"";6
987;"1998-09-13 00:00:00";"Sunday";"September";2007;13;40;9;"Q3";"";7
988;"1998-09-14 00:00:00";"Monday";"September";2007;14;40;9;"Q3";"";1
989;"1998-09-15 00:00:00";"Tuesday";"September";2007;15;40;9;"Q3";"";2
990;"1998-09-16 00:00:00";"Wednesday";"September";2007;16;40;9;"Q3";"";3
991;"1998-09-17 00:00:00";"Thursday";"September";2007;17;40;9;"Q3";"";4
992;"1998-09-18 00:00:00";"Friday";"September";2007;18;40;9;"Q3";"";5
993;"1998-09-19 00:00:00";"Saturday";"September";2007;19;40;9;"Q3";"";6
994;"1998-09-20 00:00:00";"Sunday";"September";2007;20;41;9;"Q3";"";7
995;"1998-09-21 00:00:00";"Monday";"September";2007;21;41;9;"Q3";"";1
996;"1998-09-22 00:00:00";"Tuesday";"September";2007;22;41;9;"Q3";"";2
997;"1998-09-23 00:00:00";"Wednesday";"September";2007;23;41;9;"Q3";"";3
998;"1998-09-24 00:00:00";"Thursday";"September";2007;24;41;9;"Q3";"";4
999;"1998-09-25 00:00:00";"Friday";"September";2007;25;41;9;"Q3";"";5
1000;"1998-09-26 00:00:00";"Saturday";"September";2007;26;41;9;"Q3";"";6
1001;"1998-09-27 00:00:00";"Sunday";"September";2007;27;42;9;"Q3";"";7
1002;"1998-09-28 00:00:00";"Monday";"September";2007;28;42;9;"Q3";"";1
1003;"1998-09-29 00:00:00";"Tuesday";"September";2007;29;42;9;"Q3";"";2
1004;"1998-09-30 00:00:00";"Wednesday";"September";2007;30;42;9;"Q3";"";3
1005;"1998-10-01 00:00:00";"Thursday";"October";2007;1;42;10;"Q4";"";4
1006;"1998-10-02 00:00:00";"Friday";"October";2007;2;42;10;"Q4";"";5
1007;"1998-10-03 00:00:00";"Saturday";"October";2007;3;42;10;"Q4";"";6
1008;"1998-10-04 00:00:00";"Sunday";"October";2007;4;43;10;"Q4";"";7
1009;"1998-10-05 00:00:00";"Monday";"October";2007;5;43;10;"Q4";"";1
1010;"1998-10-06 00:00:00";"Tuesday";"October";2007;6;43;10;"Q4";"";2
1011;"1998-10-07 00:00:00";"Wednesday";"October";2007;7;43;10;"Q4";"";3
1012;"1998-10-08 00:00:00";"Thursday";"October";2007;8;43;10;"Q4";"";4
1013;"1998-10-09 00:00:00";"Friday";"October";2007;9;43;10;"Q4";"";5
1014;"1998-10-10 00:00:00";"Saturday";"October";2007;10;43;10;"Q4";"";6
1015;"1998-10-11 00:00:00";"Sunday";"October";2007;11;44;10;"Q4";"";7
1016;"1998-10-12 00:00:00";"Monday";"October";2007;12;44;10;"Q4";"";1
1017;"1998-10-13 00:00:00";"Tuesday";"October";2007;13;44;10;"Q4";"";2
1018;"1998-10-14 00:00:00";"Wednesday";"October";2007;14;44;10;"Q4";"";3
1019;"1998-10-15 00:00:00";"Thursday";"October";2007;15;44;10;"Q4";"";4
1020;"1998-10-16 00:00:00";"Friday";"October";2007;16;44;10;"Q4";"";5
1021;"1998-10-17 00:00:00";"Saturday";"October";2007;17;44;10;"Q4";"";6
1022;"1998-10-18 00:00:00";"Sunday";"October";2007;18;45;10;"Q4";"";7
1023;"1998-10-19 00:00:00";"Monday";"October";2007;19;45;10;"Q4";"";1
1024;"1998-10-20 00:00:00";"Tuesday";"October";2007;20;45;10;"Q4";"";2
1025;"1998-10-21 00:00:00";"Wednesday";"October";2007;21;45;10;"Q4";"";3
1026;"1998-10-22 00:00:00";"Thursday";"October";2007;22;45;10;"Q4";"";4
1027;"1998-10-23 00:00:00";"Friday";"October";2007;23;45;10;"Q4";"";5
1028;"1998-10-24 00:00:00";"Saturday";"October";2007;24;45;10;"Q4";"";6
1029;"1998-10-25 00:00:00";"Sunday";"October";2007;25;46;10;"Q4";"";7
1030;"1998-10-26 00:00:00";"Monday";"October";2007;26;46;10;"Q4";"";1
1031;"1998-10-27 00:00:00";"Tuesday";"October";2007;27;46;10;"Q4";"";2
1032;"1998-10-28 00:00:00";"Wednesday";"October";2007;28;46;10;"Q4";"";3
1033;"1998-10-29 00:00:00";"Thursday";"October";2007;29;46;10;"Q4";"";4
1034;"1998-10-30 00:00:00";"Friday";"October";2007;30;46;10;"Q4";"";5
1035;"1998-10-31 00:00:00";"Saturday";"October";2007;31;46;10;"Q4";"";6
1036;"1998-11-01 00:00:00";"Sunday";"November";2007;1;47;11;"Q4";"";7
1037;"1998-11-02 00:00:00";"Monday";"November";2007;2;47;11;"Q4";"";1
1038;"1998-11-03 00:00:00";"Tuesday";"November";2007;3;47;11;"Q4";"";2
1039;"1998-11-04 00:00:00";"Wednesday";"November";2007;4;47;11;"Q4";"";3
1040;"1998-11-05 00:00:00";"Thursday";"November";2007;5;47;11;"Q4";"";4
1041;"1998-11-06 00:00:00";"Friday";"November";2007;6;47;11;"Q4";"";5
1042;"1998-11-07 00:00:00";"Saturday";"November";2007;7;47;11;"Q4";"";6
1043;"1998-11-08 00:00:00";"Sunday";"November";2007;8;48;11;"Q4";"";7
1044;"1998-11-09 00:00:00";"Monday";"November";2007;9;48;11;"Q4";"";1
1045;"1998-11-10 00:00:00";"Tuesday";"November";2007;10;48;11;"Q4";"";2
1046;"1998-11-11 00:00:00";"Wednesday";"November";2007;11;48;11;"Q4";"";3
1047;"1998-11-12 00:00:00";"Thursday";"November";2007;12;48;11;"Q4";"";4
1048;"1998-11-13 00:00:00";"Friday";"November";2007;13;48;11;"Q4";"";5
1049;"1998-11-14 00:00:00";"Saturday";"November";2007;14;48;11;"Q4";"";6
1050;"1998-11-15 00:00:00";"Sunday";"November";2007;15;49;11;"Q4";"";7
1051;"1998-11-16 00:00:00";"Monday";"November";2007;16;49;11;"Q4";"";1
1052;"1998-11-17 00:00:00";"Tuesday";"November";2007;17;49;11;"Q4";"";2
1053;"1998-11-18 00:00:00";"Wednesday";"November";2007;18;49;11;"Q4";"";3
1054;"1998-11-19 00:00:00";"Thursday";"November";2007;19;49;11;"Q4";"";4
1055;"1998-11-20 00:00:00";"Friday";"November";2007;20;49;11;"Q4";"";5
1056;"1998-11-21 00:00:00";"Saturday";"November";2007;21;49;11;"Q4";"";6
1057;"1998-11-22 00:00:00";"Sunday";"November";2007;22;50;11;"Q4";"";7
1058;"1998-11-23 00:00:00";"Monday";"November";2007;23;50;11;"Q4";"";1
1059;"1998-11-24 00:00:00";"Tuesday";"November";2007;24;50;11;"Q4";"";2
1060;"1998-11-25 00:00:00";"Wednesday";"November";2007;25;50;11;"Q4";"";3
1061;"1998-11-26 00:00:00";"Thursday";"November";2007;26;50;11;"Q4";"";4
1062;"1998-11-27 00:00:00";"Friday";"November";2007;27;50;11;"Q4";"";5
1063;"1998-11-28 00:00:00";"Saturday";"November";2007;28;50;11;"Q4";"";6
1064;"1998-11-29 00:00:00";"Sunday";"November";2007;29;51;11;"Q4";"";7
1065;"1998-11-30 00:00:00";"Monday";"November";2007;30;51;11;"Q4";"";1
1066;"1998-12-01 00:00:00";"Tuesday";"December";2007;1;51;12;"Q4";"";2
1067;"1998-12-02 00:00:00";"Wednesday";"December";2007;2;51;12;"Q4";"";3
1068;"1998-12-03 00:00:00";"Thursday";"December";2007;3;51;12;"Q4";"";4
1069;"1998-12-04 00:00:00";"Friday";"December";2007;4;51;12;"Q4";"";5
1070;"1998-12-05 00:00:00";"Saturday";"December";2007;5;51;12;"Q4";"";6
1071;"1998-12-06 00:00:00";"Sunday";"December";2007;6;52;12;"Q4";"";7
1072;"1998-12-07 00:00:00";"Monday";"December";2007;7;1;12;"Q4";"";1
1073;"1998-12-08 00:00:00";"Tuesday";"December";2007;8;1;12;"Q4";"";2
1074;"1998-12-09 00:00:00";"Wednesday";"December";2007;9;1;12;"Q4";"";3
1075;"1998-12-10 00:00:00";"Thursday";"December";2007;10;1;12;"Q4";"";4
1076;"1998-12-11 00:00:00";"Friday";"December";2007;11;1;12;"Q4";"";5
1077;"1998-12-12 00:00:00";"Saturday";"December";2007;12;1;12;"Q4";"";6
1078;"1998-12-13 00:00:00";"Sunday";"December";2007;13;2;12;"Q4";"";7
1079;"1998-12-14 00:00:00";"Monday";"December";2007;14;2;12;"Q4";"";1
1080;"1998-12-15 00:00:00";"Tuesday";"December";2007;15;2;12;"Q4";"";2
1081;"1998-12-16 00:00:00";"Wednesday";"December";2007;16;2;12;"Q4";"";3
1082;"1998-12-17 00:00:00";"Thursday";"December";2007;17;2;12;"Q4";"";4
1083;"1998-12-18 00:00:00";"Friday";"December";2007;18;2;12;"Q4";"";5
1084;"1998-12-19 00:00:00";"Saturday";"December";2007;19;2;12;"Q4";"";6
1085;"1998-12-20 00:00:00";"Sunday";"December";2007;20;3;12;"Q4";"";7
1086;"1998-12-21 00:00:00";"Monday";"December";2007;21;3;12;"Q4";"";1
1087;"1998-12-22 00:00:00";"Tuesday";"December";2007;22;3;12;"Q4";"";2
1088;"1998-12-23 00:00:00";"Wednesday";"December";2007;23;3;12;"Q4";"";3
1089;"1998-12-24 00:00:00";"Thursday";"December";2007;24;3;12;"Q4";"";4
1090;"1998-12-25 00:00:00";"Friday";"December";2007;25;3;12;"Q4";"";5
1091;"1998-12-26 00:00:00";"Saturday";"December";2007;26;3;12;"Q4";"";6
1092;"1998-12-27 00:00:00";"Sunday";"December";2007;27;4;12;"Q4";"";7
1093;"1998-12-28 00:00:00";"Monday";"December";2007;28;4;12;"Q4";"";1
1094;"1998-12-29 00:00:00";"Tuesday";"December";2007;29;4;12;"Q4";"";2
1095;"1998-12-30 00:00:00";"Wednesday";"December";2007;30;4;12;"Q4";"";3
1096;"1998-12-31 00:00:00";"Thursday";"December";2007;31;4;12;"Q4";"";4
"warehouse_id";"warehouse_name";"wa_address1";"wa_address2";"wa_address3";"wa_address4";"warehouse_city";"warehouse_state_province";"warehouse_postal_code";"warehouse_country";"warehouse_owner_name";"warehouse_phone";"warehouse_fax"
1;"Salka Warehousing";"9716 Alovera Road";"";"";"";"Acapulco";"Guerrero";"55555";"Mexico";"";"821-555-1658";"594-555-2908"
2;"Foster Products";"958 Hilltop Dr";"";"";"";"Bellingham";"WA";"55555";"USA";"";"315-555-8947";"119-555-3826"
3;"Destination, Inc.";"4162 Euclid Ave";"";"";"";"Bremerton";"WA";"55555";"USA";"";"517-555-3022";"136-555-4501"
4;"Anderson Warehousing";"5657 Georgia Dr";"";"";"";"Camacho";"Zacatecas";"55555";"Mexico";"";"681-555-1655";"946-555-4848"
5;"Focus, Inc.";"9116 Tice Valley Blv.";"";"";"";"Guadalajara";"Jalisco";"55555";"Mexico";"";"344-555-5530";"379-555-9065"
6;"Big Quality Warehouse";"3521 Fourth Stret";"";"";"";"Beverly Hills";"CA";"55555";"USA";"";"892-555-3590";"388-555-7926"
7;"Artesia Warehousing, Inc.";"9889 Matterhorn Court";"";"";"";"Los Angeles";"CA";"55555";"USA";"";"859-555-2792";"740-555-6556"
8;"Bastani and Sons";"1893 Northridge Drive";"";"";"";"Marida";"Yucatan";"55555";"Mexico";"";"846-555-3024";"804-555-6674"
9;"Freeman And Co";"234 West Covina Pkwy";"";"";"";"Mexico City";"DF";"55555";"Mexico";"";"";""
10;"Jamison, Inc.";"1172 Liana Lane";"";"";"";"Orizaba";"Veracruz";"55555";"Mexico";"";"379-555-5756";"436-555-7920"
11;"Quality Distribution, Inc.";"6085 Darlene Drive";"";"";"";"Portland";"OR";"55555";"USA";"";"181-555-3588";"269-555-8381"
12;"Arnold and Sons";"5617 Saclan Terrace";"";"";"";"Hidalgo";"Zacatecas";"55555";"Mexico";"";"360-555-8035";"263-555-1427"
13;"Treehouse Distribution";"5473 Olive Hill";"";"";"";"Salem";"OR";"55555";"USA";"";"831-555-6210";"481-555-1317"
14;"Food Service Storage, Inc.";"5259 Mildred Ln";"";"";"";"San Francisco";"CA";"55555";"USA";"";"471-555-2456";"552-555-3249"
15;"Quality Warehousing and Trucking";"3337 Northpoint Ct";"";"";"";"Seattle";"WA";"55555";"USA";"";"427-555-9060";"869-555-1652"
16;"Jones International";"3377 Coachman Place";"";"";"";"Spokane";"WA";"55555";"USA";"";"144-555-5192";"971-555-6213"
17;"Jorge Garcia, Inc.";"4364 Viera Avenue";"";"";"";"Tacoma";"WA";"55555";"USA";"";"200-555-1310";"442-555-5874"
18;"Worthington Food Products";"4659 Cape Cod Way";"";"";"";"Hidalgo";"Zacatecas";"55555";"Mexico";"";"609-555-5413";"952-555-8492"
19;"Bellmont Distributing";"5900 May Rd";"";"";"";"Vancouver";"BC";"55555";"Canada";"";"226-555-5335";"361-555-7385"
20;"Rose Food Warehousing";"9104 Jacobsen Street";"";"";"";"Victoria";"BC";"55555";"Canada";"";"143-555-7496";"332-555-1803"
21;"Derby and Hunt";"600 Lake Nadine Place";"";"";"";"San Andres";"DF";"55555";"Mexico";"";"922-555-5214";"618-555-6578"
22;"Valdez Warehousing";"6714 Roundtree Court";"";"";"";"Walla Walla";"WA";"55555";"USA";"";"301-555-8174";"666-555-9881"
23;"Maddock Stored Foods";"8463 Kim Court";"";"";"";"Yakima";"WA";"55555";"USA";"";"803-555-8978";"630-555-2485"
24;"Jorgensen Service Storage";"4832 Park Glen Ct";"";"";"";"San Diego";"CA";"55555";"USA";"";"259-555-2824";"470-555-4760"
Day;City;Licence;Amount;Count
May 12,2010;Madrid;Personal;1;84
May 13,2010;Barcelona;Personal;2;841
May 14,2010;Paris;Personal;4;2
May 15,2010;Lausanne;Personal;8;231
May 16,2010;Lausanne;Corporate;16;4
May 17,2010;Lausanne;Partnership;32;65
May 18,2010;Zurich;Partnership;64;64
May 19,2010;Geneva;Corporate;128;13
May 20,2010;New York;Corporate;256;12
May 21,2010;New York;Corporate;512;564
Continent;Country;City
America;Canada;Quebec
America;Canada;Toronto
America;United States;Los Angeles
America;United States;New York
America;United States;San Francisco
America;Mexico;Mexico
America;Venezuela;Caracas
Europe;France;Paris
Europe;Spain;Barcelona
Europe;Spain;Madrid
Europe;Spain;Valencia
Europe;Switzerland;Geneva
Europe;Switzerland;Lausanne
Europe;Switzerland;Zurich
Company;Article;Licence
Crazy Development;olapy;Corporate
Crazy Development;olapy;Partnership
Crazy Development;olapy;Personal
Crazy Development;olapy;Startup
Year;Quarter;Month;Day
2010;Q1 2010;January 2010;January 1,2010
2010;Q1 2010;January 2010;January 2,2010
2010;Q1 2010;January 2010;January 3,2010
2010;Q1 2010;January 2010;January 4,2010
2010;Q1 2010;January 2010;January 5,2010
2010;Q1 2010;January 2010;January 6,2010
2010;Q1 2010;January 2010;January 7,2010
2010;Q1 2010;January 2010;January 8,2010
2010;Q1 2010;January 2010;January 9,2010
2010;Q1 2010;January 2010;January 10,2010
2010;Q1 2010;January 2010;January 11,2010
2010;Q1 2010;January 2010;January 12,2010
2010;Q1 2010;January 2010;January 13,2010
2010;Q1 2010;January 2010;January 14,2010
2010;Q1 2010;January 2010;January 15,2010
2010;Q1 2010;January 2010;January 16,2010
2010;Q1 2010;January 2010;January 17,2010
2010;Q1 2010;January 2010;January 18,2010
2010;Q1 2010;January 2010;January 19,2010
2010;Q1 2010;January 2010;January 20,2010
2010;Q1 2010;January 2010;January 21,2010
2010;Q1 2010;January 2010;January 22,2010
2010;Q1 2010;January 2010;January 23,2010
2010;Q1 2010;January 2010;January 24,2010
2010;Q1 2010;January 2010;January 25,2010
2010;Q1 2010;January 2010;January 26,2010
2010;Q1 2010;January 2010;January 27,2010
2010;Q1 2010;January 2010;January 28,2010
2010;Q1 2010;January 2010;January 29,2010
2010;Q1 2010;January 2010;January 30,2010
2010;Q1 2010;January 2010;January 31,2010
2010;Q1 2010;February 2010;February 1,2010
2010;Q1 2010;February 2010;February 2,2010
2010;Q1 2010;February 2010;February 3,2010
2010;Q1 2010;February 2010;February 4,2010
2010;Q1 2010;February 2010;February 5,2010
2010;Q1 2010;February 2010;February 6,2010
2010;Q1 2010;February 2010;February 7,2010
2010;Q1 2010;February 2010;February 8,2010
2010;Q1 2010;February 2010;February 9,2010
2010;Q1 2010;February 2010;February 10,2010
2010;Q1 2010;February 2010;February 11,2010
2010;Q1 2010;February 2010;February 12,2010
2010;Q1 2010;February 2010;February 13,2010
2010;Q1 2010;February 2010;February 14,2010
2010;Q1 2010;February 2010;February 15,2010
2010;Q1 2010;February 2010;February 16,2010
2010;Q1 2010;February 2010;February 17,2010
2010;Q1 2010;February 2010;February 18,2010
2010;Q1 2010;February 2010;February 19,2010
2010;Q1 2010;February 2010;February 20,2010
2010;Q1 2010;February 2010;February 21,2010
2010;Q1 2010;February 2010;February 22,2010
2010;Q1 2010;February 2010;February 23,2010
2010;Q1 2010;February 2010;February 24,2010
2010;Q1 2010;February 2010;February 25,2010
2010;Q1 2010;February 2010;February 26,2010
2010;Q1 2010;February 2010;February 27,2010
2010;Q1 2010;February 2010;February 28,2010
2010;Q1 2010;March 2010;March 1,2010
2010;Q1 2010;March 2010;March 2,2010
2010;Q1 2010;March 2010;March 3,2010
2010;Q1 2010;March 2010;March 4,2010
2010;Q1 2010;March 2010;March 5,2010
2010;Q1 2010;March 2010;March 6,2010
2010;Q1 2010;March 2010;March 7,2010
2010;Q1 2010;March 2010;March 8,2010
2010;Q1 2010;March 2010;March 9,2010
2010;Q1 2010;March 2010;March 10,2010
2010;Q1 2010;March 2010;March 11,2010
2010;Q1 2010;March 2010;March 12,2010
2010;Q1 2010;March 2010;March 13,2010
2010;Q1 2010;March 2010;March 14,2010
2010;Q1 2010;March 2010;March 15,2010
2010;Q1 2010;March 2010;March 16,2010
2010;Q1 2010;March 2010;March 17,2010
2010;Q1 2010;March 2010;March 18,2010
2010;Q1 2010;March 2010;March 19,2010
2010;Q1 2010;March 2010;March 20,2010
2010;Q1 2010;March 2010;March 21,2010
2010;Q1 2010;March 2010;March 22,2010
2010;Q1 2010;March 2010;March 23,2010
2010;Q1 2010;March 2010;March 24,2010
2010;Q1 2010;March 2010;March 25,2010
2010;Q1 2010;March 2010;March 26,2010
2010;Q1 2010;March 2010;March 27,2010
2010;Q1 2010;March 2010;March 28,2010
2010;Q1 2010;March 2010;March 29,2010
2010;Q1 2010;March 2010;March 30,2010
2010;Q1 2010;March 2010;March 31,2010
2010;Q2 2010;April 2010;April 1,2010
2010;Q2 2010;April 2010;April 2,2010
2010;Q2 2010;April 2010;April 3,2010
2010;Q2 2010;April 2010;April 4,2010
2010;Q2 2010;April 2010;April 5,2010
2010;Q2 2010;April 2010;April 6,2010
2010;Q2 2010;April 2010;April 7,2010
2010;Q2 2010;April 2010;April 8,2010
2010;Q2 2010;April 2010;April 9,2010
2010;Q2 2010;April 2010;April 10,2010
2010;Q2 2010;April 2010;April 11,2010
2010;Q2 2010;April 2010;April 12,2010
2010;Q2 2010;April 2010;April 13,2010
2010;Q2 2010;April 2010;April 14,2010
2010;Q2 2010;April 2010;April 15,2010
2010;Q2 2010;April 2010;April 16,2010
2010;Q2 2010;April 2010;April 17,2010
2010;Q2 2010;April 2010;April 18,2010
2010;Q2 2010;April 2010;April 19,2010
2010;Q2 2010;April 2010;April 20,2010
2010;Q2 2010;April 2010;April 21,2010
2010;Q2 2010;April 2010;April 22,2010
2010;Q2 2010;April 2010;April 23,2010
2010;Q2 2010;April 2010;April 24,2010
2010;Q2 2010;April 2010;April 25,2010
2010;Q2 2010;April 2010;April 26,2010
2010;Q2 2010;April 2010;April 27,2010
2010;Q2 2010;April 2010;April 28,2010
2010;Q2 2010;April 2010;April 29,2010
2010;Q2 2010;April 2010;April 30,2010
2010;Q2 2010;May 2010;May 1,2010
2010;Q2 2010;May 2010;May 2,2010
2010;Q2 2010;May 2010;May 3,2010
2010;Q2 2010;May 2010;May 4,2010
2010;Q2 2010;May 2010;May 5,2010
2010;Q2 2010;May 2010;May 6,2010
2010;Q2 2010;May 2010;May 7,2010
2010;Q2 2010;May 2010;May 8,2010
2010;Q2 2010;May 2010;May 9,2010
2010;Q2 2010;May 2010;May 10,2010
2010;Q2 2010;May 2010;May 11,2010
2010;Q2 2010;May 2010;May 12,2010
2010;Q2 2010;May 2010;May 13,2010
2010;Q2 2010;May 2010;May 14,2010
2010;Q2 2010;May 2010;May 15,2010
2010;Q2 2010;May 2010;May 16,2010
2010;Q2 2010;May 2010;May 17,2010
2010;Q2 2010;May 2010;May 18,2010
2010;Q2 2010;May 2010;May 19,2010
2010;Q2 2010;May 2010;May 20,2010
2010;Q2 2010;May 2010;May 21,2010
2010;Q2 2010;May 2010;May 22,2010
2010;Q2 2010;May 2010;May 23,2010
2010;Q2 2010;May 2010;May 24,2010
2010;Q2 2010;May 2010;May 25,2010
2010;Q2 2010;May 2010;May 26,2010
2010;Q2 2010;May 2010;May 27,2010
2010;Q2 2010;May 2010;May 28,2010
2010;Q2 2010;May 2010;May 29,2010
2010;Q2 2010;May 2010;May 30,2010
2010;Q2 2010;May 2010;May 31,2010
2010;Q2 2010;June 2010;June 1,2010
2010;Q2 2010;June 2010;June 2,2010
2010;Q2 2010;June 2010;June 3,2010
2010;Q2 2010;June 2010;June 4,2010
2010;Q2 2010;June 2010;June 5,2010
2010;Q2 2010;June 2010;June 6,2010
2010;Q2 2010;June 2010;June 7,2010
2010;Q2 2010;June 2010;June 8,2010
2010;Q2 2010;June 2010;June 9,2010
2010;Q2 2010;June 2010;June 10,2010
2010;Q2 2010;June 2010;June 11,2010
2010;Q2 2010;June 2010;June 12,2010
2010;Q2 2010;June 2010;June 13,2010
2010;Q2 2010;June 2010;June 14,2010
2010;Q2 2010;June 2010;June 15,2010
2010;Q2 2010;June 2010;June 16,2010
2010;Q2 2010;June 2010;June 17,2010
2010;Q2 2010;June 2010;June 18,2010
2010;Q2 2010;June 2010;June 19,2010
2010;Q2 2010;June 2010;June 20,2010
2010;Q2 2010;June 2010;June 21,2010
2010;Q2 2010;June 2010;June 22,2010
2010;Q2 2010;June 2010;June 23,2010
2010;Q2 2010;June 2010;June 24,2010
2010;Q2 2010;June 2010;June 25,2010
2010;Q2 2010;June 2010;June 26,2010
2010;Q2 2010;June 2010;June 27,2010
2010;Q2 2010;June 2010;June 28,2010
2010;Q2 2010;June 2010;June 29,2010
2010;Q2 2010;June 2010;June 30,2010
2010;Q3 2010;July 2010;July 1,2010
2010;Q3 2010;July 2010;July 2,2010
2010;Q3 2010;July 2010;July 3,2010
2010;Q3 2010;July 2010;July 4,2010
2010;Q3 2010;July 2010;July 5,2010
2010;Q3 2010;July 2010;July 6,2010
2010;Q3 2010;July 2010;July 7,2010
2010;Q3 2010;July 2010;July 8,2010
2010;Q3 2010;July 2010;July 9,2010
2010;Q3 2010;July 2010;July 10,2010
2010;Q3 2010;July 2010;July 11,2010
2010;Q3 2010;July 2010;July 12,2010
2010;Q3 2010;July 2010;July 13,2010
2010;Q3 2010;July 2010;July 14,2010
2010;Q3 2010;July 2010;July 15,2010
2010;Q3 2010;July 2010;July 16,2010
2010;Q3 2010;July 2010;July 17,2010
2010;Q3 2010;July 2010;July 18,2010
2010;Q3 2010;July 2010;July 19,2010
2010;Q3 2010;July 2010;July 20,2010
2010;Q3 2010;July 2010;July 21,2010
2010;Q3 2010;July 2010;July 22,2010
2010;Q3 2010;July 2010;July 23,2010
2010;Q3 2010;July 2010;July 24,2010
2010;Q3 2010;July 2010;July 25,2010
2010;Q3 2010;July 2010;July 26,2010
2010;Q3 2010;July 2010;July 27,2010
2010;Q3 2010;July 2010;July 28,2010
2010;Q3 2010;July 2010;July 29,2010
2010;Q3 2010;July 2010;July 30,2010
2010;Q3 2010;July 2010;July 31,2010
2010;Q3 2010;August 2010;August 1,2010
2010;Q3 2010;August 2010;August 2,2010
2010;Q3 2010;August 2010;August 3,2010
2010;Q3 2010;August 2010;August 4,2010
2010;Q3 2010;August 2010;August 5,2010
2010;Q3 2010;August 2010;August 6,2010
2010;Q3 2010;August 2010;August 7,2010
2010;Q3 2010;August 2010;August 8,2010
2010;Q3 2010;August 2010;August 9,2010
2010;Q3 2010;August 2010;August 10,2010
2010;Q3 2010;August 2010;August 11,2010
2010;Q3 2010;August 2010;August 12,2010
2010;Q3 2010;August 2010;August 13,2010
2010;Q3 2010;August 2010;August 14,2010
2010;Q3 2010;August 2010;August 15,2010
2010;Q3 2010;August 2010;August 16,2010
2010;Q3 2010;August 2010;August 17,2010
2010;Q3 2010;August 2010;August 18,2010
2010;Q3 2010;August 2010;August 19,2010
2010;Q3 2010;August 2010;August 20,2010
2010;Q3 2010;August 2010;August 21,2010
2010;Q3 2010;August 2010;August 22,2010
2010;Q3 2010;August 2010;August 23,2010
2010;Q3 2010;August 2010;August 24,2010
2010;Q3 2010;August 2010;August 25,2010
2010;Q3 2010;August 2010;August 26,2010
2010;Q3 2010;August 2010;August 27,2010
2010;Q3 2010;August 2010;August 28,2010
2010;Q3 2010;August 2010;August 29,2010
2010;Q3 2010;August 2010;August 30,2010
2010;Q3 2010;August 2010;August 31,2010
2010;Q3 2010;September 2010;September 1,2010
2010;Q3 2010;September 2010;September 2,2010
2010;Q3 2010;September 2010;September 3,2010
2010;Q3 2010;September 2010;September 4,2010
2010;Q3 2010;September 2010;September 5,2010
2010;Q3 2010;September 2010;September 6,2010
2010;Q3 2010;September 2010;September 7,2010
2010;Q3 2010;September 2010;September 8,2010
2010;Q3 2010;September 2010;September 9,2010
2010;Q3 2010;September 2010;September 10,2010
2010;Q3 2010;September 2010;September 11,2010
2010;Q3 2010;September 2010;September 12,2010
2010;Q3 2010;September 2010;September 13,2010
2010;Q3 2010;September 2010;September 14,2010
2010;Q3 2010;September 2010;September 15,2010
2010;Q3 2010;September 2010;September 16,2010
2010;Q3 2010;September 2010;September 17,2010
2010;Q3 2010;September 2010;September 18,2010
2010;Q3 2010;September 2010;September 19,2010
2010;Q3 2010;September 2010;September 20,2010
2010;Q3 2010;September 2010;September 21,2010
2010;Q3 2010;September 2010;September 22,2010
2010;Q3 2010;September 2010;September 23,2010
2010;Q3 2010;September 2010;September 24,2010
2010;Q3 2010;September 2010;September 25,2010
2010;Q3 2010;September 2010;September 26,2010
2010;Q3 2010;September 2010;September 27,2010
2010;Q3 2010;September 2010;September 28,2010
2010;Q3 2010;September 2010;September 29,2010
2010;Q3 2010;September 2010;September 30,2010
2010;Q4 2010;October 2010;October 1,2010
2010;Q4 2010;October 2010;October 2,2010
2010;Q4 2010;October 2010;October 3,2010
2010;Q4 2010;October 2010;October 4,2010
2010;Q4 2010;October 2010;October 5,2010
2010;Q4 2010;October 2010;October 6,2010
2010;Q4 2010;October 2010;October 7,2010
2010;Q4 2010;October 2010;October 8,2010
2010;Q4 2010;October 2010;October 9,2010
2010;Q4 2010;October 2010;October 10,2010
2010;Q4 2010;October 2010;October 11,2010
2010;Q4 2010;October 2010;October 12,2010
2010;Q4 2010;October 2010;October 13,2010
2010;Q4 2010;October 2010;October 14,2010
2010;Q4 2010;October 2010;October 15,2010
2010;Q4 2010;October 2010;October 16,2010
2010;Q4 2010;October 2010;October 17,2010
2010;Q4 2010;October 2010;October 18,2010
2010;Q4 2010;October 2010;October 19,2010
2010;Q4 2010;October 2010;October 20,2010
2010;Q4 2010;October 2010;October 21,2010
2010;Q4 2010;October 2010;October 22,2010
2010;Q4 2010;October 2010;October 23,2010
2010;Q4 2010;October 2010;October 24,2010
2010;Q4 2010;October 2010;October 25,2010
2010;Q4 2010;October 2010;October 26,2010
2010;Q4 2010;October 2010;October 27,2010
2010;Q4 2010;October 2010;October 28,2010
2010;Q4 2010;October 2010;October 29,2010
2010;Q4 2010;October 2010;October 30,2010
2010;Q4 2010;October 2010;October 31,2010
2010;Q4 2010;November 2010;November 1,2010
2010;Q4 2010;November 2010;November 2,2010
2010;Q4 2010;November 2010;November 3,2010
2010;Q4 2010;November 2010;November 4,2010
2010;Q4 2010;November 2010;November 5,2010
2010;Q4 2010;November 2010;November 6,2010
2010;Q4 2010;November 2010;November 7,2010
2010;Q4 2010;November 2010;November 8,2010
2010;Q4 2010;November 2010;November 9,2010
2010;Q4 2010;November 2010;November 10,2010
2010;Q4 2010;November 2010;November 11,2010
2010;Q4 2010;November 2010;November 12,2010
2010;Q4 2010;November 2010;November 13,2010
2010;Q4 2010;November 2010;November 14,2010
2010;Q4 2010;November 2010;November 15,2010
2010;Q4 2010;November 2010;November 16,2010
2010;Q4 2010;November 2010;November 17,2010
2010;Q4 2010;November 2010;November 18,2010
2010;Q4 2010;November 2010;November 19,2010
2010;Q4 2010;November 2010;November 20,2010
2010;Q4 2010;November 2010;November 21,2010
2010;Q4 2010;November 2010;November 22,2010
2010;Q4 2010;November 2010;November 23,2010
2010;Q4 2010;November 2010;November 24,2010
2010;Q4 2010;November 2010;November 25,2010
2010;Q4 2010;November 2010;November 26,2010
2010;Q4 2010;November 2010;November 27,2010
2010;Q4 2010;November 2010;November 28,2010
2010;Q4 2010;November 2010;November 29,2010
2010;Q4 2010;November 2010;November 30,2010
2010;Q4 2010;December 2010;December 1,2010
2010;Q4 2010;December 2010;December 2,2010
2010;Q4 2010;December 2010;December 3,2010
2010;Q4 2010;December 2010;December 4,2010
2010;Q4 2010;December 2010;December 5,2010
2010;Q4 2010;December 2010;December 6,2010
2010;Q4 2010;December 2010;December 7,2010
2010;Q4 2010;December 2010;December 8,2010
2010;Q4 2010;December 2010;December 9,2010
2010;Q4 2010;December 2010;December 10,2010
2010;Q4 2010;December 2010;December 11,2010
2010;Q4 2010;December 2010;December 12,2010
2010;Q4 2010;December 2010;December 13,2010
2010;Q4 2010;December 2010;December 14,2010
2010;Q4 2010;December 2010;December 15,2010
2010;Q4 2010;December 2010;December 16,2010
2010;Q4 2010;December 2010;December 17,2010
2010;Q4 2010;December 2010;December 18,2010
2010;Q4 2010;December 2010;December 19,2010
2010;Q4 2010;December 2010;December 20,2010
2010;Q4 2010;December 2010;December 21,2010
2010;Q4 2010;December 2010;December 22,2010
2010;Q4 2010;December 2010;December 23,2010
2010;Q4 2010;December 2010;December 24,2010
2010;Q4 2010;December 2010;December 25,2010
2010;Q4 2010;December 2010;December 26,2010
2010;Q4 2010;December 2010;December 27,2010
2010;Q4 2010;December 2010;December 28,2010
2010;Q4 2010;December 2010;December 29,2010
2010;Q4 2010;December 2010;December 30,2010
2010;Q4 2010;December 2010;December 31,2010
2011;Q1 2011;January 2011;January 1,2011
2011;Q1 2011;January 2011;January 2,2011
2011;Q1 2011;January 2011;January 3,2011
2011;Q1 2011;January 2011;January 4,2011
2011;Q1 2011;January 2011;January 5,2011
2011;Q1 2011;January 2011;January 6,2011
2011;Q1 2011;January 2011;January 7,2011
2011;Q1 2011;January 2011;January 8,2011
2011;Q1 2011;January 2011;January 9,2011
2011;Q1 2011;January 2011;January 10,2011
2011;Q1 2011;January 2011;January 11,2011
2011;Q1 2011;January 2011;January 12,2011
2011;Q1 2011;January 2011;January 13,2011
2011;Q1 2011;January 2011;January 14,2011
2011;Q1 2011;January 2011;January 15,2011
2011;Q1 2011;January 2011;January 16,2011
2011;Q1 2011;January 2011;January 17,2011
2011;Q1 2011;January 2011;January 18,2011
2011;Q1 2011;January 2011;January 19,2011
2011;Q1 2011;January 2011;January 20,2011
2011;Q1 2011;January 2011;January 21,2011
2011;Q1 2011;January 2011;January 22,2011
2011;Q1 2011;January 2011;January 23,2011
2011;Q1 2011;January 2011;January 24,2011
2011;Q1 2011;January 2011;January 25,2011
2011;Q1 2011;January 2011;January 26,2011
2011;Q1 2011;January 2011;January 27,2011
2011;Q1 2011;January 2011;January 28,2011
2011;Q1 2011;January 2011;January 29,2011
2011;Q1 2011;January 2011;January 30,2011
2011;Q1 2011;January 2011;January 31,2011
2011;Q1 2011;February 2011;February 1,2011
2011;Q1 2011;February 2011;February 2,2011
2011;Q1 2011;February 2011;February 3,2011
2011;Q1 2011;February 2011;February 4,2011
2011;Q1 2011;February 2011;February 5,2011
2011;Q1 2011;February 2011;February 6,2011
2011;Q1 2011;February 2011;February 7,2011
2011;Q1 2011;February 2011;February 8,2011
2011;Q1 2011;February 2011;February 9,2011
2011;Q1 2011;February 2011;February 10,2011
2011;Q1 2011;February 2011;February 11,2011
2011;Q1 2011;February 2011;February 12,2011
2011;Q1 2011;February 2011;February 13,2011
2011;Q1 2011;February 2011;February 14,2011
2011;Q1 2011;February 2011;February 15,2011
2011;Q1 2011;February 2011;February 16,2011
2011;Q1 2011;February 2011;February 17,2011
2011;Q1 2011;February 2011;February 18,2011
2011;Q1 2011;February 2011;February 19,2011
2011;Q1 2011;February 2011;February 20,2011
2011;Q1 2011;February 2011;February 21,2011
2011;Q1 2011;February 2011;February 22,2011
2011;Q1 2011;February 2011;February 23,2011
2011;Q1 2011;February 2011;February 24,2011
2011;Q1 2011;February 2011;February 25,2011
2011;Q1 2011;February 2011;February 26,2011
2011;Q1 2011;February 2011;February 27,2011
2011;Q1 2011;February 2011;February 28,2011
2011;Q1 2011;March 2011;March 1,2011
2011;Q1 2011;March 2011;March 2,2011
2011;Q1 2011;March 2011;March 3,2011
2011;Q1 2011;March 2011;March 4,2011
2011;Q1 2011;March 2011;March 5,2011
2011;Q1 2011;March 2011;March 6,2011
2011;Q1 2011;March 2011;March 7,2011
2011;Q1 2011;March 2011;March 8,2011
2011;Q1 2011;March 2011;March 9,2011
2011;Q1 2011;March 2011;March 10,2011
2011;Q1 2011;March 2011;March 11,2011
2011;Q1 2011;March 2011;March 12,2011
2011;Q1 2011;March 2011;March 13,2011
2011;Q1 2011;March 2011;March 14,2011
2011;Q1 2011;March 2011;March 15,2011
2011;Q1 2011;March 2011;March 16,2011
2011;Q1 2011;March 2011;March 17,2011
2011;Q1 2011;March 2011;March 18,2011
2011;Q1 2011;March 2011;March 19,2011
2011;Q1 2011;March 2011;March 20,2011
2011;Q1 2011;March 2011;March 21,2011
2011;Q1 2011;March 2011;March 22,2011
2011;Q1 2011;March 2011;March 23,2011
2011;Q1 2011;March 2011;March 24,2011
2011;Q1 2011;March 2011;March 25,2011
2011;Q1 2011;March 2011;March 26,2011
2011;Q1 2011;March 2011;March 27,2011
2011;Q1 2011;March 2011;March 28,2011
2011;Q1 2011;March 2011;March 29,2011
2011;Q1 2011;March 2011;March 30,2011
2011;Q1 2011;March 2011;March 31,2011
2011;Q2 2011;April 2011;April 1,2011
2011;Q2 2011;April 2011;April 2,2011
2011;Q2 2011;April 2011;April 3,2011
2011;Q2 2011;April 2011;April 4,2011
2011;Q2 2011;April 2011;April 5,2011
2011;Q2 2011;April 2011;April 6,2011
2011;Q2 2011;April 2011;April 7,2011
2011;Q2 2011;April 2011;April 8,2011
2011;Q2 2011;April 2011;April 9,2011
2011;Q2 2011;April 2011;April 10,2011
2011;Q2 2011;April 2011;April 11,2011
2011;Q2 2011;April 2011;April 12,2011
2011;Q2 2011;April 2011;April 13,2011
2011;Q2 2011;April 2011;April 14,2011
2011;Q2 2011;April 2011;April 15,2011
2011;Q2 2011;April 2011;April 16,2011
2011;Q2 2011;April 2011;April 17,2011
2011;Q2 2011;April 2011;April 18,2011
2011;Q2 2011;April 2011;April 19,2011
2011;Q2 2011;April 2011;April 20,2011
2011;Q2 2011;April 2011;April 21,2011
2011;Q2 2011;April 2011;April 22,2011
2011;Q2 2011;April 2011;April 23,2011
2011;Q2 2011;April 2011;April 24,2011
2011;Q2 2011;April 2011;April 25,2011
2011;Q2 2011;April 2011;April 26,2011
2011;Q2 2011;April 2011;April 27,2011
2011;Q2 2011;April 2011;April 28,2011
2011;Q2 2011;April 2011;April 29,2011
2011;Q2 2011;April 2011;April 30,2011
2011;Q2 2011;May 2011;May 1,2011
2011;Q2 2011;May 2011;May 2,2011
2011;Q2 2011;May 2011;May 3,2011
2011;Q2 2011;May 2011;May 4,2011
2011;Q2 2011;May 2011;May 5,2011
2011;Q2 2011;May 2011;May 6,2011
2011;Q2 2011;May 2011;May 7,2011
2011;Q2 2011;May 2011;May 8,2011
2011;Q2 2011;May 2011;May 9,2011
2011;Q2 2011;May 2011;May 10,2011
2011;Q2 2011;May 2011;May 11,2011
2011;Q2 2011;May 2011;May 12,2011
2011;Q2 2011;May 2011;May 13,2011
2011;Q2 2011;May 2011;May 14,2011
2011;Q2 2011;May 2011;May 15,2011
2011;Q2 2011;May 2011;May 16,2011
2011;Q2 2011;May 2011;May 17,2011
2011;Q2 2011;May 2011;May 18,2011
2011;Q2 2011;May 2011;May 19,2011
2011;Q2 2011;May 2011;May 20,2011
2011;Q2 2011;May 2011;May 21,2011
2011;Q2 2011;May 2011;May 22,2011
2011;Q2 2011;May 2011;May 23,2011
2011;Q2 2011;May 2011;May 24,2011
2011;Q2 2011;May 2011;May 25,2011
2011;Q2 2011;May 2011;May 26,2011
2011;Q2 2011;May 2011;May 27,2011
2011;Q2 2011;May 2011;May 28,2011
2011;Q2 2011;May 2011;May 29,2011
2011;Q2 2011;May 2011;May 30,2011
2011;Q2 2011;May 2011;May 31,2011
2011;Q2 2011;June 2011;June 1,2011
2011;Q2 2011;June 2011;June 2,2011
2011;Q2 2011;June 2011;June 3,2011
2011;Q2 2011;June 2011;June 4,2011
2011;Q2 2011;June 2011;June 5,2011
2011;Q2 2011;June 2011;June 6,2011
2011;Q2 2011;June 2011;June 7,2011
2011;Q2 2011;June 2011;June 8,2011
2011;Q2 2011;June 2011;June 9,2011
2011;Q2 2011;June 2011;June 10,2011
2011;Q2 2011;June 2011;June 11,2011
2011;Q2 2011;June 2011;June 12,2011
2011;Q2 2011;June 2011;June 13,2011
2011;Q2 2011;June 2011;June 14,2011
2011;Q2 2011;June 2011;June 15,2011
2011;Q2 2011;June 2011;June 16,2011
2011;Q2 2011;June 2011;June 17,2011
2011;Q2 2011;June 2011;June 18,2011
2011;Q2 2011;June 2011;June 19,2011
2011;Q2 2011;June 2011;June 20,2011
2011;Q2 2011;June 2011;June 21,2011
2011;Q2 2011;June 2011;June 22,2011
2011;Q2 2011;June 2011;June 23,2011
2011;Q2 2011;June 2011;June 24,2011
2011;Q2 2011;June 2011;June 25,2011
2011;Q2 2011;June 2011;June 26,2011
2011;Q2 2011;June 2011;June 27,2011
2011;Q2 2011;June 2011;June 28,2011
2011;Q2 2011;June 2011;June 29,2011
2011;Q2 2011;June 2011;June 30,2011
2011;Q3 2011;July 2011;July 1,2011
2011;Q3 2011;July 2011;July 2,2011
2011;Q3 2011;July 2011;July 3,2011
2011;Q3 2011;July 2011;July 4,2011
2011;Q3 2011;July 2011;July 5,2011
2011;Q3 2011;July 2011;July 6,2011
2011;Q3 2011;July 2011;July 7,2011
2011;Q3 2011;July 2011;July 8,2011
2011;Q3 2011;July 2011;July 9,2011
2011;Q3 2011;July 2011;July 10,2011
2011;Q3 2011;July 2011;July 11,2011
2011;Q3 2011;July 2011;July 12,2011
2011;Q3 2011;July 2011;July 13,2011
2011;Q3 2011;July 2011;July 14,2011
2011;Q3 2011;July 2011;July 15,2011
2011;Q3 2011;July 2011;July 16,2011
2011;Q3 2011;July 2011;July 17,2011
2011;Q3 2011;July 2011;July 18,2011
2011;Q3 2011;July 2011;July 19,2011
2011;Q3 2011;July 2011;July 20,2011
2011;Q3 2011;July 2011;July 21,2011
2011;Q3 2011;July 2011;July 22,2011
2011;Q3 2011;July 2011;July 23,2011
2011;Q3 2011;July 2011;July 24,2011
2011;Q3 2011;July 2011;July 25,2011
2011;Q3 2011;July 2011;July 26,2011
2011;Q3 2011;July 2011;July 27,2011
2011;Q3 2011;July 2011;July 28,2011
2011;Q3 2011;July 2011;July 29,2011
2011;Q3 2011;July 2011;July 30,2011
2011;Q3 2011;July 2011;July 31,2011
2011;Q3 2011;August 2011;August 1,2011
2011;Q3 2011;August 2011;August 2,2011
2011;Q3 2011;August 2011;August 3,2011
2011;Q3 2011;August 2011;August 4,2011
2011;Q3 2011;August 2011;August 5,2011
2011;Q3 2011;August 2011;August 6,2011
2011;Q3 2011;August 2011;August 7,2011
2011;Q3 2011;August 2011;August 8,2011
2011;Q3 2011;August 2011;August 9,2011
2011;Q3 2011;August 2011;August 10,2011
2011;Q3 2011;August 2011;August 11,2011
2011;Q3 2011;August 2011;August 12,2011
2011;Q3 2011;August 2011;August 13,2011
2011;Q3 2011;August 2011;August 14,2011
2011;Q3 2011;August 2011;August 15,2011
2011;Q3 2011;August 2011;August 16,2011
2011;Q3 2011;August 2011;August 17,2011
2011;Q3 2011;August 2011;August 18,2011
2011;Q3 2011;August 2011;August 19,2011
2011;Q3 2011;August 2011;August 20,2011
2011;Q3 2011;August 2011;August 21,2011
2011;Q3 2011;August 2011;August 22,2011
2011;Q3 2011;August 2011;August 23,2011
2011;Q3 2011;August 2011;August 24,2011
2011;Q3 2011;August 2011;August 25,2011
2011;Q3 2011;August 2011;August 26,2011
2011;Q3 2011;August 2011;August 27,2011
2011;Q3 2011;August 2011;August 28,2011
2011;Q3 2011;August 2011;August 29,2011
2011;Q3 2011;August 2011;August 30,2011
2011;Q3 2011;August 2011;August 31,2011
2011;Q3 2011;September 2011;September 1,2011
2011;Q3 2011;September 2011;September 2,2011
2011;Q3 2011;September 2011;September 3,2011
2011;Q3 2011;September 2011;September 4,2011
2011;Q3 2011;September 2011;September 5,2011
2011;Q3 2011;September 2011;September 6,2011
2011;Q3 2011;September 2011;September 7,2011
2011;Q3 2011;September 2011;September 8,2011
2011;Q3 2011;September 2011;September 9,2011
2011;Q3 2011;September 2011;September 10,2011
2011;Q3 2011;September 2011;September 11,2011
2011;Q3 2011;September 2011;September 12,2011
2011;Q3 2011;September 2011;September 13,2011
2011;Q3 2011;September 2011;September 14,2011
2011;Q3 2011;September 2011;September 15,2011
2011;Q3 2011;September 2011;September 16,2011
2011;Q3 2011;September 2011;September 17,2011
2011;Q3 2011;September 2011;September 18,2011
2011;Q3 2011;September 2011;September 19,2011
2011;Q3 2011;September 2011;September 20,2011
2011;Q3 2011;September 2011;September 21,2011
2011;Q3 2011;September 2011;September 22,2011
2011;Q3 2011;September 2011;September 23,2011
2011;Q3 2011;September 2011;September 24,2011
2011;Q3 2011;September 2011;September 25,2011
2011;Q3 2011;September 2011;September 26,2011
2011;Q3 2011;September 2011;September 27,2011
2011;Q3 2011;September 2011;September 28,2011
2011;Q3 2011;September 2011;September 29,2011
2011;Q3 2011;September 2011;September 30,2011
2011;Q4 2011;October 2011;October 1,2011
2011;Q4 2011;October 2011;October 2,2011
2011;Q4 2011;October 2011;October 3,2011
2011;Q4 2011;October 2011;October 4,2011
2011;Q4 2011;October 2011;October 5,2011
2011;Q4 2011;October 2011;October 6,2011
2011;Q4 2011;October 2011;October 7,2011
2011;Q4 2011;October 2011;October 8,2011
2011;Q4 2011;October 2011;October 9,2011
2011;Q4 2011;October 2011;October 10,2011
2011;Q4 2011;October 2011;October 11,2011
2011;Q4 2011;October 2011;October 12,2011
2011;Q4 2011;October 2011;October 13,2011
2011;Q4 2011;October 2011;October 14,2011
2011;Q4 2011;October 2011;October 15,2011
2011;Q4 2011;October 2011;October 16,2011
2011;Q4 2011;October 2011;October 17,2011
2011;Q4 2011;October 2011;October 18,2011
2011;Q4 2011;October 2011;October 19,2011
2011;Q4 2011;October 2011;October 20,2011
2011;Q4 2011;October 2011;October 21,2011
2011;Q4 2011;October 2011;October 22,2011
2011;Q4 2011;October 2011;October 23,2011
2011;Q4 2011;October 2011;October 24,2011
2011;Q4 2011;October 2011;October 25,2011
2011;Q4 2011;October 2011;October 26,2011
2011;Q4 2011;October 2011;October 27,2011
2011;Q4 2011;October 2011;October 28,2011
2011;Q4 2011;October 2011;October 29,2011
2011;Q4 2011;October 2011;October 30,2011
2011;Q4 2011;October 2011;October 31,2011
2011;Q4 2011;November 2011;November 1,2011
2011;Q4 2011;November 2011;November 2,2011
2011;Q4 2011;November 2011;November 3,2011
2011;Q4 2011;November 2011;November 4,2011
2011;Q4 2011;November 2011;November 5,2011
2011;Q4 2011;November 2011;November 6,2011
2011;Q4 2011;November 2011;November 7,2011
2011;Q4 2011;November 2011;November 8,2011
2011;Q4 2011;November 2011;November 9,2011
2011;Q4 2011;November 2011;November 10,2011
2011;Q4 2011;November 2011;November 11,2011
2011;Q4 2011;November 2011;November 12,2011
2011;Q4 2011;November 2011;November 13,2011
2011;Q4 2011;November 2011;November 14,2011
2011;Q4 2011;November 2011;November 15,2011
2011;Q4 2011;November 2011;November 16,2011
2011;Q4 2011;November 2011;November 17,2011
2011;Q4 2011;November 2011;November 18,2011
2011;Q4 2011;November 2011;November 19,2011
2011;Q4 2011;November 2011;November 20,2011
2011;Q4 2011;November 2011;November 21,2011
2011;Q4 2011;November 2011;November 22,2011
2011;Q4 2011;November 2011;November 23,2011
2011;Q4 2011;November 2011;November 24,2011
2011;Q4 2011;November 2011;November 25,2011
2011;Q4 2011;November 2011;November 26,2011
2011;Q4 2011;November 2011;November 27,2011
2011;Q4 2011;November 2011;November 28,2011
2011;Q4 2011;November 2011;November 29,2011
2011;Q4 2011;November 2011;November 30,2011
2011;Q4 2011;December 2011;December 1,2011
2011;Q4 2011;December 2011;December 2,2011
2011;Q4 2011;December 2011;December 3,2011
2011;Q4 2011;December 2011;December 4,2011
2011;Q4 2011;December 2011;December 5,2011
2011;Q4 2011;December 2011;December 6,2011
2011;Q4 2011;December 2011;December 7,2011
2011;Q4 2011;December 2011;December 8,2011
2011;Q4 2011;December 2011;December 9,2011
2011;Q4 2011;December 2011;December 10,2011
2011;Q4 2011;December 2011;December 11,2011
2011;Q4 2011;December 2011;December 12,2011
2011;Q4 2011;December 2011;December 13,2011
2011;Q4 2011;December 2011;December 14,2011
2011;Q4 2011;December 2011;December 15,2011
2011;Q4 2011;December 2011;December 16,2011
2011;Q4 2011;December 2011;December 17,2011
2011;Q4 2011;December 2011;December 18,2011
2011;Q4 2011;December 2011;December 19,2011
2011;Q4 2011;December 2011;December 20,2011
2011;Q4 2011;December 2011;December 21,2011
2011;Q4 2011;December 2011;December 22,2011
2011;Q4 2011;December 2011;December 23,2011
2011;Q4 2011;December 2011;December 24,2011
2011;Q4 2011;December 2011;December 25,2011
2011;Q4 2011;December 2011;December 26,2011
2011;Q4 2011;December 2011;December 27,2011
2011;Q4 2011;December 2011;December 28,2011
2011;Q4 2011;December 2011;December 29,2011
2011;Q4 2011;December 2011;December 30,2011
2011;Q4 2011;December 2011;December 31,2011
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
# -*- encoding: utf8 -*-
from __future__ import absolute_import, division, print_function
import itertools
import os
import re
from os.path import expanduser
from collections import OrderedDict
import numpy as np
import pandas as pd
import pandas.io.sql as psql
from ..tools.config_file_parser import ConfigParser
from ..tools.connection import MyDB
class MdxEngine:
"""
The principal class for executing a query
:param cube_name: Cube name , it must be under cube_folder (example : olapy/cubes/sales)
:param mdx_query: query to execute
"""
CUBE_FOLDER = "cubes"
# (before instantiate MdxEngine I need to access cubes information)
csv_files_cubes = []
postgres_db_cubes = []
# to show just config file's dimensions
dimension_display_name = []
def __init__(self,
cube_name,
cubes_path=None,
mdx_query=None,
cube_folder=CUBE_FOLDER,
sep=';',
fact_table_name="Facts"):
'''
:param cube_folder: parent cube folder name
:param mdx_query: query to execute
:param sep: separator in the csv files
'''
self.cube_folder = cube_folder
self.cube = cube_name
self.sep = sep
self.facts = fact_table_name
self.mdx_query = mdx_query
if cubes_path is None:
self.cube_path = self._get_default_cube_directory()
else:
self.cube_path = cubes_path
# to get cubes in db
self._ = self.get_cubes_names()
self.tables_loaded = self._load_tables()
# all measures
self.measures = self._get_measures()
self.load_star_schema_dataframe = self._get_star_schema_dataframe(
cube_name)
self.tables_names = self._get_tables_name()
# default measure is the first one
self.selected_measures = [self.measures[0]]
@classmethod
def get_cubes_names(cls):
'''
:return: list cubes name under cubes folder
'''
# get csv files folders (cubes)
home_directory = expanduser("~")
location = os.path.join(home_directory, 'olapy-data', cls.CUBE_FOLDER)
try:
MdxEngine.csv_files_cubes = [
file for file in os.listdir(location)
if os.path.isdir(os.path.join(location, file))
]
except:
pass
# get postgres databases
try:
db = MyDB()
cursor = db.connection.cursor()
cursor.execute("""SELECT datname FROM pg_database
WHERE datistemplate = false;""")
MdxEngine.postgres_db_cubes = [
database[0] for database in cursor.fetchall()
]
except:
pass
return MdxEngine.csv_files_cubes + MdxEngine.postgres_db_cubes
def _get_default_cube_directory(self):
home_directory = expanduser("~")
return os.path.join(home_directory, 'olapy-data', self.cube_folder)
def _get_tables_name(self):
return self.tables_loaded.keys()
def _load_table_config_file(self, cube_obj):
"""
load tables from config file
:param cube_obj: cubes object
:return: tables dict with table name as key and dataframe as value
"""
tables = {}
# just one facts table right now
self.facts = cube_obj.facts[0].table_name
db = MyDB(db=self.cube)
for table in cube_obj.dimensions:
value = psql.read_sql_query("SELECT * FROM {0}".format(table.name),
db.connection)
tables[table.name] = value[[
col for col in value.columns if col.lower()[-3:] != '_id'
]]
# update table display name
for dimension in cube_obj.dimensions:
if dimension.displayName and dimension.name and dimension.displayName != dimension.name:
tables[dimension.displayName] = tables[dimension.name][
dimension.columns]
MdxEngine.dimension_display_name.append(dimension.name)
return tables
def _load_tables_csv_files(self):
"""
load tables from csv files
:return: tables dict with table name as key and dataframe as value
"""
tables = {}
cube = self.get_cube()
for file in os.listdir(cube):
# to remove file extension ".csv"
table_name = os.path.splitext(file)[0]
value = pd.read_csv(os.path.join(cube, file), sep=self.sep)
tables[table_name] = value[[
col for col in value.columns if col.lower()[-3:] != '_id'
]]
return tables
def _load_tables_db(self):
"""
load tables from database
:return: tables dict with table name as key and dataframe as value
"""
tables = {}
db = MyDB(db=self.cube)
cursor = db.connection.cursor()
cursor.execute("""SELECT table_name FROM information_schema.tables
WHERE table_schema = 'public'""")
for table_name in cursor.fetchall():
value = psql.read_sql_query(
'SELECT * FROM "{0}" '.format(table_name[0]), db.connection)
tables[table_name[0]] = value[[
col for col in value.columns if col.lower()[-3:] != '_id'
]]
return tables
def _load_tables(self):
"""
load all tables
:return: dict with key as table name and DataFrame as value
"""
config_file_parser = ConfigParser(self.cube_path)
tables = {}
if config_file_parser.config_file_exist(
) and self.cube in config_file_parser.get_cubes_names():
for cubes in config_file_parser.construct_cubes():
# TODO cubes.source == 'csv'
if cubes.source == 'postgres':
tables = self._load_table_config_file(cubes)
elif self.cube in self.csv_files_cubes:
tables = self._load_tables_csv_files()
elif self.cube in self.postgres_db_cubes:
tables = self._load_tables_db()
return tables
def _get_measures(self):
"""
:return: all numerical columns in facts table
"""
# col.lower()[-2:] != 'id' to ignore any id column
return [
col
for col in self.tables_loaded[self.facts].select_dtypes(
include=[np.number]).columns if col.lower()[-2:] != 'id'
]
def _construct_star_schema_config_file(self, cube_name, cubes_obj):
"""
Construct star schema Dataframe from configuration file
:param cube_name: cube name (or database name)
:param cubes_obj: cubes object
:return: star schema Dataframe
"""
self.facts = cubes_obj.facts[0].table_name
db = MyDB(db=cube_name)
# load facts table
fusion = psql.read_sql_query("SELECT * FROM {0}".format(self.facts),
db.connection)
for fact_key, dimension_and_key in cubes_obj.facts[0].keys.items():
df = psql.read_sql_query(
"SELECT * FROM {0}".format(dimension_and_key.split('.')[0]),
db.connection)
fusion = fusion.merge(
df, left_on=fact_key, right_on=dimension_and_key.split('.')[1])
# TODO CHOSE BETWEEN THOSES DF
# if separated dimensions
# fusion = fusion.merge(df, left_on=fact_key,right_on=dimension_and_key.split('.')[1])
# TODO CHOSE BETWEEN THOSES DF
# if facts contains all dimensions
# fusion = facts
# measures in config-file only
if cubes_obj.facts[0].measures:
self.measures = cubes_obj.facts[0].measures
return fusion
def _construct_star_schema_csv_files(self, cube_name):
"""
Construct star schema Dataframe from csv files
:param cube_name: cube name (folder name)
:return: star schema Dataframe
"""
cube = self.get_cube()
# loading facts table
fusion = pd.read_csv(
os.path.join(cube, self.facts + '.csv'), sep=self.sep)
for file_name in os.listdir(cube):
try:
fusion = fusion.merge(
pd.read_csv(os.path.join(cube, file_name), sep=self.sep))
except:
print('No common column')
pass
return fusion
def _construct_star_schema_db(self, cube_name):
"""
Construct star schema Dataframe from database
:param cube_name: cube name (database name)
:return: star schema Dataframe
"""
db = MyDB(db=cube_name)
# load facts table
fusion = psql.read_sql_query('SELECT * FROM "{0}" '.format(self.facts),
db.connection)
cursor = db.connection.cursor()
cursor.execute("""SELECT table_name FROM information_schema.tables
WHERE table_schema = 'public'""")
for db_table_name in cursor.fetchall():
try:
fusion = fusion.merge(
psql.read_sql_query("SELECT * FROM {0}".format(
db_table_name[0]), db.connection))
except:
print('No common column')
pass
return fusion
def _get_star_schema_dataframe(self, cube_name):
'''
:return: all DataFrames merged as star schema
'''
fusion = None
config_file_parser = ConfigParser(self.cube_path)
if config_file_parser.config_file_exist(
) and cube_name in config_file_parser.get_cubes_names():
for cubes in config_file_parser.construct_cubes():
# TODO cubes.source == 'csv'
if cubes.source == 'postgres':
fusion = self._construct_star_schema_config_file(
cube_name, cubes)
elif cube_name in self.csv_files_cubes:
fusion = self._construct_star_schema_csv_files(cube_name)
elif cube_name in self.postgres_db_cubes:
fusion = self._construct_star_schema_db(cube_name)
return fusion[[
col for col in fusion.columns if col.lower()[-3:] != '_id'
]]
def get_all_tables_names(self, ignore_fact=False):
"""
get list of tables names of the cube
:param ignore_fact: return all table name with facts table name
:return: all tables names
"""
if ignore_fact:
return [tab for tab in self.tables_names if self.facts not in tab]
return self.tables_names
def get_cube(self):
"""
get path to the cube (example /home/your_user_name/olapy-core/cubes)
:return: path to the cube
"""
return os.path.join(self.cube_path, self.cube)
# TODO temporary function
def get_tuples(self, query, start=None, stop=None):
# french characters
# or use new regex 2017.02.08
regex = "(\[[\w+\d ]+\](\.\[[\w+\d\.\,\s\_\-\é\ù\è\ù\û\ü\ÿ\\\à\â\æ\ç\é\è\ê\ë\ï\î" \
"\ô\œ\Ù\Û\Ü\Ÿ\À\Â\Æ\Ç\É\È\Ê\Ë\Ï\Î\Ô\Œ\& ]+\])*\.?((Members)|(\[Q\d\]))?)"
if start is not None:
start = query.index(start)
if stop is not None:
stop = query.index(stop)
# clean the query (from All, Members...)
return [[
tup_att.replace('All ', '').replace('[', "").replace("]", "")
for tup_att in tup[0].replace('.Members', '').split('.')
]
for tup in re.compile(regex).findall(
query.encode("utf-8")[start:stop])
if len(tup[0].split('.')) > 1]
# TODO temporary function
def decorticate_query(self, query):
"""
get all tuples that exists in the MDX Query
:param query: MDX Query
:return: all tuples in the query
"""
tuples_on_mdx_query = self.get_tuples(query)
on_rows = []
on_columns = []
on_where = []
# ON ROWS
if 'ON ROWS' in query:
stop = 'ON ROWS'
if 'ON COLUMNS' in query:
start = 'ON COLUMNS'
else:
start = 'SELECT'
on_rows = self.get_tuples(query, start, stop)
# ON COLUMNS
if 'ON COLUMNS' in query:
start = 'SELECT'
stop = 'ON COLUMNS'
on_columns = self.get_tuples(query, start, stop)
# WHERE
if 'WHERE' in query:
start = 'FROM'
on_where = self.get_tuples(query, start)
return {
'all': tuples_on_mdx_query,
'columns': on_columns,
'rows': on_rows,
'where': on_where
}
def change_measures(self, tuples_on_mdx):
"""
set measures to which exists in the query
:param tuples_on_where: list of tuples
example : [ '[Measures].[Amount]' , '[Geography].[Geography].[Continent]' ]
:return: measures columns names
"""
return [
tple[-1] for tple in tuples_on_mdx if tple[0].upper() == "MEASURES"
]
def get_tables_and_columns(self, tuple_as_list):
# TODO update docstring
"""
get used dimensions and columns in the MDX Query (useful for DataFrame -> xmla response transformation)
:param tuple_as_list: list of tuples
example : [ '[Measures].[Amount]' , '[Geography].[Geography].[Continent]' ]
:return: dimension and columns dict
example :
{
Geography : ['Continent','Country'],
Product : ['Company']
Facts : ['Amount','Count']
}
"""
axes = {}
# TODO optimize
for axis, tuples in tuple_as_list.items():
measures = []
tables_columns = OrderedDict()
# if we have measures in columns or rows axes like :
# SELECT {[Measures].[Amount],[Measures].[Count]} ON COLUMNS
# we have to add measures directly to tables_columns
for tupl in tuples:
if tupl[0].upper() == 'MEASURES':
if tupl[-1] not in measures:
measures.append(tupl[-1])
tables_columns.update({self.facts: measures})
else:
continue
else:
tables_columns.update({
tupl[0]:
self.tables_loaded[tupl[0]].columns[:len(tupl[2:])]
})
axes.update({axis: tables_columns})
return axes
def execute_one_tuple(self, tuple_as_list, Dataframe_in, columns_to_keep):
"""
filter a DataFrame (Dataframe_in) with one tuple
Example :
tuple = ['Geograpy','Geograpy','Continent','Europe','France','olapy']
Dataframe_in in =
+-------------+----------+---------+---------+---------+
| Continent | Country | Company | Article | Amount |
+=============+==========+=========+=========+=========+
| America | US | MS | SSAS | 35150 |
+-------------+----------+---------+---------+---------+
| Europe | France | AB | olapy | 41239 |
+-------------+----------+---------+---------+---------+
| ..... | ..... | ...... | ..... | ..... |
+-------------+----------+---------+---------+---------+
out :
+-------------+----------+---------+---------+---------+
| Continent | Country | Company | Article | Amount |
+=============+==========+=========+=========+=========+
| Europe | France | AB | olapy | 41239 |
+-------------+----------+---------+---------+---------+
:param tuple_as_list: tuple as list
:param Dataframe_in: DataFrame in with you want to execute tuple
:param columns_to_keep: (useful for executing many tuples, for instance execute_mdx)
other columns to keep in the execution except the current tuple
:return: Filtered DataFrame
"""
df = Dataframe_in
# tuple_as_list like ['Geograpy','Geograpy','Continent']
# return df with Continent column non empty
if len(tuple_as_list) == 3:
df = df[(df[tuple_as_list[-1]].notnull())]
# tuple_as_list like['Geograpy', 'Geograpy', 'Continent' , 'America','US']
# execute : df[(df['Continent'] == 'America')] and
# df[(df['Country'] == 'US')]
elif len(tuple_as_list) > 3:
for idx, tup_att in enumerate(tuple_as_list[3:]):
# df[(df['Year'] == 2010)]
# 2010 must be as int, otherwise , pandas generate exception
if tup_att.isdigit():
tup_att = int(tup_att)
df = df[(df[self.tables_loaded[tuple_as_list[0]].columns[idx]]
== tup_att)]
cols = list(itertools.chain.from_iterable(columns_to_keep))
return df[cols + self.selected_measures]
def add_missed_column(self, dataframe1, dataframe2):
"""
solution to fix BUG : https://github.com/pandas-dev/pandas/issues/15525
if you want to concat two dataframes with different columns like :
+-------------+---------+
| Continent | Amount |
+=============+=========+
| America | 35150 |
+-------------+---------+
| Europe | 41239 |
+-------------+---------+
and :
+-------------+---------------+---------+
| Continent | Country_code | Amount |
+=============+===============+=========+
| America | 1111 | 35150 |
+-------------+---------------+---------+
result :
+-------------+--------------+---------+
| Continent | Country_code | Amount |
+=============+==============+=========+
| America | 1111.0 |35150 |
+-------------+--------------+---------+
| Europe | NaN |41239 |
+-------------+--------------+---------+
Country_code is converted to float,
so the solution is to add a column to the fist DataFrame filled with -1, thus
+-------------+---------------+---------+
| Continent | Country_code | Amount |
+=============+===============+=========+
| America | -1 | 35150 |
+-------------+---------------+---------+
| Europe | -1 | 41239 |
+-------------+---------------+---------+
and :
+-------------+---------------+---------+
| Continent | Country_code | Amount |
+=============+===============+=========+
| America | 1111 | 35150 |
+-------------+---------------+---------+
result :
+-------------+--------------+---------+
| Continent | Country_code | Amount |
+=============+==============+=========+
| America | 1111 |35150 |
+-------------+--------------+---------+
| Europe | -1 |41239 |
+-------------+--------------+---------+
:return: two DataFrames with same columns
"""
df_with_less_columns = dataframe1
df_with_more_columns = dataframe2
if len(list(dataframe1.columns)) != len(list(dataframe2.columns)):
if len(list(dataframe1.columns)) > len(list(dataframe2.columns)):
df_with_more_columns = dataframe1
df_with_less_columns = dataframe2
missed_columns = [
col for col in list(df_with_more_columns.columns)
if col not in list(df_with_less_columns.columns)
]
for missed_column in missed_columns:
df_with_less_columns[missed_column] = -1
return [df_with_less_columns, df_with_more_columns]
def update_columns_to_keep(self, tuple_as_list, columns_to_keep):
"""
If we have multiple dimensions, with many columns like
columns_to_keep =>
( Geo -> Continent,Country
Prod -> Company
Time -> Year,Month,Day
)
we have to use only dimension's columns of current dimension that exist in tuple_as_list a keep other dimensions
columns
so if tuple_as_list = ['Geography','Geography','Continent']
columns_to_keep will be
columns_to_keep =>
( Geo -> Continent
Prod -> Company
Time -> Year,Month,Day
)
(we need columns_to_keep for grouping our columns in the DataFrame)
:param tuple_as_list: example -> ['Geography','Geography','Continent']
:param columns_to_keep: example -> { 'Geography' : ['Continent','Country'],
'Time' : ['Year','Month','Day']
}
:return: updated columns_to_keep
"""
if len(
tuple_as_list
) == 3 and tuple_as_list[-1] in self.tables_loaded[tuple_as_list[0]].columns:
# in case of [Geography].[Geography].[Country]
cols = [tuple_as_list[-1]]
else:
cols = self.tables_loaded[tuple_as_list[0]].columns[:len(
tuple_as_list[2:])]
columns_to_keep.update({tuple_as_list[0]: cols})
def execute_mdx(self):
"""
execute and MDX Query
usage ::
executer = MdxEngine('sales')
executer.mdx_query = "SELECT FROM [sales] WHERE ([Measures].[Amount])"
executer.execute_mdx()
:return: dict with DataFrame execution result and (dimension and columns used as dict)
{
'result' : DataFrame result
'columns_desc' : dict of dimension and columns used
}
"""
# use measures that exists on where or insides axes
query_axes = self.decorticate_query(self.mdx_query)
if self.change_measures(query_axes['all']):
self.selected_measures = self.change_measures(query_axes['all'])
# get only used columns and dimensions for all query
start_df = self.load_star_schema_dataframe
tables_n_columns = self.get_tables_and_columns(query_axes)
columns_to_keep = OrderedDict(
(table, columns)
for table, columns in tables_n_columns['all'].items()
if table != self.facts)
# if we have measures on axes we have to ignore them
tuples_on_mdx_query = [
tup for tup in query_axes['all'] if tup[0].upper() != 'MEASURES'
]
# if we have tuples in axes
# to avoid prob with query like this: SELECT FROM [Sales] WHERE ([Measures].[Amount])
if tuples_on_mdx_query:
df_to_fusion = []
table_name = tuples_on_mdx_query[0][0]
# in every tuple
for tupl in tuples_on_mdx_query:
# if we have measures in columns or rows axes like :
# SELECT {[Measures].[Amount],[Measures].[Count], [Customers].[Geography].[All Regions]} ON COLUMNS
# we use only used columns for dimension in that tuple and keep other dimension's columns
self.update_columns_to_keep(tupl, columns_to_keep)
# a tuple with new dimension
if tupl[0] != table_name:
# if we change dimension , we have to work on the exection's result on previous DataFrames
# TODO BUG !!! https://github.com/pandas-dev/pandas/issues/15525
# solution 1 .astype(str) ( take a lot of time from execution)
# solution 2 a['ccc'] = "" ( good solution i think ) also it avoid nan values and -1 :D !!
# solution 3 a['ccc'] = -1
# solution 4 finding something with merge
# fix 3 test
df = df_to_fusion[0]
for next_df in df_to_fusion[1:]:
df = pd.concat(self.add_missed_column(df, next_df))
# df = pd.concat(df_to_fusion)
table_name = tupl[0]
df_to_fusion = []
start_df = df
df_to_fusion.append(
self.execute_one_tuple(tupl, start_df,
columns_to_keep.values()))
cols = list(
itertools.chain.from_iterable(columns_to_keep.values()))
# TODO BUG !!! https://github.com/pandas-dev/pandas/issues/15525
# solution 1 .astype(str) ( take a lot of time from execution)
# solution 2 a['ccc'] = "" ( good solution i think ) also it avoid nan values and -1 :D !!
# solution 3 a['ccc'] = -1 (the best)
# solution 4 finding something with merge
# fix 3 test
df = df_to_fusion[0]
for next_df in df_to_fusion[1:]:
df = pd.concat(self.add_missed_column(df, next_df))
# TODO groupby in web demo (remove it for more performance)
# TODO margins=True for columns total !!!!!
return {
'result':
df.groupby(cols).sum()[self.selected_measures],
'columns_desc':
tables_n_columns
}
else:
return {
'result': start_df[self.selected_measures].sum().to_frame().T,
'columns_desc': tables_n_columns
}
# -*- encoding: utf8 -*- from __future__ import absolute_import, division, print_function import itertools import os import re from os.path import expanduser from collections import OrderedDict import numpy as np import pandas as pd import pandas.io.sql as psql from ..tools.config_file_parser import ConfigParser from ..tools.connection import MyDB RUNNING_TOX = 'RUNTING_TOX' in os.environ class MdxEngine: """ The principal class for executing a query :param cube_name: Cube name , it must be under cube_folder (example : olapy/cubes/sales) :param mdx_query: query to execute """ CUBE_FOLDER = "cubes" # (before instantiate MdxEngine I need to access cubes information) csv_files_cubes = [] postgres_db_cubes = [] # to show just config file's dimensions dimension_display_name = [] def __init__(self, cube_name, cubes_path=None, mdx_query=None, cube_folder=CUBE_FOLDER, sep=';', fact_table_name="Facts"): ''' :param cube_folder: parent cube folder name :param mdx_query: query to execute :param sep: separator in the csv files ''' self.cube_folder = cube_folder self.cube = cube_name self.sep = sep self.facts = fact_table_name self.mdx_query = mdx_query if cubes_path is None: self.cube_path = self._get_default_cube_directory() else: self.cube_path = cubes_path # to get cubes in db self._ = self.get_cubes_names() self.tables_loaded = self._load_tables() # all measures self.measures = self._get_measures() self.load_star_schema_dataframe = self._get_star_schema_dataframe( cube_name) self.tables_names = self._get_tables_name() # default measure is the first one self.selected_measures = [self.measures[0]] @classmethod def get_cubes_names(cls): ''' :return: list cubes name under cubes folder ''' # get csv files folders (cubes) if RUNNING_TOX: location = os.path.join( os.path.abspath( os.path.join( os.path.dirname(__file__), "..", "..", "..", "..")), MdxEngine.CUBE_FOLDER) else: home_directory = expanduser("~") location = os.path.join(home_directory, 'olapy-data', cls.CUBE_FOLDER) try: MdxEngine.csv_files_cubes = [ file for file in os.listdir(location) if os.path.isdir(os.path.join(location, file)) ] except: pass # get postgres databases try: db = MyDB() cursor = db.connection.cursor() cursor.execute("""SELECT datname FROM pg_database WHERE datistemplate = false;""") MdxEngine.postgres_db_cubes = [ database[0] for database in cursor.fetchall() ] except: pass return MdxEngine.csv_files_cubes + MdxEngine.postgres_db_cubes def _get_default_cube_directory(self): if RUNNING_TOX: return os.path.join( os.path.abspath( os.path.join( os.path.dirname(__file__), "..", "..", "..", "..")), MdxEngine.CUBE_FOLDER) else: home_directory = expanduser("~") return os.path.join(home_directory, 'olapy-data', self.cube_folder) def _get_tables_name(self): return self.tables_loaded.keys() def _load_table_config_file(self, cube_obj): """ load tables from config file :param cube_obj: cubes object :return: tables dict with table name as key and dataframe as value """ tables = {} # just one facts table right now self.facts = cube_obj.facts[0].table_name db = MyDB(db=self.cube) for table in cube_obj.dimensions: value = psql.read_sql_query("SELECT * FROM {0}".format(table.name), db.connection) tables[table.name] = value[[ col for col in value.columns if col.lower()[-3:] != '_id' ]] # update table display name for dimension in cube_obj.dimensions: if dimension.displayName and dimension.name and dimension.displayName != dimension.name: tables[dimension.displayName] = tables[dimension.name][ dimension.columns] MdxEngine.dimension_display_name.append(dimension.name) return tables def _load_tables_csv_files(self): """ load tables from csv files :return: tables dict with table name as key and dataframe as value """ tables = {} cube = self.get_cube() for file in os.listdir(cube): # to remove file extension ".csv" table_name = os.path.splitext(file)[0] value = pd.read_csv(os.path.join(cube, file), sep=self.sep) tables[table_name] = value[[ col for col in value.columns if col.lower()[-3:] != '_id' ]] return tables def _load_tables_db(self): """ load tables from database :return: tables dict with table name as key and dataframe as value """ tables = {} db = MyDB(db=self.cube) cursor = db.connection.cursor() cursor.execute("""SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'""") for table_name in cursor.fetchall(): value = psql.read_sql_query( 'SELECT * FROM "{0}" '.format(table_name[0]), db.connection) tables[table_name[0]] = value[[ col for col in value.columns if col.lower()[-3:] != '_id' ]] return tables def _load_tables(self): """ load all tables :return: dict with key as table name and DataFrame as value """ config_file_parser = ConfigParser(self.cube_path) tables = {} if config_file_parser.config_file_exist( ) and self.cube in config_file_parser.get_cubes_names(): for cubes in config_file_parser.construct_cubes(): # TODO cubes.source == 'csv' if cubes.source == 'postgres': tables = self._load_table_config_file(cubes) elif self.cube in self.csv_files_cubes: tables = self._load_tables_csv_files() elif self.cube in self.postgres_db_cubes: tables = self._load_tables_db() return tables def _get_measures(self): """ :return: all numerical columns in facts table """ # col.lower()[-2:] != 'id' to ignore any id column return [ col for col in self.tables_loaded[self.facts].select_dtypes( include=[np.number]).columns if col.lower()[-2:] != 'id' ] def _construct_star_schema_config_file(self, cube_name, cubes_obj): """ Construct star schema Dataframe from configuration file :param cube_name: cube name (or database name) :param cubes_obj: cubes object :return: star schema Dataframe """ self.facts = cubes_obj.facts[0].table_name db = MyDB(db=cube_name) # load facts table fusion = psql.read_sql_query("SELECT * FROM {0}".format(self.facts), db.connection) for fact_key, dimension_and_key in cubes_obj.facts[0].keys.items(): df = psql.read_sql_query( "SELECT * FROM {0}".format(dimension_and_key.split('.')[0]), db.connection) fusion = fusion.merge( df, left_on=fact_key, right_on=dimension_and_key.split('.')[1]) # TODO CHOSE BETWEEN THOSES DF # if separated dimensions # fusion = fusion.merge(df, left_on=fact_key,right_on=dimension_and_key.split('.')[1]) # TODO CHOSE BETWEEN THOSES DF # if facts contains all dimensions # fusion = facts # measures in config-file only if cubes_obj.facts[0].measures: self.measures = cubes_obj.facts[0].measures return fusion def _construct_star_schema_csv_files(self, cube_name): """ Construct star schema Dataframe from csv files :param cube_name: cube name (folder name) :return: star schema Dataframe """ cube = self.get_cube() # loading facts table fusion = pd.read_csv( os.path.join(cube, self.facts + '.csv'), sep=self.sep) for file_name in os.listdir(cube): try: fusion = fusion.merge( pd.read_csv(os.path.join(cube, file_name), sep=self.sep)) except: print('No common column') pass return fusion def _construct_star_schema_db(self, cube_name): """ Construct star schema Dataframe from database :param cube_name: cube name (database name) :return: star schema Dataframe """ db = MyDB(db=cube_name) # load facts table fusion = psql.read_sql_query('SELECT * FROM "{0}" '.format(self.facts), db.connection) cursor = db.connection.cursor() cursor.execute("""SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'""") for db_table_name in cursor.fetchall(): try: fusion = fusion.merge( psql.read_sql_query("SELECT * FROM {0}".format( db_table_name[0]), db.connection)) except: print('No common column') pass return fusion def _get_star_schema_dataframe(self, cube_name): ''' :return: all DataFrames merged as star schema ''' fusion = None config_file_parser = ConfigParser(self.cube_path) if config_file_parser.config_file_exist( ) and cube_name in config_file_parser.get_cubes_names(): for cubes in config_file_parser.construct_cubes(): # TODO cubes.source == 'csv' if cubes.source == 'postgres': fusion = self._construct_star_schema_config_file( cube_name, cubes) elif cube_name in self.csv_files_cubes: fusion = self._construct_star_schema_csv_files(cube_name) elif cube_name in self.postgres_db_cubes: fusion = self._construct_star_schema_db(cube_name) return fusion[[ col for col in fusion.columns if col.lower()[-3:] != '_id' ]] def get_all_tables_names(self, ignore_fact=False): """ get list of tables names of the cube :param ignore_fact: return all table name with facts table name :return: all tables names """ if ignore_fact: return [tab for tab in self.tables_names if self.facts not in tab] return self.tables_names def get_cube(self): """ get path to the cube (example /home/your_user_name/olapy-core/cubes) :return: path to the cube """ return os.path.join(self.cube_path, self.cube) # TODO temporary function def get_tuples(self, query, start=None, stop=None): # french characters # or use new regex 2017.02.08 regex = "(\[[\w+\d ]+\](\.\[[\w+\d\.\,\s\_\-\é\ù\è\ù\û\ü\ÿ\€\’\à\â\æ\ç\é\è\ê\ë\ï\î" \ "\ô\œ\Ù\Û\Ü\Ÿ\À\Â\Æ\Ç\É\È\Ê\Ë\Ï\Î\Ô\Œ\& ]+\])*\.?((Members)|(\[Q\d\]))?)" if start is not None: start = query.index(start) if stop is not None: stop = query.index(stop) # clean the query (from All, Members...) return [[ tup_att.replace('All ', '').replace('[', "").replace("]", "") for tup_att in tup[0].replace('.Members', '').split('.') ] for tup in re.compile(regex).findall( query.encode("utf-8")[start:stop]) if len(tup[0].split('.')) > 1] # TODO temporary function def decorticate_query(self, query): """ get all tuples that exists in the MDX Query :param query: MDX Query :return: all tuples in the query """ tuples_on_mdx_query = self.get_tuples(query) on_rows = [] on_columns = [] on_where = [] # ON ROWS if 'ON ROWS' in query: stop = 'ON ROWS' if 'ON COLUMNS' in query: start = 'ON COLUMNS' else: start = 'SELECT' on_rows = self.get_tuples(query, start, stop) # ON COLUMNS if 'ON COLUMNS' in query: start = 'SELECT' stop = 'ON COLUMNS' on_columns = self.get_tuples(query, start, stop) # WHERE if 'WHERE' in query: start = 'FROM' on_where = self.get_tuples(query, start) return { 'all': tuples_on_mdx_query, 'columns': on_columns, 'rows': on_rows, 'where': on_where } def change_measures(self, tuples_on_mdx): """ set measures to which exists in the query :param tuples_on_where: list of tuples example : [ '[Measures].[Amount]' , '[Geography].[Geography].[Continent]' ] :return: measures columns names """ return [ tple[-1] for tple in tuples_on_mdx if tple[0].upper() == "MEASURES" ] def get_tables_and_columns(self, tuple_as_list): # TODO update docstring """ get used dimensions and columns in the MDX Query (useful for DataFrame -> xmla response transformation) :param tuple_as_list: list of tuples example : [ '[Measures].[Amount]' , '[Geography].[Geography].[Continent]' ] :return: dimension and columns dict example : { Geography : ['Continent','Country'], Product : ['Company'] Facts : ['Amount','Count'] } """ axes = {} # TODO optimize for axis, tuples in tuple_as_list.items(): measures = [] tables_columns = OrderedDict() # if we have measures in columns or rows axes like : # SELECT {[Measures].[Amount],[Measures].[Count]} ON COLUMNS # we have to add measures directly to tables_columns for tupl in tuples: if tupl[0].upper() == 'MEASURES': if tupl[-1] not in measures: measures.append(tupl[-1]) tables_columns.update({self.facts: measures}) else: continue else: tables_columns.update({ tupl[0]: self.tables_loaded[tupl[0]].columns[:len(tupl[2:])] }) axes.update({axis: tables_columns}) return axes def execute_one_tuple(self, tuple_as_list, Dataframe_in, columns_to_keep): """ filter a DataFrame (Dataframe_in) with one tuple Example : tuple = ['Geograpy','Geograpy','Continent','Europe','France','olapy'] Dataframe_in in = +-------------+----------+---------+---------+---------+ | Continent | Country | Company | Article | Amount | +=============+==========+=========+=========+=========+ | America | US | MS | SSAS | 35150 | +-------------+----------+---------+---------+---------+ | Europe | France | AB | olapy | 41239 | +-------------+----------+---------+---------+---------+ | ..... | ..... | ...... | ..... | ..... | +-------------+----------+---------+---------+---------+ out : +-------------+----------+---------+---------+---------+ | Continent | Country | Company | Article | Amount | +=============+==========+=========+=========+=========+ | Europe | France | AB | olapy | 41239 | +-------------+----------+---------+---------+---------+ :param tuple_as_list: tuple as list :param Dataframe_in: DataFrame in with you want to execute tuple :param columns_to_keep: (useful for executing many tuples, for instance execute_mdx) other columns to keep in the execution except the current tuple :return: Filtered DataFrame """ df = Dataframe_in # tuple_as_list like ['Geograpy','Geograpy','Continent'] # return df with Continent column non empty if len(tuple_as_list) == 3: df = df[(df[tuple_as_list[-1]].notnull())] # tuple_as_list like['Geograpy', 'Geograpy', 'Continent' , 'America','US'] # execute : df[(df['Continent'] == 'America')] and # df[(df['Country'] == 'US')] elif len(tuple_as_list) > 3: for idx, tup_att in enumerate(tuple_as_list[3:]): # df[(df['Year'] == 2010)] # 2010 must be as int, otherwise , pandas generate exception if tup_att.isdigit(): tup_att = int(tup_att) df = df[(df[self.tables_loaded[tuple_as_list[0]].columns[idx]] == tup_att)] cols = list(itertools.chain.from_iterable(columns_to_keep)) return df[cols + self.selected_measures] def add_missed_column(self, dataframe1, dataframe2): """ solution to fix BUG : https://github.com/pandas-dev/pandas/issues/15525 if you want to concat two dataframes with different columns like : +-------------+---------+ | Continent | Amount | +=============+=========+ | America | 35150 | +-------------+---------+ | Europe | 41239 | +-------------+---------+ and : +-------------+---------------+---------+ | Continent | Country_code | Amount | +=============+===============+=========+ | America | 1111 | 35150 | +-------------+---------------+---------+ result : +-------------+--------------+---------+ | Continent | Country_code | Amount | +=============+==============+=========+ | America | 1111.0 |35150 | +-------------+--------------+---------+ | Europe | NaN |41239 | +-------------+--------------+---------+ Country_code is converted to float, so the solution is to add a column to the fist DataFrame filled with -1, thus +-------------+---------------+---------+ | Continent | Country_code | Amount | +=============+===============+=========+ | America | -1 | 35150 | +-------------+---------------+---------+ | Europe | -1 | 41239 | +-------------+---------------+---------+ and : +-------------+---------------+---------+ | Continent | Country_code | Amount | +=============+===============+=========+ | America | 1111 | 35150 | +-------------+---------------+---------+ result : +-------------+--------------+---------+ | Continent | Country_code | Amount | +=============+==============+=========+ | America | 1111 |35150 | +-------------+--------------+---------+ | Europe | -1 |41239 | +-------------+--------------+---------+ :return: two DataFrames with same columns """ df_with_less_columns = dataframe1 df_with_more_columns = dataframe2 if len(list(dataframe1.columns)) != len(list(dataframe2.columns)): if len(list(dataframe1.columns)) > len(list(dataframe2.columns)): df_with_more_columns = dataframe1 df_with_less_columns = dataframe2 missed_columns = [ col for col in list(df_with_more_columns.columns) if col not in list(df_with_less_columns.columns) ] for missed_column in missed_columns: df_with_less_columns[missed_column] = -1 return [df_with_less_columns, df_with_more_columns] def update_columns_to_keep(self, tuple_as_list, columns_to_keep): """ If we have multiple dimensions, with many columns like columns_to_keep => ( Geo -> Continent,Country Prod -> Company Time -> Year,Month,Day ) we have to use only dimension's columns of current dimension that exist in tuple_as_list a keep other dimensions columns so if tuple_as_list = ['Geography','Geography','Continent'] columns_to_keep will be columns_to_keep => ( Geo -> Continent Prod -> Company Time -> Year,Month,Day ) (we need columns_to_keep for grouping our columns in the DataFrame) :param tuple_as_list: example -> ['Geography','Geography','Continent'] :param columns_to_keep: example -> { 'Geography' : ['Continent','Country'], 'Time' : ['Year','Month','Day'] } :return: updated columns_to_keep """ if len( tuple_as_list ) == 3 and tuple_as_list[-1] in self.tables_loaded[tuple_as_list[0]].columns: # in case of [Geography].[Geography].[Country] cols = [tuple_as_list[-1]] else: cols = self.tables_loaded[tuple_as_list[0]].columns[:len( tuple_as_list[2:])] columns_to_keep.update({tuple_as_list[0]: cols}) def execute_mdx(self): """ execute and MDX Query usage :: executer = MdxEngine('sales') executer.mdx_query = "SELECT FROM [sales] WHERE ([Measures].[Amount])" executer.execute_mdx() :return: dict with DataFrame execution result and (dimension and columns used as dict) { 'result' : DataFrame result 'columns_desc' : dict of dimension and columns used } """ # use measures that exists on where or insides axes query_axes = self.decorticate_query(self.mdx_query) if self.change_measures(query_axes['all']): self.selected_measures = self.change_measures(query_axes['all']) # get only used columns and dimensions for all query start_df = self.load_star_schema_dataframe tables_n_columns = self.get_tables_and_columns(query_axes) columns_to_keep = OrderedDict( (table, columns) for table, columns in tables_n_columns['all'].items() if table != self.facts) # if we have measures on axes we have to ignore them tuples_on_mdx_query = [ tup for tup in query_axes['all'] if tup[0].upper() != 'MEASURES' ] # if we have tuples in axes # to avoid prob with query like this: SELECT FROM [Sales] WHERE ([Measures].[Amount]) if tuples_on_mdx_query: df_to_fusion = [] table_name = tuples_on_mdx_query[0][0] # in every tuple for tupl in tuples_on_mdx_query: # if we have measures in columns or rows axes like : # SELECT {[Measures].[Amount],[Measures].[Count], [Customers].[Geography].[All Regions]} ON COLUMNS # we use only used columns for dimension in that tuple and keep other dimension's columns self.update_columns_to_keep(tupl, columns_to_keep) # a tuple with new dimension if tupl[0] != table_name: # if we change dimension , we have to work on the exection's result on previous DataFrames # TODO BUG !!! https://github.com/pandas-dev/pandas/issues/15525 # solution 1 .astype(str) ( take a lot of time from execution) # solution 2 a['ccc'] = "" ( good solution i think ) also it avoid nan values and -1 :D !! # solution 3 a['ccc'] = -1 # solution 4 finding something with merge # fix 3 test df = df_to_fusion[0] for next_df in df_to_fusion[1:]: df = pd.concat(self.add_missed_column(df, next_df)) # df = pd.concat(df_to_fusion) table_name = tupl[0] df_to_fusion = [] start_df = df df_to_fusion.append( self.execute_one_tuple(tupl, start_df, columns_to_keep.values())) cols = list( itertools.chain.from_iterable(columns_to_keep.values())) # TODO BUG !!! https://github.com/pandas-dev/pandas/issues/15525 # solution 1 .astype(str) ( take a lot of time from execution) # solution 2 a['ccc'] = "" ( good solution i think ) also it avoid nan values and -1 :D !! # solution 3 a['ccc'] = -1 (the best) # solution 4 finding something with merge # fix 3 test df = df_to_fusion[0] for next_df in df_to_fusion[1:]: df = pd.concat(self.add_missed_column(df, next_df)) # TODO groupby in web demo (remove it for more performance) # TODO margins=True for columns total !!!!! return { 'result': df.groupby(cols).sum()[self.selected_measures], 'columns_desc': tables_n_columns } else: return { 'result': start_df[self.selected_measures].sum().to_frame().T, 'columns_desc': tables_n_columns }
\ No newline at end of file
......
......@@ -11,5 +11,5 @@ commands=
pip install -q -r requirements.txt
; https://bitbucket.org/hpk42/tox/issues/327/toxworkdir-does-not-expanduser-properly
; pytest tests
pytest tests
make lint
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment