Selam Arkadaşlar ,
İş amaçlı D dilini kullanma fırsatı buldum. Ali Hocamızınki gibi güzel olmadı tabi, ben dahil olmak üzere kod çok beğenilmedi.
"Hacim ağırlık ortalama fiyat(vwap diyolar)" diye bir şey varmış arkadaşlar örnekle anlatacak olursam diyelimki bir elma 5 lira ve ben bu elmadan 20 tane aldım sonra aynı gün bu elmadan 10 tane fakat bu sefer 8 liraya aldım. Burumda bu "vwap" dediğimiz şey 520 + 810 / 30 = 6, 6 olarak hesaplanıyor.
Elimizdeki data ".csv" formatında ve şuna benziyor ama bir sürü satır var
2013-12-16;DE0009652388;FESX;FUT ON EURO STOXX 50;EUREX;EUR;;EU0009658145;F;2013-12;2013-12-20;0.00;0.00;0;0;N;;11:26:26.220000;0;XX;2957.00;2;N
2013-12-16;DE0009652388;FESX;FUT ON EURO STOXX 50;EUREX;EUR;;EU0009658145;F;2013-13;2013-12-20;0.00;0.00;0;0;N;;10:56:24.580000;0;XX;2943.00;10;N
2013-12-16;DE0009652388;FESX;FUT ON EURO STOXX 50;EUREX;EUR;;EU0009658145;F;2013-14;2013-12-20;0.00;0.00;0;0;N;;17:25:00.410000;0;XX;2972.00;1;N
Miktar 21.(sondan 1.) sıradaki sırayla 2,10 ve 1 olan alanlar.
Fiyat 20. sıradaki alanlar sırayla 2957, 2943 ve 2972.
Bu değeri değişik günler için hesaplamız gerekiyor ve tarihte 10. sıradaki 2013-12-20 değerindeki alan. Benim gönderdiğim örnekte sadece 3 satır ve 1 tane tarih var fakat benim parse etmem beklenen dosyada değişik tarihler vardı yüzbinlerce satır vardı.
Ben bu isteği D ile şöyle gerçekleştirmeye çalıştım.
import std.stdio;
import std.getopt;
import std.string;
import std.range;
import std.typecons;
import std.conv;
import std.algorithm;
import std.file;
string data = "5202-dod_FESX_20131216.csv";
alias totalCostAmountPair = Tuple!(double, int);
totalCostAmountPair[ dstring ] totalCostAndAmountForEachDate;
int main(string[] argv)
{
auto helpInformation = getopt( argv, "file", &data);
if (helpInformation.helpWanted)
{
defaultGetoptPrinter(" Only valid input is the fileName ",
helpInformation.options);
return 0;
}
if ( !exists(data) || !isFile(data) )
{
writeln( "Please make sure the file exists" );
return 0;
}
auto file = File(data, "r");
auto dateAmountPriceTupleList = file.byLine().
map!(a => to!dstring(a).split(";")).
map!(a => a.indexed([10,20,21])).array();
foreach ( dataTriple ; dateAmountPriceTupleList )
{
auto cost = to!double(dataTriple[1]);
auto amount = to!int(dataTriple[2]);
auto curValPtr = dataTriple[0] in totalCostAndAmountForEachDate;
if ( curValPtr !is null )
{
auto curVal = *curValPtr;
totalCostAndAmountForEachDate[dataTriple[0]] = tuple(curVal[0] + cost * amount, curVal[1] + amount);
}
else
totalCostAndAmountForEachDate[dataTriple[0]] = tuple(cost * amount, amount);
}
foreach ( key ; totalCostAndAmountForEachDate.keys )
{
totalCostAndAmountForEachDate[key][0] /= totalCostAndAmountForEachDate[key][1];
writeln( "VWAP for date: ", key, " is " , totalCostAndAmountForEachDate[key][0] );
}
return 0;
}
Kodum çalıştı ama rangeleri birazda zaman kısıtılaması olduğundan istediğim kadar kullanamadım.
Sizin düşünceleriniz varmıdır?
Sevgiler
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply