forked from balapriyac/data-science-tutorials
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmulti_format_exporter.py
More file actions
161 lines (129 loc) · 5.82 KB
/
Copy pathmulti_format_exporter.py
File metadata and controls
161 lines (129 loc) · 5.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import pandas as pd
import json
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
import sqlite3
from datetime import datetime
class DataExporter:
def __init__(self, df, base_filename=None):
self.df = df
self.base_filename = base_filename or f"export_{datetime.now().strftime('%Y%m%d_%H%M')}"
self.export_log = []
def to_excel_formatted(self, filename=None):
"""Export to Excel with formatting and multiple sheets"""
filename = filename or f"{self.base_filename}.xlsx"
with pd.ExcelWriter(filename, engine='openpyxl') as writer:
# Main data sheet
self.df.to_excel(writer, sheet_name='Data', index=False)
# Summary statistics sheet (for numeric data)
numeric_cols = self.df.select_dtypes(include=['number']).columns
if len(numeric_cols) > 0:
summary = self.df[numeric_cols].describe()
summary.to_excel(writer, sheet_name='Summary_Stats')
# Data info sheet
info_data = {
'Metric': ['Total Rows', 'Total Columns', 'Missing Values', 'Numeric Columns', 'Text Columns'],
'Value': [
len(self.df),
len(self.df.columns),
self.df.isnull().sum().sum(),
len(self.df.select_dtypes(include=['number']).columns),
len(self.df.select_dtypes(include=['object']).columns)
]
}
info_df = pd.DataFrame(info_data)
info_df.to_excel(writer, sheet_name='Data_Info', index=False)
# Format the main data sheet
workbook = writer.book
worksheet = writer.sheets['Data']
# Header formatting
header_font = Font(bold=True, color="FFFFFF")
header_fill = PatternFill(start_color="366092", end_color="366092", fill_type="solid")
for cell in worksheet[1]:
cell.font = header_font
cell.fill = header_fill
# Auto-adjust column widths
for column in worksheet.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = min(max_length + 2, 50)
worksheet.column_dimensions[column_letter].width = adjusted_width
self.export_log.append(f"✓ Excel: {filename}")
return filename
def to_json_structured(self, filename=None):
"""Export to JSON with metadata"""
filename = filename or f"{self.base_filename}.json"
export_data = {
'metadata': {
'export_date': datetime.now().isoformat(),
'total_records': len(self.df),
'columns': list(self.df.columns),
'data_types': {col: str(dtype) for col, dtype in self.df.dtypes.items()}
},
'data': self.df.to_dict(orient='records')
}
with open(filename, 'w') as f:
json.dump(export_data, f, indent=2, default=str)
self.export_log.append(f"✓ JSON: {filename}")
return filename
def to_sqlite(self, filename=None, table_name='data'):
"""Export to SQLite database"""
filename = filename or f"{self.base_filename}.db"
conn = sqlite3.connect(filename)
# Export main data
self.df.to_sql(table_name, conn, if_exists='replace', index=False)
# Create metadata table
metadata = pd.DataFrame({
'key': ['export_date', 'total_records', 'total_columns'],
'value': [
datetime.now().isoformat(),
str(len(self.df)),
str(len(self.df.columns))
]
})
metadata.to_sql('metadata', conn, if_exists='replace', index=False)
conn.close()
self.export_log.append(f"✓ SQLite: {filename}")
return filename
def to_csv_clean(self, filename=None):
"""Export to clean CSV with optimized settings"""
filename = filename or f"{self.base_filename}.csv"
# Clean data for CSV export
df_clean = self.df.copy()
# Handle potential CSV issues
for col in df_clean.select_dtypes(include=['object']).columns:
df_clean[col] = df_clean[col].astype(str).str.replace(',', ';').str.replace('\n', ' ')
df_clean.to_csv(filename, index=False, encoding='utf-8')
self.export_log.append(f"✓ CSV: {filename}")
return filename
def export_all(self, formats=['excel', 'json', 'csv', 'sqlite']):
"""Export to multiple formats at once"""
print(f"Exporting data to {len(formats)} formats...")
results = {}
if 'excel' in formats:
results['excel'] = self.to_excel_formatted()
if 'json' in formats:
results['json'] = self.to_json_structured()
if 'csv' in formats:
results['csv'] = self.to_csv_clean()
if 'sqlite' in formats:
results['sqlite'] = self.to_sqlite()
print("\nExport Summary:")
for log_entry in self.export_log:
print(log_entry)
return results
# Usage example:
# df = pd.read_csv('processed_data.csv')
# exporter = DataExporter(df, 'final_analysis')
#
# # Export to all formats
# files = exporter.export_all()
#
# # Or export to specific formats
# files = exporter.export_all(['excel', 'json'])