Среднее динамическое вычисление значений с плавающей точкой, используя dask и groupby? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь динамически рассчитать среднее для всех столбцов float64.Конечный пользователь должен иметь возможность фильтровать любые столбцы категорий на диаграмме и получать различные средства для каждого экземпляра.Чтобы достичь этого, я написал нижеприведенный скрипт на Python с использованием функции dask и groupby.

Однако ...

При выполнении groupby для следующих столбцов столбцы объекта исчезаютиз выходного файла CSV в результате агрегации и вычисления среднего по столбцам, содержащим тип float64.В этом примере я использую dask, чтобы прочитать фрейм данных (pandas не подходит из-за большого использования mem) и сохранить выходной файл как CSV.

Типы входных столбцов CSV:

Dtype                   Columns
String (eg. 2018-P01/02) Time Period
Integer Journey Code
Object  Journey Name
Object  Route
Object  Route Name
Object  Area
Object  Area Name
Object  Fuel Type
Float64 Fuel Load
Float64 Mileage
Float64 Odometer Reading
Float64 Delay Minutes

Мой код для чтения / сохранения CSV и выполнения вычисления среднего значения:

import numpy as np
import dask.dataframe as dd
import pandas as pd

filename = "H:\\testing3.csv"
data = dd.read_csv("H:\\testing2.csv")
cols=['Time Period','Journey Code','Journey Name','Route',
      'Route Name','Area','Area Name','Fuel Type']
x = data.groupby(cols).aggregation(['mean'])
x.to_csv(filename, index = False)

Примерисходного набора данных:

Time Period Journey Code    Route   Route Name      Area    Area Name
2018-P01    261803          High    France-Germany   WE       West
2018-P01-02 325429          High    France-Germany   EA      Eastern
2018-P01-02 359343          High    France-Germany   WCS    West Coast South
2018-P01-02 359343          High    France-Germany   WE     West
2018-P01-03 370697          High    France-Germany   WE     West
2018-P01-04 392535          High    France-Germany   EA     Eastern
2018-P01-04 394752          High    France-Germany   WCS    West Coast South
2018-P01-05 408713          High    France-Germany   WE     West

Fuel Type   Fuel Load   Mileage Odometer Reading    Delay Minutes
Diesel         165         6        14567.1               2
Diesel         210        12        98765.8               0
Diesel         210        5         23406.2               0
Diesel         130        10        54418.8               0
Diesel         152.5      37        58838.35              2
Diesel         142        140       63257.9              37.1194012
Diesel         131.5      120       67677.45              0
Diesel         121        13        72097                1.25

Почему столбцы объектов исчезают из результирующего файла CSV и как я могу получить результат, подобный приведенному ниже?

Желаемый вывод (пример в строке 2и 3): нет среднего значения для стартовой линии, но тогда любые будущие значения float64 будут содержать среднее (текущее по отношению к предыдущему).Я разделяю каждый экземпляр отдельно, чтобы получить динамический результат, но любые идеи приветствуются.

    Time Period Journey Code    Route   Route Name  Area    Area Name

    2018-P01-02                 
                  325429                
                                 High           
                                        France-Germany      
                                                        EA  
                                                              Eastern
    …….                 

                   359343        High   France-Germany  WCS   West Coast South

Fuel Type   Fuel Load   Mileage Odometer Reading    Delay Minutes

Diesel         210        12        98765.8               0
Diesel         210        12        98765.8               0
Diesel         210        12        98765.8               0
Diesel         210        12        98765.8               0
Diesel         210        12        98765.8               0
......

Diesel         170        8.5       23406.2              NaN

Редактировать: Добавлен пример набора данных в формате df.head (10) .to_dict ()

{'Time Period': {0: '2018-P01', 1: '2018-P01-02', 2: '2018-P01-02', 3: '2018-P01-02', 4: '2018-P01-03', 5: '2018-P01-04', 6: '2018-P01-04', 7: '2018-P01-05', 8: '2018-P01-06', 9: '2018-P01-07'}, 'Odometer Reading': {0: 14567.1, 1: 98765.8, 2: 23406.2, 3: 54418.8, 4: 58838.35, 5: 63257.9, 6: 67677.45, 7: 72097.0, 8: 89221.0, 9: 89221.0}, 'Journey Code': {0: 261803, 1: 325429, 2: 359343, 3: 359343, 4: 370697, 5: 392535, 6: 394752, 7: 408713, 8: 408714, 9: 408715}, 'Fuel Type': {0: 'Diesel', 1: 'Diesel', 2: 'Diesel', 3: 'Diesel', 4: 'Diesel', 5: 'Diesel', 6: 'Diesel', 7: 'Diesel', 8: 'Diesel', 9: 'Diesel'}, 'Route Name': {0: 'France-Germany', 1: 'France-Germany', 2: 'France-Germany', 3: 'France-Germany', 4: 'France-Germany', 5: 'France-Germany', 6: 'France-Germany', 7: 'France-Germany', 8: 'France-Germany', 9: 'France-Germany'}, 'Area': {0: 'WE', 1: 'EA', 2: 'WCS', 3: 'WE', 4: 'WE', 5: 'EA', 6: 'WCS', 7: 'WE', 8: 'WE', 9: 'WE'}, 'Route': {0: 'High', 1: 'High', 2: 'High', 3: 'High', 4: 'High', 5: 'High', 6: 'High', 7: 'High', 8: 'High', 9: 'High'}, 'Fuel Load': {0: 165.0, 1: 210.0, 2: 170.0, 3: 130.0, 4: 152.5, 5: 142.0, 6: 131.5, 7: 121.0, 8: 121.0, 9: 121.0}, 'Delay Minutes': {0: 2.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 2.0, 5: 37.119401200000006, 6: 0.0, 7: 1.25, 8: 2.56, 9: 2.56}, 'Mileage': {0: 6.0, 1: 12.0, 2: 8.5, 3: 10.0, 4: 37.0, 5: 140.0, 6: 120.0, 7: 13.0, 8: 13.0, 9: 13.0}, 'Area Name': {0: 'West', 1: 'Eastern', 2: 'West Coast South', 3: 'West', 4: 'West', 5: 'Eastern', 6: 'West Coast South', 7: 'West', 8: 'West', 9: 'West'}}
...