예제 #1
0
        static void Main(string[] args)
        {
            //Нужно дополнить модель WeatherEvent, создать список этого типа List<>
            //И заполнить его, читая файл с данными построчно через StreamReader
            //Ссылка на файл https://www.kaggle.com/sobhanmoosavi/us-weather-events

            //Написать Linq-запросы, используя синтаксис методов расширений
            //и продублировать его, используя синтаксис запросов
            //(возможно с вкраплениями методов расширений, ибо иногда первого может быть недостаточно)

            //0. Linq - сколько различных городов есть в датасете.
            //1. Сколько записей за каждый из годов имеется в датасете.
            //Потом будут еще запросы
            List <WeatherEvent> We = new List <WeatherEvent>();

            using (StreamReader sr = new StreamReader("WeatherEvents_Jan2016-Dec2020.csv"))
            {
                string line;
                sr.ReadLine();
                while ((line = sr.ReadLine()) != null)
                {
                    string[]     elements = line.Split(',');
                    WeatherEvent we       = new WeatherEvent()
                    {
                        EventId     = elements[0],
                        Type        = (WeatherEventType)Enum.Parse(typeof(WeatherEventType), elements[1]),
                        Severity    = (Severity)Enum.Parse(typeof(Severity), elements[2]),
                        StartTime   = DateTime.Parse(elements[3]),
                        EndTime     = DateTime.Parse(elements[4]),
                        TimeZone    = elements[5],
                        AirportCode = elements[6],
                        LocationLat = elements[7],
                        LocationLng = elements[8],
                        City        = elements[9],
                        County      = elements[10],
                        State       = elements[11],
                        ZipCode     = elements[12]
                    };
                    We.Add(we);
                }
            }
            int[] distinctyears = We.Select(e => e.StartTime).Select(e => e.Year).Distinct().ToArray();
            Console.WriteLine($"Numbers of distinct cities: {NumbersOfDistinctCities(We)}");
            Console.WriteLine(EachYearDataCount(We));
            Console.WriteLine($"Numbers of weather event in 2018: {NumbersOfEventsIn(2018, We)} ");
            Console.WriteLine($"Numbers of state in dataset: {NumbersOfDistinctState(We)}");
            Console.WriteLine($"Numbers of city in dataset: {NumbersOfDistinctCities(We)}");
            Console.WriteLine("Top 3 by rain numbers in different city");
            var RainingDic = DictionaryOfRainingCitiesIn(2019, We).OrderByDescending(e => e.Value).ToList();

            for (int i = 0; i < 3; i++)
            {
                Console.Write($"{i + 1} place : {RainingDic[i].Key}");
                Console.WriteLine($", numbers of rain: {RainingDic[i].Value}");
            }
            foreach (var item in distinctyears)
            {
                Console.WriteLine($"Longest snow in {item} was at {LongestSnowEventIn(item, We)}");
            }
        }
예제 #2
0
        static string LongestSnowEventIn(int year, List <WeatherEvent> wetherEvent)
        {
            WeatherEvent maxSpancity = wetherEvent.Where(e => e.StartTime.Year == year && e.Type == WeatherEventType.Snow)
                                       .OrderByDescending(e => e.EndTime - e.StartTime)
                                       .First();
            var snowTimeSpanDay     = (maxSpancity.EndTime - maxSpancity.StartTime).ToString("%d");
            var snowTimeSpanPrecise = (maxSpancity.EndTime - maxSpancity.StartTime).ToString(@"hh\:mm\:ss");

            return($"{maxSpancity.City} and was continued {snowTimeSpanDay} day(s) {snowTimeSpanPrecise}");
        }
예제 #3
0
        static string LongestSnowEventIn(int year, List <WeatherEvent> we)
        {
            WeatherEvent maxspancity = we.Where(e => e.StartTime.Year == year)
                                       .Where(e => e.Type == WeatherEventType.Snow)
                                       .OrderByDescending(e => e.EndTime - e.StartTime)
                                       .ToList()[0];
            //Or

            /*WeatherEvent maxspancity = (from e in we
             *                          where e.StartTime.Year == year
             *                          orderby e.EndTime - e.StartTime descending).ToList();*/
            string snowtimespanday     = (maxspancity.EndTime - maxspancity.StartTime).ToString("%d");
            string snowtimespanprecise = (maxspancity.EndTime - maxspancity.StartTime).ToString(@"hh\:mm\:ss");

            return($"{maxspancity.City} and was continued {snowtimespanday} day(s) {snowtimespanprecise}");
        }
예제 #4
0
        private static WeatherEvent ConvertFromStringToWeatherEvent(string line, int index)
        {
            var data = line.Split(',');

            if (data.Length != 13)
            {
                throw new ArgumentException($"Invalid data in line {index}!");
            }
            WeatherEvent weatherEvent;

            try
            {
                data[7]      = data[7].Replace('.', ',');
                data[8]      = data[8].Replace('.', ',');
                weatherEvent = new WeatherEvent()
                {
                    EventId     = data[0],
                    Type        = Enum.Parse <WeatherEventType>(data[1]),
                    Severity    = Enum.Parse <Severity>(data[2]),
                    StartTime   = DateTime.Parse(data[3]),
                    EndTime     = DateTime.Parse(data[4]),
                    TimeZone    = data[5],
                    AirportCode = data[6],
                    LocationLat = double.Parse(data[7]),
                    LocationLng = double.Parse(data[8]),
                    City        = data[9],
                    County      = data[10],
                    State       = data[11],
                    ZipCode     = data[12],
                };
            }
            catch
            {
                throw new ArgumentException($"Invalid data in line {index}!");
            }
            return(weatherEvent);
        }
예제 #5
0
        static void Main(string[] args)
        {
            //Нужно дополнить модель WeatherEvent, создать список этого типа List<>
            //И заполнить его, читая файл с данными построчно через StreamReader
            //Ссылка на файл https://www.kaggle.com/sobhanmoosavi/us-weather-events

            //Написать Linq-запросы, используя синтаксис методов расширений
            //и продублировать его, используя синтаксис запросов
            //(возможно с вкраплениями методов расширений, ибо иногда первого может быть недостаточно)

            //0. Linq - сколько различных городов есть в датасете.
            //1. Сколько записей за каждый из годов имеется в датасете.
            //Потом будут еще запросы

            WeatherEvent we = new WeatherEvent()
            {
                EventId   = "W-1",
                Type      = WeatherEventType.Rain,
                Severity  = Severity.Light,
                StartTime = DateTime.Now
            };

            string file_path = "../../../Data.csv";

            List <WeatherEvent> arr = new List <WeatherEvent>();

            using (StreamReader sr = new StreamReader(file_path))
            {
                sr.ReadLine();
                while (!sr.EndOfStream)
                {
                    string inp = sr.ReadLine();
                    arr.Add(new WeatherEvent(inp));
                }
            }

            #region 0. Linq - сколько различных городов есть в датасете

            Console.WriteLine("0. сколько различных городов есть в датасете");
            var cityCnt1 = arr.GroupBy(elem => elem.City).Count();
            Console.WriteLine(cityCnt1);

            var cityCnt2 =
                (from elem in arr
                 group elem by elem.City).Count();
            Console.WriteLine(cityCnt2);

            #endregion

            #region 1.Сколько записей за каждый из годов имеется в датасете.

            Console.WriteLine("\n1.Сколько записей за каждый из годов имеется в датасете.");
            var entryPerYear1 = arr
                                .GroupBy(elem => elem.StartTime.Year)
                                .Select(g => new { Year = g.Key, Quantity = g.Count() });

            entryPerYear1.PrintCollection();

            Console.WriteLine(new string('-', 5));

            var entryPerYear2 =
                from elem in arr
                group elem by elem.StartTime.Year into yearGroup
                select new { Year = yearGroup.Key, Quantity = yearGroup.Count() };

            entryPerYear2.PrintCollection();
            #endregion

            #region 2. Вывести количество зафиксированных природных явлений в Америке в 2018 году

            Console.WriteLine("\n2.Вывести количество зафиксированных природных явлений в Америке в 2018 году");

            var typeCnt1 = arr
                           .Where(elem => elem.StartTime.Year == 2018)
                           .GroupBy(elem => elem.Type)
                           .Count();

            var typeCnt2 = (from elem in arr
                            where elem.StartTime.Year == 2018
                            group elem by elem.Type).Count();

            var TypeInfo =
                from elem in arr
                where elem.StartTime.Year == 2018
                group elem by elem.Type into g
                select new { WeatherEventType = g.Key, Quantity = g.Count() };

            Console.WriteLine(typeCnt1);
            Console.WriteLine(typeCnt2);
            TypeInfo.PrintCollection();
            #endregion

            #region 3.Вывести топ 3 самых дождливых города в 2019 году в порядке убывания количества дождей (вывести город и количество дождей)

            Console.WriteLine("\n3.Вывести топ 3 самых дождливых города в 2019 году в порядке убывания количества дождей");
            var rainCities1 = arr
                              .Where(elem => elem.StartTime.Year == 2019 &&
                                     elem.Type == WeatherEventType.Rain)
                              .GroupBy(elem => elem.City)
                              .Select(g => new { City = g.Key, Quantity = g.Count() })
                              .OrderByDescending(pair => pair.Quantity)
                              .Take(3);

            var rainCities2 =
                (from elem in arr
                 where elem.StartTime.Year == 2019 && elem.Type == WeatherEventType.Rain
                 group elem by elem.City into g
                 select new { City = g.Key, Quantity = g.Count() } into pair
                 orderby pair.Quantity descending
                 select pair).Take(3);

            rainCities1.PrintCollection();

            Console.WriteLine(new string('-', 5));

            rainCities2.PrintCollection();

            #endregion

            #region 4.Вывести данные самых долгих (топ-1) снегопадов в Америке по годам (за каждый из годов) - с какого времени, по какое время, в каком городе

            Console.WriteLine("4.Вывести данные самых долгих снегопадов в Америке по годам");

            var longSnowCol1 = arr
                               .Where(elem => elem.Type == WeatherEventType.Snow)
                               .GroupBy(elem => elem.StartTime.Year)
                               .Select(g => g.OrderByDescending(elem => elem.EndTime - elem.StartTime))
                               .Select(g => new
            {
                g.First().StartTime.Year,
                g.First().StartTime,
                g.First().EndTime,
                g.First().City
            });

            var longSnowCol2 =
                from elem in arr
                where elem.Type == WeatherEventType.Snow
                group elem by elem.StartTime.Year into gr
                select gr.OrderByDescending(elem => elem.EndTime - elem.StartTime) into g
                let f = g.First()
                        select new { f.StartTime.Year, f.StartTime, f.EndTime, f.City };

            longSnowCol1.PrintCollection();

            Console.WriteLine(new string('-', 5));

            longSnowCol2.PrintCollection();

            #endregion
        }
예제 #6
0
파일: Program.cs 프로젝트: su5kk/linqTeam
        static void Main(string[] args)
        {
            List <WeatherEvent> data = new List <WeatherEvent>();

            // Нужно дополнить модель WeatherEvent, создать список этого типа List<>
            // И заполнить его, читая файл с данными построчно через StreamReader
            // Ссылка на файл https://www.kaggle.com/sobhanmoosavi/us-weather-events

            // Написать Linq-запросы, используя синтаксис методов-расширений
            // и продублировать его, используя синтаксис запросов
            // (возможно с вкраплениями методов расширений, ибо иногда первого может быть недостаточно)

            // 0. Linq - сколько различных городов есть в датасете.
            // 1. Сколько записей за каждый из годов имеется в датасете.
            // Потом будут еще запросы

            string path = "C:\\Users\\Tim\\shit\\Desktop\\lessons\\seminars\\30.01.21\\30.01.21\\semLinqTask\\WeatherEvents_Jan2016-Dec2020.csv";

            //string sup = "C:\\Users\\Tim\\shit\\Desktop\\1.txt";
            using (StreamReader streamReader = new StreamReader(File.Open(path, FileMode.Open)))
            {
                streamReader.ReadLine();
                while (!streamReader.EndOfStream)
                {
                    string[]     text         = streamReader.ReadLine().Split(',');
                    WeatherEvent weatherEvent = new WeatherEvent();
                    weatherEvent.EventId = text[0];
                    weatherEvent.Type    = text[1] switch
                    {
                        "Snow" => WeatherEventType.Snow,
                        "Rain" => WeatherEventType.Rain,
                        "Cold" => WeatherEventType.Cold,
                        "Fog" => WeatherEventType.Fog,
                        "Precipitation" => WeatherEventType.Precipitation,
                        "Hail" => WeatherEventType.Hail,
                        "Storm" => WeatherEventType.Storm
                    };
                    weatherEvent.Severity = text[2] switch
                    {
                        "Other" => Severity.Other,
                        "UNK" => Severity.UNK,
                        "Heavy" => Severity.Heavy,
                        "Light" => Severity.Light,
                        "Moderate" => Severity.Moderate,
                        "Severe" => Severity.Severe
                    };

                    weatherEvent.StartTime = DateTime.Parse(text[3]);
                    weatherEvent.EndTime   = DateTime.Parse(text[4]);
                    weatherEvent.TimeZone  = text[5] switch
                    {
                        "US/Mountain" => TimeZoneInfo.FindSystemTimeZoneById("US Mountain Standard Time"),
                        "US/Pacific" => TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"),
                        "US/Central" => TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"),
                        "US/Eastern" => TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time"),
                    };
                    weatherEvent.AirportCode = text[6];
                    weatherEvent.LocationLat = double.Parse(text[7]);
                    weatherEvent.LocationLng = double.Parse(text[8]);
                    weatherEvent.City        = text[9];
                    weatherEvent.County      = text[10];
                    weatherEvent.State       = text[11];
                    try
                    {
                        weatherEvent.ZipCode = int.Parse(text[12]);
                    }
                    catch
                    {
                        weatherEvent.ZipCode = null;
                    }
                    data.Add(weatherEvent);
                }
            }
            // Task 0
            //var cities = new List<string>(data.Select(element => element.City).Distinct());
            //Console.WriteLine(cities.Count);

            // Task 1
            var posts = data.GroupBy(info => info.EndTime.Year).Select(group => new
            {
                Year  = group.Key,
                count = group.Count()
            }).OrderBy(x => x.Year);

            foreach (var post in posts)
            {
                Console.WriteLine($"{post.Year}  {post.count}");
            }
        }
    }
예제 #7
0
        static void Main(string[] args)
        {
            //Нужно дополнить модель WeatherEvent, создать список этого типа List<>
            //И заполнить его, читая файл с данными построчно через StreamReader
            //Ссылка на файл https://www.kaggle.com/sobhanmoosavi/us-weather-events

            //Написать Linq-запросы, используя синтаксис методов расширений
            //и продублировать его, используя синтаксис запросов
            //(возможно с вкраплениями методов расширений, ибо иногда первого может быть недостаточно)

            //0. Linq - сколько различных городов есть в датасете.
            //1. Сколько записей за каждый из годов имеется в датасете.
            //2. Вывести данные самых долгих(топ - 1) снегопадов в Америке по годам(за каждый из годов) - с какого времени, по какое время, в каком городе
            //Потом будут еще запросы

            WeatherEvent we = new WeatherEvent()
            {
                EventId   = "W-1",
                Type      = WeatherEventType.Rain,
                Severity  = Severity.Light,
                StartTime = DateTime.Now
            };
            StreamReader        sr = new StreamReader("../../../table.csv");
            string              curLine;
            List <WeatherEvent> weatherEvents = new List <WeatherEvent>();

            sr.ReadLine();
            while ((curLine = sr.ReadLine()) != null)
            {
                var          props = curLine.Split(',');
                WeatherEvent curWe = new WeatherEvent()
                {
                    EventId     = props[0],
                    Type        = (WeatherEventType)(props[1])[0],
                    Severity    = (Severity)(props[2][0]),
                    StartTime   = DateTime.Parse(props[3].Replace(' ', 'T')),
                    EndTime     = DateTime.Parse(props[4].Replace(' ', 'T')),
                    TimeZone    = (TimeZone)(props[5])[3],
                    AirportCode = props[6],
                    // Делаю на русской локали приходится заменять
                    LocationLat = double.Parse(props[7].Replace('.', ',')),
                    LocationLng = double.Parse(props[8].Replace('.', ',')),
                    City        = props[9],
                    Country     = props[10],
                    State       = props[11],
                    // Zipcode строка потому что где-то с 40080 коды становятся пустыми, потом опять возвращаются
                    ZipCode = props[12]
                };

                weatherEvents.Add(curWe);
            }
            Console.WriteLine($"0.Уникальных городов: {weatherEvents.Select(x => x.City).ToHashSet().Count}");
            Console.WriteLine($"1.Сколько записей за года:");
            var years = WeatherEvent.GetAllYears(weatherEvents);

            foreach (var e in years)
            {
                Console.WriteLine($"{e}: {WeatherEvent.GetYearAmount(weatherEvents, e)}");
            }
            Console.WriteLine($"2.Топ снегопад за каждый год:");
            foreach (var e in years)
            {
                Console.WriteLine($"{e}: {WeatherEvent.GetTopSnowfallByYear(weatherEvents, e)}");
            }
        }