English 中文(简体)
“年头”Algorithm需要改进
原标题:"Week of the year" Algorithm needs improvements

我有一个算法,通过从一.csv文档(约3700条线)中读取的数据对数据进行扫描,并评估每一条目中哪一个交易周为当年的每个星期的每个星期的0元数据,并将计算值定为交易周。

它的工作进展良好,但业绩仍然滞后。 这是第3项职能,利用任务。 Invoke。

时间测试的结果。

页: 1

之后:00:23.27

<>>>>>

每个交易周之后加休息时间。 时间有所改善,但仍然缓慢。

新时间:00:15.74

就我们而言,今年的第一周是第1周(而不是0),从该年第一季度到星期日。 如果该年的第一天为星期日,则第1周为一天。

private void SetDefiniteWeeks()
        {
            string FileLoc = FilePath + Market + ".csv";
            string[] Data = File.ReadAllLines(FileLoc);
            var FileData = from D in Data
                           let DataSplit = D.Split( , )
                           select new
                           {
                               Date = DateTime.Parse(DataSplit[0]),
                               ClosingPrice = double.Parse(DataSplit[4])
                           };

            //assign each date to it s relevant week
            TradingWeek TW;
            List<TradingWeek> tradingWeek = new List<TradingWeek>();
            foreach (var pe in FileData)
            {
               // DateTime dt = pe.Date;
                int Year = pe.Date.Year;
                string End_of_Week = "Sunday";
                int WeekCount = 0;

                DateTime LoopDate_Begin = new DateTime(Year,1,1);
                DateTime LoopDate_End = new DateTime(Year,12,31);
                do
                {
                    if (LoopDate_Begin.DayOfWeek.ToString() == End_of_Week)
                    {
                        WeekCount++;
                        if (LoopDate_Begin.DayOfYear > pe.Date.DayOfYear && LoopDate_Begin.DayOfYear < (pe.Date.DayOfYear + 7))
                        {
                            TW = new TradingWeek { Week = WeekCount, Date = pe.Date };
                            tradingWeek.Add(TW);
                            break;
                        }
                    }
                    LoopDate_Begin = LoopDate_Begin.AddDays(1);

                } while (LoopDate_Begin.Date.ToString() != LoopDate_End.Date.ToString());

            }

        }

请提供帮助。

<>>>>>

新的技术评估

00:00:06.686

大有改进。 感谢大家的帮助。

修订后的法典:

    CalendarWeekRule cw = CalendarWeekRule.FirstDay;
    var calendar = CultureInfo.CurrentCulture.Calendar;
    var trad_Week = (from pe in FileData
                        select new TradingWeek
                        {
                        Date = pe.Date,
                        Week = (calendar.GetWeekOfYear(pe.Date, cw,DayOfWeek.Sunday))
                        }).ToList();
最佳回答

不要确定这是你想要的,而是在阅读评论之后,我感觉到这或许会奏效(?)

var calendar = CultureInfo.CurrentCulture.Calendar;
var tradingWeek = (from pe in FileData
                  select new TradingWeek
                  {
                    Date = pe.Date,
                    Week = calendar.GetWeekOfYear(pe.Date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
                  }).ToList();

Edit: 更改为《Week规则》。 第一夫人 自那天起(更是吗?),“OP”正在寻找什么。

问题回答

三个快速想法:

  • 为什么你每次只增加一天,并检查一下,看看它是否在星期日。 肯定在你发现你第一个星期日之后,你可以增加7天,找到下一个星期?

  • 如果你在你开始之前按期命令你pes,那么你就不必在年初重新开张,你可以去你离开的地方。

  • 正如Nicolas所说,在增加交易周之后,会休息。 在你知道答案是什么之后,不需要再到年底。

我猜想你这样说(可能或不可能实际工作,但应当足够接近)

TradingWeek TW;
List<TradingWeek> tradingWeek = new List<TradingWeek>();
string End_of_Week = "Sunday";
var orderedData = FileData.OrderBy(x => x.Date)
DateTime LoopDate_Begin = new DateTime(orderedData[0].Date.Year,1,1);
int WeekCount = 1; 

while (LoopDate_Begin.DayOfWeek.ToString() != End_of_Week)
{
    LoopDate_Begin = LoopDate_Begin.AddDays(1);
}

foreach (var pe in orderedData)
{
    do
    {           
        if (LoopDate_Begin.DayOfYear > pe.Date.DayOfYear && LoopDate_Begin.DayOfYear < (pe.Date.DayOfYear + 7))
        {
            TW = new TradingWeek { Week = WeekCount, Date = pe.Date };
            tradingWeek.Add(TW);
            break;
        }
        WeekCount++;
        LoopDate_Begin = LoopDate_Begin.AddDays(7);

    } while (true); //need to be careful here

}

如果我正确找你的话,你就没有必要在你加入“贸易我们”之后再看一看。

因此,你可以

break;

之后

tradingWeek.Add(TW);

然后,你甚至可以离开。

&& LoopDate_Begin.DayOfYear < (pe.Date.DayOfYear + 7)

由于第一部分只能是一次情况:就您所期望的间隔而言。

您甚至可以采取无休止的做法,把自上周起的天数隔开7天,并做一些清理工作。

您能否直接计算周数,从而完全删除<条码>。 部分内容与接受的答复:here

在“尼拉斯78”答复之后,同样应该做的工作。

int Year = pe.Date.Year;
DateTime Year_Begin = new DateTime(Year,1,1);
int Jan1DayOfWeek = Year_Begin.DayOfWeek;

foreach (var pe in FileData)
{
    int WeekCount = (pe.Date.DayOfYear - Jan1DayOfWeek) % 7 + 1;
    TradingWeek TW = new TradingWeek { Week = WeekCount, Date = pe.Date };
    tradingWeek.Add(TW);
}

视“日O”和“日O年”的计算方式,即从0到1年,以及你如何开展行动,你可能需要把“日Co”计算出一旁。

有一个内在特征,即根据网络的日期进入该年一周。 下面举一个例子,但为了适应你的业务情况,可能需要一些警示:

System.Globalization.CultureInfo myCI = new System.Globalization.CultureInfo("en-US");

int week = myCI.Calendar.GetWeekOfYear(DateTime.Now.ToUniversalTime(), System.Globalization.CalendarWeekRule.FirstFourDayWeek, System.DayOfWeek.Sunday);

你们根本不需要——只是快速计算。 假设年初的一周为第1周,第2周从第一个星期一开始。

List<TradingWeek> tradingWeek = new List<TradingWeek>();
foreach (var pe in FileData)
{
    var date = pe.Date;
    while (date.DayOfWeek != DayOfWeek.Sunday)
        date = date.AddDays(1);
    var week = date.DayOfYear/7+1;
    var TW = new TradingWeek {Week = week, Date = pe.Date};
    tradingWeek.Add(TW);
}




相关问题
How to add/merge several Big O s into one

If I have an algorithm which is comprised of (let s say) three sub-algorithms, all with different O() characteristics, e.g.: algorithm A: O(n) algorithm B: O(log(n)) algorithm C: O(n log(n)) How do ...

Grokking Timsort

There s a (relatively) new sort on the block called Timsort. It s been used as Python s list.sort, and is now going to be the new Array.sort in Java 7. There s some documentation and a tiny Wikipedia ...

Manually implementing high performance algorithms in .NET

As a learning experience I recently tried implementing Quicksort with 3 way partitioning in C#. Apart from needing to add an extra range check on the left/right variables before the recursive call, ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Enumerating All Minimal Directed Cycles Of A Directed Graph

I have a directed graph and my problem is to enumerate all the minimal (cycles that cannot be constructed as the union of other cycles) directed cycles of this graph. This is different from what the ...

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...

热门标签