Создание поддельных данных, похожих на данный шаблон
Я хочу сделать несколько поддельных файлов Excel, содержащих такие данные, как следующие:
DATE CAR Cost Outlet Code
2012/01/01 BMW 100 AA 2187
2012/01/01 Mercedes Benz 200 AA 2187
2012/01/01 BMW 100 AA 2187
2012/01/02 Volvo 100 AA 2187
2012/01/02 BMW 50 AA 2187
2012/01/03 Mercedes Benz 75 AA 2187
...
2012/09/01 BMW 200 AA 2187
2012/09/02 Volvo 100 AA 2187
Идея состоит в том, чтобы иметь возможность создавать поддельные данные, которые имеют шаблон, похожий на шаблон, описанный выше. Данные также могут быть случайными.
Каков наилучший способ создания поддельных табличных данных для анализа данных?
2 ответа
Вы можете попробовать это:
import pandas as pd
import random
from datetime import datetime
from faker import Faker
from faker.providers import BaseProvider
fake = Faker()
# This custom Provider inherits from the BaseProvider
class Provider(BaseProvider):
# You can change these values as needed.
start_date = datetime(2012, 1, 1)
end_date = datetime(2012, 12, 1)
cars = ['BMW', 'Mercedes Benz', 'Volvo']
cost_start = 50
cost_end = 200
outlets = ['AA', 'BB', 'CC']
code_start = 2000
code_end = 2200
def date(self):
"""Return random date between the start and end dates."""
self.date = fake.date_between_dates(
date_start=self.start_date, date_end=self.end_date).strftime('%Y/%m/%d')
return self.date
def car(self):
"""Return a random car from cars."""
return random.choice(self.cars)
def cost(self):
"""Return a random cost between the start and end range."""
return random.randrange(self.cost_start, self.cost_end)
def outlet(self):
"""Return a random outlet."""
return random.choice(self.outlets)
def code(self):
"""Return a random code between the start and end range."""
return random.randrange(self.code_start, self.code_end)
# Add the Provider to our faker object
fake.add_provider(Provider)
def create_fake_data(fake, no_of_rows):
columns = ['date', 'car', 'cost', 'outlet', 'code']
data = {column: [getattr(fake, column)() for _ in range(no_of_rows)] for column in columns}
df = pd.DataFrame(data=data)
df = df[columns]
return df
print(create_fake_data(fake, 10))
Кадр данных, который печатается:
date car cost outlet code
0 2012/07/01 BMW 173 BB 2059
1 2012/11/14 BMW 120 BB 2026
2 2012/11/23 Volvo 81 AA 2078
3 2012/04/01 Volvo 98 CC 2040
4 2012/01/03 Volvo 171 BB 2173
5 2012/08/29 Mercedes Benz 193 BB 2086
6 2012/08/25 Volvo 156 CC 2018
7 2012/07/13 Volvo 92 CC 2065
8 2012/04/15 Volvo 75 CC 2096
9 2012/07/04 BMW 87 AA 2145
Вы можете изменить любое или все значения, хранящиеся в переменных класса:
Provider.start_date = datetime(2018, 1, 1)
Provider.end_date = datetime(2018, 9, 1)
Provider.cars.append('Tesla')
Provider.cost_start = 100
Provider.cost_end = 300
Provider.outlets.append('DD')
Provider.code_start = 3000
Provider.code_end = 4300
print(create_fake_data(fake, 5))
Новый вывод:
date car cost outlet code
0 2018/01/29 Volvo 246 DD 3447
1 2018/05/18 BMW 282 AA 3800
2 2018/04/08 Mercedes Benz 175 AA 3547
3 2018/01/07 Tesla 215 CC 3652
4 2018/03/11 Tesla 267 CC 3480
Запись в Excel с различными данными в каждой электронной таблице:
for i in range(5):
df = create_fake_data(fake, 10)
df.to_excel('data_' + str(i) + '.xlsx', index=False) # Stored in your current folder
Вы можете использовать пакет pydbgen для создания случайных данных и возврата в виде pandas dataframe:
from pydbgen import pydbgen
myDB=pydbgen.pydb()
myDB.gen_dataframe(5,['name','city','phone','date'])
Это выводит:
Вот предложение для создания ramdom в листах, вы можете создавать рабочие книги.
Sub createRandom()
Dim aCar(3)
Dim aOutlet(1)
Dim aCode(1)
Dim startDate
Dim i%, sheet%
Dim sh As Workbook
aCar(0) = "BMW"
aCar(1) = "Mercedes Benz"
aCar(2) = "Volvo"
aOutlet(0) = "AA"
aCode(0) = 2187
startDate = CDate("01/01/2012")
For sheet = 1 To 5
Set sh = ActiveWorkbook.Sheets.Add()
sh.Cells(1, 1) = "Date"
sh.Cells(1, 2) = "CAR"
sh.Cells(1, 3) = "Cost"
sh.Cells(1, 4) = "Outlet"
sh.Cells(1, 5) = "Code"
For i = 2 To 100
sh.Cells(i, 1) = DateAdd("d", Rnd * 28 + 1, startDate) 'Random date
sh.Cells(i, 2) = aCar(Int(UBound(aCar(2)) * Rnd))
sh.Cells(i, 3) = Int((100) * Rnd) ' 0-100
sh.Cells(i, 4) = aOutlet(0)
sh.Cells(i, 5) = aCode(0)
Next
Next
End Sub