我有CSV中的交易数据,其中包含客户ID、交易金额、交易日期等列。我有一个函数,它接受
transactions\u csv\u file\u path作为字符串,N作为整数作为参数。我想从事务数据中返回最好的N个客户。注:
[最佳客户为连续每日付款时间最长的客户]`。我可以阅读CSV,如下所示:
public static string[,] ProcessCSV(string file_path, int n)
{
List<string> transData = new List<string>();
using (StreamReader sr = new StreamReader(file_path))
{
string strResult = sr.ReadToEnd();
var values = strResult.Split(',');
transData.Add(values[0]);
transData.Add(values[1]);
}
return transData.ToArray();
}
如何从CSV获取阵列数据,并以最长的连续日付款周期获得最佳的N个客户ID?
要考虑:将连续的每日付款定义为每个日历日至少1笔交易。如果有任何联系,请使用升序来打破联系。例如,K20003在K20005
之前
我可能会提出一种计算最长运行长度的方法:
int MaxRun(IEnumerable<DateTime> ds){
int max = 0;
int current = 0;
var prev = DateTime.MinValue;
foreach(var d in ds.Distinct().OrderBy(x => x)){
if((d - prev).Days == 1)
current++;
else
current = 0;
prev = d;
if(current > max)
max = current;
}
return max;
}
然后使用一点LINQ将人员分组,计算maxrun,按maxrun命令传输,并输出人员:
transactions
.GroupBy(t => t.Customer, t => t.TransactionDate )
.Select(g => new { g.Key, MR = MaxRun(g) })
.OrderBy(at => at.MR)
.ThenBy(at => at.Key)
.Select(at => at.Key)
.ToArray()